diff options
Diffstat (limited to 'caribou/ui/keyboard.py')
-rw-r--r-- | caribou/ui/keyboard.py | 223 |
1 files changed, 92 insertions, 131 deletions
diff --git a/caribou/ui/keyboard.py b/caribou/ui/keyboard.py index b3098d3..b6ca509 100644 --- a/caribou/ui/keyboard.py +++ b/caribou/ui/keyboard.py @@ -24,12 +24,12 @@ import caribou.common.const as const from caribou.common.settings_manager import SettingsManager -import scan from preferences_window import PreferencesWindow -import gconf +from gi.repository import GConf import gobject -import gtk -import pango +from gi.repository import Gdk +from gi.repository import Gtk +from gi.repository import Pango import sys import virtkey import os @@ -48,23 +48,23 @@ from xml.dom import minidom import gettext import i18n -KEY_MASKS = {'shift': gtk.gdk.SHIFT_MASK, - 'lock': gtk.gdk.LOCK_MASK, - 'control': gtk.gdk.CONTROL_MASK, - 'mod1': gtk.gdk.MOD1_MASK, - 'mod2': gtk.gdk.MOD2_MASK, - 'mod3': gtk.gdk.MOD3_MASK, - 'mod4': gtk.gdk.MOD4_MASK, - 'mod5': gtk.gdk.MOD5_MASK, - 'button1': gtk.gdk.BUTTON1_MASK, - 'button2': gtk.gdk.BUTTON2_MASK, - 'button3': gtk.gdk.BUTTON3_MASK, - 'button4': gtk.gdk.BUTTON4_MASK, - 'button5': gtk.gdk.BUTTON5_MASK} +KEY_MASKS = {'shift': Gdk.ModifierType.SHIFT_MASK, + 'lock': Gdk.ModifierType.LOCK_MASK, + 'control': Gdk.ModifierType.CONTROL_MASK, + 'mod1': Gdk.ModifierType.MOD1_MASK, + 'mod2': Gdk.ModifierType.MOD2_MASK, + 'mod3': Gdk.ModifierType.MOD3_MASK, + 'mod4': Gdk.ModifierType.MOD4_MASK, + 'mod5': Gdk.ModifierType.MOD5_MASK, + 'button1': Gdk.ModifierType.BUTTON1_MASK, + 'button2': Gdk.ModifierType.BUTTON2_MASK, + 'button3': Gdk.ModifierType.BUTTON3_MASK, + 'button4': Gdk.ModifierType.BUTTON4_MASK, + 'button5': Gdk.ModifierType.BUTTON5_MASK} class BaseKey(object): '''An abstract class the represents a key on the keyboard. - Inheriting classes also need to inherit from gtk.Button or any + Inheriting classes also need to inherit from Gtk.Button or any of it's subclasses.''' def __init__(self, label = '', value = '', key_type = 'normal', @@ -75,70 +75,45 @@ class BaseKey(object): self.fill = False self.label = label or value if self.key_type == const.DUMMY_KEY_TYPE: - self.set_relief(gtk.RELIEF_NONE) + self.set_relief(Gtk.ReliefStyle.NONE) self.set_sensitive(False) elif self.key_type == const.PREFERENCES_KEY_TYPE: - image = gtk.Image() - image.set_from_stock(gtk.STOCK_PREFERENCES, - gtk.ICON_SIZE_BUTTON) + image = Gtk.Image() + image.set_from_stock(Gtk.STOCK_PREFERENCES, + Gtk.IconSize.BUTTON) self.set_image(image) else: if label: - label_markup = gtk.Label() + label_markup = Gtk.Label() label_markup.set_markup(self.label) self.add(label_markup) else: self.set_label(self.label) - - self.connect('size-allocate', self._on_size_allocate) - - def _on_size_allocate(self, widget, allocation): - widget.set_property('width-request', allocation.height * self.width) - + def set_font(self, font): - label = self.get_child() - if not isinstance(label, gtk.Label): - return - rcstyle = label.get_modifier_style() - rcstyle.font_desc = pango.FontDescription(font) - - label.modify_style(rcstyle) - label.queue_resize() + raise NotImplemented def reset_font(self): - label = self.get_child() - if not isinstance(label, gtk.Label): - return - rcstyle = label.get_modifier_style() - rcstyle.font_desc = None - label.modify_style(rcstyle) - label.queue_resize() + raise NotImplemented def set_color(self, normal_color, mouse_over_color): - rcstyle = self.get_modifier_style() - - rcstyle.bg[gtk.STATE_NORMAL] = gtk.gdk.Color(normal_color) - rcstyle.bg[gtk.STATE_PRELIGHT] = gtk.gdk.Color(mouse_over_color) - - self.modify_style(rcstyle) + raise NotImplemented def reset_color(self): - rcstyle = self.get_modifier_style() - rcstyle.bg[gtk.STATE_NORMAL] = None - rcstyle.bg[gtk.STATE_PRELIGHT] = None - self.modify_style(rcstyle) + raise NotImplemented def _get_value(self): return self._value def _set_value(self, value): if self.key_type == const.NORMAL_KEY_TYPE: - if type(value) == str or type(value) == unicode: + if type(value) == str: value = value.decode('utf-8') + if type(value) == unicode: if len(value) == 1: - self._value = gtk.gdk.unicode_to_keyval(ord(value)) + self._value = Gdk.unicode_to_keyval(ord(value)) else: - key_value = gtk.gdk.keyval_from_name(value) + key_value = Gdk.keyval_from_name(value) if key_value: self._value = key_value elif self.key_type == const.MASK_KEY_TYPE: @@ -151,38 +126,59 @@ class BaseKey(object): value = property(_get_value, _set_value) -class Key(gtk.Button, BaseKey): +class Key(Gtk.Button, BaseKey): def __init__(self, label = '', value = '', key_type = 'normal', width = 1, fill = False): - gtk.Button.__init__(self) + gobject.GObject.__init__(self) BaseKey.__init__(self, label, value, key_type, width, fill) -class ModifierKey(gtk.ToggleButton, BaseKey): - def __init__(self, label = '', value = '', key_type = 'normal', - width = 1, fill = False): - gtk.ToggleButton.__init__(self) - BaseKey.__init__(self, label, value, key_type, width, fill) + def set_font(self, font): + child = self.get_child() + if isinstance(child, Gtk.Label): + child.modify_font(Pango.font_description_from_string(font)) + if child is not None: + child.queue_resize() + + def reset_font(self): + label = self.get_child() + if not isinstance(label, Gtk.Label): + return + label.modify_font(None) + + def set_color(self, normal_color, mouse_over_color): + self.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse(normal_color)[1]) + self.modify_bg(Gtk.StateType.PRELIGHT, + Gdk.color_parse(mouse_over_color)[1]) + + def reset_color(self): + self.modify_bg(Gtk.StateType.NORMAL, None) + self.modify_bg(Gtk.StateType.PRELIGHT, None) + +class ModifierKey(Gtk.ToggleButton, Key): + pass -class KeyboardLayout(gtk.Alignment): +class KeyboardLayout(Gtk.Table): + KEY_SPAN = 4 def __init__(self, name): - super(KeyboardLayout, self).__init__(0, 0, 0, 0) + gobject.GObject.__init__(self) self.layout_name = name self.rows = [] - self.vbox = gtk.VBox() - self.vbox.set_homogeneous(True) - self.add(self.vbox) + self.set_homogeneous(True) def add_row(self, row): + row_num = len(self.rows) self.rows.append(row) - alignment = gtk.Alignment(0.5, 0.5, 1, 1) - hbox = gtk.HBox() - for key in row: - hbox.pack_start(key, expand = True, fill = key.fill) - alignment.add(hbox) - self.vbox.pack_start(alignment) + last_col = 0 + for i, key in enumerate(row): + next_col = (last_col + (key.width * self.KEY_SPAN)) + self.attach(key, last_col, next_col, + row_num * self.KEY_SPAN, (row_num + 1) * self.KEY_SPAN, + Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, + Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, + 0, 0) + last_col = next_col class KbLayoutDeserializer(object): - def __init__(self): pass @@ -282,11 +278,11 @@ class KbLayoutDeserializer(object): return value return [value] -class CaribouKeyboard(gtk.Notebook): +class CaribouKeyboard(Gtk.Notebook): __gtype_name__ = "CaribouKeyboard" def __init__(self): - gtk.Notebook.__init__(self) + gobject.GObject.__init__(self) self.set_show_tabs(False) self.vk = virtkey.virtkey() self.key_size = 30 @@ -302,50 +298,18 @@ class CaribouKeyboard(gtk.Notebook): getattr(SettingsManager, name).connect("value-changed", self._key_font_changed) - self.scan_enabled = SettingsManager.scan_enabled - - self.scan_enabled.connect("value-changed", - self._scan_enabled) - - self.scan_service = None - - self.connect('size-allocate', self._on_size_allocate) - self.row_height = -1 - def reset_row_height(self): - for i in xrange(self.get_n_pages()): - layout = self.get_nth_page(i) - for row in layout.vbox.get_children(): - row.set_property('height-request', -1) - self.row_height = -1 - - def _on_size_allocate(self, notebook, allocation): - if self.row_height > 0: - return - - for i in xrange(self.get_n_pages()): - layout = self.get_nth_page(i) - rows = layout.vbox.get_children() - height = rows[0].allocation.height - self.row_height = max(self.row_height, height) - for i in xrange(self.get_n_pages()): - layout = self.get_nth_page(i) - for row in layout.vbox.get_children(): - row.set_property('height-request', self.row_height) - - def load_kb(self, kb_location): kb_deserializer = KbLayoutDeserializer() layouts = kb_deserializer.deserialize(kb_location) self._set_layouts(layouts) self._update_key_style() - self._enable_scanning() def _set_layouts(self, layout_list): self._clear() for layout in layout_list: - self.append_page(layout) + self.append_page(layout, None) for row in layout.rows: for key in row: if key.key_type == const.LAYOUT_SWITCHER_KEY_TYPE: @@ -361,14 +325,10 @@ class CaribouKeyboard(gtk.Notebook): key.connect('clicked', self._pressed_normal_key) - def _scan_enabled(self, setting, val): - self._enable_scanning() - def _colors_changed(self, setting, val): self._update_key_style() def _key_font_changed(self, setting, val): - self.reset_row_height() self._update_key_style() def _update_key_style(self): @@ -416,9 +376,7 @@ class CaribouKeyboard(gtk.Notebook): def show_all(self): self.set_current_page(self.current_page) - gtk.Notebook.show_all(self) - #if self.scan_enabled.value: - # self.scan_service.start() + Gtk.Notebook.show_all(self) def _pressed_preferences_key(self, key): p = PreferencesWindow() @@ -426,19 +384,10 @@ class CaribouKeyboard(gtk.Notebook): p.run() p.destroy() - def _enable_scanning(self): - if self.scan_enabled.value and self.scan_service is None: - current_layout = self.get_nth_page(self.current_page) - self.scan_service = scan.ScanService( - current_layout.rows, - self.get_parent().get_parent()) - def destroy(self): - if self.scan_enabled.value: - self.scan_service.destroy() for id in self._gconf_connections: self.client.notify_remove(id) - super(gtk.Notebook, self).destroy() + super(Gtk.Notebook, self).destroy() def _switch_to_layout(self, name): n_pages = self.get_n_pages() @@ -446,7 +395,19 @@ class CaribouKeyboard(gtk.Notebook): if self.get_nth_page(i).layout_name == name: self.set_current_page(i) self.current_page = i - if self.scan_enabled.value: - self.scan_service.change_keyboard( - self.get_nth_page(i).rows) break + +if __name__ == "__main__": + import signal + signal.signal(signal.SIGINT, signal.SIG_DFL) + + w = Gtk.Window() + + kb = CaribouKeyboard() + kb.load_kb('data/keyboards/qwerty.xml') + + w.add(kb) + + w.show_all() + + Gtk.main() |