qemuctl0.2/ 0000755 0001750 0001750 00000000000 10365254040 013227 5 ustar peter peter 0000000 0000000 qemuctl0.2/Makefile 0000644 0001750 0001750 00000001741 10365254040 014672 0 ustar peter peter 0000000 0000000 #
## Config
# Edit these to fit your system:
VERSION=0.2
PREFIX=/usr
MANDIR=$(PREFIX)/share/man/man1
BINDIR=$(PREFIX)/bin
SHAREDIR=$(PREFIX)/share/qemuctl
PIXMAPSDIR=$(PREFIX)/share/pixmaps
DOCSDIR=$(PREFIX)/share/doc/qemu-launcher
LOCALEDIR=$(PREFIX)/share/locale
APPLICATIONSDIR=$(PREFIX)/share/applications
## End config
SHELL=/bin/sh
DESTDIR=
EXECUTABLE = qemuctl
MANPAGE = qemuctl.1
DOCS=
POFILES=
install:
install -D $(EXECUTABLE) $(DESTDIR)$(BINDIR)/$(EXECUTABLE)
install -d $(DESTDIR)$(SHAREDIR)
install -m644 qemuctl.xml $(DESTDIR)$(SHAREDIR)/qemuctl.xml
install -m644 -D $(MANPAGE) $(DESTDIR)$(MANDIR)/$(MANPAGE)
gzip -f --best $(DESTDIR)$(MANDIR)/$(MANPAGE)
uninstall:
rm $(DESTDIR)$(MANDIR)/$(MANPAGE).gz
rm $(DESTDIR)$(BINDIR)/$(EXECUTABLE)
rm -rf $(DESTDIR)$(SHAREDIR)
tar:
rm -f qemuctl$(VERSION).tar.gz
mkdir qemuctl$(VERSION) || true
cp -f $(EXECUTABLE) qemuctl.xml $(MANPAGE) Makefile qemuctl$(VERSION)
tar cvf qemuctl$(VERSION).tar.gz qemuctl$(VERSION)
qemuctl0.2/qemuctl.xml 0000644 0001750 0001750 00000157214 10365254040 015435 0 ustar peter peter 0000000 0000000
True
Qemu Control - Main
GTK_WINDOW_TOPLEVEL
GTK_WIN_POS_NONE
False
False
False
True
False
False
GDK_WINDOW_TYPE_HINT_NORMAL
GDK_GRAVITY_NORTH_WEST
GTK_FILE_CHOOSER_ACTION_SAVE
True
False
False
Save VM State
GTK_WINDOW_TOPLEVEL
GTK_WIN_POS_NONE
False
True
False
True
False
False
GDK_WINDOW_TYPE_HINT_DIALOG
GDK_GRAVITY_NORTH_WEST
True
False
24
True
GTK_BUTTONBOX_END
True
True
True
gtk-cancel
True
GTK_RELIEF_NORMAL
True
-6
True
True
True
True
gtk-save
True
GTK_RELIEF_NORMAL
True
-5
0
False
True
GTK_PACK_END
Qemu Control Info
GTK_WINDOW_TOPLEVEL
GTK_WIN_POS_NONE
False
True
False
True
False
False
GDK_WINDOW_TYPE_HINT_DIALOG
GDK_GRAVITY_NORTH_WEST
True
True
False
0
True
GTK_BUTTONBOX_END
True
True
True
gtk-close
True
GTK_RELIEF_NORMAL
True
-7
0
False
True
GTK_PACK_END
True
Qemu Control
(c)2005 Peter Rustler
home: http://www.chefpro.de
False
False
GTK_JUSTIFY_CENTER
False
False
0.5
0.5
0
0
0
False
False
GTK_FILE_CHOOSER_ACTION_OPEN
True
False
False
Load VM State
GTK_WINDOW_TOPLEVEL
GTK_WIN_POS_NONE
False
True
False
True
False
False
GDK_WINDOW_TYPE_HINT_DIALOG
GDK_GRAVITY_NORTH_WEST
True
False
24
True
GTK_BUTTONBOX_END
True
True
True
gtk-cancel
True
GTK_RELIEF_NORMAL
True
-6
True
True
True
True
gtk-open
True
GTK_RELIEF_NORMAL
True
-5
0
False
True
GTK_PACK_END
GTK_FILE_CHOOSER_ACTION_SAVE
True
False
False
Save Screenshot
GTK_WINDOW_TOPLEVEL
GTK_WIN_POS_NONE
False
True
False
True
False
False
GDK_WINDOW_TYPE_HINT_DIALOG
GDK_GRAVITY_NORTH_WEST
True
False
24
True
GTK_BUTTONBOX_END
True
True
True
gtk-cancel
True
GTK_RELIEF_NORMAL
True
-6
True
True
True
True
gtk-save
True
GTK_RELIEF_NORMAL
True
-5
0
False
True
GTK_PACK_END
GTK_FILE_CHOOSER_ACTION_OPEN
True
False
False
Open File
GTK_WINDOW_TOPLEVEL
GTK_WIN_POS_NONE
False
True
False
True
False
False
GDK_WINDOW_TYPE_HINT_DIALOG
GDK_GRAVITY_NORTH_WEST
True
False
24
True
GTK_BUTTONBOX_END
True
True
True
gtk-cancel
True
GTK_RELIEF_NORMAL
True
-6
True
True
True
True
gtk-open
True
GTK_RELIEF_NORMAL
True
-5
0
False
True
GTK_PACK_END
400
300
Qemu Control - Shell
GTK_WINDOW_TOPLEVEL
GTK_WIN_POS_NONE
False
400
300
True
False
True
False
False
GDK_WINDOW_TYPE_HINT_NORMAL
GDK_GRAVITY_NORTH_WEST
True
False
0
True
True
GTK_POLICY_AUTOMATIC
GTK_POLICY_AUTOMATIC
GTK_SHADOW_IN
GTK_CORNER_TOP_LEFT
True
True
False
False
True
GTK_JUSTIFY_LEFT
GTK_WRAP_NONE
False
0
0
0
0
0
0
0
True
True
True
False
0
True
True
True
True
0
True
*
False
0
True
True
True
True
GTK_RELIEF_NORMAL
False
True
0.5
0.5
0
0
0
0
0
0
True
False
2
True
gtk-media-play
4
0.5
0.5
0
0
0
False
False
True
Send
True
False
GTK_JUSTIFY_LEFT
False
False
0.5
0.5
0
0
0
False
False
0
False
False
0
False
False
qemuctl0.2/qemuctl.1 0000644 0001750 0001750 00000004435 10365254040 014771 0 ustar peter peter 0000000 0000000 .TH "qemuctl" "1" "0.0.1" "Peter Rustler" ""
.SH "NAME"
.LP
qemuctl \- Graphical control for qemu
.SH "SYNTAX"
.LP
qemuctl [\fI\-suspend\-dir\fP <\fIdir\fP>] [\fI\-suspend\-file\fP <\fIfilename\fP>] [\fI\-nowakeup\fP] qemu\-options
.SH "DESCRIPTION"
.LP
qemuctl is a gui that controls a qemu process with the built\-in monitor of qemu. So you can change devices, suspend machines, save screenshots, ...
.LP
If you suspend a machine it will do the following macro:
.LP
stop
.br
screendump "suspend\-dir/suspend\-file.ppm"
.br
savevm "suspend\-dir/suspend\-file.vm"
.br
commit
.br
quit
.LP
.br
.br
You can afterwards resume the machine with:
.LP
qemuctl \-suspend\-dir suspend\-dir \-suspend\-file suspend\-file your_qemu_options
.br
the suspend\-files will then be deleted
.br
or
.br
qemuctl \-loadvm suspend\-dir/suspend\-file.vm your_qemu_options
.LP
Be aware that you can't use the "\-monitor" option with qemuctl, because it needs the control over the monitor. The option "\-serial stdio" can't be used, too.
.SH "OPTIONS"
.LP
.TP
\fB\-suspend\-file \fR
This option is normaly used by qemuctl to support suspend and wakeup. qemuctl can then find the vm\-state\-file in its folders and wakeup the virtual machine. If the file is there the qemuctl waes up the virtual machine and deletes the file afterwards. On suspend the vm\-state\-file is then stored as the with the .vm ending and the screenshot is stored as the with the .ppm ending.
.br
Default filename is "suspend".
.TP
\fB\-suspend\-dir \fR
This is the dir where the suspend files would be stored or expected.
.br
Default is current dir.
.TP
\fB\-nowakeup\fR
Don't wake up even if the vm\-file is there. Suspend still works.
.br
Default is to wake up using the vm\-file if it is there.
.TP
\fBqemu\-options\fR
Use qemu\-options for the launch of qemu. See qemu(1) for further details.
.SH "FILES"
.LP
none
.SH "ENVIRONMENT VARIABLES"
.LP
none
.SH "EXAMPLES"
.LP
To use the suspend file 'Debian 3.1' and store/search it in the '/qemu' dir:
.LP
qemuctl \-suspend\-file "Debian 3.1" \-suspend\-dir "/qemu" \-boot c \-hda hda.raw
.LP
Alternativly you can run it with default suspend filenames:
.LP
qemuctl \-boot c \-hda hda.raw
.SH "AUTHORS"
.LP
Peter Rustler
.SH "SEE ALSO"
.LP
qemu(1) qemu\-launcher(1)
qemuctl0.2/qemuctl 0000755 0001750 0001750 00000043664 10365254040 014644 0 ustar peter peter 0000000 0000000 #!/usr/bin/perl
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# 2005 Peter Rustler - qemuctl@chefpro.de
use Gtk2 qw/-init -threads-init/;
use Gtk2::GladeXML;
use IO::Handle;
use IPC::Open3;
use Gtk2::Helper;
use Fcntl;
use Getopt::Long qw(:config pass_through);
$default_floppy_a = "";
$default_floppy_b = "";
$default_cdrom = "";
$default_serial1 = "";
$default_parport = "";
$suspend_dir = ".";
$suspend_file = "suspend";
$wakeup=1;
$loadvm=0;
$monitor="xystdio";
$usbhostlog = "";
$usblog = "";
$usb=0;
$usbhost=0;
$dontread = 0;
$usbmenu = 0;
$usbhostmenu = 0;
@usbmenuitems = 0;
@usbhostmenuitems = 0;
GetOptions("suspend-dir=s"=>\$suspend_dir,
"suspend-file=s"=>\$suspend_file,
"wakeup!"=>\$wakeup#,
#"monitor=s"=>\$monitor
);
$command = "qemu '".join( "' '", @ARGV)."' -monitor stdio";
GetOptions("fda=s"=>\$default_floppy_a,
"fdb=s"=>\$default_floppy_b,
"cdrom=s"=>\$default_cdrom,
"serial=s"=>\$default_serial1,
"parallel=s"=>\$default_parport,
"loadvm"=>\$loadvm
);
# if monitor != stdio
#if( $monitor ne "stdio" && $monitor != 48 ){
# print STDERR "Error: Monitor not stdio\n";
# exit 1;
#}
#print "xxx".$monitor."xxx\n";
#exit;
if( $loadvm == 0 && $wakeup == 1 && -f $suspend_dir."/".$suspend_file.".vm" && -r $suspend_dir."/".$suspend_file.".vm"){
$command .= " -loadvm '".$suspend_dir."/".$suspend_file.".vm'";
} else {
$wakeup = 0;
}
#print $command."\n";
$gladexml = Gtk2::GladeXML->new('/usr/share/qemuctl/qemuctl.xml');
#$gladexml = Gtk2::GladeXML->new('qemuctl.xml');
$window = $gladexml->get_widget('mainwindow');
$info = $gladexml->get_widget('info');
$savevm = $gladexml->get_widget('savevm');
$loadvm = $gladexml->get_widget('loadvm');
$openfile = $gladexml->get_widget('openfile');
$savescreen = $gladexml->get_widget('savescreen');
$shellwindow = $gladexml->get_widget('shellwindow');
$logview = $gladexml->get_widget('textview');
$logscroll = $gladexml->get_widget('scrolledwindow1');
# setting default names
$gladexml->get_widget('floppy_a_default')->get_child()->set_label("default (".$default_floppy_a.")");
$gladexml->get_widget('floppy_b_default')->get_child()->set_label("default (".$default_floppy_b.")");
$gladexml->get_widget('cdrom_default')->get_child()->set_label("default (".$default_cdrom.")");
$gladexml->get_widget('serial1_default')->get_child()->set_label("default (".$default_serial1.")");
$gladexml->get_widget('parport_default')->get_child()->set_label("default (".$default_parport.")");
$gladexml->get_widget('usb_connect')->set_submenu( $usbhostmenu=new Gtk2::Menu() );
$gladexml->get_widget('usb_disconnect')->set_submenu( $usbmenu=new Gtk2::Menu() );
$gladexml->signal_autoconnect_all(
"gtk_main_quit" => gtk_main_quit,
"on_save_screenshot_activate" => on_save_screenshot_activate,
"on_save_vm_state_activate" => on_save_vm_state_activate,
"on_load_vm_state_activate" => on_load_vm_state_activate,
"on_quit_activate" => on_quit_activate,
"on_floppy_a_default_activate" => on_floppy_a_default_activate,
"on_floppy_a_fd0_activate" => on_floppy_a_fd0_activate,
"on_floppy_a_null_activate" => on_floppy_a_null_activate,
"on_floppy_a_other_activate" => on_floppy_a_other_activate,
"on_eject_a_activate" => on_eject_a_activate,
"on_floppy_b_default_activate" => on_floppy_b_default_activate,
"on_floppy_b_fd0_activate" => on_floppy_b_fd0_activate,
"on_floppy_b_null_activate" => on_floppy_b_null_activate,
"on_floppy_b_other_activate" => on_floppy_b_other_activate,
"on_eject_b_activate" => on_eject_b_activate,
"on_cdrom_default_activate" => on_cdrom_default_activate,
"on_cdrom_cdrom_activate" => on_cdrom_cdrom_activate,
"on_cdrom_null_activate" => on_cdrom_null_activate,
"on_cdrom_other_activate" => on_cdrom_other_activate,
"on_eject_cdrom_activate" => on_eject_cdrom_activate,
"on_usb_connect_activate" => on_usb_connect_activate,
"on_usb_disconnect_activate" => on_usb_disconnect_activate,
"on_serial1_default_activate" => on_serial1_default_activate,
"on_serial1_ttyS0_activate" => on_serial1_ttyS0_activate,
"on_serial1_null_activate" => on_serial1_null_activate,
"on_serial1_other_activate" => on_serial1_other_activate,
"on_parport_default_activate" => on_parport_default_activate,
"on_parport_parport0_activate" => on_parport_parport0_activate,
"on_parport_null_activate" => on_parport_null_activate,
"on_parport_other_activate" => on_parport_other_activate,
"on_suspend_activate" => on_suspend_activate,
"on_pause_activate" => on_pause_activate,
"on_continue_activate" => on_continue_activate,
"on_power_off_activate" => on_power_off_activate,
"on_reset_activate" => on_reset_activate,
"on_commit_activate" => on_commit_activate,
"on_quit_qemu_activate" => on_quit_qemu_activate,
"on_help_activate" => on_help_activate,
"on_info_activate" => on_info_activate,
"on_sendkeys_ctrl-alt-delete_activate" => on_sendkeys_ctrl_alt_delete_activate,
"on_sendkeys_ctrl-alt-f1_activate" => on_sendkeys_ctrl_alt_f1_activate,
"on_sendkeys_ctrl-alt-f2_activate" => on_sendkeys_ctrl_alt_f2_activate,
"on_sendkeys_ctrl-alt-f3_activate" => on_sendkeys_ctrl_alt_f3_activate,
"on_sendkeys_ctrl-alt-f4_activate" => on_sendkeys_ctrl_alt_f4_activate,
"on_sendkeys_ctrl-alt-f5_activate" => on_sendkeys_ctrl_alt_f5_activate,
"on_sendkeys_ctrl-alt-f6_activate" => on_sendkeys_ctrl_alt_f6_activate,
"on_sendkeys_ctrl-alt-f7_activate" => on_sendkeys_ctrl_alt_f7_activate,
"on_sendkeys_ctrl-alt-f8_activate" => on_sendkeys_ctrl_alt_f8_activate,
"on_sendkeys_ctrl-alt-f9_activate" => on_sendkeys_ctrl_alt_f9_activate,
"on_sendkeys_ctrl-alt-f10_activate" => on_sendkeys_ctrl_alt_f10_activate,
"on_sendkeys_ctrl-alt-f11_activate" => on_sendkeys_ctrl_alt_f11_activate,
"on_sendkeys_ctrl-alt-f12_activate" => on_sendkeys_ctrl_alt_f12_activate,
"on_shell_activate" => on_shell_activate,
"on_shellwindow_delete_event" => on_shellwindow_delete_event,
"on_sendbutton_key_press_event" => on_sendbutton_key_press_event,
);
$log="";
$pid = open3( QEMUIN, QEMUOUT, QEMUERR, $command);
QEMUOUT->autoflush(1);
QEMUIN->autoflush(1);
QEMUERR->autoflush(1);
fcntl( QEMUIN , F_SETFL, O_NONBLOCK);
fcntl( QEMUOUT , F_SETFL, O_NONBLOCK);
fcntl( QEMUERR , F_SETFL, O_NONBLOCK);
fcntl( STDERR , F_SETFL, O_NONBLOCK);
if( $monitor eq "stdio" ){
STDIN->autoflush(1);
fcntl( STDIN , F_SETFL, O_NONBLOCK);
fcntl( STDOUT , F_SETFL, O_NONBLOCK);
}
$stdqemuout = Gtk2::Helper->add_watch( fileno( QEMUOUT ), in => sub {
while( $dontread == 1 ){
;
}
$dontread == 1;
if ( eof( QEMUOUT ) ) {
Gtk2::Helper->remove_watch( $stdqemuout );
close( QEMUOUT );
$dontread == 0;
gtk_main_quit();
}
else {
#print "Lese QEMUOUT begin\n";
sysread( QEMUOUT, $line, 8000);
#print "Lese QEMUOUT end\n";
#my $line = ;
#if( $line =~/\n/ ){
if( $monitor eq "stdio" ){
print STDOUT $line;
}
$line =~s/\(qemu\).+\[D/\(qemu\)/;
$log = $log . $line;
$usbhostlog = $usbhostlog . $line;
$usblog = $usblog . $line;
if( $usb == 1 and $usblog =~/qemu/s ){
$usb = 0;
usb_disconnect_act();
}
if( $usbhost == 1 and $usbhostlog =~/qemu/s ){
$usbhost = 0;
usb_connect_act();
}
($start, $end) = $logview->get_buffer->get_bounds();
#print "buffer-chars: ".$logview->get_buffer->get_char_count." buffer-lines: ".$logview->get_buffer->get_line_count."\n";
Gtk2::TextBuffer::insert($logview->get_buffer,$end,$line);
#$logview->get_buffer->set_text($log);
$gladexml->get_widget('scrolledwindow1')->get_vadjustment->set_value(
$gladexml->get_widget('scrolledwindow1')->get_vadjustment->upper -
$gladexml->get_widget('scrolledwindow1')->get_vadjustment->page_size - 1);
#}
}
$dontread == 0;
return 1;
} );
$stdqemuerr = Gtk2::Helper->add_watch( fileno( QEMUERR ), in => sub {
while( $dontread == 1 ){
;
}
$dontread == 1;
if ( eof( QEMUERR ) ) {
Gtk2::Helper->remove_watch( $stdqemuerr );
close( QEMUERR );
$dontread == 0;
gtk_main_quit();
}
else {
#print "Lese QEMUERR begin\n";
sysread( QEMUERR, $line, 8000);
#print "Lese QEMUERR end\n";
#my $line = ;
#if( $line =~/\n/ ){
$log = $log . $line;
print STDERR $line;
#($start, $end) = $logview->get_buffer->get_bounds();
Gtk2::TextBuffer::insert($logview->get_buffer,$end,$line);
#$logview->get_buffer->set_text($log);
$gladexml->get_widget('scrolledwindow1')->get_vadjustment->set_value(
$gladexml->get_widget('scrolledwindow1')->get_vadjustment->upper -
$gladexml->get_widget('scrolledwindow1')->get_vadjustment->page_size - 1);
#}
}
$dontread == 0;
return 1;
} );
if( $monitor eq "stdio" ){
$stdin = Gtk2::Helper->add_watch( fileno( STDIN ), in => sub {
if ( eof( STDIN ) ) {
Gtk2::Helper->remove_watch( $stdin );
close( STDIN );
gtk_main_quit();
}
else {
#print "Lese STDIN begin\n";
sysread( STDIN, $line, 8000);
#print "Lese STDIN end\n";
#$line = STDIN;
#if( $line =~ s/\n// ){
sendcomandraw( $line );
#}
}
return 1;
} );
}
$window->show;
Gtk2->main;
#waitpid($pid);
sub sendcomand {
print QEMUIN $_[0]."\n";
}
sub sendcomandraw {
print QEMUIN $_[0];
}
sub gtk_main_quit {
sendcomand( "quit" );
Gtk2->main_quit;
exit(0);
}
sub on_save_screenshot_activate {
$savescreen->show;
my $status = $savescreen->run;
$savescreen->hide;
if( $status eq "ok" ){
my $filename = $savescreen->get_filename();
sendcomand( "screendump \"".$filename.".ppm\"" );
}
}
sub on_save_vm_state_activate {
$savevm->show;
my $status = $savevm->run;
$savevm->hide;
if( $status eq "ok" ){
my $filename = $savevm->get_filename();
sendcomand( "savevm \"".$filename."\"" );
}
}
sub on_load_vm_state_activate {
$loadvm->show;
my $status = $loadvm->run;
$loadvm->hide;
if( $status eq "ok" ){
my $filename = $loadvm->get_filename();
sendcomand( "loadvm \"".$filename."\"" );
}
}
sub on_quit_activate {
gtk_main_quit();
}
sub on_floppy_a_default_activate {
sendcomand( "change fda \"".$default_floppy_a."\"" );
}
sub on_floppy_a_fd0_activate {
sendcomand( "change fda \"/dev/fd0\"" );
}
sub on_floppy_a_null_activate {
sendcomand( "change fda \"/dev/null\"" );
}
sub on_floppy_a_other_activate {
$openfile->show;
my $status = $openfile->run;
$openfile->hide;
if( $status eq "ok" ){
my $filename = $openfile->get_filename();
sendcomand( "change fda \"".$filename."\"" );
}
}
sub on_eject_a_activate {
sendcomand( "eject -f fda" );
}
sub on_floppy_b_default_activate {
sendcomand( "change fdb \"".$default_floppy_b."\"" );
}
sub on_floppy_b_fd0_activate {
sendcomand( "change fdb \"/dev/fd0\"" );
}
sub on_floppy_b_null_activate {
sendcomand( "change fdb \"/dev/null\"" );
}
sub on_floppy_b_other_activate {
$openfile->show;
my $status = $openfile->run;
$openfile->hide;
if( $status eq "ok" ){
my $filename = $openfile->get_filename();
sendcomand( "change fdb \"".$filename."\"" );
}
}
sub on_eject_b_activate {
sendcomand( "eject -f fdb" );
}
sub on_cdrom_default_activate {
sendcomand( "change cdrom \"".$default_cdrom."\"" );
}
sub on_cdrom_cdrom_activate {
sendcomand( "change cdrom \"/dev/cdrom\"" );
}
sub on_cdrom_null_activate {
sendcomand( "change cdrom \"/dev/null\"" );
}
sub on_cdrom_other_activate {
$openfile->show;
my $status = $openfile->run;
$openfile->hide;
if( $status eq "ok" ){
my $filename = $openfile->get_filename();
sendcomand( "change cdrom \"".$filename."\"" );
}
}
sub on_eject_cdrom_activate {
sendcomand( "eject -f cdrom" );
}
sub on_usb_connect_activate{
if( $usbhost == 0 and $usb == 0 ){
$usbhostlog="";
sendcomand( "info usbhost" );
$usbhost = 1;
}
}
sub usb_connect_act{
#print "starting usb_connect_act\n";
my @temp = split( /\n/, $usbhostlog);
#$usbhostmenu->destroy();
#$usbhostmenu = new Gtk2::Menu(); # Don't need to show menus
$i=0;
foreach( @temp ){
if( $_=~/Class/ ){
$_=~s/.+USB device (.+), (.+)/\1\*\2/;
@tmp = split( /\*/, $_ );
if( not $usbhostmenuitems[$i] ){
$usbhostmenuitems[$i] = new Gtk2::MenuItem( $tmp[0]." -> ".$tmp[1] );
$usbhostmenuitems[$i]->signal_connect( 'activate', usb_connect );
$usbhostmenu->append($usbhostmenuitems[$i]);
$usbhostmenuitems[$i]->show();
} else {
$usbhostmenuitems[$i]->get_child->set_label( $tmp[0]." -> ".$tmp[1] );
$usbhostmenuitems[$i]->show();
}
$i++;
#print "menu ".$tmp[0]." ".$tmp[1]."\n";
}
}
while( $usbhostmenuitems[$i] ){
$usbhostmenuitems[$i]->get_child->set_label( "" );
$usbhostmenuitems[$i]->hide();
$i++;
}
#$gladexml->get_widget('usb_connect')->set_submenu( $usb_menu );
#print "stoping usb_connect_act\n";
}
sub on_usb_disconnect_activate{
if( $usbhost == 0 and $usb == 0 ){
$usblog="";
sendcomand( "info usb" );
$usb = 1;
}
}
sub usb_disconnect_act{
#print "starting usb_disconnect_act\n";
my @temp = split( /\n/, $usblog);
#$usbmenu->destroy();
#$usbmenu = new Gtk2::Menu(); # Don't need to show menus
$i=0;
foreach( @temp ){
if( $_=~/Device/ ){
$_=~s/.+Device (.+), .+/\1/;
if( not $usbmenuitems[$i] ){
$usbmenuitems[$i] = new Gtk2::MenuItem( "Device ".$_ );
$usbmenuitems[$i]->signal_connect( 'activate', usb_disconnect );
$usbmenu->append($usbmenuitems[$i]);
$usbmenuitems[$i]->show();
} else {
$usbmenuitems[$i]->get_child->set_label( "Device ".$_ );
$usbmenuitems[$i]->show();
}
$i++;
}
}
while( $usbmenuitems[$i] ){
$usbmenuitems[$i]->get_child->set_label( "" );
$usbmenuitems[$i]->hide();
$i++;
}
#$gladexml->get_widget('usb_disconnect')->set_submenu( $usb_menu );
#print "stoping usb_disconnect_act\n";
}
sub on_serial1_default_activate {
sendcomand( "change serial \"".$default_serial1."\"" );
}
sub on_serial1_ttys0_activate {
sendcomand( "change serial \"/dev/ttyS0\"" );
}
sub on_serial1_null_activate {
sendcomand( "change serial \"/dev/null\"" );
}
sub on_serial1_other_activate {
$openfile->show;
my $status = $openfile->run;
$openfile->hide;
if( $status eq "ok" ){
my $filename = $openfile->get_filename();
sendcomand( "change serial \"".$filename."\"" );
}
}
sub on_parport_default_activate {
sendcomand( "change parport \"".$default_parport."\"" );
}
sub on_parport_parport0_activate {
sendcomand( "change parport \"/dev/parport0\"" );
}
sub on_parport_null_activate {
sendcomand( "change parport \"/dev/null\"" );
}
sub on_parport_other_activate {
$openfile->show;
my $status = $openfile->run;
$openfile->hide;
if( $status eq "ok" ){
my $filename = $openfile->get_filename();
sendcomand( "change parport \"".$filename."\"" );
}
}
sub on_suspend_activate {
sendcomand( "stop" );
sendcomand( "screendump \"".$suspend_dir."/".$suspend_file.".ppm\"" );
sendcomand( "savevm \"".$suspend_dir."/".$suspend_file.".vm\"" );
sendcomand( "commit" );
sendcomand( "quit" );
gtk_main_quit();
}
sub on_pause_activate {
sendcomand( "stop" );
}
sub on_continue_activate {
sendcomand( "c" );
}
sub on_power_off_activate {
sendcomand( "system_powerdown" );
}
sub on_reset_activate {
sendcomand( "system_reset" );
}
sub on_commit_activate {
sendcomand( "commit" );
}
sub on_quit_qemu_activate {
sendcomand( "quit" );
gtk_main_quit();
}
sub on_help_activate {
$info->show;
$info->run;
$info->hide;
}
sub on_info_activate {
$info->show;
$info->run;
$info->hide;
}
sub on_sendkeys_ctrl_alt_delete_activate {
sendcomand( "sendkey ctrl-alt-delete" );
}
sub on_sendkeys_ctrl_alt_f1_activate {
sendcomand( "sendkey ctrl-alt-f1" );
}
sub on_sendkeys_ctrl_alt_f2_activate {
sendcomand( "sendkey ctrl-alt-f2" );
}
sub on_sendkeys_ctrl_alt_f3_activate {
sendcomand( "sendkey ctrl-alt-f3" );
}
sub on_sendkeys_ctrl_alt_f4_activate {
sendcomand( "sendkey ctrl-alt-f4" );
}
sub on_sendkeys_ctrl_alt_f5_activate {
sendcomand( "sendkey ctrl-alt-f5" );
}
sub on_sendkeys_ctrl_alt_f6_activate {
sendcomand( "sendkey ctrl-alt-f6" );
}
sub on_sendkeys_ctrl_alt_f7_activate {
sendcomand( "sendkey ctrl-alt-f7" );
}
sub on_sendkeys_ctrl_alt_f8_activate {
sendcomand( "sendkey ctrl-alt-f8" );
}
sub on_sendkeys_ctrl_alt_f9_activate {
sendcomand( "sendkey ctrl-alt-f9" );
}
sub on_sendkeys_ctrl_alt_f10_activate {
sendcomand( "sendkey ctrl-alt-f10" );
}
sub on_sendkeys_ctrl_alt_f11_activate {
sendcomand( "sendkey ctrl-alt-f11" );
}
sub on_sendkeys_ctrl_alt_f12_activate {
sendcomand( "sendkey ctrl-alt-f12" );
}
sub on_shell_activate {
$shellwindow->show;
}
sub on_shellwindow_delete_event {
$shellwindow->hide;
return TRUE;
}
sub on_sendbutton_key_press_event {
sendcomand( $gladexml->get_widget('sendtext')->get_text() );
$gladexml->get_widget('sendtext')->set_text("");
}
sub usb_connect{
$tmp = $_[0]->get_child()->get_label();
$tmp =~s/(.+) -> .+/\1/;
#print( "usb_add host:".$tmp."\n" );
sendcomand( "usb_add host:".$tmp );
}
sub usb_disconnect{
$tmp = $_[0]->get_child()->get_label();
$tmp =~s/Device (.+)/\1/;
#print( "usb_del ".$tmp."\n" );
sendcomand( "usb_del ".$tmp );
}