diff options
author | Richard Hult <richard@imendio.com> | 2006-07-17 18:39:43 +0000 |
---|---|---|
committer | Richard Hult <rhult@src.gnome.org> | 2006-07-17 18:39:43 +0000 |
commit | d473868ace14300b42931b398952aaa0ccc69e40 (patch) | |
tree | d17fefa5bac62b4cde40c1c82ce9d3a7fed60f73 /gdk | |
parent | 1f9befb77a49bcf1444b0f6d4c9b9edb1d38869f (diff) | |
download | gtk+-d473868ace14300b42931b398952aaa0ccc69e40.tar.gz |
Fill in string, length and is_modifier for key events. Map some more keys
2006-07-17 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkevents-quartz.c: (create_key_event):
* gdk/quartz/gdkkeys-quartz.c: (_gdk_quartz_key_event_type),
(_gdk_quartz_key_is_modifier):
* gdk/quartz/gdkprivate-quartz.h: Fill in string, length and
is_modifier for key events. Map some more keys into gdk keyvals.
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/quartz/gdkevents-quartz.c | 48 | ||||
-rw-r--r-- | gdk/quartz/gdkkeys-quartz.c | 49 | ||||
-rw-r--r-- | gdk/quartz/gdkprivate-quartz.h | 4 |
3 files changed, 88 insertions, 13 deletions
diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c index 859d757b1b..409264a230 100644 --- a/gdk/quartz/gdkevents-quartz.c +++ b/gdk/quartz/gdkevents-quartz.c @@ -26,7 +26,11 @@ #include <pthread.h> #include <unistd.h> +#include <Carbon/Carbon.h> + #include "gdkscreen.h" +#include "gdkkeysyms.h" + #include "gdkprivate-quartz.h" static GPollFD event_poll_fd; @@ -1340,6 +1344,8 @@ static GdkEvent * create_key_event (GdkWindow *window, NSEvent *nsevent, GdkEventType type) { GdkEvent *event; + gchar buf[7]; + gunichar c = 0; event = gdk_event_new (type); event->key.window = window; @@ -1347,6 +1353,8 @@ create_key_event (GdkWindow *window, NSEvent *nsevent, GdkEventType type) event->key.state = get_keyboard_modifiers_from_nsevent (nsevent); event->key.hardware_keycode = [nsevent keyCode]; event->key.group = ([nsevent modifierFlags] & NSAlternateKeyMask) ? 1 : 0; + + event->key.keyval = GDK_VoidSymbol; gdk_keymap_translate_keyboard_state (NULL, event->key.hardware_keycode, @@ -1355,6 +1363,46 @@ create_key_event (GdkWindow *window, NSEvent *nsevent, GdkEventType type) &event->key.keyval, NULL, NULL, NULL); + event->key.is_modifier = _gdk_quartz_key_is_modifier (event->key.hardware_keycode); + + event->key.string = NULL; + + /* Fill in ->string since apps depend on it, taken from the x11 backend. */ + if (event->key.keyval != GDK_VoidSymbol) + c = gdk_keyval_to_unicode (event->key.keyval); + + if (c) + { + gsize bytes_written; + gint len; + + len = g_unichar_to_utf8 (c, buf); + buf[len] = '\0'; + + event->key.string = g_locale_from_utf8 (buf, len, + NULL, &bytes_written, + NULL); + if (event->key.string) + event->key.length = bytes_written; + } + else if (event->key.keyval == GDK_Escape) + { + event->key.length = 1; + event->key.string = g_strdup ("\033"); + } + else if (event->key.keyval == GDK_Return || + event->key.keyval == GDK_KP_Enter) + { + event->key.length = 1; + event->key.string = g_strdup ("\r"); + } + + if (!event->key.string) + { + event->key.length = 0; + event->key.string = g_strdup (""); + } + GDK_NOTE(EVENTS, g_message ("key %s:\t\twindow: %p key: %12s %d", type == GDK_KEY_PRESS ? "press" : "release", diff --git a/gdk/quartz/gdkkeys-quartz.c b/gdk/quartz/gdkkeys-quartz.c index 1ea173671e..bee7cc8113 100644 --- a/gdk/quartz/gdkkeys-quartz.c +++ b/gdk/quartz/gdkkeys-quartz.c @@ -160,6 +160,8 @@ const static struct { guint keyval; } special_ucs_table [] = { { 0x0001, GDK_Home }, + { 0x0003, GDK_Return }, + { 0x0004, GDK_End }, { 0x0008, GDK_BackSpace }, { 0x0009, GDK_Tab }, { 0x000b, GDK_Page_Up }, @@ -169,7 +171,8 @@ const static struct { { 0x001c, GDK_Left }, { 0x001d, GDK_Right }, { 0x001e, GDK_Up }, - { 0x001f, GDK_Down } + { 0x001f, GDK_Down }, + { 0x007f, GDK_Delete } }; static void @@ -582,7 +585,8 @@ gdk_keymap_translate_keyboard_state (GdkKeymap *keymap, /* What sort of key event is this? Returns one of * GDK_KEY_PRESS, GDK_KEY_RELEASE, GDK_NOTHING (should be ignored) */ -GdkEventType _gdk_quartz_key_event_type (NSEvent *event) +GdkEventType +_gdk_quartz_key_event_type (NSEvent *event) { unsigned short keycode; unsigned int flags; @@ -590,10 +594,14 @@ GdkEventType _gdk_quartz_key_event_type (NSEvent *event) switch ([event type]) { - case NSKeyDown: return GDK_KEY_PRESS; - case NSKeyUp: return GDK_KEY_RELEASE; - case NSFlagsChanged: break; /* Continue... */ - default: g_assert_not_reached (); + case NSKeyDown: + return GDK_KEY_PRESS; + case NSKeyUp: + return GDK_KEY_RELEASE; + case NSFlagsChanged: + break; + default: + g_assert_not_reached (); } /* For flags-changed events, we have to find the special key that caused the @@ -604,15 +612,32 @@ GdkEventType _gdk_quartz_key_event_type (NSEvent *event) for (i = 0; i < G_N_ELEMENTS (known_keys); i++) { if (known_keys[i].keycode == keycode) - { - if (flags & known_keys[i].modmask) - return GDK_KEY_PRESS; - else - return GDK_KEY_RELEASE; - } + { + if (flags & known_keys[i].modmask) + return GDK_KEY_PRESS; + else + return GDK_KEY_RELEASE; } + } /* Some keypresses (eg: Expose' activations) seem to trigger flags-changed * events for no good reason. Ignore them! */ return GDK_NOTHING; } + +gboolean +_gdk_quartz_key_is_modifier (guint keycode) +{ + gint i; + + for (i = 0; i < G_N_ELEMENTS (known_keys); i++) + { + if (known_keys[i].modmask == 0) + break; + + if (known_keys[i].keycode == keycode) + return TRUE; + } + + return FALSE; +} diff --git a/gdk/quartz/gdkprivate-quartz.h b/gdk/quartz/gdkprivate-quartz.h index 960844d3b5..101fe80fed 100644 --- a/gdk/quartz/gdkprivate-quartz.h +++ b/gdk/quartz/gdkprivate-quartz.h @@ -96,6 +96,7 @@ GdkGC *_gdk_quartz_gc_new (GdkDrawable *drawable, void _gdk_windowing_window_init (void); void _gdk_events_init (void); void _gdk_visual_init (void); +void _gdk_input_init (void); void _gdk_quartz_set_context_fill_color_from_pixel (CGContextRef context, GdkColormap *colormap, guint32 pixel); void _gdk_quartz_set_context_stroke_color_from_pixel (CGContextRef context, GdkColormap *colormap, guint32 pixel); @@ -122,7 +123,8 @@ GdkImage *_gdk_quartz_copy_to_image (GdkDrawable *drawable, void _gdk_quartz_send_map_events (GdkWindow *window); -GdkEventType _gdk_quartz_flags_changed_is_press (NSEvent *event); +GdkEventType _gdk_quartz_key_event_type (NSEvent *event); +gboolean _gdk_quartz_key_is_modifier (guint keycode); extern GdkWindow *_gdk_quartz_keyboard_grab_window; extern GdkWindow *_gdk_quartz_pointer_grab_window; |