Hello community, here is the log from the commit of package virt-manager checked in at Mon Feb 19 23:39:45 CET 2007. -------- --- arch/i386/virt-manager/virt-manager.changes 2007-01-31 19:33:51.000000000 +0100 +++ virt-manager/virt-manager.changes 2007-02-17 02:28:13.000000000 +0100 @@ -1,0 +2,12 @@ +Tue Feb 13 12:53:38 MST 2007 - ccoffing@novell.com + +- Update to latest hg; grabs mouse for better mouse tracking. + (#240387) +- Don't lose mouse grab on every keystroke +- Disable menubar & toolbar when pointer is in VM window, to avoid + key conflicts. (#240001) +- Fix syntax to avoid deprecation warnings (don't raise strings). +- YaST integration: default to managing on-box; detach from yast + control center. + +------------------------------------------------------------------- New: ---- virtman-console-keys.diff virtman-deprecated-raise.diff virtman-detach-yast.diff virtman-error.diff virtman-limit-popup.diff virtman-no-ungrab.diff ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ virt-manager.spec ++++++ --- /var/tmp/diff_new_pack.dK7450/_old 2007-02-19 23:39:01.000000000 +0100 +++ /var/tmp/diff_new_pack.dK7450/_new 2007-02-19 23:39:01.000000000 +0100 @@ -24,7 +24,7 @@ Group: System/Monitoring Autoreqprov: yes Version: 0.3.0 -Release: 1 +Release: 5 Summary: Virtual Machine Manager Source0: virt-manager-0.3.0.tar.bz2 Source1: rhpl-exception.py @@ -43,6 +43,12 @@ Patch0: virtman-desktop.diff Patch1: virtman-install.diff Patch2: virtman-type-register.diff +Patch3: virtman-deprecated-raise.diff +Patch5: virtman-console-keys.diff +Patch6: virtman-detach-yast.diff +Patch7: virtman-no-ungrab.diff +Patch8: virtman-limit-popup.diff +Patch9: virtman-error.diff Requires: gconf2 %description @@ -62,6 +68,12 @@ %patch0 -p1 %patch1 -p1 %patch2 -p1 +%patch3 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch9 -p1 %build #automake @@ -129,7 +141,16 @@ %dir %{_datadir}/dbus-1/services %dir %{_datadir}/applications/YaST2 -%changelog -n virt-manager +%changelog +* Tue Feb 13 2007 - ccoffing@novell.com +- Update to latest hg; grabs mouse for better mouse tracking. + (#240387) +- Don't lose mouse grab on every keystroke +- Disable menubar & toolbar when pointer is in VM window, to avoid + key conflicts. (#240001) +- Fix syntax to avoid deprecation warnings (don't raise strings). +- YaST integration: default to managing on-box; detach from yast + control center. * Mon Jan 29 2007 - ccoffing@novell.com - Fix desktop file. (#239275) - Update to 0.3.0 (updated translations; no code changes) ++++++ virt-manager-0.3.0.tar.bz2 ++++++ diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/virt-manager-0.3.0/src/virt-manager.glade new/virt-manager-0.3.0/src/virt-manager.glade --- old/virt-manager-0.3.0/src/virt-manager.glade 2007-01-17 22:48:30.000000000 +0100 +++ new/virt-manager-0.3.0/src/virt-manager.glade 2007-02-12 20:38:28.000000000 +0100 @@ -341,7 +341,7 @@ <property name="justify">GTK_JUSTIFY_RIGHT</property> <property name="wrap">False</property> <property name="selectable">False</property> - <property name="xalign">0.5</property> + <property name="xalign">1</property> <property name="yalign">0.5</property> <property name="xpad">0</property> <property name="ypad">0</property> @@ -4255,14 +4255,16 @@ <widget class="GtkWindow" id="vmm-progress"> <property name="visible">True</property> - <property name="title" translatable="yes">Saving VM Image</property> + <property name="title" translatable="yes">Operation in progress</property> <property name="type">GTK_WINDOW_TOPLEVEL</property> <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property> <property name="modal">False</property> + <property name="default_width">300</property> + <property name="default_height">200</property> <property name="resizable">True</property> <property name="destroy_with_parent">False</property> <property name="decorated">True</property> - <property name="skip_taskbar_hint">False</property> + <property name="skip_taskbar_hint">True</property> <property name="skip_pager_hint">False</property> <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> @@ -4276,10 +4278,10 @@ <property name="yalign">0.5</property> <property name="xscale">1</property> <property name="yscale">1</property> - <property name="top_padding">5</property> - <property name="bottom_padding">5</property> - <property name="left_padding">12</property> - <property name="right_padding">12</property> + <property name="top_padding">0</property> + <property name="bottom_padding">3</property> + <property name="left_padding">3</property> + <property name="right_padding">3</property> <child> <widget class="GtkVBox" id="vbox13"> @@ -4288,18 +4290,73 @@ <property name="spacing">5</property> <child> - <widget class="GtkLabel" id="pbar-text"> + <widget class="GtkHBox" id="hbox50"> <property name="visible">True</property> - <property name="label" translatable="yes">Please wait...</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkImage" id="image99"> + <property name="visible">True</property> + <property name="icon_size">4</property> + <property name="icon_name">gtk-info</property> + <property name="xalign">0.5</property> + <property name="yalign">0</property> + <property name="xpad">3</property> + <property name="ypad">10</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="pbar-text"> + <property name="visible">True</property> + <property name="label" translatable="yes">Please wait a few moments...</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">True</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">10</property> + <property name="ypad">10</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="pbar-stage"> + <property name="visible">True</property> + <property name="label" translatable="yes">Processing...</property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> <property name="wrap">False</property> <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">3</property> + <property name="ypad">3</property> <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> <property name="width_chars">-1</property> <property name="single_line_mode">False</property> diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/virt-manager-0.3.0/src/virtManager/asyncjob.py new/virt-manager-0.3.0/src/virtManager/asyncjob.py --- old/virt-manager-0.3.0/src/virtManager/asyncjob.py 2007-01-17 22:48:30.000000000 +0100 +++ new/virt-manager-0.3.0/src/virtManager/asyncjob.py 2007-02-12 20:38:28.000000000 +0100 @@ -35,54 +35,68 @@ def run(self): threading.Thread.run(self) - def __init__(self, config, callback, args=None, title="Progress"): + def __init__(self, config, callback, args=None, text=_("Please wait a few moments..."), title=_("Operation in progress")): self.__gobject_init__() self.config = config - self.pbar_glade = gtk.glade.XML(self.config.get_glade_file(), "vmm-progress", domain="virt-manager") - self.pbar_win = self.pbar_glade.get_widget("vmm-progress") - self.pbar_text = self.pbar_glade.get_widget("pbar-text") - self.pbar = self.pbar_glade.get_widget("pbar") - self.pbar_win.set_title(title) - self.pbar_win.hide() + + self.window = gtk.glade.XML(self.config.get_glade_file(), "vmm-progress", domain="virt-manager") + self.window.get_widget("pbar-text").set_text(text) + + self.topwin = self.window.get_widget("vmm-progress") + self.topwin.set_title(title) + self.topwin.hide() + + self.stage = self.window.get_widget("pbar-stage") + self.pbar = self.window.get_widget("pbar") + args.append(self) self.bg_thread = vmmAsyncJob.asyncJobWorker(callback, args) self.is_pulsing = True def run(self): self.timer = gobject.timeout_add (100, self.exit_if_necessary) - self.pbar_win.present() - self.pbar_win.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) + self.topwin.present() + self.topwin.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) self.bg_thread.start() gtk.main() gobject.source_remove(self.timer) self.timer = 0 - self.pbar_win.destroy() + self.topwin.destroy() - def pulse_pbar(self, text=None): + def pulse_pbar(self, progress="", stage=None): self.is_pulsing = True - if text is not None: - self.pbar_text.set_text(text) + self.pbar.set_text(progress) + if stage is not None: + self.stage.set_text(stage) + else: + self.stage.set_text(_("Processing...")) - def set_pbar_fraction(self, frac, text=None): + def set_pbar_fraction(self, frac, progress, stage=None): # callback for progress meter when file size is known self.is_pulsing=False - if text is not None: - self.pbar_text.set_text(text) + if stage is not None: + self.stage.set_text(stage) + else: + self.stage.set_text(_("Processing...")) + self.pbar.set_text(progress) self.pbar.set_fraction(frac) - def set_pbar_done(self, text=None): + def set_pbar_done(self, progress, stage=None): #callback for progress meter when progress is done self.is_pulsing=False - if text is not None: - self.pbar_text.set_text(text) + if stage is not None: + self.stage.set_text(stage) + else: + self.stage.set_text(_("Completed")) + self.pbar.set_text(progress) self.pbar.set_fraction(1) - + def exit_if_necessary(self): - if(self.bg_thread.isAlive()): + if self.bg_thread.isAlive(): if(self.is_pulsing): self.pbar.pulse() return True else: gtk.main_quit() return False - + diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/virt-manager-0.3.0/src/virtManager/console.py new/virt-manager-0.3.0/src/virtManager/console.py --- old/virt-manager-0.3.0/src/virtManager/console.py 2007-01-17 22:48:30.000000000 +0100 +++ new/virt-manager-0.3.0/src/virtManager/console.py 2007-02-12 20:38:28.000000000 +0100 @@ -23,6 +23,7 @@ import libvirt import sys import logging +import dbus from vncViewer.vnc import GRFBViewer @@ -45,7 +46,8 @@ topwin = self.window.get_widget("vmm-console") topwin.hide() - topwin.set_title(vm.get_name() + " " + topwin.get_title()) + self.title = vm.get_name() + " " + topwin.get_title() + topwin.set_title(self.title) self.window.get_widget("control-shutdown").set_icon_widget(gtk.Image()) self.window.get_widget("control-shutdown").get_icon_widget().set_from_file(config.get_icon_dir() + "/icon_shutdown.png") @@ -53,6 +55,9 @@ self.vncViewer = GRFBViewer(topwin, autograbkey=True) else: self.vncViewer = GRFBViewer(topwin, autograbkey=False) + self.vncViewer.connect("pointer-grabbed", self.notify_grabbed) + self.vncViewer.connect("pointer-ungrabbed", self.notify_ungrabbed) + self.window.get_widget("console-vnc-align").add(self.vncViewer) self.vncViewer.connect("size-request", self.autosize) self.vncViewer.show() @@ -109,6 +114,32 @@ self.window.get_widget("console-vnc-vp").set_size_request(vncWidth+2, vncHeight+2) + def notify_grabbed(self, src): + topwin = self.window.get_widget("vmm-console") + try: + bus = dbus.SessionBus() + noteSvr = bus.get_object("org.freedesktop.Notifications", "/org/freedesktop/Notifications") + noteObj = dbus.Interface(noteSvr, "org.freedesktop.Notifications") + (x, y) = topwin.window.get_origin() + noteObj.Notify(topwin.get_title(), + 0, + '', + "Pointer grabbed", + "The mouse pointer has been restricted to the virtual " + + "console window. To release the pointer press the key pair " + + "Ctrl+Alt", + [], + {"desktop-entry": "virt-manager", + "x": x+200, "y": y}, + 5 * 1000); + except Exception, e: + pass + topwin.set_title(_("Press Ctrl+Alt to release mouse.") + " " + self.title) + + def notify_ungrabbed(self, src): + topwin = self.window.get_widget("vmm-console") + topwin.set_title(self.title) + def keygrab_changed(self, src, ignore1=None,ignore2=None,ignore3=None): if self.config.get_console_keygrab() == 2: self.vncViewer.set_autograb_keyboard(True) diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/virt-manager-0.3.0/src/virtManager/create.py new/virt-manager-0.3.0/src/virtManager/create.py --- old/virt-manager-0.3.0/src/virtManager/create.py 2007-01-31 19:30:52.000000000 +0100 +++ new/virt-manager-0.3.0/src/virtManager/create.py 2007-02-12 20:38:28.000000000 +0100 @@ -58,34 +58,38 @@ else: text = self.basename if self.size is None: - self.asyncjob.pulse_pbar(text) + out = " %5sB" % (0) + self.asyncjob.pulse_pbar(out, text) else: - self.asyncjob.set_pbar_fraction(0, text) + out = "%3i%% %5sB" % (0, 0) + self.asyncjob.set_pbar_fraction(0, out, text) def _do_update(self, amount_read, now=None): - fread = progress.format_number(amount_read) - #self.size = None if self.text is not None: text = self.text else: text = self.basename + fread = progress.format_number(amount_read) if self.size is None: - out = '\r%-60.60s %5sB' % \ - (text, fread) - self.asyncjob.pulse_pbar(out) + out = " %5sB" % (fread) + self.asyncjob.pulse_pbar(out, text) else: frac = self.re.fraction_read() - out = '\r%-25.25s %3i%% %5sB' % \ - (text, frac*100, fread) - self.asyncjob.set_pbar_fraction(frac, out) + out = "%3i%% %5sB" % (frac*100, fread) + self.asyncjob.set_pbar_fraction(frac, out, text) def _do_end(self, amount_read, now=None): if self.text is not None: text = self.text else: text = self.basename - out = '\r%-25.25s 100%%' % text - self.asyncjob.set_pbar_done(out) + fread = progress.format_number(amount_read) + if self.size is None: + out = " %5sB" % (fread) + self.asyncjob.pulse_pbar(out, text) + else: + out = "%3i%% %5sB" % (100, fread) + self.asyncjob.set_pbar_done(out, text) class vmmCreate(gobject.GObject): __gsignals__ = { @@ -399,7 +403,13 @@ # set the memory try: - guest.memory = int(self.get_config_maximum_memory()) + guest.memory = int(self.get_config_initial_memory()) + except ValueError: + self._validation_error_box(_("Invalid memory setting"), e.args[0]) + return + + try: + guest.maxmemory = int(self.get_config_maximum_memory()) except ValueError: self._validation_error_box(_("Invalid memory setting"), e.args[0]) return @@ -442,6 +452,7 @@ "\n Source: " + self.get_config_install_source() + \ "\n Kickstart: " + self.get_config_kickstart_source() + \ "\n Memory: " + str(guest.memory) + \ + "\n Max Memory: " + str(guest.maxmemory) + \ "\n # VCPUs: " + str(guest.vcpus) + \ "\n Filesize: " + str(filesize) + \ "\n Disk image: " + str(self.get_config_disk_image()) +\ @@ -457,9 +468,13 @@ logging.debug("Non-sparse file selected") progWin = vmmAsyncJob(self.config, self.do_install, [guest], - title=_("Creating Virtual Machine")) + title=_("Creating Virtual Machine"), + text=_("The virtual machine is now being created. " + \ + "Allocation of disk storage and retrieval of " + \ + "the installation images may a few minutes " + \ + "to complete.")) progWin.run() - + if self.install_error != None: logging.error("Async job failed to create VM " + str(self.install_error)) self._validation_error_box(_("Guest Install Error"), self.install_error) diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/virt-manager-0.3.0/src/virtManager/details.py new/virt-manager-0.3.0/src/virtManager/details.py --- old/virt-manager-0.3.0/src/virtManager/details.py 2007-01-05 17:01:29.000000000 +0100 +++ new/virt-manager-0.3.0/src/virtManager/details.py 2007-02-12 20:38:28.000000000 +0100 @@ -335,14 +335,14 @@ if self.window.get_widget("config-memory-apply").get_property("sensitive"): self.window.get_widget("config-memory").get_adjustment().upper = self.window.get_widget("config-maxmem").get_adjustment().value else: - self.window.get_widget("config-memory").get_adjustment().value = self.vm.current_memory()/1024 + self.window.get_widget("config-memory").get_adjustment().value = self.vm.get_memory()/1024 self.window.get_widget("config-maxmem").get_adjustment().value = self.vm.maximum_memory()/1024 # XXX hack - changing the value above will have just re-triggered # the callback making apply button sensitive again. So we have to # turn it off again.... self.window.get_widget("config-memory-apply").set_sensitive(False) - self.window.get_widget("state-vm-memory").set_text("%d MB" % (self.vm.current_memory()/1024)) + self.window.get_widget("state-vm-memory").set_text("%d MB" % (self.vm.get_memory()/1024)) def refresh_config_disk(self): self.populate_disk_list() diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/virt-manager-0.3.0/src/virtManager/domain.py new/virt-manager-0.3.0/src/virtManager/domain.py --- old/virt-manager-0.3.0/src/virtManager/domain.py 2007-01-17 22:48:30.000000000 +0100 +++ new/virt-manager-0.3.0/src/virtManager/domain.py 2007-02-12 20:38:28.000000000 +0100 @@ -42,6 +42,7 @@ self.uuid = uuid self.lastStatus = None self.record = [] + self._update_status() def set_handle(self, vm): self.vm = vm @@ -370,7 +371,7 @@ elif self.lastStatus == libvirt.VIR_DOMAIN_CRASHED: return _("Crashed") else: - raise _("Unknown status code") + raise RuntimeError(_("Unknown status code")) def run_status_icon(self): return self.config.get_vm_status_icon(self.status()) diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/virt-manager-0.3.0/src/vncViewer/vnc.py new/virt-manager-0.3.0/src/vncViewer/vnc.py --- old/virt-manager-0.3.0/src/vncViewer/vnc.py 2007-01-05 17:01:29.000000000 +0100 +++ new/virt-manager-0.3.0/src/vncViewer/vnc.py 2007-02-12 20:38:28.000000000 +0100 @@ -174,7 +174,11 @@ "connected": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [str, int]), "authenticated": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, []), "activated": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, []), - "disconnected": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, []) + "disconnected": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, []), + "pointer-grabbed": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, []), + "pointer-ungrabbed": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, []), + "keyboard-grabbed": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, []), + "keyboard-ungrabbed": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, []), } def __init__(self, topwin, autograbkey=False): @@ -185,6 +189,7 @@ self.authenticated = False self.needpw = True self.autograbkey = autograbkey + self.autograbptr = True self.topwin = topwin self.accel_groups = gtk.accel_groups_from_object(topwin) self.preferred_encoding = (rfb.ENCODING_RAW, rfb.ENCODING_DESKTOP_RESIZE) @@ -197,9 +202,10 @@ self.connect("expose-event", self.expose_region) - self.connect("motion-notify-event", self.update_pointer) - self.connect("button-press-event", self.update_pointer) - self.connect("button-release-event", self.update_pointer) + self.connect("motion-notify-event", self.pointer_move) + self.connect("button-press-event", self.pointer_press) + self.connect("button-release-event", self.pointer_release) + self.connect("scroll-event", self.pointer_scroll) self.connect("key-press-event", self.key_press) self.connect("key-release-event", self.key_release) self.connect("enter-notify-event", self.enter_notify) @@ -265,6 +271,10 @@ self.lastKeyVal = None self.lastKeyRepeat = 0 + empty = gtk.gdk.Pixmap(None, 1, 1, 1) + clear = gtk.gdk.Color() + self.nullcursor = gtk.gdk.Cursor(empty, empty, clear, clear, 0, 0) + self.set_events(gtk.gdk.EXPOSURE_MASK | gtk.gdk.LEAVE_NOTIFY_MASK | gtk.gdk.ENTER_NOTIFY_MASK | @@ -364,18 +374,48 @@ mask = mask + 8 if state & gtk.gdk.BUTTON5_MASK: mask = mask + 16 - return mask def take_screenshot(self): return self.fb.clone_pixmap() + def pointer_move(self, win, event): + self.update_pointer(win, event) + + def pointer_press(self, win, event): + if not gtk.gdk.pointer_is_grabbed() and self.will_autograb_pointer(): + self.grab_pointer() + self.update_pointer(win, event) + + def pointer_release(self, win, event): + self.update_pointer(win, event) + + def pointer_scroll(self, win, event): + if self.client != None: + x, y, state = event.window.get_pointer() + newstate = state + if event.direction == gtk.gdk.SCROLL_UP: + newstate = newstate | gtk.gdk.BUTTON4_MASK + else: + newstate = newstate | gtk.gdk.BUTTON5_MASK + self.client.update_pointer(self.state_to_mask(newstate), x, y) + self.client.update_pointer(self.state_to_mask(state), x, y) + def update_pointer(self, win, event): if self.client != None: x, y, state = event.window.get_pointer() self.client.update_pointer(self.state_to_mask(state), x, y) return True + + def will_autograb_pointer(self): + return self.autograbptr + + def set_autograb_pointer(self, grab): + self.autograbptr = grab + if grab == False and gtk.gdk.pointer_is_grabbed(): + self.ungrab_pointer() + def has_grabbed_keyboard(self): return self.grabbedKeyboard @@ -384,18 +424,38 @@ def set_autograb_keyboard(self, grab): self.autograbkey = grab + if grab == False and grabbedKeyboard: + self.ungrab_keyboard() + + + def grab_pointer(self): + gtk.gdk.pointer_grab(self.window, False, + gtk.gdk.LEAVE_NOTIFY_MASK | + gtk.gdk.ENTER_NOTIFY_MASK | + gtk.gdk.BUTTON_RELEASE_MASK | + gtk.gdk.BUTTON_PRESS_MASK | + gtk.gdk.POINTER_MOTION_MASK | + gtk.gdk.POINTER_MOTION_HINT_MASK, + self.window, self.nullcursor) + self.emit("pointer-grabbed") + + def ungrab_pointer(self): + gtk.gdk.pointer_ungrab() + self.emit("pointer-ungrabbed") def grab_keyboard(self): gtk.gdk.keyboard_grab(self.window, False, long(0)) for g in self.accel_groups: self.topwin.remove_accel_group(g) self.grabbedKeyboard = True + self.emit("keyboard-grabbed") def ungrab_keyboard(self): gtk.gdk.keyboard_ungrab() for g in self.accel_groups: self.topwin.add_accel_group(g) self.grabbedKeyboard = False + self.emit("keyboard-ungrabbed") def enter_notify(self, win, event): if self.autograbkey: @@ -417,6 +477,13 @@ def key_press(self, win, event): + # Allow Ctrl+Alt+Esc to break the pointer grab + if self.will_autograb_pointer(): + if event.state & gtk.gdk.CONTROL_MASK and event.state & gtk.gdk.MOD1_MASK and gtk.gdk.pointer_is_grabbed(): + self.ungrab_pointer() + return + + self.ungrab_pointer() # Key handling in VNC is screwy. The event.keyval from GTK is # interpreted relative to modifier state. This really messes # up with VNC which has no concept of modifiers. If we interpret ++++++ virtman-console-keys.diff ++++++ Index: virt-manager-0.3.0/src/virtManager/console.py =================================================================== --- virt-manager-0.3.0.orig/src/virtManager/console.py +++ virt-manager-0.3.0/src/virtManager/console.py @@ -45,6 +45,8 @@ class vmmConsole(gobject.GObject): self.vm = vm topwin = self.window.get_widget("vmm-console") + sens = (self.window.get_widget("menubar2"), + self.window.get_widget("console-toolbar")) topwin.hide() self.title = vm.get_name() + " " + topwin.get_title() topwin.set_title(self.title) @@ -52,9 +54,9 @@ class vmmConsole(gobject.GObject): self.window.get_widget("control-shutdown").get_icon_widget().set_from_file(config.get_icon_dir() + "/icon_shutdown.png") if self.config.get_console_keygrab() == 2: - self.vncViewer = GRFBViewer(topwin, autograbkey=True) + self.vncViewer = GRFBViewer(topwin, sens, autograbkey=True) else: - self.vncViewer = GRFBViewer(topwin, autograbkey=False) + self.vncViewer = GRFBViewer(topwin, sens, autograbkey=False) self.vncViewer.connect("pointer-grabbed", self.notify_grabbed) self.vncViewer.connect("pointer-ungrabbed", self.notify_ungrabbed) Index: virt-manager-0.3.0/src/vncViewer/vnc.py =================================================================== --- virt-manager-0.3.0.orig/src/vncViewer/vnc.py +++ virt-manager-0.3.0/src/vncViewer/vnc.py @@ -179,7 +179,7 @@ class GRFBViewer(gtk.DrawingArea): "keyboard-ungrabbed": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, []), } - def __init__(self, topwin, autograbkey=False): + def __init__(self, topwin, sens, autograbkey=False): gtk.DrawingArea.__init__(self) self.fb = GRFBFrameBuffer(self) @@ -189,6 +189,7 @@ class GRFBViewer(gtk.DrawingArea): self.autograbkey = autograbkey self.autograbptr = True self.topwin = topwin + self.sens = sens self.accel_groups = gtk.accel_groups_from_object(topwin) self.preferred_encoding = (rfb.ENCODING_RAW, rfb.ENCODING_DESKTOP_RESIZE) # Current impl of draw_solid is *far* too slow to be practical @@ -445,6 +446,8 @@ class GRFBViewer(gtk.DrawingArea): gtk.gdk.keyboard_grab(self.window, False, long(0)) for g in self.accel_groups: self.topwin.remove_accel_group(g) + for w in self.sens: + w.set_sensitive(False) self.grabbedKeyboard = True self.emit("keyboard-grabbed") @@ -452,6 +455,8 @@ class GRFBViewer(gtk.DrawingArea): gtk.gdk.keyboard_ungrab() for g in self.accel_groups: self.topwin.add_accel_group(g) + for w in self.sens: + w.set_sensitive(True) self.grabbedKeyboard = False self.emit("keyboard-ungrabbed") ++++++ virtman-deprecated-raise.diff ++++++ Index: virt-manager-0.3.0/src/virtManager/domain.py =================================================================== --- virt-manager-0.3.0.orig/src/virtManager/domain.py +++ virt-manager-0.3.0/src/virtManager/domain.py @@ -371,7 +371,7 @@ class vmmDomain(gobject.GObject): elif self.lastStatus == libvirt.VIR_DOMAIN_CRASHED: return _("Crashed") else: - raise RuntimeError(_("Unknown status code")) + raise RuntimeError(_("Unknown status code: %s") % self.lastStatus) def run_status_icon(self): return self.config.get_vm_status_icon(self.status()) @@ -443,9 +443,9 @@ class vmmDomain(gobject.GObject): devdst = child.prop("dev") if srcpath == None: - raise "missing source path" + raise RuntimeError("missing source path") if devdst == None: - raise "missing destination device" + raise RuntimeError("missing destination device") devtype = node.prop("device") if devtype == None: ++++++ virtman-desktop.diff ++++++ --- /var/tmp/diff_new_pack.dK7450/_old 2007-02-19 23:39:02.000000000 +0100 +++ /var/tmp/diff_new_pack.dK7450/_new 2007-02-19 23:39:02.000000000 +0100 @@ -1,20 +1,21 @@ -Index: virt-manager-0.2.6/src/virt-manager.desktop.in +Index: virt-manager-0.3.0/src/virt-manager.desktop.in =================================================================== ---- virt-manager-0.2.6.orig/src/virt-manager.desktop.in -+++ virt-manager-0.2.6/src/virt-manager.desktop.in -@@ -1,9 +1,16 @@ +--- virt-manager-0.3.0.orig/src/virt-manager.desktop.in ++++ virt-manager-0.3.0/src/virt-manager.desktop.in +@@ -1,9 +1,17 @@ [Desktop Entry] ++Version=1.0 Name=Virtual Machine Manager Comment=The virtual machine management tool -Icon=::ICONDIR::/::PACKAGE::-icon.svg -Exec=::PACKAGE:: -+Exec=/usr/bin/virt-manager ++Exec=/usr/bin/virt-manager -c xen Type=Application Terminal=false Encoding=UTF-8 -Categories=System; +Categories=Qt;X-SuSE-YaST; -+X-SuSE-YaST-Call=/usr/bin/virt-manager ++X-SuSE-YaST-Call=/usr/bin/virt-manager -- -c xen --yast +X-SuSE-YaST-Group=Virtualization +X-SuSE-YaST-Argument= +X-SuSE-YaST-RootOnly=true @@ -22,10 +23,10 @@ +X-SuSE-YaST-SortKey= +Icon=yast-network +X-SuSE-translate=true -Index: virt-manager-0.2.6/src/Makefile.am +Index: virt-manager-0.3.0/src/Makefile.am =================================================================== ---- virt-manager-0.2.6.orig/src/Makefile.am -+++ virt-manager-0.2.6/src/Makefile.am +--- virt-manager-0.3.0.orig/src/Makefile.am ++++ virt-manager-0.3.0/src/Makefile.am @@ -14,7 +14,7 @@ libexec_SCRIPTS = $(PACKAGE)-launch gladedir = $(pkgdatadir) glade_DATA = $(PACKAGE).glade ++++++ virtman-detach-yast.diff ++++++ Index: virt-manager-0.3.0/src/virt-manager.py.in =================================================================== --- virt-manager-0.3.0.orig/src/virt-manager.py.in +++ virt-manager-0.3.0/src/virt-manager.py.in @@ -148,6 +148,8 @@ def main(): optParser = OptionParser() optParser.add_option("--profile", dest="profile", help="Generate runtime performance profile stats", metavar="FILE") optParser.set_defaults(uuid=None) + optParser.add_option("-y", "--yast", dest="fork", action="store_true", + help="Allow yast parent to exit") optParser.add_option("-c", "--connect", dest="uri", help="Connect to hypervisor at URI", metavar="URI") optParser.add_option("--no-dbus", action="store_true", dest="nodbus", @@ -199,6 +201,23 @@ def main(): logging.warning("Could not connection to session bus, disabling DBus service " + \ str(sys.exc_info()[0]) + " " + str(sys.exc_info()[1])) + if options.fork: + # Don't have to completely daemonize; just fork off and close + # stdin/stdout/stderr to let yast parent die happily. + pid = os.fork() + if pid == 0: + for fd in (0, 1, 2): + try: + os.close(fd) + except: + continue + os.open('/dev/null', os.O_RDWR) + if os.fork(): + os._exit(0) + else: + os.waitpid(pid, 0) + os._exit(0) + # Finally start the app for real show_engine(engine, options.show, options.uri, options.uuid) if options.profile != None: Index: virt-manager-0.3.0/src/virtManager/engine.py =================================================================== --- virt-manager-0.3.0.orig/src/virtManager/engine.py +++ virt-manager-0.3.0/src/virtManager/engine.py @@ -229,7 +229,7 @@ class vmmEngine: return self.connections[uri]["windowDetails"][uuid] def show_manager(self, uri): - con = self.get_connection(uri) + con = self.get_connection(uri, False) if self.connections[uri]["windowManager"] == None: manager = vmmManager(self.get_config(), ++++++ virtman-error.diff ++++++ Index: virt-manager-0.3.0/src/vncViewer/vnc.py =================================================================== --- virt-manager-0.3.0.orig/src/vncViewer/vnc.py +++ virt-manager-0.3.0/src/vncViewer/vnc.py @@ -423,7 +423,7 @@ class GRFBViewer(gtk.DrawingArea): def set_autograb_keyboard(self, grab): self.autograbkey = grab - if grab == False and grabbedKeyboard: + if grab == False and self.grabbedKeyboard: self.ungrab_keyboard() ++++++ virtman-install.diff ++++++ --- /var/tmp/diff_new_pack.dK7450/_old 2007-02-19 23:39:02.000000000 +0100 +++ /var/tmp/diff_new_pack.dK7450/_new 2007-02-19 23:39:02.000000000 +0100 @@ -1,7 +1,7 @@ -Index: virt-manager-0.2.6/src/virtManager/engine.py +Index: virt-manager-0.3.0/src/virtManager/engine.py =================================================================== ---- virt-manager-0.2.6.orig/src/virtManager/engine.py -+++ virt-manager-0.2.6/src/virtManager/engine.py +--- virt-manager-0.3.0.orig/src/virtManager/engine.py ++++ virt-manager-0.3.0/src/virtManager/engine.py @@ -30,7 +30,7 @@ from virtManager.manager import vmmManag from virtManager.details import vmmDetails from virtManager.console import vmmConsole ++++++ virtman-limit-popup.diff ++++++ Index: virt-manager-0.3.0/src/virtManager/console.py =================================================================== --- virt-manager-0.3.0.orig/src/virtManager/console.py +++ virt-manager-0.3.0/src/virtManager/console.py @@ -43,6 +43,7 @@ class vmmConsole(gobject.GObject): self.window = gtk.glade.XML(config.get_glade_file(), "vmm-console", domain="virt-manager") self.config = config self.vm = vm + self.grab_notifications = 1 topwin = self.window.get_widget("vmm-console") sens = (self.window.get_widget("menubar2"), @@ -118,6 +119,10 @@ class vmmConsole(gobject.GObject): def notify_grabbed(self, src): topwin = self.window.get_widget("vmm-console") + topwin.set_title(_("Press Ctrl+Alt to release mouse.") + " " + self.title) + if not self.grab_notifications: + return + self.grab_notifications -= 1 try: bus = dbus.SessionBus() noteSvr = bus.get_object("org.freedesktop.Notifications", "/org/freedesktop/Notifications") @@ -136,7 +141,6 @@ class vmmConsole(gobject.GObject): 5 * 1000); except Exception, e: pass - topwin.set_title(_("Press Ctrl+Alt to release mouse.") + " " + self.title) def notify_ungrabbed(self, src): topwin = self.window.get_widget("vmm-console") ++++++ virtman-no-ungrab.diff ++++++ Index: virt-manager-0.3.0/src/vncViewer/vnc.py =================================================================== --- virt-manager-0.3.0.orig/src/vncViewer/vnc.py +++ virt-manager-0.3.0/src/vncViewer/vnc.py @@ -482,11 +482,14 @@ class GRFBViewer(gtk.DrawingArea): def key_press(self, win, event): # Allow Ctrl+Alt+Esc to break the pointer grab if self.will_autograb_pointer(): - if event.state & gtk.gdk.CONTROL_MASK and event.state & gtk.gdk.MOD1_MASK and gtk.gdk.pointer_is_grabbed(): + if gtk.gdk.pointer_is_grabbed() and \ + ((event.state & gtk.gdk.CONTROL_MASK and + (event.keyval == gtk.keysyms.Alt_L or event.keyval == gtk.keysyms.Alt_R)) or + (event.state & gtk.gdk.MOD1_MASK and + (event.keyval == gtk.keysyms.Control_L or event.keyval == gtk.keysyms.Control_R))): self.ungrab_pointer() return - self.ungrab_pointer() # Key handling in VNC is screwy. The event.keyval from GTK is # interpreted relative to modifier state. This really messes # up with VNC which has no concept of modifiers. If we interpret ++++++ virtman-type-register.diff ++++++ --- /var/tmp/diff_new_pack.dK7450/_old 2007-02-19 23:39:02.000000000 +0100 +++ /var/tmp/diff_new_pack.dK7450/_new 2007-02-19 23:39:02.000000000 +0100 @@ -1,62 +1,62 @@ -Index: virt-manager-0.2.6/src/virtManager/connect.py +Index: virt-manager-0.3.0/src/virtManager/connect.py =================================================================== ---- virt-manager-0.2.6.orig/src/virtManager/connect.py -+++ virt-manager-0.2.6/src/virtManager/connect.py +--- virt-manager-0.3.0.orig/src/virtManager/connect.py ++++ virt-manager-0.3.0/src/virtManager/connect.py @@ -102,4 +102,3 @@ class vmmConnect(gobject.GObject): self.close() self.emit("completed", uri, readOnly) -gobject.type_register(vmmConnect) -Index: virt-manager-0.2.6/src/virtManager/connection.py +Index: virt-manager-0.3.0/src/virtManager/connection.py =================================================================== ---- virt-manager-0.2.6.orig/src/virtManager/connection.py -+++ virt-manager-0.2.6/src/virtManager/connection.py +--- virt-manager-0.3.0.orig/src/virtManager/connection.py ++++ virt-manager-0.3.0/src/virtManager/connection.py @@ -242,5 +242,4 @@ class vmmConnection(gobject.GObject): uuid.append('-') return "".join(uuid) -gobject.type_register(vmmConnection) -Index: virt-manager-0.2.6/src/virtManager/console.py +Index: virt-manager-0.3.0/src/virtManager/console.py =================================================================== ---- virt-manager-0.2.6.orig/src/virtManager/console.py -+++ virt-manager-0.2.6/src/virtManager/console.py -@@ -423,4 +423,3 @@ class vmmConsole(gobject.GObject): +--- virt-manager-0.3.0.orig/src/virtManager/console.py ++++ virt-manager-0.3.0/src/virtManager/console.py +@@ -454,4 +454,3 @@ class vmmConsole(gobject.GObject): self.ignorePause = False self.ignorePause = False -gobject.type_register(vmmConsole) -Index: virt-manager-0.2.6/src/virtManager/details.py +Index: virt-manager-0.3.0/src/virtManager/details.py =================================================================== ---- virt-manager-0.2.6.orig/src/virtManager/details.py -+++ virt-manager-0.2.6/src/virtManager/details.py +--- virt-manager-0.3.0.orig/src/virtManager/details.py ++++ virt-manager-0.3.0/src/virtManager/details.py @@ -466,4 +466,3 @@ class vmmDetails(gobject.GObject): for d in netList: netsModel.append(None, d) -gobject.type_register(vmmDetails) -Index: virt-manager-0.2.6/src/virtManager/domain.py +Index: virt-manager-0.3.0/src/virtManager/domain.py =================================================================== ---- virt-manager-0.2.6.orig/src/virtManager/domain.py -+++ virt-manager-0.2.6/src/virtManager/domain.py -@@ -509,4 +509,3 @@ class vmmDomain(gobject.GObject): +--- virt-manager-0.3.0.orig/src/virtManager/domain.py ++++ virt-manager-0.3.0/src/virtManager/domain.py +@@ -510,4 +510,3 @@ class vmmDomain(gobject.GObject): memory = int(memory) self.vm.setMaxMemory(memory) -gobject.type_register(vmmDomain) -Index: virt-manager-0.2.6/src/virtManager/manager.py +Index: virt-manager-0.3.0/src/virtManager/manager.py =================================================================== ---- virt-manager-0.2.6.orig/src/virtManager/manager.py -+++ virt-manager-0.2.6/src/virtManager/manager.py +--- virt-manager-0.3.0.orig/src/virtManager/manager.py ++++ virt-manager-0.3.0/src/virtManager/manager.py @@ -597,4 +597,3 @@ class vmmManager(gobject.GObject): data.reverse() cell.set_property('data_array', data) -gobject.type_register(vmmManager) -Index: virt-manager-0.2.6/src/vncViewer/vnc.py +Index: virt-manager-0.3.0/src/vncViewer/vnc.py =================================================================== ---- virt-manager-0.2.6.orig/src/vncViewer/vnc.py -+++ virt-manager-0.2.6/src/vncViewer/vnc.py +--- virt-manager-0.3.0.orig/src/vncViewer/vnc.py ++++ virt-manager-0.3.0/src/vncViewer/vnc.py @@ -113,7 +113,6 @@ class GRFBFrameBuffer(rfb.RFBFrameBuffer def move_cursor(self, x, y): logging.error("Unsupported move_cursor operation requested") @@ -73,7 +73,7 @@ class GRFBViewer(gtk.DrawingArea): -@@ -512,7 +510,6 @@ class GRFBViewer(gtk.DrawingArea): +@@ -579,7 +577,6 @@ class GRFBViewer(gtk.DrawingArea): gc = self.window.new_gc() self.window.draw_drawable(gc, self.fb.get_pixmap(), event.area.x, event.area.y, event.area.x, event.area.y, event.area.width, event.area.height) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org