in reply to Perl/Tk + CSSH

s there any cssh/ssh TK module or ability that allows me to just say place open window 1 to x,y - window 2 x,y - window 3 x,y - etc. or pipe the system call to a widget that can be controlled via grid or frame?

Yes to all those questions. :-)

Considering you are using Proc::Background to run your c based ssh connections, your best bet for this style of code may be to make individual mainwindows for each connection, otherwise you would make one mainwindow, and the rest would be dependent toplevels. If you go the toplevel route, you may still run into the blocking of the eventloop. The best solution would be to run each ssh instance in it's own thread, and display all the input/output in a set of Text widgets.

But lets just get back to just opening multiple mainwidows( independent eventloops) and controlling their placements. It's quite simple. The general way to do it is:

$widget -> geometry("wxh+x+y") width (w), height (h), yposition (x), and yposition (y) can be set as +string using above syntax. Position and size can be set independently, e.g. "+x+y" or "100x200". Without a parameter the actual size and position is returned in the ab +ove syntax. Attention: Values are "0" before the widget has manifested itself on t +he screen; use update() or waitVisibility() if unsure. Note: All values are in pixels. The screensize can be requested using $top -> screenwidth() and $top -> screenheight() Thus (e.g.): $h = $top->screenheight() - 40; $w = $top->screenwidth() - 40; $top -> geometry("${w}x$h+20+20") # if you specify -0-0 for position, you anchor in the lower right corn +er
Here is a rudimentary example, almost a Window Bomb. :-)
#!/usr/bin/perl use warnings; use strict; use Tk; my ($x,$y,$count) = (0,0,0); for(1..15) { $count++; if (fork == 0) { #$widget->geometry("wxh+x+y") my $top = new MainWindow; $top->geometry('100x100'.'+'.$x.'+'.$y); $top->Button(-command => sub { warn "top$_" })->pack; MainLoop; CORE::exit(); } if( $count % 3 == 0) {$y += 150; $x = 0 } $x += 150; } MainLoop; #If you need start a new process from one of the child processes, then #you have to establish some kind of IPC (e.g. pipes) between the child #and parent. #I the launched task running another Perl/Tk module or function or a #complete new program? In the latter case, you should just use fork an +d #exit/system and do not forget to use CORE::exit instead of exit in th +e #child process (according to the FAQ). Perl/Tk forks are somewhat more #difficult. You have to make sure that you fork off the process which #does not have a created a MainWindow itself. This will work fine:

I'm not really a human, but I play one on earth.
Old Perl Programmer Haiku ................... flash japh

Replies are listed 'Best First'.
Re^2: Perl/Tk + CSSH
by Monkless (Acolyte) on Feb 07, 2012 at 14:01 UTC

    Oh Wise one, Your response is greatly appreciated. I am currently combing through your explanation/examples. I think this is what I am looking for, but will need to see how its implemented into my code. Your example worked like a charm and will post back with my success/failure! Thanks again for quick turn around!

Re^2: Perl/Tk + CSSH
by Monkless (Acolyte) on Feb 08, 2012 at 10:08 UTC

    Ok, So I had the chance to review and here is what I have come up with. I took your example and mashed a chunk of my code that has my CSSH call, to see if I could manage the windows via example code.

    #!/usr/bin/perl -w use warnings; use strict; use Tk; my ($x,$y,$count) = (0,0,0); my @systems = qw(system1 system2 system3 system4 system5 system7); foreach(@systems) { $count++; if (fork == 0) { #$widget->geometry("wxh+x+y") my $top = new MainWindow; $top->geometry('100x100'.'+'.$x.'+'.$y); $top => "cssh -G -T 'OOPCSSH' -l username $_"; ##MY PROBLEM LIES H +ERE. If I simply `the command/call` it runs but still no placement co +ntrol. $top->Button(-command => sub { warn "top$_" })->pack; MainLoop; CORE::exit(); } if( $count % 3 == 0) {$y += 150; $x = 0 } $x += 150; } MainLoop;

    Since I am calling cssh, what it is actually doing is opening up a seperate XTERM window for each connection in which I can control each window with one control window. Essentially calling a seperate program all together, your example actually cleared up a previous issue I had but not quite this one, as I still cannot control the placement of the "outside" program/call. I would like to be able to place the XTERM windows that CSSH opens or use a CSSH module to do the work inside the program. Checking CPAN I didn't see what I was looking for.

      as I still cannot control the placement of the "outside" program/call. I would like to be able to place the XTERM windows that CSSH opens

      That can be done with the xterm options.

      See "xterm -h" for all the options. To execute cssh in that xterm, use the -e option, like " xterm -fn 10x20 -geometry '16x19+0+20' -e CSSH @CSSHOPTIONS "

      #!/usr/bin/perl use warnings; use strict; use Tk; my $mw = tkinit; $mw->Button(-text=>"Xterm",-command=> [\&go])->pack; $mw->Button(-text=>"Xterm with attributes ", -command=>[\&go, q(-fn 10x20 -geometry '16x19+0+20')])->pac +k; MainLoop; sub go { print "@_\n"; my $xoptions = shift || ''; local $SIG{CHLD} = 'IGNORE'; # don't wait for child # exit status. avoids # zombies. die "fork failed: $!" unless defined(my $pid = fork); return if $pid; exec("xterm $xoptions"); warn "exec failed: $!"; CORE::exit(1); }

      I'm not really a human, but I play one on earth.
      Old Perl Programmer Haiku ................... flash japh