diff --git a/virt-manager.changes b/virt-manager.changes index 0806102c..a217508f 100644 --- a/virt-manager.changes +++ b/virt-manager.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Thu Sep 5 14:03:32 MDT 2013 - carnold@suse.com + +- bnc#821214 - virt-manager has a big memory leak. + virtman-memleak-disable-graph.patch + virtman-memleak-callbacks.patch + virtman-graph-row-spacing.patch + ------------------------------------------------------------------- Thu Aug 29 15:41:17 MDT 2013 - carnold@suse.com diff --git a/virt-manager.spec b/virt-manager.spec index 9d429c7d..70c6940a 100644 --- a/virt-manager.spec +++ b/virt-manager.spec @@ -34,6 +34,9 @@ Release: 0 Url: http://virt-manager.et.redhat.com Source0: virt-manager-%{version}.tar.bz2 Patch0: virtman-dropped-connection-segfault.patch +Patch1: virtman-memleak-disable-graph.patch +Patch2: virtman-memleak-callbacks.patch +Patch3: virtman-graph-row-spacing.patch Patch50: virtman-desktop.patch Patch51: virtman-cdrom.patch Patch52: virtman-kvm.patch @@ -102,6 +105,9 @@ Authors: %prep %setup -q %patch0 -p1 +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 %patch50 -p1 %patch51 -p1 %patch52 -p1 diff --git a/virtman-graph-row-spacing.patch b/virtman-graph-row-spacing.patch new file mode 100644 index 00000000..50cc6a2f --- /dev/null +++ b/virtman-graph-row-spacing.patch @@ -0,0 +1,110 @@ + +Subject: manager: Use consistent row spacing even if we disable all graphs +From: Cole Robinson crobinso@redhat.com Mon Sep 2 10:43:53 2013 -0400 +Date: Mon Sep 2 10:43:53 2013 -0400: +Git: b86c5b21ec3016f64dcf6e0375fcea166b16bcb7 + + +Index: virt-manager-0.9.5/src/virtManager/manager.py +=================================================================== +--- virt-manager-0.9.5.orig/src/virtManager/manager.py ++++ virt-manager-0.9.5/src/virtManager/manager.py +@@ -48,11 +48,11 @@ ROW_COLOR = 11 + ROW_INSPECTION_OS_ICON = 12 + + # Columns in the tree view +-COL_NAME = 0 +-COL_GUEST_CPU = 1 +-COL_HOST_CPU = 2 +-COL_DISK = 3 +-COL_NETWORK = 4 ++(COL_NAME, ++COL_GUEST_CPU, ++COL_HOST_CPU, ++COL_DISK, ++COL_NETWORK) = range(5) + + rcstring = """ + style "toolbar-style" { +@@ -92,13 +92,6 @@ class vmmManager(vmmGObjectUI): + self.connmenu = gtk.Menu() + self.connmenu_items = {} + +- # There seem to be ref counting issues with calling +- # list.get_column, so avoid it +- self.diskcol = None +- self.netcol = None +- self.guestcpucol = None +- self.hostcpucol = None +- + self.window.connect_signals({ + "on_menu_view_guest_cpu_usage_activate": + (self.toggle_stats_visible, COL_GUEST_CPU), +@@ -133,7 +126,15 @@ class vmmManager(vmmGObjectUI): + "on_menu_help_activate": self.show_help, + }) + ++ # There seem to be ref counting issues with calling ++ # list.get_column, so avoid it ++ self.diskcol = None ++ self.netcol = None ++ self.guestcpucol = None ++ self.hostcpucol = None ++ self.spacer_txt = None + self.init_vmlist() ++ + self.init_stats() + self.init_toolbar() + self.init_context_menus() +@@ -368,27 +369,31 @@ class vmmManager(vmmGObjectUI): + nameCol = gtk.TreeViewColumn(_("Name")) + nameCol.set_expand(True) + nameCol.set_spacing(6) ++ nameCol.set_sort_column_id(COL_NAME) + +- statusCol = nameCol + vmlist.append_column(nameCol) + + status_icon = gtk.CellRendererPixbuf() + status_icon.set_property("stock-size", gtk.ICON_SIZE_DND) +- statusCol.pack_start(status_icon, False) +- statusCol.add_attribute(status_icon, 'icon-name', ROW_STATUS_ICON) +- statusCol.add_attribute(status_icon, 'visible', ROW_IS_VM) ++ nameCol.pack_start(status_icon, False) ++ nameCol.add_attribute(status_icon, 'icon-name', ROW_STATUS_ICON) ++ nameCol.add_attribute(status_icon, 'visible', ROW_IS_VM) + + inspection_os_icon = gtk.CellRendererPixbuf() +- statusCol.pack_start(inspection_os_icon, False) +- statusCol.add_attribute(inspection_os_icon, 'pixbuf', +- ROW_INSPECTION_OS_ICON) +- statusCol.add_attribute(inspection_os_icon, 'visible', ROW_IS_VM) ++ nameCol.pack_start(inspection_os_icon, False) ++ nameCol.add_attribute(inspection_os_icon, 'pixbuf', ++ ROW_INSPECTION_OS_ICON) ++ nameCol.add_attribute(inspection_os_icon, 'visible', ROW_IS_VM) + + name_txt = gtk.CellRendererText() + nameCol.pack_start(name_txt, True) + nameCol.add_attribute(name_txt, 'markup', ROW_MARKUP) + nameCol.add_attribute(name_txt, 'foreground-gdk', ROW_COLOR) +- nameCol.set_sort_column_id(COL_NAME) ++ ++ self.spacer_txt = gtk.CellRendererText() ++ self.spacer_txt.set_property("ypad", 4) ++ self.spacer_txt.set_property("visible", False) ++ nameCol.pack_end(self.spacer_txt, False) + + def make_stats_column(title, colnum): + col = gtk.TreeViewColumn(title) +@@ -1161,6 +1166,10 @@ class vmmManager(vmmGObjectUI): + col.set_visible(do_show) + self.widget(menu).set_active(do_show) + ++ any_visible = any([col.get_visible() for col in ++ [self.netcol, self.diskcol, self.guestcpucol, self.hostcpucol]]) ++ self.spacer_txt.set_property("visible", not any_visible) ++ + def toggle_network_traffic_visible_widget(self, *ignore): + self._toggle_graph_helper( + self.config.is_vmlist_network_traffic_visible(), self.netcol, diff --git a/virtman-memleak-callbacks.patch b/virtman-memleak-callbacks.patch new file mode 100644 index 00000000..f1b88e94 --- /dev/null +++ b/virtman-memleak-callbacks.patch @@ -0,0 +1,192 @@ + +Subject: manager: Separate stats and state update callbacks +From: Cole Robinson crobinso@redhat.com Mon Sep 2 09:09:31 2013 -0400 +Date: Mon Sep 2 09:32:50 2013 -0400: +Git: f141c77c452d4807b516bdc40a0e86235bf5243a + +There's no need to be resetting row keys like VM name, state, on every +'resources-sampled' signals, since we have had finer grained status-changed +and config-changed signals for a while. This seems to reduce the memory +leak on F19 as well. + +Index: virt-manager-0.9.5/src/virtManager/manager.py +=================================================================== +--- virt-manager-0.9.5.orig/src/virtManager/manager.py ++++ virt-manager-0.9.5/src/virtManager/manager.py +@@ -141,9 +141,9 @@ class vmmManager(vmmGObjectUI): + # XXX: Help docs useless/out of date + self.widget("menu_help").hide() + +- self.vm_selected() +- self.widget("vm-list").get_selection().connect("changed", +- self.vm_selected) ++ self.update_current_selection() ++ self.widget("vm-list").get_selection().connect( ++ "changed", self.update_current_selection) + + self.max_disk_rate = 10.0 + self.max_net_rate = 10.0 +@@ -708,9 +708,9 @@ class vmmManager(vmmGObjectUI): + + def vm_added(self, conn, vmuuid): + vm = conn.get_vm(vmuuid) ++ vm.connect("config-changed", self.vm_config_changed) + vm.connect("status-changed", self.vm_status_changed) +- vm.connect("resources-sampled", self.vm_resources_sampled) +- vm.connect("config-changed", self.vm_resources_sampled, True) ++ vm.connect("resources-sampled", self.vm_row_updated) + vm.connect("inspection-changed", self.vm_inspection_changed) + + vmlist = self.widget("vm-list") +@@ -829,7 +829,7 @@ class vmmManager(vmmGObjectUI): + + conn.connect("vm-added", self.vm_added) + conn.connect("vm-removed", self.vm_removed) +- conn.connect("resources-sampled", self.conn_resources_sampled) ++ conn.connect("resources-sampled", self.conn_row_updated) + conn.connect("state-changed", self.conn_state_changed) + conn.connect("connect-error", self._connect_error) + +@@ -854,7 +854,7 @@ class vmmManager(vmmGObjectUI): + continue + + newname = conn.get_pretty_desc_inactive(False, True) +- self.conn_resources_sampled(conn, newname) ++ self.conn_state_changed(conn, newname=newname) + + def remove_conn(self, engine_ignore, uri): + model = self.widget("vm-list").get_model() +@@ -877,6 +877,29 @@ class vmmManager(vmmGObjectUI): + # State/UI updating methods # + ############################# + ++ def vm_row_updated(self, vm): ++ row = self.rows.get(self.vm_row_key(vm), None) ++ if row is None: ++ return ++ self.widget("vm-list").get_model().row_changed(row.path, row.iter) ++ ++ def vm_config_changed(self, vm): ++ if self.vm_row_key(vm) not in self.rows: ++ return ++ ++ row = self.rows[self.vm_row_key(vm)] ++ row[ROW_NAME] = vm.get_name() ++ row[ROW_STATUS] = vm.run_status() ++ row[ROW_STATUS_ICON] = vm.run_status_icon_name() ++ row[ROW_IS_VM_RUNNING] = vm.is_active() ++ row[ROW_MARKUP] = self._build_vm_markup(row) ++ ++ desc = vm.get_description() ++ if not uihelpers.can_set_row_none: ++ desc = desc or "" ++ row[ROW_HINT] = util.xml_escape(desc) ++ self.vm_row_updated(vm) ++ + def vm_status_changed(self, vm, oldstatus, newstatus): + ignore = newstatus + ignore = oldstatus +@@ -887,7 +910,7 @@ class vmmManager(vmmGObjectUI): + missing = True + for row in range(model.iter_n_children(parent)): + _iter = model.iter_nth_child(parent, row) +- if model.get_value(_iter, ROW_KEY) == vm.get_uuid(): ++ if model.get_value(_iter, ROW_HANDLE) == vm: + missing = False + break + +@@ -895,27 +918,8 @@ class vmmManager(vmmGObjectUI): + self._append_vm(model, vm, vm.conn) + + # Update run/shutdown/pause button states +- self.vm_selected() +- self.vm_resources_sampled(vm) +- +- def vm_resources_sampled(self, vm, config_changed=False): +- vmlist = self.widget("vm-list") +- model = vmlist.get_model() +- +- if self.vm_row_key(vm) not in self.rows: +- return +- +- row = self.rows[self.vm_row_key(vm)] +- row[ROW_NAME] = vm.get_name() +- row[ROW_STATUS] = vm.run_status() +- row[ROW_STATUS_ICON] = vm.run_status_icon_name() +- row[ROW_IS_VM_RUNNING] = vm.is_active() +- row[ROW_MARKUP] = self._build_vm_markup(row) +- +- if config_changed: +- row[ROW_HINT] = util.xml_escape(vm.get_description()) +- +- model.row_changed(row.path, row.iter) ++ self.update_current_selection() ++ self.vm_config_changed(vm) + + def vm_inspection_changed(self, vm): + vmlist = self.widget("vm-list") +@@ -927,7 +931,7 @@ class vmmManager(vmmGObjectUI): + row = self.rows[self.vm_row_key(vm)] + row[ROW_INSPECTION_OS_ICON] = \ + self.get_inspection_icon_pixbuf(vm, 16, 16) +- model.row_changed(row.path, row.iter) ++ self.vm_row_updated(vm) + + def get_inspection_icon_pixbuf(self, vm, w, h): + # libguestfs gives us the PNG data as a string. +@@ -943,13 +947,7 @@ class vmmManager(vmmGObjectUI): + except: + return None + +- def conn_state_changed(self, conn): +- self.conn_resources_sampled(conn) +- self.vm_selected() +- +- def conn_resources_sampled(self, conn, newname=None): +- vmlist = self.widget("vm-list") +- model = vmlist.get_model() ++ def conn_state_changed(self, conn, newname=None): + row = self.rows[conn.get_uri()] + + if newname: +@@ -964,20 +962,27 @@ class vmmManager(vmmGObjectUI): + if conn.get_state() in [vmmConnection.STATE_DISCONNECTED, + vmmConnection.STATE_CONNECTING]: + # Connection went inactive, delete any VM child nodes +- parent = self.rows[conn.get_uri()].iter ++ parent = row.iter + if parent is not None: ++ model = self.widget("vm-list").get_model() + child = model.iter_children(parent) + while child is not None: +- del self.rows[self.vm_row_key(model.get_value(child, +- ROW_HANDLE))] ++ vm = model[child][ROW_HANDLE] ++ del self.rows[self.vm_row_key(vm)] + model.remove(child) + child = model.iter_children(parent) + ++ self.conn_row_updated(conn) ++ self.update_current_selection() ++ ++ def conn_row_updated(self, conn): ++ row = self.rows[conn.get_uri()] ++ + self.max_disk_rate = max(self.max_disk_rate, conn.disk_io_max_rate()) + self.max_net_rate = max(self.max_net_rate, + conn.network_traffic_max_rate()) + +- model.row_changed(row.path, row.iter) ++ self.widget("vm-list").get_model().row_changed(row.path, row.iter) + + def change_run_text(self, can_restore): + if can_restore: +@@ -989,7 +994,7 @@ class vmmManager(vmmGObjectUI): + self.vmmenu_items["run"].get_child().set_label(text) + self.widget("vm-run").set_label(strip_text) + +- def vm_selected(self, ignore=None): ++ def update_current_selection(self, ignore=None): + conn = self.current_conn() + vm = self.current_vm() + diff --git a/virtman-memleak-disable-graph.patch b/virtman-memleak-disable-graph.patch new file mode 100644 index 00000000..6bcec498 --- /dev/null +++ b/virtman-memleak-disable-graph.patch @@ -0,0 +1,160 @@ + +Subject: manager: Disable graph data func if graph isn't visible +From: Cole Robinson crobinso@redhat.com Sun Sep 1 21:35:23 2013 -0400 +Date: Mon Sep 2 08:42:25 2013 -0400: +Git: db7db9ab47dd00d746cf8a3359c1c26dbfcfa50e + +Seems like pygobject is a bit leaky with tree row accesses, and +the cell cb hammers on that quite a bit, even if the graph isn't showing. + +Index: virt-manager-0.9.5/src/virtManager/manager.py +=================================================================== +--- virt-manager-0.9.5.orig/src/virtManager/manager.py ++++ virt-manager-0.9.5/src/virtManager/manager.py +@@ -249,15 +249,11 @@ class vmmManager(vmmGObjectUI): + self.config.on_stats_enable_net_poll_changed(self.enable_polling, + COL_NETWORK)) + ++ self.toggle_guest_cpu_usage_visible_widget() ++ self.toggle_host_cpu_usage_visible_widget() ++ self.toggle_disk_io_visible_widget() ++ self.toggle_network_traffic_visible_widget() + +- self.widget("menu_view_stats_guest_cpu").set_active( +- self.config.is_vmlist_guest_cpu_usage_visible()) +- self.widget("menu_view_stats_host_cpu").set_active( +- self.config.is_vmlist_host_cpu_usage_visible()) +- self.widget("menu_view_stats_disk").set_active( +- self.config.is_vmlist_disk_io_visible()) +- self.widget("menu_view_stats_network").set_active( +- self.config.is_vmlist_network_traffic_visible()) + + def init_toolbar(self): + self.widget("vm-new").set_icon_name("vm_new") +@@ -394,7 +390,7 @@ class vmmManager(vmmGObjectUI): + nameCol.add_attribute(name_txt, 'foreground-gdk', ROW_COLOR) + nameCol.set_sort_column_id(COL_NAME) + +- def make_stats_column(title, datafunc, is_visible, colnum): ++ def make_stats_column(title, colnum): + col = gtk.TreeViewColumn(title) + col.set_min_width(140) + txt = gtk.CellRendererText() +@@ -406,28 +402,14 @@ class vmmManager(vmmGObjectUI): + col.pack_start(txt, False) + col.add_attribute(img, 'visible', ROW_IS_VM) + col.add_attribute(txt, 'visible', ROW_IS_CONN) +- col.set_cell_data_func(img, datafunc, None) +- col.set_visible(is_visible) + col.set_sort_column_id(colnum) + vmlist.append_column(col) + return col + +- self.guestcpucol = make_stats_column(_("CPU usage"), +- self.guest_cpu_usage_img, +- self.config.is_vmlist_guest_cpu_usage_visible(), +- COL_GUEST_CPU) +- self.hostcpucol = make_stats_column(_("Host CPU usage"), +- self.host_cpu_usage_img, +- self.config.is_vmlist_host_cpu_usage_visible(), +- COL_HOST_CPU) +- self.diskcol = make_stats_column(_("Disk I/O"), +- self.disk_io_img, +- self.config.is_vmlist_disk_io_visible(), +- COL_DISK) +- self.netcol = make_stats_column(_("Network I/O"), +- self.network_traffic_img, +- self.config.is_vmlist_network_traffic_visible(), +- COL_NETWORK) ++ self.guestcpucol = make_stats_column(_("CPU usage"), COL_GUEST_CPU) ++ self.hostcpucol = make_stats_column(_("Host CPU usage"), COL_HOST_CPU) ++ self.diskcol = make_stats_column(_("Disk I/O"), COL_DISK) ++ self.netcol = make_stats_column(_("Network I/O"), COL_NETWORK) + + model.set_sort_func(COL_NAME, self.vmlist_name_sorter) + model.set_sort_func(COL_GUEST_CPU, self.vmlist_guest_cpu_usage_sorter) +@@ -1163,25 +1145,33 @@ class vmmManager(vmmGObjectUI): + current_text = current_text + disabled_text + widget.set_label(current_text) + +- def toggle_network_traffic_visible_widget(self, *ignore): +- val = self.config.is_vmlist_network_traffic_visible() +- self.netcol.set_visible(val) +- self.widget("menu_view_stats_network").set_active(val) ++ def _toggle_graph_helper(self, do_show, col, datafunc, menu): ++ img = -1 ++ for child in col.get_cells(): ++ if isinstance(child, CellRendererSparkline): ++ img = child ++ datafunc = do_show and datafunc or None ++ ++ col.set_cell_data_func(img, datafunc, None) ++ col.set_visible(do_show) ++ self.widget(menu).set_active(do_show) + ++ def toggle_network_traffic_visible_widget(self, *ignore): ++ self._toggle_graph_helper( ++ self.config.is_vmlist_network_traffic_visible(), self.netcol, ++ self.network_traffic_img, "menu_view_stats_network") + def toggle_disk_io_visible_widget(self, *ignore): +- val = self.config.is_vmlist_disk_io_visible() +- self.diskcol.set_visible(val) +- self.widget("menu_view_stats_disk").set_active(val) +- ++ self._toggle_graph_helper( ++ self.config.is_vmlist_disk_io_visible(), self.diskcol, ++ self.disk_io_img, "menu_view_stats_disk") + def toggle_guest_cpu_usage_visible_widget(self, *ignore): +- val = self.config.is_vmlist_guest_cpu_usage_visible() +- self.guestcpucol.set_visible(val) +- self.widget("menu_view_stats_guest_cpu").set_active(val) +- ++ self._toggle_graph_helper( ++ self.config.is_vmlist_guest_cpu_usage_visible(), self.guestcpucol, ++ self.guest_cpu_usage_img, "menu_view_stats_guest_cpu") + def toggle_host_cpu_usage_visible_widget(self, *ignore): +- val = self.config.is_vmlist_host_cpu_usage_visible() +- self.hostcpucol.set_visible(val) +- self.widget("menu_view_stats_host_cpu").set_active(val) ++ self._toggle_graph_helper( ++ self.config.is_vmlist_host_cpu_usage_visible(), self.hostcpucol, ++ self.host_cpu_usage_img, "menu_view_stats_host_cpu") + + def toggle_stats_visible(self, src, stats_id): + visible = src.get_active() +@@ -1194,7 +1184,7 @@ class vmmManager(vmmGObjectUI): + set_stats[stats_id](visible) + + def guest_cpu_usage_img(self, column_ignore, cell, model, _iter, data): +- obj = model.get_value(_iter, ROW_HANDLE) ++ obj = model[_iter][ROW_HANDLE] + if obj is None: + return + +@@ -1202,7 +1192,7 @@ class vmmManager(vmmGObjectUI): + cell.set_property('data_array', data) + + def host_cpu_usage_img(self, column_ignore, cell, model, _iter, data): +- obj = model.get_value(_iter, ROW_HANDLE) ++ obj = model[_iter][ROW_HANDLE] + if obj is None: + return + +@@ -1210,7 +1200,7 @@ class vmmManager(vmmGObjectUI): + cell.set_property('data_array', data) + + def disk_io_img(self, column_ignore, cell, model, _iter, data): +- obj = model.get_value(_iter, ROW_HANDLE) ++ obj = model[_iter][ROW_HANDLE] + if obj is None: + return + +@@ -1221,7 +1211,7 @@ class vmmManager(vmmGObjectUI): + cell.set_property('data_array', data) + + def network_traffic_img(self, column_ignore, cell, model, _iter, data): +- obj = model.get_value(_iter, ROW_HANDLE) ++ obj = model[_iter][ROW_HANDLE] + if obj is None: + return + diff --git a/virtman-slow-mouse.patch b/virtman-slow-mouse.patch index e71062f6..f010ec16 100644 --- a/virtman-slow-mouse.patch +++ b/virtman-slow-mouse.patch @@ -10,7 +10,7 @@ Index: virt-manager-0.9.5/src/virtManager/manager.py =================================================================== --- virt-manager-0.9.5.orig/src/virtManager/manager.py +++ virt-manager-0.9.5/src/virtManager/manager.py -@@ -787,7 +787,7 @@ class vmmManager(vmmGObjectUI): +@@ -774,7 +774,7 @@ class vmmManager(vmmGObjectUI): row.insert(ROW_STATUS, vm.run_status()) row.insert(ROW_STATUS_ICON, vm.run_status_icon_name()) row.insert(ROW_KEY, vm.get_uuid()) @@ -19,12 +19,12 @@ Index: virt-manager-0.9.5/src/virtManager/manager.py row.insert(ROW_IS_CONN, False) row.insert(ROW_IS_CONN_CONNECTED, True) row.insert(ROW_IS_VM, True) -@@ -931,7 +931,7 @@ class vmmManager(vmmGObjectUI): - row[ROW_MARKUP] = self._build_vm_markup(row) - - if config_changed: -- row[ROW_HINT] = util.xml_escape(vm.get_description()) -+ row[ROW_HINT] = vm.get_description() - - model.row_changed(row.path, row.iter) +@@ -902,7 +902,7 @@ class vmmManager(vmmGObjectUI): + desc = vm.get_description() + if not uihelpers.can_set_row_none: + desc = desc or "" +- row[ROW_HINT] = util.xml_escape(desc) ++ row[ROW_HINT] = desc + self.vm_row_updated(vm) + def vm_status_changed(self, vm, oldstatus, newstatus): diff --git a/virtman-vminstall.patch b/virtman-vminstall.patch index ddda7861..8f948e5c 100644 --- a/virtman-vminstall.patch +++ b/virtman-vminstall.patch @@ -23,8 +23,8 @@ Index: virt-manager-0.9.5/src/virtManager/manager.py =================================================================== --- virt-manager-0.9.5.orig/src/virtManager/manager.py +++ virt-manager-0.9.5/src/virtManager/manager.py -@@ -260,7 +260,8 @@ class vmmManager(vmmGObjectUI): - self.config.is_vmlist_network_traffic_visible()) +@@ -257,7 +257,8 @@ class vmmManager(vmmGObjectUI): + def init_toolbar(self): - self.widget("vm-new").set_icon_name("vm_new") @@ -33,7 +33,7 @@ Index: virt-manager-0.9.5/src/virtManager/manager.py self.widget("vm-open").set_icon_name("icon_console") uihelpers.build_shutdown_button_menu(self.widget("vm-shutdown"), self.poweroff_vm, -@@ -510,6 +511,9 @@ class vmmManager(vmmGObjectUI): +@@ -497,6 +498,9 @@ class vmmManager(vmmGObjectUI): def new_vm(self, src_ignore=None): self.emit("action-show-create", self.current_conn_uri()) @@ -43,7 +43,7 @@ Index: virt-manager-0.9.5/src/virtManager/manager.py def show_about(self, src_ignore): self.emit("action-show-about") -@@ -1238,6 +1242,7 @@ vmmManager.signal_new(vmmManager, "actio +@@ -1242,6 +1246,7 @@ vmmManager.signal_new(vmmManager, "actio vmmManager.signal_new(vmmManager, "action-show-host", [str]) vmmManager.signal_new(vmmManager, "action-show-preferences", []) vmmManager.signal_new(vmmManager, "action-show-create", [str])