Allow application to remain running if manager window is closed, but a 'Details' window is still present.

This commit is contained in:
Cole Robinson 2008-06-13 12:12:37 -04:00
parent 484bc23638
commit 0f75898fc3
3 changed files with 42 additions and 18 deletions

View File

@ -92,21 +92,23 @@ class vmmDetails(gobject.GObject):
}
def __init__(self, config, vm):
def __init__(self, config, vm, engine):
self.__gobject_init__()
self.window = gtk.glade.XML(config.get_glade_dir() + "/vmm-details.glade", "vmm-details", domain="virt-manager")
self.config = config
self.vm = vm
topwin = self.window.get_widget("vmm-details")
topwin.hide_all()
self.err = vmmErrorDialog(topwin,
0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE,
_("Unexpected Error"),
_("An unexpected error occurred"))
topwin.hide()
self.title = vm.get_name() + " " + topwin.get_title()
topwin.set_title(self.title)
self.engine = engine
# Don't allowing changing network/disks for Dom0
# XXX also disable for remote connections for now
if self.vm.is_management_domain() or self.vm.get_connection().is_remote():
@ -272,12 +274,12 @@ class vmmDetails(gobject.GObject):
self.window.get_widget("hw-list").get_selection().connect("changed", self.hw_selected)
self.update_widget_states(self.vm, self.vm.status())
self.refresh_resources(self.vm)
self.pixbuf_processor = gtk.gdk.pixbuf_new_from_file(config.get_icon_dir() + "/icon_cpu.png")
self.pixbuf_memory = gtk.gdk.pixbuf_new_from_file(config.get_icon_dir() + "/icon_cpu.png")
self.prepare_hw_list()
self.hw_selected()
self.refresh_resources(self.vm)
# Black magic todo with scrolled windows. Basically the behaviour we want
@ -415,6 +417,8 @@ class vmmDetails(gobject.GObject):
self.window.get_widget("details-toolbar").hide()
def show(self):
if self.is_visible():
return
dialog = self.window.get_widget("vmm-details")
dialog.show_all()
self.window.get_widget("overview-network-traffic-text").hide()
@ -424,6 +428,7 @@ class vmmDetails(gobject.GObject):
self.window.get_widget("overview-disk-usage-label").hide()
self.network_traffic_graph.hide()
dialog.present()
self.engine.increment_window_counter()
self.update_widget_states(self.vm, self.vm.status())
def show_help(self, src):
@ -446,10 +451,11 @@ class vmmDetails(gobject.GObject):
self.window.get_widget("vmm-details").hide()
if self.vncViewer.flags() & gtk.VISIBLE:
try:
try:
self.vncViewer.close()
except:
logging.error("Failure when disconnecting from VNC server")
except:
logging.error("Failure when disconnecting from VNC server")
self.engine.decrement_window_counter()
return 1
def is_visible(self):

View File

@ -61,6 +61,10 @@ class vmmEngine(gobject.GObject):
self.timer = None
self.last_timeout = 0
# Counter keeping track of how many manager and details windows
# are open. When it is decremented to 0, close the app
self.windows = 0
self._save_callback_info = []
self.config = config
@ -275,8 +279,7 @@ class vmmEngine(gobject.GObject):
if not(self.connections[uri]["windowDetails"].has_key(uuid)):
try:
details = vmmDetails(self.get_config(),
con.get_vm(uuid))
details = vmmDetails(self.get_config(), con.get_vm(uuid), self)
details.connect("action-save-domain", self._do_save_domain)
details.connect("action-destroy-domain", self._do_destroy_domain)
details.connect("action-show-help", self._do_show_help)
@ -317,6 +320,20 @@ class vmmEngine(gobject.GObject):
def show_manager(self):
self.get_manager().show()
def increment_window_counter(self):
self.windows += 1
logging.debug("window counter incremented to %s" % self.windows)
def decrement_window_counter(self):
self.windows -= 1
logging.debug("window counter decremented to %s" % self.windows)
if self.windows <= 0:
conns = self.connections.values()
for conn in conns:
conn["connection"].close()
gtk.main_quit()
def wait_for_open(self, uri):
# Used to ensure connection fully starts before running
# ONLY CALL FROM WITHIN A THREAD

View File

@ -105,13 +105,13 @@ class vmmManager(gobject.GObject):
def __init__(self, config, engine):
self.__gobject_init__()
self.window = gtk.glade.XML(config.get_glade_dir() + "/vmm-manager.glade", "vmm-manager", domain="virt-manager")
self.window.get_widget("vmm-manager").hide_all()
self.err = vmmErrorDialog(self.window.get_widget("vmm-manager"),
0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE,
_("Unexpected Error"),
_("An unexpected error occurred"))
self.config = config
self.engine = engine
self.connections = {}
self.prepare_vmlist()
self.config.on_vmlist_domain_id_visible_changed(self.toggle_domain_id_visible_widget)
@ -285,17 +285,18 @@ class vmmManager(gobject.GObject):
self.engine.connect("connection-removed", self._remove_connection)
def show(self):
win = self.window.get_widget("vmm-manager")
win.show_all()
win.present()
if not self.is_visible():
win = self.window.get_widget("vmm-manager")
win.show_all()
win.present()
self.engine.increment_window_counter()
def close(self, src=None, src2=None):
conns = self.connections.values()
for conn in conns:
conn.close()
win = self.window.get_widget("vmm-manager")
win.hide()
gtk.main_quit()
if self.is_visible():
win = self.window.get_widget("vmm-manager")
win.hide()
self.engine.decrement_window_counter()
return 1
def is_visible(self):
if self.window.get_widget("vmm-manager").flags() & gtk.VISIBLE: