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>
|
2007-07-03 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkbuilder.c: Fix some typos in docs. (#452278,
|
* gtk/gtkbuilder.c: Fix some typos in docs. (#452278,
|
||||||
|
@ -49,6 +49,10 @@ static gboolean pointer_grab_implicit;
|
|||||||
GdkWindow * _gdk_quartz_keyboard_grab_window;
|
GdkWindow * _gdk_quartz_keyboard_grab_window;
|
||||||
static gboolean keyboard_grab_owner_events;
|
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,
|
static void get_child_coordinates_from_ancestor (GdkWindow *ancestor_window,
|
||||||
gint ancestor_x,
|
gint ancestor_x,
|
||||||
gint ancestor_y,
|
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
|
static GdkModifierType
|
||||||
get_keyboard_modifiers_from_ns_event (NSEvent *nsevent)
|
get_keyboard_modifiers_from_ns_event (NSEvent *nsevent)
|
||||||
{
|
{
|
||||||
@ -464,8 +482,6 @@ get_keyboard_modifiers_from_ns_event (NSEvent *nsevent)
|
|||||||
if (nsflags & NSCommandKeyMask)
|
if (nsflags & NSCommandKeyMask)
|
||||||
modifiers |= GDK_MOD1_MASK;
|
modifiers |= GDK_MOD1_MASK;
|
||||||
|
|
||||||
/* FIXME: Support GDK_BUTTON_MASK */
|
|
||||||
|
|
||||||
return modifiers;
|
return modifiers;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1327,7 +1343,10 @@ create_button_event (GdkWindow *window,
|
|||||||
{
|
{
|
||||||
GdkEvent *event;
|
GdkEvent *event;
|
||||||
GdkEventType type;
|
GdkEventType type;
|
||||||
guint button;
|
gint state;
|
||||||
|
gint button;
|
||||||
|
|
||||||
|
state = get_keyboard_modifiers_from_ns_event (nsevent);
|
||||||
|
|
||||||
switch ([nsevent type])
|
switch ([nsevent type])
|
||||||
{
|
{
|
||||||
@ -1340,6 +1359,7 @@ create_button_event (GdkWindow *window,
|
|||||||
case NSRightMouseUp:
|
case NSRightMouseUp:
|
||||||
case NSOtherMouseUp:
|
case NSOtherMouseUp:
|
||||||
type = GDK_BUTTON_RELEASE;
|
type = GDK_BUTTON_RELEASE;
|
||||||
|
state |= get_mouse_button_modifiers_from_ns_event (nsevent);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
@ -1353,7 +1373,7 @@ create_button_event (GdkWindow *window,
|
|||||||
event->button.x = x;
|
event->button.x = x;
|
||||||
event->button.y = y;
|
event->button.y = y;
|
||||||
/* FIXME event->axes */
|
/* FIXME event->axes */
|
||||||
event->button.state = get_keyboard_modifiers_from_ns_event (nsevent);
|
event->button.state = state;
|
||||||
event->button.button = button;
|
event->button.button = button;
|
||||||
event->button.device = _gdk_display->core_pointer;
|
event->button.device = _gdk_display->core_pointer;
|
||||||
convert_window_coordinates_to_root (window, x, y,
|
convert_window_coordinates_to_root (window, x, y,
|
||||||
@ -1372,14 +1392,13 @@ create_motion_event (GdkWindow *window,
|
|||||||
GdkEvent *event;
|
GdkEvent *event;
|
||||||
GdkEventType type;
|
GdkEventType type;
|
||||||
GdkModifierType state = 0;
|
GdkModifierType state = 0;
|
||||||
int button = 0;
|
|
||||||
|
|
||||||
switch ([nsevent type])
|
switch ([nsevent type])
|
||||||
{
|
{
|
||||||
case NSLeftMouseDragged:
|
case NSLeftMouseDragged:
|
||||||
case NSRightMouseDragged:
|
case NSRightMouseDragged:
|
||||||
case NSOtherMouseDragged:
|
case NSOtherMouseDragged:
|
||||||
button = get_mouse_button_from_ns_event (nsevent);
|
state = get_mouse_button_modifiers_from_ns_event (nsevent);
|
||||||
/* Fall through */
|
/* Fall through */
|
||||||
case NSMouseMoved:
|
case NSMouseMoved:
|
||||||
type = GDK_MOTION_NOTIFY;
|
type = GDK_MOTION_NOTIFY;
|
||||||
@ -1388,10 +1407,6 @@ create_motion_event (GdkWindow *window,
|
|||||||
g_assert_not_reached ();
|
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);
|
state |= get_keyboard_modifiers_from_ns_event (nsevent);
|
||||||
|
|
||||||
event = gdk_event_new (type);
|
event = gdk_event_new (type);
|
||||||
@ -1500,6 +1515,8 @@ create_key_event (GdkWindow *window,
|
|||||||
event->key.state |= mask;
|
event->key.state |= mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
event->key.state |= current_button_state;
|
||||||
|
|
||||||
event->key.string = NULL;
|
event->key.string = NULL;
|
||||||
|
|
||||||
/* Fill in ->string since apps depend on it, taken from the x11 backend. */
|
/* Fill in ->string since apps depend on it, taken from the x11 backend. */
|
||||||
@ -1547,11 +1564,10 @@ create_key_event (GdkWindow *window,
|
|||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GdkEventMask current_mask = 0;
|
|
||||||
GdkEventMask
|
GdkEventMask
|
||||||
_gdk_quartz_events_get_current_event_mask (void)
|
_gdk_quartz_events_get_current_event_mask (void)
|
||||||
{
|
{
|
||||||
return current_mask;
|
return current_event_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
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];
|
nswindow = [nsevent window];
|
||||||
|
|
||||||
/* Ignore events for no window or ones not created by GDK. */
|
/* Ignore events for no window or ones not created by GDK. */
|
||||||
@ -1674,7 +1709,7 @@ gdk_event_translate (NSEvent *nsevent)
|
|||||||
[NSApp activateIgnoringOtherApps:YES];
|
[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])
|
switch ([nsevent type])
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user