Keep track of button state and include it in key events. Needed for gimp's
2007-07-03 Richard Hult <richard@imendio.com> * gdk/quartz/gdkevents-quartz.c: Keep track of button state and include it in key events. Needed for gimp's selection tools and fixes bug #453411. svn path=/trunk/; revision=18369
This commit is contained in:
parent
e66ef22b50
commit
a07742849e
@ -1,3 +1,9 @@
|
||||
2007-07-03 Richard Hult <richard@imendio.com>
|
||||
|
||||
* gdk/quartz/gdkevents-quartz.c: Keep track of button state and
|
||||
include it in key events. Needed for gimp's selection tools and
|
||||
fixes bug #453411.
|
||||
|
||||
2007-07-03 Matthias Clasen <mclasen@redhat.com>
|
||||
|
||||
* gtk/gtkbuilder.c: Fix some typos in docs. (#452278,
|
||||
|
@ -49,6 +49,10 @@ static gboolean pointer_grab_implicit;
|
||||
GdkWindow * _gdk_quartz_keyboard_grab_window;
|
||||
static gboolean keyboard_grab_owner_events;
|
||||
|
||||
/* This is the event mask and button state from the last event */
|
||||
static GdkEventMask current_event_mask;
|
||||
static int current_button_state;
|
||||
|
||||
static void get_child_coordinates_from_ancestor (GdkWindow *ancestor_window,
|
||||
gint ancestor_x,
|
||||
gint ancestor_y,
|
||||
@ -447,6 +451,20 @@ get_mouse_button_from_ns_event (NSEvent *event)
|
||||
}
|
||||
}
|
||||
|
||||
static GdkModifierType
|
||||
get_mouse_button_modifiers_from_ns_event (NSEvent *event)
|
||||
{
|
||||
int button;
|
||||
GdkModifierType state = 0;
|
||||
|
||||
/* This maps buttons 1 to 5 to GDK_BUTTON[1-5]_MASK */
|
||||
button = get_mouse_button_from_ns_event (event);
|
||||
if (button >= 1 && button <= 5)
|
||||
state = (1 << (button + 7));
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
static GdkModifierType
|
||||
get_keyboard_modifiers_from_ns_event (NSEvent *nsevent)
|
||||
{
|
||||
@ -464,8 +482,6 @@ get_keyboard_modifiers_from_ns_event (NSEvent *nsevent)
|
||||
if (nsflags & NSCommandKeyMask)
|
||||
modifiers |= GDK_MOD1_MASK;
|
||||
|
||||
/* FIXME: Support GDK_BUTTON_MASK */
|
||||
|
||||
return modifiers;
|
||||
}
|
||||
|
||||
@ -1327,7 +1343,10 @@ create_button_event (GdkWindow *window,
|
||||
{
|
||||
GdkEvent *event;
|
||||
GdkEventType type;
|
||||
guint button;
|
||||
gint state;
|
||||
gint button;
|
||||
|
||||
state = get_keyboard_modifiers_from_ns_event (nsevent);
|
||||
|
||||
switch ([nsevent type])
|
||||
{
|
||||
@ -1340,6 +1359,7 @@ create_button_event (GdkWindow *window,
|
||||
case NSRightMouseUp:
|
||||
case NSOtherMouseUp:
|
||||
type = GDK_BUTTON_RELEASE;
|
||||
state |= get_mouse_button_modifiers_from_ns_event (nsevent);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
@ -1353,7 +1373,7 @@ create_button_event (GdkWindow *window,
|
||||
event->button.x = x;
|
||||
event->button.y = y;
|
||||
/* FIXME event->axes */
|
||||
event->button.state = get_keyboard_modifiers_from_ns_event (nsevent);
|
||||
event->button.state = state;
|
||||
event->button.button = button;
|
||||
event->button.device = _gdk_display->core_pointer;
|
||||
convert_window_coordinates_to_root (window, x, y,
|
||||
@ -1372,14 +1392,13 @@ create_motion_event (GdkWindow *window,
|
||||
GdkEvent *event;
|
||||
GdkEventType type;
|
||||
GdkModifierType state = 0;
|
||||
int button = 0;
|
||||
|
||||
switch ([nsevent type])
|
||||
{
|
||||
case NSLeftMouseDragged:
|
||||
case NSRightMouseDragged:
|
||||
case NSOtherMouseDragged:
|
||||
button = get_mouse_button_from_ns_event (nsevent);
|
||||
state = get_mouse_button_modifiers_from_ns_event (nsevent);
|
||||
/* Fall through */
|
||||
case NSMouseMoved:
|
||||
type = GDK_MOTION_NOTIFY;
|
||||
@ -1388,10 +1407,6 @@ create_motion_event (GdkWindow *window,
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
|
||||
/* This maps buttons 1 to 5 to GDK_BUTTON[1-5]_MASK */
|
||||
if (button >= 1 && button <= 5)
|
||||
state = (1 << (button + 7));
|
||||
|
||||
state |= get_keyboard_modifiers_from_ns_event (nsevent);
|
||||
|
||||
event = gdk_event_new (type);
|
||||
@ -1500,6 +1515,8 @@ create_key_event (GdkWindow *window,
|
||||
event->key.state |= mask;
|
||||
}
|
||||
|
||||
event->key.state |= current_button_state;
|
||||
|
||||
event->key.string = NULL;
|
||||
|
||||
/* Fill in ->string since apps depend on it, taken from the x11 backend. */
|
||||
@ -1547,11 +1564,10 @@ create_key_event (GdkWindow *window,
|
||||
return event;
|
||||
}
|
||||
|
||||
static GdkEventMask current_mask = 0;
|
||||
GdkEventMask
|
||||
_gdk_quartz_events_get_current_event_mask (void)
|
||||
{
|
||||
return current_mask;
|
||||
return current_event_mask;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@ -1617,6 +1633,25 @@ gdk_event_translate (NSEvent *nsevent)
|
||||
}
|
||||
}
|
||||
|
||||
/* Keep track of button state, since we don't get that information
|
||||
* for key events.
|
||||
*/
|
||||
switch ([nsevent 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;
|
||||
}
|
||||
|
||||
nswindow = [nsevent window];
|
||||
|
||||
/* Ignore events for no window or ones not created by GDK. */
|
||||
@ -1674,7 +1709,7 @@ gdk_event_translate (NSEvent *nsevent)
|
||||
[NSApp activateIgnoringOtherApps:YES];
|
||||
}
|
||||
|
||||
current_mask = get_event_mask_from_ns_event (nsevent);
|
||||
current_event_mask = get_event_mask_from_ns_event (nsevent);
|
||||
|
||||
switch ([nsevent type])
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user