[gtk+/quartz-integration] Handle (some) deadkeys in uchr keymaps by mapping them to corresponding GDK deadkeys. Apple's deadke



commit a9b9dc8785d264e1d5b5773effbfa60f8b8dc789
Author: John Ralls <jralls ceridwen us>
Date:   Sun Nov 28 16:17:15 2010 -0800

    Handle (some) deadkeys in uchr keymaps by mapping them to corresponding GDK deadkeys. Apple's deadkeys don't correspond perfectly with GDK's, and some of GDK's appear to be unimplemented (meaning that they neither display anything nor modify the succeeding character).

 gdk/quartz/gdkkeys-quartz.c |   79 +++++++++++++++++++++++++++++++++++++------
 1 files changed, 68 insertions(+), 11 deletions(-)
---
diff --git a/gdk/quartz/gdkkeys-quartz.c b/gdk/quartz/gdkkeys-quartz.c
index 6af6718..7dba9f3 100644
--- a/gdk/quartz/gdkkeys-quartz.c
+++ b/gdk/quartz/gdkkeys-quartz.c
@@ -182,7 +182,58 @@ const static struct {
   { 0x001d, GDK_KEY_Right },
   { 0x001e, GDK_KEY_Up },
   { 0x001f, GDK_KEY_Down },
-  { 0x007f, GDK_KEY_Delete }
+  { 0x007f, GDK_KEY_Delete },
+  { 0xf060, GDK_KEY_dead_grave },
+  { 0xf300, GDK_KEY_dead_grave },
+  { 0xf0b4, GDK_KEY_dead_acute },
+  { 0xf301, GDK_KEY_dead_acute },
+  { 0xf385, GDK_KEY_dead_acute },
+  { 0xf05e, GDK_KEY_dead_circumflex },
+  { 0xf2c6, GDK_KEY_dead_circumflex },
+  { 0xf302, GDK_KEY_dead_circumflex },
+  { 0xf07e, GDK_KEY_dead_tilde },
+  { 0xf303, GDK_KEY_dead_tilde },
+  { 0xf342, GDK_KEY_dead_perispomeni },
+  { 0xf0af, GDK_KEY_dead_macron },
+  { 0xf304, GDK_KEY_dead_macron },
+  { 0xf2d8, GDK_KEY_dead_breve },
+  { 0xf306, GDK_KEY_dead_breve },
+  { 0xf2d9, GDK_KEY_dead_abovedot },
+  { 0xf307, GDK_KEY_dead_abovedot },
+  { 0xf0a8, GDK_KEY_dead_diaeresis },
+  { 0xf308, GDK_KEY_dead_diaeresis },
+  { 0xf2da, GDK_KEY_dead_abovering },
+  { 0xf30A, GDK_KEY_dead_abovering },
+  { 0xf2dd, GDK_KEY_dead_doubleacute },
+  { 0xf30B, GDK_KEY_dead_doubleacute },
+  { 0xf2c7, GDK_KEY_dead_caron },
+  { 0xf30C, GDK_KEY_dead_caron },
+  { 0xf0be, GDK_KEY_dead_cedilla },
+  { 0xf327, GDK_KEY_dead_cedilla },
+  { 0xf2db, GDK_KEY_dead_ogonek },
+  { 0xf328, GDK_KEY_dead_ogonek },
+  { 0xfe5d, GDK_KEY_dead_iota },
+  { 0xf323, GDK_KEY_dead_belowdot },
+  { 0xf309, GDK_KEY_dead_hook },
+  { 0xf31B, GDK_KEY_dead_horn },
+  { 0xf02d, GDK_KEY_dead_stroke },
+  { 0xf335, GDK_KEY_dead_stroke },
+  { 0xf336, GDK_KEY_dead_stroke },
+  { 0xf313, GDK_KEY_dead_abovecomma },
+  /*  { 0xf313, GDK_KEY_dead_psili }, */
+  { 0xf314, GDK_KEY_dead_abovereversedcomma },
+  /*  { 0xf314, GDK_KEY_dead_dasia }, */
+  { 0xf30F, GDK_KEY_dead_doublegrave },
+  { 0xf325, GDK_KEY_dead_belowring },
+  { 0xf2cd, GDK_KEY_dead_belowmacron },
+  { 0xf331, GDK_KEY_dead_belowmacron },
+  { 0xf32D, GDK_KEY_dead_belowcircumflex },
+  { 0xf330, GDK_KEY_dead_belowtilde },
+  { 0xf32E, GDK_KEY_dead_belowbreve },
+  { 0xf324, GDK_KEY_dead_belowdiaeresis },
+  { 0xf311, GDK_KEY_dead_invertedbreve },
+  { 0xf02c, GDK_KEY_dead_belowcomma },
+  { 0xf326, GDK_KEY_dead_belowcomma }
 };
 typedef struct _KBLayout KBLayout;
 static UniChar get_keyvalue_uchr(KBLayout *layout, int key, UInt32 modifiers);
@@ -278,20 +329,26 @@ get_keyvalue_uchr(KBLayout *layout, int key, UInt32 modifiers)
   UniCharCount nChars;
 
   err = UCKeyTranslate (layout->data, key,
-                       kUCKeyActionDown,
+                       kUCKeyActionDisplay,
                        (modifiers >> 8) & 0xFF,
                        LMGetKbdType(),
-                       kUCKeyTranslateNoDeadKeysMask,
+                       0,
                        &state, 4, &nChars, chars);
 
-
-  /* FIXME: Theoretically, we can get multiple UTF-16 values;
-   * we should convert them to proper unicode and figure
-   * out whether there are really keyboard layouts that
-   * give us more than one character for one keypress. */
-  if (err == noErr && nChars == 1)
-    return chars[0];
-  return 0;
+  if (err != noErr)
+    return 0;
+  /* A few <Shift><Option>keys return two characters, the first of
+   * which is U+00a0, which isn't interesting; so we return the
+   * second. More sophisticated handling is the job of a GtkIMContext.
+   */
+  /* If state isn't zero, it means that it's a dead key of some
+     sort. Some of those are enumerated in the special_ucs_table with
+     the high nibble set to f to push it into the private use
+     range. Here we do the same.
+  */
+  if (state != 0)
+    chars[nChars - 1] |= 0xf000;
+  return chars[nChars -1];
 }
 
 static void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]