add patch for handling mouse grabs in gdk/quartz by foreign (nested) windows
This commit is contained in:
parent
d0e17d074a
commit
a6d67fdd56
106
patches/gdk-foreign-view-mouse.patch
Normal file
106
patches/gdk-foreign-view-mouse.patch
Normal file
@ -0,0 +1,106 @@
|
||||
--- /tmp/gtk+-2.24.23/gdk/quartz/gdkevents-quartz.c 2013-10-16 11:31:40.000000000 -0400
|
||||
+++ gdkevents-quartz.c 2016-11-18 06:53:12.000000000 -0500
|
||||
@@ -43,6 +43,9 @@
|
||||
GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN && \
|
||||
GDK_WINDOW_TYPE (window) != GDK_WINDOW_OFFSCREEN)
|
||||
|
||||
+/* This is the NSView not owned by GDK where a mouse down event occurs */
|
||||
+static NSView *foreign_mouse_down_view;
|
||||
+
|
||||
/* This is the window corresponding to the key window */
|
||||
static GdkWindow *current_keyboard_window;
|
||||
|
||||
@@ -705,14 +708,35 @@
|
||||
NSPoint screen_point;
|
||||
NSEventType event_type;
|
||||
|
||||
+ event_type = [nsevent type];
|
||||
+
|
||||
+ if (foreign_mouse_down_view) {
|
||||
+ switch (event_type) {
|
||||
+ case NSLeftMouseUp:
|
||||
+ case NSRightMouseUp:
|
||||
+ case NSOtherMouseUp:
|
||||
+ /* mouse up happened, foreign view needs to handle it
|
||||
+ but we will also assume that it does (e.g. ends
|
||||
+ a drag and whatever goes with it) and so we reset
|
||||
+ foreign_mouse_down_view.
|
||||
+ */
|
||||
+ foreign_mouse_down_view = 0;
|
||||
+ return NULL;
|
||||
+
|
||||
+ default:
|
||||
+ /* foreign view needs to handle this */
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
view = (GdkQuartzView *)[[nsevent window] contentView];
|
||||
|
||||
toplevel = get_toplevel_from_ns_event (nsevent, &screen_point, x, y);
|
||||
- if (!toplevel)
|
||||
- return NULL;
|
||||
+ if (!toplevel)
|
||||
+ return NULL;
|
||||
+
|
||||
_gdk_quartz_window_nspoint_to_gdk_xy (screen_point, x_root, y_root);
|
||||
|
||||
- event_type = [nsevent type];
|
||||
|
||||
switch (event_type)
|
||||
{
|
||||
@@ -749,10 +773,10 @@
|
||||
* event mask should not be checked.
|
||||
*/
|
||||
if (!grab->implicit
|
||||
- && (grab->event_mask & get_event_mask_from_ns_event (nsevent)) == 0)
|
||||
- return NULL;
|
||||
+ && (grab->event_mask & get_event_mask_from_ns_event (nsevent)) == 0)
|
||||
+ return NULL;
|
||||
|
||||
- if (grab->owner_events)
|
||||
+ if (grab->owner_events)
|
||||
{
|
||||
/* For owner events, we need to use the toplevel under the
|
||||
* pointer, not the window from the NSEvent, since that is
|
||||
@@ -823,13 +847,25 @@
|
||||
{
|
||||
unsigned int subviews = [[toplevel_impl->view subviews] count];
|
||||
unsigned int si;
|
||||
-
|
||||
+
|
||||
for (si = 0; si < subviews; ++si) {
|
||||
NSView* sv = [[toplevel_impl->view subviews] objectAtIndex:si];
|
||||
NSRect r = [sv frame];
|
||||
if (r.origin.x <= *x && r.origin.x + r.size.width >= *x &&
|
||||
r.origin.y <= *y && r.origin.y + r.size.height >= *y) {
|
||||
/* event is within subview, forward back to Cocoa */
|
||||
+
|
||||
+ switch (event_type)
|
||||
+ {
|
||||
+ case NSLeftMouseDown:
|
||||
+ case NSRightMouseDown:
|
||||
+ case NSOtherMouseDown:
|
||||
+ foreign_mouse_down_view = sv;
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -838,12 +874,11 @@
|
||||
*x = x_tmp;
|
||||
*y = y_tmp;
|
||||
}
|
||||
-
|
||||
return toplevel;
|
||||
}
|
||||
}
|
||||
break;
|
||||
-
|
||||
+
|
||||
case NSMouseEntered:
|
||||
case NSMouseExited:
|
||||
/* Only handle our own entered/exited events, not the ones for the
|
Loading…
Reference in New Issue
Block a user