summaryrefslogtreecommitdiff
path: root/caribou/ui/keyboard.py
diff options
context:
space:
mode:
Diffstat (limited to 'caribou/ui/keyboard.py')
-rw-r--r--caribou/ui/keyboard.py223
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()