diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c index f4ae401..d601ee3 100644 --- a/gdk/quartz/gdkevents-quartz.c +++ b/gdk/quartz/gdkevents-quartz.c @@ -680,6 +680,8 @@ _gdk_quartz_events_update_focus_window (GdkWindow *window, * everything in the window is set to correct state. */ generate_motion_event (window); + + _gdk_quartz_update_symbolic_hotkeys (); } } diff --git a/gdk/quartz/gdkinput.c b/gdk/quartz/gdkinput.c index 6f5f8ea..8d5698f 100644 --- a/gdk/quartz/gdkinput.c +++ b/gdk/quartz/gdkinput.c @@ -568,6 +568,8 @@ _gdk_input_exit (void) g_free (tmp_list->data); } g_list_free (_gdk_input_windows); + + _gdk_quartz_release_symbolic_hotkeys (); } gboolean diff --git a/gdk/quartz/gdkkeys-quartz.c b/gdk/quartz/gdkkeys-quartz.c index e81ea4d..746881b 100644 --- a/gdk/quartz/gdkkeys-quartz.c +++ b/gdk/quartz/gdkkeys-quartz.c @@ -55,6 +55,7 @@ #include #include "gdk.h" #include "gdkkeysyms.h" +#include "gdkprivate-quartz.h" #define NUM_KEYCODES 128 #define KEYVALS_PER_KEYCODE 4 @@ -65,6 +66,7 @@ static GdkKeymap *default_keymap = NULL; * TThere is 1 keyval per modifier (Nothing, Shift, Alt, Shift+Alt); */ static guint *keyval_array = NULL; +static CFArrayRef global_hotkeys = NULL; static inline UniChar macroman2ucs (unsigned char c) @@ -806,6 +808,24 @@ gdk_keymap_map_virtual_modifiers (GdkKeymap *keymap, return TRUE; } +void +_gdk_quartz_update_symbolic_hotkeys () +{ + _gdk_quartz_release_symbolic_hotkeys (); + + CopySymbolicHotKeys (&global_hotkeys); +} + +void +_gdk_quartz_release_symbolic_hotkeys () +{ + if (global_hotkeys != NULL) + { + CFRelease (global_hotkeys); + global_hotkeys = NULL; + } +} + /* What sort of key event is this? Returns one of * GDK_KEY_PRESS, GDK_KEY_RELEASE, GDK_NOTHING (should be ignored) */ @@ -814,20 +834,19 @@ _gdk_quartz_keys_event_type (NSEvent *event) { unsigned short keycode = [event keyCode]; unsigned int flags = [event modifierFlags]; - CFArrayRef global_keys = NULL; unsigned int eventmods = (flags & NSCommandKeyMask ? cmdKey : 0) | (flags & NSAlternateKeyMask ? optionKey : 0) | (flags & NSControlKeyMask ? controlKey : 0) | (flags & NSShiftKeyMask ? shiftKey : 0); int i; - if (CopySymbolicHotKeys (&global_keys) == noErr && global_keys != NULL) + if (global_hotkeys != NULL) { - CFIndex length = CFArrayGetCount (global_keys); + CFIndex length = CFArrayGetCount (global_hotkeys); for (i = 0; i < length; i++) { - CFDictionaryRef key_info = CFArrayGetValueAtIndex (global_keys, i); + CFDictionaryRef key_info = CFArrayGetValueAtIndex (global_hotkeys, i); CFNumberRef code = CFDictionaryGetValue (key_info, kHISymbolicHotKeyCode); CFNumberRef mods = CFDictionaryGetValue (key_info, kHISymbolicHotKeyModifiers); @@ -846,8 +865,6 @@ _gdk_quartz_keys_event_type (NSEvent *event) } } - CFRelease (global_keys); - switch ([event type]) { case NSKeyDown: diff --git a/gdk/quartz/gdkprivate-quartz.h b/gdk/quartz/gdkprivate-quartz.h index f8b382d..0b0f66b 100644 --- a/gdk/quartz/gdkprivate-quartz.h +++ b/gdk/quartz/gdkprivate-quartz.h @@ -200,6 +200,8 @@ GdkImage *_gdk_quartz_image_copy_to_image (GdkDrawable *drawable, gint height); /* Keys */ +void _gdk_quartz_update_symbolic_hotkeys (); +void _gdk_quartz_release_symbolic_hotkeys (); GdkEventType _gdk_quartz_keys_event_type (NSEvent *event); gboolean _gdk_quartz_keys_is_modifier (guint keycode); void _gdk_quartz_synthesize_null_key_event (GdkWindow *window);