summaryrefslogtreecommitdiff
path: root/src/keyboard.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/keyboard.py')
-rw-r--r--src/keyboard.py143
1 files changed, 143 insertions, 0 deletions
diff --git a/src/keyboard.py b/src/keyboard.py
new file mode 100644
index 0000000..7474334
--- /dev/null
+++ b/src/keyboard.py
@@ -0,0 +1,143 @@
+# -*- coding: UTF-8 -*-
+
+import candidatepanel
+import gtk
+import gobject
+import gtk.gdk as gdk
+import pango
+import virtkey
+
+
+# from OnBoard.utils.py
+keysyms = {"space" : 0xff80,
+ "insert" : 0xff9e,
+ "home" : 0xff50,
+ "page_up" : 0xff55,
+ "page_down" : 0xff56,
+ "end" : 0xff57,
+ "delete" : 0xff9f,
+ "return" : 0xff0d,
+ "backspace" : 0xff08,
+ "left" : 0xff51,
+ "up" : 0xff52,
+ "right" : 0xff53,
+ "down" : 0xff54,}
+
+# TODO add horizonal keysize - will be able to specify a mulitplier
+# TODO add key colour
+
+backspace = ("⌫", keysyms["backspace"])
+control = (".?12", keysyms["space"]) #TODO not implemented
+
+# key format ("label", keysym, size)
+layout = ( ("q", "w", "e", "r", "t", "y", "u", "i", "o", "p"),
+ ("a", "s", "d", "f", "g", "h", "j", "k", "l", backspace ),
+ ("z", "x", "c", "v", "b", "n", "m", " ", control, "⇧") )
+
+# TODO add keyboard layers
+#layout2 = ( ("Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"),
+# ("A", "S", "D", "F", "G", "H", "J", "K", "L", backspace ),
+# ("Z", "X", "C", "V", "B", "N", "M", " ", " ", "⇧") )
+
+class CaribouPredicitionArea(gtk.HBox):
+ pass
+
+class CaribouKey(gtk.Button):
+ __gtype_name__ = "CaribouKey"
+
+ def __init__(self, key, vk):
+ if isinstance(key, tuple):
+ label = key[0]
+ keysym = key[1]
+ self.__press_key = vk.press_keysym
+ self.__release_key = vk.release_keysym
+ elif isinstance(key, str):
+ label = key
+ keysym = ord(key.decode('utf-8'))
+ self.__press_key = vk.press_unicode
+ self.__release_key = vk.release_unicode
+ else:
+ pass #TODO throw error here
+ gtk.Button.__init__(self, label)
+ #self.set_relief(gtk.RELIEF_NONE)
+ self.connect("clicked", self.__on_click, keysym)
+
+ def __on_click(self, widget, data):
+ self.__press_key(data)
+ self.__release_key(data)
+
+gobject.type_register(CaribouKey)
+
+class CaribouKeyboard(gtk.VBox):
+ __gtype_name__ = "CaribouKeyboard"
+
+ def __init__(self):
+ super(CaribouKeyboard, self).__init__()
+ self.set_name("CaribouKeyboard")
+
+ self.__toplevel = gtk.Window(gtk.WINDOW_POPUP)
+ self.__toplevel.add(self)
+ self.__toplevel.connect("size-allocate", lambda w, a: self.__check_position())
+
+ self.__cursor_location = (0, 0)
+
+ self.__build_keyboard()
+
+
+ #TODO: validate keyboard
+ def __build_keyboard(self):
+ vk = virtkey.virtkey()
+ for row in layout:
+ rowhbox = gtk.HBox(homogeneous=True)
+ for keylabel in row:
+ key = CaribouKey(keylabel, vk)
+ rowhbox.pack_start(key, expand=False, fill=True)
+ self.pack_start(rowhbox, expand=False, fill=False)
+
+ #TODO understand
+ def set_cursor_location(self, x, y):
+ #print "----> SET CURSOR LOCATION"
+ self.__cursor_location = (x, y)
+ self.__check_position()
+
+ def do_size_request(self, requisition):
+ #print "---->> DO SIZE REQUEST"
+ gtk.VBox.do_size_request(self, requisition)
+ self.__toplevel.resize(1, 1)
+
+ def __check_position(self):
+ #print "---->>> CHECK POSITION"
+ bx = self.__cursor_location[0] + self.__toplevel.allocation.width
+ by = self.__cursor_location[1] + self.__toplevel.allocation.height
+
+ root_window = gdk.get_default_root_window()
+ sx, sy = root_window.get_size()
+
+ if bx > sx:
+ x = sx - self.__toplevel.allocation.width
+ else:
+ x = self.__cursor_location[0]
+
+ if by > sy:
+ y = sy - self.__toplevel.allocation.height
+ else:
+ y = self.__cursor_location[1]
+
+ self.move(x, y)
+
+ def show_all(self):
+ gtk.VBox.show_all(self)
+ self.__toplevel.show_all()
+
+ def hide_all(self):
+ gtk.VBox.hide_all(self)
+ self.__toplevel.hide_all()
+
+ def move(self, x, y):
+ self.__toplevel.move(x, y)
+
+if __name__ == "__main__":
+ ckbd = CaribouKeyboard()
+ ckbd.show_all()
+ gtk.main()
+