diff --git a/Screenkey/screenkey.py b/Screenkey/screenkey.py index a292ed9..d45a00d 100644 --- a/Screenkey/screenkey.py +++ b/Screenkey/screenkey.py @@ -20,6 +20,7 @@ import glib import pango import pickle +import keybinder from threading import Timer from Screenkey import APP_NAME, APP_DESC, APP_URL, VERSION, AUTHOR @@ -56,6 +57,8 @@ class Screenkey(gtk.Window): STATE_FILE = os.path.join(glib.get_user_cache_dir(), 'screenkey.dat') + _disabled = False + def __init__(self, logger, nodetach): gtk.Window.__init__(self) @@ -69,6 +72,7 @@ def __init__(self, logger, nodetach): 'position': POS_BOTTOM, 'size': SIZE_MEDIUM, 'mode': MODE_NORMAL, + 'hotkey': 'F1', } if not nodetach: @@ -107,7 +111,6 @@ def __init__(self, logger, nodetach): mode=self.options['mode']) self.listenkbd.start() - menu = gtk.Menu() show_item = gtk.CheckMenuItem(_("Show keys")) @@ -156,8 +159,8 @@ def __init__(self, logger, nodetach): self.on_statusicon_popup, menu) self.logger.debug("Using StatusIcon.") - self.connect("delete-event", self.quit) + keybinder.bind(self.options['hotkey'], self.hotkey_cb, show_item) def quit(self, widget, data=None): self.listenkbd.stop() @@ -230,17 +233,22 @@ def on_statusicon_popup(self, widget, button, timestamp, data=None): 3, timestamp, widget) def on_label_change(self, widget, data=None): - if not self.get_property('visible'): + if not self._disabled: + if not self.get_property('visible'): + gtk.gdk.threads_enter() + self.set_xy_position(self.options['position']) + self.stick() + self.show() + gtk.gdk.threads_leave() + if self.timer: + self.timer.cancel() + self.timer = Timer(self.options['timeout'], self.on_timeout) + self.timer.start() + else: gtk.gdk.threads_enter() - self.set_xy_position(self.options['position']) - self.stick() - self.show() + self.hide() + self.label.set_text("") gtk.gdk.threads_leave() - if self.timer: - self.timer.cancel() - - self.timer = Timer(self.options['timeout'], self.on_timeout) - self.timer.start() def on_timeout(self): gtk.gdk.threads_enter() @@ -256,13 +264,24 @@ def on_change_mode(self, mode): def on_show_keys(self, widget, data=None): if widget.get_active(): + self._disabled = False self.logger.debug("Screenkey enabled.") self.listenkbd = ListenKbd(self.label, logger=self.logger, mode=self.options['mode']) self.listenkbd.start() else: self.logger.debug("Screenkey disabled.") + self._disabled = True self.listenkbd.stop() + + def hotkey_cb(self, widget, data=None): + if widget.get_active(): + self.logger.debug("Hotkey Pressed: %s." % self.options['hotkey']) + self._disabled = True + widget.set_active(False) + else: + self._disabled = False + widget.set_active(True) def on_preferences_dialog(self, widget, data=None): prefs = gtk.Dialog(APP_NAME, None, @@ -294,6 +313,10 @@ def on_cbox_changed(widget, data=None): self.options[name] = index self.logger.debug("Window position changed.") + def on_entry_hotkey_changed(widget, data=None): + self.options['hotkey'] = widget.get_text() + self.logger.debug("Hotkey value Changed") + frm_main = gtk.Frame(_("Preferences")) frm_main.set_border_width(6) vbox_main = gtk.VBox() @@ -379,9 +402,27 @@ def on_cbox_changed(widget, data=None): fill=False, padding=4) frm_kbd.add(hbox_kbd) + frm_hotkey = gtk.Frame(_("Hot Keys")) + frm_hotkey.set_border_width(4) + frm_hotkey.get_label_widget().set_use_markup(True) + frm_hotkey.set_shadow_type(gtk.SHADOW_NONE) + hbox_hotkey = gtk.HBox() + lbl_hotkey = gtk.Label(_("Shortcut")) + entry_hotkey = gtk.Entry() + entry_hotkey.set_text(self.options['hotkey']) + entry_hotkey.set_width_chars(10) + entry_hotkey.connect("changed", on_entry_hotkey_changed) + hbox_hotkey.pack_start(lbl_hotkey, expand=False, + fill=False, padding=6) + hbox_hotkey.pack_start(entry_hotkey, expand=False, + fill=False, padding=4) + frm_hotkey.add(hbox_hotkey) + + vbox_main.pack_start(frm_time, False, False, 6) vbox_main.pack_start(frm_aspect, False, False, 6) vbox_main.pack_start(frm_kbd, False, False, 6) + vbox_main.pack_start(frm_hotkey, False, False, 6) frm_main.add(vbox_main) prefs.vbox.pack_start(frm_main)