[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