console: Watch gconf for grab keys update

This commit is contained in:
Cole Robinson 2012-01-29 21:51:20 -05:00
parent b7a533a451
commit edbd5191c0
3 changed files with 55 additions and 67 deletions

View File

@ -345,45 +345,19 @@ class vmmConfig(object):
return self.conf.notify_add( return self.conf.notify_add(
self.conf_dir + "/vmlist-fields/network_traffic", cb) self.conf_dir + "/vmlist-fields/network_traffic", cb)
# Check whether we have GTK-VNC that supports configurable grab keys
# installed on the system
def vnc_grab_keys_supported(self):
try:
import gtkvnc
return hasattr(gtkvnc.Display, "set_grab_keys")
except:
return False
# Keys preferences # Keys preferences
def get_keys_combination(self, syms=False): def get_keys_combination(self):
val = self.conf.get_string(self.conf_dir + "/keys/grab-keys") ret = self.conf.get_string(self.conf_dir + "/keys/grab-keys")
if syms == True: if not ret:
return val # Left Control + Left Alt
return "65507,65513"
# If val is None we return it return ret
if val is None:
return None
# We convert keysyms to names
keystr = None
for k in val.split(','):
try:
key = int(k)
except:
key = None
if key is not None:
if keystr is None:
keystr = gtk.gdk.keyval_name(key)
else:
keystr = keystr + "+" + gtk.gdk.keyval_name(key)
return keystr
def set_keys_combination(self, val): def set_keys_combination(self, val):
# Val have to be a list of integers # Val have to be a list of integers
val = ','.join(map(str, val)) val = ','.join(map(str, val))
self.conf.set_string(self.conf_dir + "/keys/grab-keys", val) self.conf.set_string(self.conf_dir + "/keys/grab-keys", val)
def on_keys_combination_changed(self, cb):
return self.conf.notify_add(self.conf_dir + "/keys/grab-keys", cb)
# Confirmation preferences # Confirmation preferences
def get_confirm_forcepoweroff(self): def get_confirm_forcepoweroff(self):

View File

@ -224,19 +224,6 @@ class Viewer(vmmGObject):
def get_pixbuf(self): def get_pixbuf(self):
return self.display.get_pixbuf() return self.display.get_pixbuf()
def get_grab_keys_from_config(self):
keys = []
grab_keys = self.config.get_keys_combination(True)
if grab_keys is not None:
# If somebody edited this in GConf it would fail so
# we encapsulate this into try/except block
try:
keys = map(int, grab_keys.split(','))
except:
logging.debug("Error in grab_keys configuration in GConf")
return keys
def get_grab_keys(self): def get_grab_keys(self):
keystr = None keystr = None
try: try:
@ -256,9 +243,23 @@ class Viewer(vmmGObject):
def set_grab_keys(self): def set_grab_keys(self):
try: try:
keys = self.get_grab_keys_from_config() keys = self.config.get_keys_combination()
if keys: if not keys:
self.display.set_grab_keys(keys) return
if not hasattr(self.display, "set_grab_keys"):
logging.debug("Display class doesn't support custom grab "
"combination.")
return
try:
keys = map(int, keys.split(','))
except:
logging.debug("Error in grab_keys configuration in GConf",
exc_info=True)
return
self.display.set_grab_keys(keys)
except Exception, e: except Exception, e:
logging.debug("Error when getting the grab keys combination: %s", logging.debug("Error when getting the grab keys combination: %s",
str(e)) str(e))
@ -279,9 +280,7 @@ class VNCViewer(Viewer):
self.desktop_resolution = None self.desktop_resolution = None
def init_widget(self): def init_widget(self):
# Set default grab key combination if found and supported self.set_grab_keys()
if self.config.vnc_grab_keys_supported():
self.set_grab_keys()
self.display.realize() self.display.realize()
@ -392,13 +391,8 @@ class VNCViewer(Viewer):
self.display.open_fd(fd) self.display.open_fd(fd)
def get_grab_keys(self): def get_grab_keys(self):
keystr = None keystr = self.get_grab_keys()
if self.config.vnc_grab_keys_supported(): if not keystr:
keystr = super(VNCViewer, self).get_grab_keys()
# If grab keys are set to None then preserve old behaviour since
# the GTK-VNC - we're using older version of GTK-VNC
if keystr is None:
keystr = "Control_L+Alt_L" keystr = "Control_L+Alt_L"
return keystr return keystr
@ -591,6 +585,8 @@ class vmmConsolePages(vmmGObjectUI):
scroll.connect("size-allocate", self.scroll_size_allocate) scroll.connect("size-allocate", self.scroll_size_allocate)
self.add_gconf_handle( self.add_gconf_handle(
self.config.on_console_accels_changed(self.set_enable_accel)) self.config.on_console_accels_changed(self.set_enable_accel))
self.add_gconf_handle(
self.config.on_keys_combination_changed(self.grab_keys_changed))
self.page_changed() self.page_changed()
@ -728,6 +724,11 @@ class vmmConsolePages(vmmGObjectUI):
for g in self.accel_groups: for g in self.accel_groups:
self.topwin.add_accel_group(g) self.topwin.add_accel_group(g)
def grab_keys_changed(self,
ignore1=None, ignore2=None,
ignore3=None, ignore4=None):
self.viewer.set_grab_keys()
def set_enable_accel(self, ignore=None, ignore1=None, def set_enable_accel(self, ignore=None, ignore1=None,
ignore2=None, ignore3=None): ignore2=None, ignore3=None):
# Make sure modifiers are up to date # Make sure modifiers are up to date

View File

@ -168,15 +168,28 @@ class vmmPreferences(vmmGObjectUI):
def refresh_grabkeys_combination(self, ignore1=None, ignore2=None, def refresh_grabkeys_combination(self, ignore1=None, ignore2=None,
ignore3=None, ignore4=None): ignore3=None, ignore4=None):
val = self.config.get_keys_combination() val = self.config.get_keys_combination()
if val is None:
val = "Control_L+Alt_L" # We convert keysyms to names
print val
if not val:
keystr = "Control_L+Alt_L"
else:
keystr = None
for k in val.split(','):
try:
key = int(k)
except:
key = None
if key is not None:
if keystr is None:
keystr = gtk.gdk.keyval_name(key)
else:
keystr = keystr + "+" + gtk.gdk.keyval_name(key)
prefs_button = self.widget("prefs-keys-grab-changebtn") prefs_button = self.widget("prefs-keys-grab-changebtn")
self.widget("prefs-keys-grab-sequence").set_text(val) self.widget("prefs-keys-grab-sequence").set_text(keystr)
if not self.config.vnc_grab_keys_supported():
util.tooltip_wrapper(prefs_button,
_("Installed version of GTK-VNC doesn't "
"support configurable grab keys"))
def refresh_confirm_forcepoweroff(self, ignore1=None, ignore2=None, def refresh_confirm_forcepoweroff(self, ignore1=None, ignore2=None,
ignore3=None, ignore4=None): ignore3=None, ignore4=None):