diff options
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java')
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java | 69 |
1 files changed, 41 insertions, 28 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java index 40e502e8c3..ea07490293 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java @@ -351,6 +351,7 @@ public class Display extends Device { {GDK.GDK_Shift_R, SWT.SHIFT}, {GDK.GDK_Control_L, SWT.CONTROL}, {GDK.GDK_Control_R, SWT.CONTROL}, + {GDK.GDK_ISO_Level3_Shift, SWT.ALT_GR}, // {OS.GDK_????, SWT.COMMAND}, // {OS.GDK_????, SWT.COMMAND}, @@ -4306,6 +4307,10 @@ long /*int*/ mouseHoverProc (long /*int*/ handle) { * <li>(in) character a character that corresponds to a keyboard key</li> * <li>(in) keyCode the key code of the key that was typed, * as defined by the key code constants in class <code>SWT</code></li> + * <p> Optional (on some platforms): </p> + * <li>(in) stateMask the state of the keyboard modifier, + * as defined by the key code constants in class <code>SWT</code> + * </li> * </ul> * <p>MouseDown, MouseUp</p> * <p>The following fields in the <code>Event</code> apply: @@ -4359,15 +4364,35 @@ public boolean post (Event event) { if (!OS.isX11()) { return false; } - long /*int*/ xDisplay = GDK.gdk_x11_display_get_xdisplay(GDK.gdk_display_get_default()); int type = event.type; + + if (type == SWT.MouseMove) { + Rectangle loc = DPIUtil.autoScaleUp(event.getBounds ()); + setCursorLocationInPixels(new Point(loc.x, loc.y)); + return true; + } + + long /*int*/ gdkDisplay = GDK.gdk_display_get_default(); + long /*int*/ gdkScreen = GDK.gdk_screen_get_default(); + long /*int*/ gdkWindow = GDK.gdk_screen_get_active_window(gdkScreen); + int[] x = new int[1], y = new int[1]; + if (gdkWindow == 0) { + // Under some window managers or wayland gdk can not determine the active window and passing null + // to gdk_test_simulate_button leads to crash. + return false; + } + if (GTK.GTK3) { + long /*int*/ gdkPointer = GDK.gdk_get_pointer(gdkDisplay); + GDK.gdk_window_get_device_position(gdkWindow, gdkPointer, x, y, new int[1]); + } else { + GDK.gdk_window_get_pointer(gdkWindow, x, y, new int[1]); + } + switch (type) { case SWT.KeyDown: case SWT.KeyUp: { - int keyCode = 0; - long /*int*/ keysym = untranslateKey (event.keyCode); - if (keysym != 0) keyCode = OS.XKeysymToKeycode (xDisplay, keysym); - if (keyCode == 0) { + int keysym = untranslateKey (event.keyCode); + if (keysym == 0) { char key = event.character; switch (key) { case SWT.BS: keysym = GDK.GDK_BackSpace; break; @@ -4379,15 +4404,18 @@ public boolean post (Event event) { default: keysym = key; } - keyCode = OS.XKeysymToKeycode (xDisplay, keysym); - if (keyCode == 0) return false; + if (keysym == 0) return false; } - OS.XTestFakeKeyEvent (xDisplay, keyCode, type == SWT.KeyDown, 0); - return true; - } - case SWT.MouseMove: { - Rectangle loc = DPIUtil.autoScaleUp(event.getBounds ()); - setCursorLocationInPixels(new Point(loc.x, loc.y)); + int modifier = 0; + switch (event.stateMask) { + case SWT.SHIFT: modifier = GDK.GDK_SHIFT_MASK; break; + case SWT.ALT: modifier = GDK.GDK_MOD1_MASK; break; + case SWT.CONTROL: modifier = GDK.GDK_CONTROL_MASK; break; + case SWT.ALT_GR: modifier = GDK.GDK_MOD5_MASK; break; + default: + modifier = 0; + } + GDK.gdk_test_simulate_key(gdkWindow, x[0], y[0], keysym, modifier, type == SWT.KeyDown ? GDK.GDK_KEY_PRESS: GDK.GDK_KEY_RELEASE); return true; } case SWT.MouseDown: @@ -4401,21 +4429,6 @@ public boolean post (Event event) { case 5: button = 7; break; default: return false; } - long /*int*/ gdkDisplay = GDK.gdk_display_get_default(); - long /*int*/ gdkScreen = GDK.gdk_screen_get_default(); - long /*int*/ gdkWindow = GDK.gdk_screen_get_active_window(gdkScreen); - int[] x = new int[1], y = new int[1]; - if (gdkWindow == 0) { - // Under some window managers or wayland gdk can not determine the active window and passing null - // to gdk_test_simulate_button leads to crash. - return false; - } - if (GTK.GTK3) { - long /*int*/ gdkPointer = GDK.gdk_get_pointer(gdkDisplay); - GDK.gdk_window_get_device_position(gdkWindow, gdkPointer, x, y, new int[1]); - } else { - GDK.gdk_window_get_pointer(gdkWindow, x, y, new int[1]); - } GDK.gdk_test_simulate_button(gdkWindow, x[0], y[0], button, 0, type == SWT.MouseDown ? GDK.GDK_BUTTON_PRESS: GDK.GDK_BUTTON_RELEASE); return true; } |