diff options
author | Eric Williams | 2018-11-28 13:30:59 +0000 |
---|---|---|
committer | Eric Williams | 2018-12-11 15:23:12 +0000 |
commit | 9c5002d0a6ac4b37630cb03911b4de26c750699f (patch) | |
tree | 059b578438fd792c069a257eaeaa42b6acc1b034 | |
parent | fd0ee04a8a4385c7e48a8e257c434a2b7024d753 (diff) | |
download | eclipse.platform.swt-9c5002d0a6ac4b37630cb03911b4de26c750699f.tar.gz eclipse.platform.swt-9c5002d0a6ac4b37630cb03911b4de26c750699f.tar.xz eclipse.platform.swt-9c5002d0a6ac4b37630cb03911b4de26c750699f.zip |
Bug 541378: [GTK4] Implement GtkWindow "close-request" signal
Use close-request on GTK4 to release/dispose of Widgets when the user
clicks the "X" button of a Shell.
Change-Id: Ic8dc4b2f53b63d7faf7069accdcb6703e93fcdc8
Signed-off-by: Eric Williams <ericwill@redhat.com>
5 files changed, 39 insertions, 12 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java index b407f9600f..0de4db4ace 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java @@ -285,6 +285,7 @@ public class OS extends C { public static final byte[] change_current_page = ascii("change-current-page"); public static final byte[] change_value = ascii("change-value"); public static final byte[] clicked = ascii("clicked"); + public static final byte[] close_request = ascii("close-request"); public static final byte[] commit = ascii("commit"); public static final byte[] configure_event = ascii("configure-event"); public static final byte[] copy_clipboard = ascii("copy-clipboard"); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java index 7676f8e648..2ab5306bbe 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java @@ -4187,17 +4187,26 @@ void releaseWidget () { if (hadFocus) fixFocus (this); if (display.currentControl == this) display.currentControl = null; display.removeMouseHoverTimeout (handle); - long /*int*/ imHandle = imHandle (); - if (imHandle != 0) { - GTK.gtk_im_context_reset (imHandle); - GTK.gtk_im_context_set_client_window (imHandle, 0); - } - if (enableWindow != 0) { - GDK.gdk_window_set_user_data (enableWindow, 0); - GDK.gdk_window_destroy (enableWindow); - enableWindow = 0; + if (GTK.GTK4) { + if (enableSurface != 0) { + GDK.gdk_surface_set_user_data (enableSurface, 0); + GDK.gdk_surface_destroy (enableSurface); + enableSurface = 0; + } + redrawSurface = 0; + } else { + long /*int*/ imHandle = imHandle (); + if (imHandle != 0) { + GTK.gtk_im_context_reset (imHandle); + GTK.gtk_im_context_set_client_window (imHandle, 0); + } + if (enableWindow != 0) { + GDK.gdk_window_set_user_data (enableWindow, 0); + GDK.gdk_window_destroy (enableWindow); + enableWindow = 0; + } + redrawWindow = 0; } - redrawWindow = 0; if (menu != null && !menu.isDisposed ()) { menu.dispose (); } 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 3c6a1c5f0e..3e3c90b73c 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 @@ -3566,6 +3566,7 @@ void initializeCallbacks () { closuresProc [Widget.ACTIVATE_INVERSE] = windowProc2; closuresProc [Widget.CHANGED] = windowProc2; closuresProc [Widget.CLICKED] = windowProc2; + closuresProc [Widget.CLOSE_REQUEST] = windowProc2; closuresProc [Widget.CREATE_MENU_PROXY] = windowProc2; closuresProc [Widget.DAY_SELECTED] = windowProc2; closuresProc [Widget.DAY_SELECTED_DOUBLE_CLICK] = windowProc2; diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java index 4de6cc3480..8cc0028990 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java @@ -922,7 +922,11 @@ void hookEvents () { OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [WINDOW_STATE_EVENT], 0, display.getClosure (WINDOW_STATE_EVENT), false); OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [SIZE_ALLOCATE], 0, display.getClosure (SIZE_ALLOCATE), false); OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [CONFIGURE_EVENT], 0, display.getClosure (CONFIGURE_EVENT), false); - OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [DELETE_EVENT], 0, display.getClosure (DELETE_EVENT), false); + if (GTK.GTK4) { + OS.g_signal_connect_closure (shellHandle, OS.close_request, display.getClosure (CLOSE_REQUEST), false); + } else { + OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [DELETE_EVENT], 0, display.getClosure (DELETE_EVENT), false); + } OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [MAP_EVENT], 0, display.shellMapProcClosure, false); OS.g_signal_connect_closure_by_id (shellHandle, display.signalIds [ENTER_NOTIFY_EVENT], 0, display.getClosure (ENTER_NOTIFY_EVENT), false); OS.g_signal_connect_closure (shellHandle, OS.move_focus, display.getClosure (MOVE_FOCUS), false); @@ -1412,6 +1416,12 @@ long /*int*/ gtk_configure_event (long /*int*/ widget, long /*int*/ event) { } @Override +long /*int*/ gtk_close_request (long /*int*/ widget) { + if (isEnabled()) closeWidget (); + return 1; +} + +@Override long /*int*/ gtk_delete_event (long /*int*/ widget, long /*int*/ event) { if (isEnabled()) closeWidget (); return 1; diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java index 92e0d5dfae..98b89e97f6 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java @@ -230,7 +230,8 @@ public abstract class Widget { static final int ENTER = 95; static final int LEAVE = 96; static final int MOTION = 97; - static final int LAST_SIGNAL = 98; + static final int CLOSE_REQUEST = 98; + static final int LAST_SIGNAL = 99; static final String IS_ACTIVE = "org.eclipse.swt.internal.control.isactive"; //$NON-NLS-1$ static final String KEY_CHECK_SUBWINDOW = "org.eclipse.swt.internal.control.checksubwindow"; //$NON-NLS-1$ @@ -713,6 +714,10 @@ long /*int*/ gtk_clicked (long /*int*/ widget) { return 0; } +long /*int*/ gtk_close_request (long /*int*/ widget) { + return 0; +} + long /*int*/ gtk_commit (long /*int*/ imcontext, long /*int*/ text) { return 0; } @@ -1907,6 +1912,7 @@ long /*int*/ windowProc (long /*int*/ handle, long /*int*/ user_data) { case ACTIVATE: return gtk_activate (handle); case CHANGED: return gtk_changed (handle); case CLICKED: return gtk_clicked (handle); + case CLOSE_REQUEST: return gtk_close_request (handle); case CREATE_MENU_PROXY: return gtk_create_menu_proxy (handle); case DAY_SELECTED: return gtk_day_selected (handle); case DAY_SELECTED_DOUBLE_CLICK: return gtk_day_selected_double_click (handle); |