diff options
| author | Eric Williams | 2018-03-06 16:38:38 +0000 |
|---|---|---|
| committer | Eric Williams | 2018-03-09 14:31:50 +0000 |
| commit | 9b6f94eeb3a09e19dba4e4e1ff8c148a99a6c9f5 (patch) | |
| tree | d6b4a596ecc1a00e8438f660eeb9dcc1d36f7307 | |
| parent | 9c6346c33b2ceab571983d3f58db7ceed75a22e8 (diff) | |
| download | eclipse.platform.swt-9b6f94eeb3a09e19dba4e4e1ff8c148a99a6c9f5.tar.gz eclipse.platform.swt-9b6f94eeb3a09e19dba4e4e1ff8c148a99a6c9f5.tar.xz eclipse.platform.swt-9b6f94eeb3a09e19dba4e4e1ff8c148a99a6c9f5.zip | |
Bug 532074: [Wayland] Arrow menu from fast view pops up in wrong
location
Adjust the parent GdkWindow of the menu event on Wayland, so that it is
always the window of the mouse pointer. Since Wayland has no global
coordinates, there is no reason to use the toplevel window as this just
pops up the menu in the wrong place.
Change-Id: I66c8a3b4b690d921485045c672a474fe5cf99fa2
Signed-off-by: Eric Williams <ericwill@redhat.com>
| -rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java | 70 |
1 files changed, 37 insertions, 33 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java index 15dfc50fc9..16f8525952 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java @@ -242,43 +242,15 @@ void _setVisible (boolean visible) { eventPtr = GDK.gdk_event_new(GDK.GDK_BUTTON_PRESS); GdkEventButton event = new GdkEventButton (); event.type = GDK.GDK_BUTTON_PRESS; - event.window = OS.g_object_ref(GTK.gtk_widget_get_window (getShell().handle)); + // Only assign a window on X11, as on Wayland the window is that of the mouse pointer + if (OS.isX11()) { + event.window = OS.g_object_ref(GTK.gtk_widget_get_window (getShell().handle)); + } event.device = GDK.gdk_get_pointer(GDK.gdk_display_get_default ()); event.time = display.getLastEventTime (); OS.memmove (eventPtr, event, GdkEventButton.sizeof); - } else { - if (!OS.isX11()) { - /* - * Lack of absolute coordinates make Wayland event windows inaccurate. - * If we are running on the Wayland the best way to pop-up a menu - * is by using the location of the mouse pointer. See bug 530059. - */ - long /*int*/ seat = GDK.gdk_event_get_seat(eventPtr); - long /*int*/ pointer = GDK.gdk_seat_get_pointer(seat); - long /*int*/ deviceWindow = GDK.gdk_device_get_window_at_position(pointer, null, null); - OS.g_object_ref(deviceWindow); - /* - * The event is most likely a button or key press. If it isn't - * we don't want it -- fall back to the event found with - * gtk_get_current_event(). - */ - int eventType = GDK.gdk_event_get_event_type(eventPtr); - switch (eventType) { - case GDK.GDK_BUTTON_PRESS: - GdkEventButton eventButton = new GdkEventButton(); - OS.memmove (eventButton, eventPtr, GdkEventButton.sizeof); - eventButton.window = deviceWindow; - OS.memmove(eventPtr, eventButton, GdkEventButton.sizeof); - break; - case GDK.GDK_KEY_PRESS: - GdkEventKey eventKey = new GdkEventKey(); - OS.memmove (eventKey, eventPtr, GdkEventKey.sizeof); - eventKey.window = deviceWindow; - OS.memmove(eventPtr, eventKey, GdkEventKey.sizeof); - break; - } - } } + adjustParentWindow(eventPtr); verifyMenuPosition(getItemCount()); GTK.gtk_menu_popup_at_pointer (handle, eventPtr); GDK.gdk_event_free (eventPtr); @@ -1130,6 +1102,38 @@ void setOrientation (boolean create) { } /** + * Lack of absolute coordinates make Wayland event windows inaccurate. + * Currently the best approach is to the use the GdkWindow of the mouse + * pointer. See bug 530059 and 532074.<p> + * + * @param eventPtr a pointer to the GdkEvent + */ +void adjustParentWindow (long /*int*/ eventPtr) { + if (!OS.isX11()) { + long /*int*/ display = GDK.gdk_display_get_default (); + long /*int*/ pointer = GDK.gdk_get_pointer(display); + long /*int*/ deviceWindow = GDK.gdk_device_get_window_at_position(pointer, null, null); + OS.g_object_ref(deviceWindow); + int eventType = GDK.gdk_event_get_event_type(eventPtr); + switch (eventType) { + case GDK.GDK_BUTTON_PRESS: + GdkEventButton eventButton = new GdkEventButton(); + OS.memmove (eventButton, eventPtr, GdkEventButton.sizeof); + eventButton.window = deviceWindow; + OS.memmove(eventPtr, eventButton, GdkEventButton.sizeof); + break; + case GDK.GDK_KEY_PRESS: + GdkEventKey eventKey = new GdkEventKey(); + OS.memmove (eventKey, eventPtr, GdkEventKey.sizeof); + eventKey.window = deviceWindow; + OS.memmove(eventPtr, eventKey, GdkEventKey.sizeof); + break; + } + } + return; +} + +/** * Feature in GTK3 on X11: context menus in SWT are populated * dynamically, sometimes asynchronously outside of SWT * (i.e. in Platform UI). This means that items are added and |
