/* This is the window corresponding to the key window */
static GdkWindow *current_keyboard_window;
-/* This is the event mask and button state from the last event */
-static GdkModifierType current_keyboard_modifiers;
-static GdkModifierType current_button_state;
static void append_event (GdkEvent *event,
gboolean windowing);
}
}
+static GdkModifierType
+get_mouse_button_modifiers_from_ns_buttons (NSUInteger nsbuttons)
+{
+ GdkModifierType modifiers = 0;
+
+ if (nsbuttons & (1 << 0))
+ modifiers |= GDK_BUTTON1_MASK;
+ if (nsbuttons & (1 << 1))
+ modifiers |= GDK_BUTTON3_MASK;
+ if (nsbuttons & (1 << 2))
+ modifiers |= GDK_BUTTON2_MASK;
+ if (nsbuttons & (1 << 3))
+ modifiers |= GDK_BUTTON4_MASK;
+ if (nsbuttons & (1 << 4))
+ modifiers |= GDK_BUTTON5_MASK;
+
+ return modifiers;
+}
+
static GdkModifierType
get_mouse_button_modifiers_from_ns_event (NSEvent *event)
{
}
static GdkModifierType
-get_keyboard_modifiers_from_ns_event (NSEvent *nsevent)
+get_keyboard_modifiers_from_ns_flags (NSUInteger nsflags)
{
GdkModifierType modifiers = 0;
- int nsflags;
- nsflags = [nsevent modifierFlags];
-
if (nsflags & NSAlphaShiftKeyMask)
modifiers |= GDK_LOCK_MASK;
if (nsflags & NSShiftKeyMask)
return modifiers;
}
+static GdkModifierType
+get_keyboard_modifiers_from_ns_event (NSEvent *nsevent)
+{
+ return get_keyboard_modifiers_from_ns_flags ([nsevent modifierFlags]);
+}
+
/* Return an event mask from an NSEvent */
static GdkEventMask
get_event_mask_from_ns_event (NSEvent *nsevent)
event->motion.x_root = x_root;
event->motion.y_root = y_root;
/* FIXME event->axes */
- event->motion.state = 0;
+ event->motion.state = _gdk_quartz_events_get_current_keyboard_modifiers () |
+ _gdk_quartz_events_get_current_mouse_modifiers ();
event->motion.is_hint = FALSE;
event->motion.device = _gdk_display->core_pointer;
event->crossing.y_root = y_root;
event->crossing.mode = GDK_CROSSING_NORMAL;
event->crossing.detail = GDK_NOTIFY_ANCESTOR;
- event->crossing.state = 0;
+ event->crossing.state = _gdk_quartz_events_get_current_keyboard_modifiers () |
+ _gdk_quartz_events_get_current_mouse_modifiers ();
gdk_event_set_device (event, _gdk_display->core_pointer);
event->crossing.y_root = y_root;
event->crossing.mode = mode;
event->crossing.detail = detail;
- event->crossing.state = get_keyboard_modifiers_from_ns_event (nsevent);
+ event->crossing.state = get_keyboard_modifiers_from_ns_event (nsevent) |
+ _gdk_quartz_events_get_current_mouse_modifiers ();
gdk_event_set_device (event, _gdk_display->core_pointer);
event->key.state |= mask;
}
- event->key.state |= current_button_state;
+ event->key.state |= _gdk_quartz_events_get_current_mouse_modifiers ();
event->key.string = NULL;
GdkModifierType
_gdk_quartz_events_get_current_keyboard_modifiers (void)
{
- return current_keyboard_modifiers;
+ if (gdk_quartz_osx_version () >= GDK_OSX_SNOW_LEOPARD)
+ {
+ return get_keyboard_modifiers_from_ns_flags ([NSClassFromString(@"NSEvent") modifierFlags]);
+ }
+ else
+ {
+ guint carbon_modifiers = GetCurrentKeyModifiers ();
+ GdkModifierType modifiers = 0;
+
+ if (carbon_modifiers & alphaLock)
+ modifiers |= GDK_LOCK_MASK;
+ if (carbon_modifiers & shiftKey)
+ modifiers |= GDK_SHIFT_MASK;
+ if (carbon_modifiers & controlKey)
+ modifiers |= GDK_CONTROL_MASK;
+ if (carbon_modifiers & optionKey)
+ modifiers |= GDK_MOD1_MASK;
+ if (carbon_modifiers & cmdKey)
+ modifiers |= GDK_MOD2_MASK;
+
+ return modifiers;
+ }
}
GdkModifierType
_gdk_quartz_events_get_current_mouse_modifiers (void)
{
- return current_button_state;
+ if (gdk_quartz_osx_version () >= GDK_OSX_SNOW_LEOPARD)
+ {
+ return get_mouse_button_modifiers_from_ns_buttons ([NSClassFromString(@"NSEvent") pressedMouseButtons]);
+ }
+ else
+ {
+ return get_mouse_button_modifiers_from_ns_buttons (GetCurrentButtonState ());
+ }
}
/* Detect window resizing */
return FALSE;
}
- /* Keep track of button state, since we don't get that information
- * for key events.
- */
- switch (event_type)
- {
- case NSLeftMouseDown:
- case NSRightMouseDown:
- case NSOtherMouseDown:
- current_button_state |= get_mouse_button_modifiers_from_ns_event (nsevent);
- break;
- case NSLeftMouseUp:
- case NSRightMouseUp:
- case NSOtherMouseUp:
- current_button_state &= ~get_mouse_button_modifiers_from_ns_event (nsevent);
- break;
- default:
- break;
- }
-
if (_gdk_default_filters)
{
/* Apply global filters */
}
}
- current_keyboard_modifiers = get_keyboard_modifiers_from_ns_event (nsevent);
-
return_val = TRUE;
switch (event_type)