[Gd-chatter] r11538 - branches/opendylan-melange/gtk-duim

andreas at gwydiondylan.org andreas at gwydiondylan.org
Thu Dec 13 03:16:36 CET 2007


Author: andreas
Date: Thu Dec 13 03:16:36 2007
New Revision: 11538

Modified:
   branches/opendylan-melange/gtk-duim/gtk-keyboard.dylan
Log:
job: fd

Modifiers and keysym translation added.


Modified: branches/opendylan-melange/gtk-duim/gtk-keyboard.dylan
==============================================================================
--- branches/opendylan-melange/gtk-duim/gtk-keyboard.dylan	(original)
+++ branches/opendylan-melange/gtk-duim/gtk-keyboard.dylan	Thu Dec 13 03:16:36 2007
@@ -21,10 +21,8 @@
                 else
                   <key-release-event>
                 end;
-    // ---*** Some keyboard symbols don't have the expected name. Translate here.
-    let keysym = as(<symbol>, gdk-keyval-name(event.GdkEventkey-keyval));
-    // ---*** Yeah, modifiers are broken too.
-    let modifiers = 0;
+    let keysym = keyval->keysym(event.GdkEventkey-keyval);
+    let modifiers = map-modifiers(event.GdkEventKey-state);
     distribute-event(_port,
 		     make(class,
 			  sheet:     sheet,
@@ -35,3 +33,62 @@
   end
 end method handle-gtk-key-event;
 
+define constant $modifier-map =
+    vector(vector($GDK-SHIFT-MASK, $shift-key),
+           vector($GDK-LOCK-MASK, $capslock-key),
+           vector($GDK-CONTROL-MASK, $control-key),
+           vector($GDK-MOD1-MASK, $alt-key),
+           vector($GDK-SUPER-MASK, $super-key),
+           vector($GDK-HYPER-MASK, $hyper-key),
+           vector($GDK-META-MASK, $meta-key));
+
+define inline function map-modifiers (modifiers)
+  let result = 0;
+  for (row in $modifier-map)
+    if (logand(modifiers, row[0]) > 0)
+      result := logior(result, row[1])
+    end
+  end;
+  result
+end;
+
+define inline function keyval->keysym (keyval)
+  let sym = as(<symbol>, gdk-keyval-name(keyval));
+  element($keysym-table, sym, default: sym)
+end;
+
+define table $keysym-table = {
+    #"Linefeed" => #"newline",
+    #"Scroll_Lock" => #"scroll",
+    #"Page_Up" => #"prior",
+    #"Page_Down" => #"next",
+    #"Num_Lock" => #"numlock",
+    #"KP_Multiply" => #"multiply",
+    #"KP_Add" => #"add",
+    #"KP_Subtract" => #"subtract",
+    #"KP_Divide" => #"divide",
+    #"KP_Separator" => #"separator",
+    #"KP_0" => #"numpad0",
+    #"KP_1" => #"numpad1",
+    #"KP_2" => #"numpad2",
+    #"KP_3" => #"numpad3",
+    #"KP_4" => #"numpad4",
+    #"KP_5" => #"numpad5",
+    #"KP_6" => #"numpad6",
+    #"KP_7" => #"numpad7",
+    #"KP_8" => #"numpad8",
+    #"KP_9" => #"numpad9",
+    #"Shift_L" => #"shift",
+    #"Shift_R" => #"shift",
+    #"Control_L" => #"control",
+    #"Control_R" => #"control",
+    #"Caps_Lock" => #"capital", // sic!
+    #"Meta_L" => #"meta",
+    #"Meta_R" => #"meta",
+    #"Alt_L" => #"alt",
+    #"Alt_R" => #"alt",
+    #"Super_L" => #"super",
+    #"Super_R" => #"super",
+    #"Hyper_L" => #"hyper",
+    #"Hyper_R" => #"hyper"};
+



More information about the chatter mailing list