Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Williams2018-11-28 13:30:59 +0000
committerEric Williams2018-12-11 15:23:12 +0000
commit9c5002d0a6ac4b37630cb03911b4de26c750699f (patch)
tree059b578438fd792c069a257eaeaa42b6acc1b034
parentfd0ee04a8a4385c7e48a8e257c434a2b7024d753 (diff)
downloadeclipse.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>
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java1
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java29
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java1
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java12
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java8
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);

Back to the top