Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandr Miloslavskiy2019-04-23 07:12:03 +0000
committerAlexandr Miloslavskiy2019-04-24 13:35:07 +0000
commit3d47beb6a71aa3e72762c9a55af531c0aedab8df (patch)
treeca03ba647a4141272d07d07af030d120a0b54861 /bundles/org.eclipse.swt/Eclipse SWT PI
parent6e658162caecbb8cd6711a48f60c4ed46c1b2615 (diff)
downloadeclipse.platform.swt-3d47beb6a71aa3e72762c9a55af531c0aedab8df.tar.gz
eclipse.platform.swt-3d47beb6a71aa3e72762c9a55af531c0aedab8df.tar.xz
eclipse.platform.swt-3d47beb6a71aa3e72762c9a55af531c0aedab8df.zip
Bug 531634 - [GTK] Linux: Handle logoff / shutdown events from session manager
Fix 1 ----- Previously, SWT applications terminated unexpectedly on session end (logoff / shutdown) and didn't have a chance to perform on-exit actions, such as saving current settings. This patch fixes it, bringing Linux in line with Windows and macOS. SWT applications will now: 1) Receive 'SWT.Close' event for their 'Display'. Similar to Windows and macOS, this now allows to set 'Event.doit' to 'false', hinting the OS that application is not ready to close. Linux often ignores this hint, though. I think handling this properly would require inhibitors which are not yet covered by this patch. 2) Force 'Display.dispose()' when 'EndSession' is received This allows applications to use all forms of on-exit cleanup, such as * Listening to 'SWT.Dispose' * Running code after 'while (!display.isDisposed())' * Installing Java shutdown hooks (because a typical application will exit its 'main()' after display is disposed) Some system properties are available for customization, see code in 'org.eclipse.swt.internal.SessionManagerDBus' Fix 2 ----- Noticed and fixed a memory leak in 'WebkitGDBusinvokeReturnValueExtensionIdentifier'. Fix 3 ----- Moved test snippets to correct folder Change-Id: If968fc4b86cc0b6de192ef3ef4319ca96967cd22 Signed-off-by: Alexandr Miloslavskiy <alexandr.miloslavskiy@syntevo.com>
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT PI')
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c122
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c8
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h8
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java119
4 files changed, 256 insertions, 1 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c
index b1acaff1d0..16ae5c75c4 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c
@@ -14766,6 +14766,18 @@ fail:
}
#endif
+#ifndef NO__1g_1dbus_1proxy_1get_1name_1owner
+JNIEXPORT jlong JNICALL OS_NATIVE(_1g_1dbus_1proxy_1get_1name_1owner)
+ (JNIEnv *env, jclass that, jlong arg0)
+{
+ jlong rc = 0;
+ OS_NATIVE_ENTER(env, that, _1g_1dbus_1proxy_1get_1name_1owner_FUNC);
+ rc = (jlong)g_dbus_proxy_get_name_owner((GDBusProxy *)arg0);
+ OS_NATIVE_EXIT(env, that, _1g_1dbus_1proxy_1get_1name_1owner_FUNC);
+ return rc;
+}
+#endif
+
#ifndef NO__1g_1dbus_1proxy_1new_1for_1bus_1sync
JNIEXPORT jlong JNICALL OS_NATIVE(_1g_1dbus_1proxy_1new_1for_1bus_1sync)
(JNIEnv *env, jclass that, jint arg0, jint arg1, jlong arg2, jbyteArray arg3, jbyteArray arg4, jbyteArray arg5, jlong arg6, jlongArray arg7)
@@ -15028,6 +15040,22 @@ JNIEXPORT void JNICALL OS_NATIVE(_1g_1get_1current_1time)
}
#endif
+#ifndef NO__1g_1getenv
+JNIEXPORT jlong JNICALL OS_NATIVE(_1g_1getenv)
+ (JNIEnv *env, jclass that, jbyteArray arg0)
+{
+ jbyte *lparg0=NULL;
+ jlong rc = 0;
+ OS_NATIVE_ENTER(env, that, _1g_1getenv_FUNC);
+ if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
+ rc = (jlong)g_getenv((const gchar *)lparg0);
+fail:
+ if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, JNI_ABORT);
+ OS_NATIVE_EXIT(env, that, _1g_1getenv_FUNC);
+ return rc;
+}
+#endif
+
#ifndef NO__1g_1hash_1table_1get_1values
JNIEXPORT jlong JNICALL OS_NATIVE(_1g_1hash_1table_1get_1values)
(JNIEnv *env, jclass that, jlong arg0)
@@ -16127,6 +16155,20 @@ fail:
}
#endif
+#ifndef NO__1g_1unsetenv
+JNIEXPORT void JNICALL OS_NATIVE(_1g_1unsetenv)
+ (JNIEnv *env, jclass that, jbyteArray arg0)
+{
+ jbyte *lparg0=NULL;
+ OS_NATIVE_ENTER(env, that, _1g_1unsetenv_FUNC);
+ if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
+ g_unsetenv((const gchar *)lparg0);
+fail:
+ if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, JNI_ABORT);
+ OS_NATIVE_EXIT(env, that, _1g_1unsetenv_FUNC);
+}
+#endif
+
#ifndef NO__1g_1utf16_1offset_1to_1pointer
JNIEXPORT jlong JNICALL OS_NATIVE(_1g_1utf16_1offset_1to_1pointer)
(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
@@ -16479,6 +16521,66 @@ JNIEXPORT jlong JNICALL OS_NATIVE(_1g_1variant_1n_1children)
}
#endif
+#ifndef NO__1g_1variant_1new___3BZ_3B
+JNIEXPORT jlong JNICALL OS_NATIVE(_1g_1variant_1new___3BZ_3B)
+ (JNIEnv *env, jclass that, jbyteArray arg0, jboolean arg1, jbyteArray arg2)
+{
+ jbyte *lparg0=NULL;
+ jbyte *lparg2=NULL;
+ jlong rc = 0;
+ OS_NATIVE_ENTER(env, that, _1g_1variant_1new___3BZ_3B_FUNC);
+ if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
+ if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
+ rc = (jlong)g_variant_new((const gchar *)lparg0, (gboolean)arg1, (const gchar *)lparg2);
+fail:
+ if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, JNI_ABORT);
+ if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, JNI_ABORT);
+ OS_NATIVE_EXIT(env, that, _1g_1variant_1new___3BZ_3B_FUNC);
+ return rc;
+}
+#endif
+
+#ifndef NO__1g_1variant_1new___3B_3B
+JNIEXPORT jlong JNICALL OS_NATIVE(_1g_1variant_1new___3B_3B)
+ (JNIEnv *env, jclass that, jbyteArray arg0, jbyteArray arg1)
+{
+ jbyte *lparg0=NULL;
+ jbyte *lparg1=NULL;
+ jlong rc = 0;
+ OS_NATIVE_ENTER(env, that, _1g_1variant_1new___3B_3B_FUNC);
+ if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
+ if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
+ rc = (jlong)g_variant_new((const gchar *)lparg0, (const gchar *)lparg1);
+fail:
+ if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
+ if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, JNI_ABORT);
+ OS_NATIVE_EXIT(env, that, _1g_1variant_1new___3B_3B_FUNC);
+ return rc;
+}
+#endif
+
+#ifndef NO__1g_1variant_1new___3B_3B_3B
+JNIEXPORT jlong JNICALL OS_NATIVE(_1g_1variant_1new___3B_3B_3B)
+ (JNIEnv *env, jclass that, jbyteArray arg0, jbyteArray arg1, jbyteArray arg2)
+{
+ jbyte *lparg0=NULL;
+ jbyte *lparg1=NULL;
+ jbyte *lparg2=NULL;
+ jlong rc = 0;
+ OS_NATIVE_ENTER(env, that, _1g_1variant_1new___3B_3B_3B_FUNC);
+ if (arg0) if ((lparg0 = (*env)->GetByteArrayElements(env, arg0, NULL)) == NULL) goto fail;
+ if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail;
+ if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail;
+ rc = (jlong)g_variant_new((const gchar *)lparg0, (const gchar *)lparg1, (const gchar *)lparg2);
+fail:
+ if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, JNI_ABORT);
+ if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, JNI_ABORT);
+ if (arg0 && lparg0) (*env)->ReleaseByteArrayElements(env, arg0, lparg0, JNI_ABORT);
+ OS_NATIVE_EXIT(env, that, _1g_1variant_1new___3B_3B_3B_FUNC);
+ return rc;
+}
+#endif
+
#ifndef NO__1g_1variant_1new_1boolean
JNIEXPORT jlong JNICALL OS_NATIVE(_1g_1variant_1new_1boolean)
(JNIEnv *env, jclass that, jboolean arg0)
@@ -16571,6 +16673,16 @@ JNIEXPORT jlong JNICALL OS_NATIVE(_1g_1variant_1new_1uint64)
}
#endif
+#ifndef NO__1g_1variant_1type_1free
+JNIEXPORT void JNICALL OS_NATIVE(_1g_1variant_1type_1free)
+ (JNIEnv *env, jclass that, jlong arg0)
+{
+ OS_NATIVE_ENTER(env, that, _1g_1variant_1type_1free_FUNC);
+ g_variant_type_free((GVariantType *)arg0);
+ OS_NATIVE_EXIT(env, that, _1g_1variant_1type_1free_FUNC);
+}
+#endif
+
#ifndef NO__1g_1variant_1type_1new
JNIEXPORT jlong JNICALL OS_NATIVE(_1g_1variant_1type_1new)
(JNIEnv *env, jclass that, jbyteArray arg0)
@@ -16587,6 +16699,16 @@ fail:
}
#endif
+#ifndef NO__1g_1variant_1unref
+JNIEXPORT void JNICALL OS_NATIVE(_1g_1variant_1unref)
+ (JNIEnv *env, jclass that, jlong arg0)
+{
+ OS_NATIVE_ENTER(env, that, _1g_1variant_1unref_FUNC);
+ g_variant_unref((GVariant *)arg0);
+ OS_NATIVE_EXIT(env, that, _1g_1variant_1unref_FUNC);
+}
+#endif
+
#ifndef NO__1getpid
JNIEXPORT jint JNICALL OS_NATIVE(_1getpid)
(JNIEnv *env, jclass that)
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c
index ef46e89be3..40806b67d5 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c
@@ -1223,6 +1223,7 @@ char * OS_nativeFunctionNames[] = {
"_1g_1dbus_1proxy_1call",
"_1g_1dbus_1proxy_1call_1finish",
"_1g_1dbus_1proxy_1call_1sync",
+ "_1g_1dbus_1proxy_1get_1name_1owner",
"_1g_1dbus_1proxy_1new_1for_1bus_1sync",
"_1g_1error_1free",
"_1g_1error_1get_1message",
@@ -1240,6 +1241,7 @@ char * OS_nativeFunctionNames[] = {
"_1g_1filename_1to_1utf8",
"_1g_1free",
"_1g_1get_1current_1time",
+ "_1g_1getenv",
"_1g_1hash_1table_1get_1values",
"_1g_1icon_1new_1for_1string",
"_1g_1icon_1to_1string",
@@ -1326,6 +1328,7 @@ char * OS_nativeFunctionNames[] = {
"_1g_1type_1parent",
"_1g_1type_1query",
"_1g_1type_1register_1static",
+ "_1g_1unsetenv",
"_1g_1utf16_1offset_1to_1pointer",
"_1g_1utf16_1offset_1to_1utf8_1offset",
"_1g_1utf16_1pointer_1to_1offset",
@@ -1352,6 +1355,9 @@ char * OS_nativeFunctionNames[] = {
"_1g_1variant_1get_1uint64",
"_1g_1variant_1is_1of_1type",
"_1g_1variant_1n_1children",
+ "_1g_1variant_1new___3BZ_3B",
+ "_1g_1variant_1new___3B_3B",
+ "_1g_1variant_1new___3B_3B_3B",
"_1g_1variant_1new_1boolean",
"_1g_1variant_1new_1byte",
"_1g_1variant_1new_1double",
@@ -1359,7 +1365,9 @@ char * OS_nativeFunctionNames[] = {
"_1g_1variant_1new_1string",
"_1g_1variant_1new_1tuple",
"_1g_1variant_1new_1uint64",
+ "_1g_1variant_1type_1free",
"_1g_1variant_1type_1new",
+ "_1g_1variant_1unref",
"_1getpid",
"_1glib_1major_1version",
"_1glib_1micro_1version",
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h
index 7e6d144d0b..935e7d2522 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h
@@ -1197,6 +1197,7 @@ typedef enum {
_1g_1dbus_1proxy_1call_FUNC,
_1g_1dbus_1proxy_1call_1finish_FUNC,
_1g_1dbus_1proxy_1call_1sync_FUNC,
+ _1g_1dbus_1proxy_1get_1name_1owner_FUNC,
_1g_1dbus_1proxy_1new_1for_1bus_1sync_FUNC,
_1g_1error_1free_FUNC,
_1g_1error_1get_1message_FUNC,
@@ -1214,6 +1215,7 @@ typedef enum {
_1g_1filename_1to_1utf8_FUNC,
_1g_1free_FUNC,
_1g_1get_1current_1time_FUNC,
+ _1g_1getenv_FUNC,
_1g_1hash_1table_1get_1values_FUNC,
_1g_1icon_1new_1for_1string_FUNC,
_1g_1icon_1to_1string_FUNC,
@@ -1300,6 +1302,7 @@ typedef enum {
_1g_1type_1parent_FUNC,
_1g_1type_1query_FUNC,
_1g_1type_1register_1static_FUNC,
+ _1g_1unsetenv_FUNC,
_1g_1utf16_1offset_1to_1pointer_FUNC,
_1g_1utf16_1offset_1to_1utf8_1offset_FUNC,
_1g_1utf16_1pointer_1to_1offset_FUNC,
@@ -1326,6 +1329,9 @@ typedef enum {
_1g_1variant_1get_1uint64_FUNC,
_1g_1variant_1is_1of_1type_FUNC,
_1g_1variant_1n_1children_FUNC,
+ _1g_1variant_1new___3BZ_3B_FUNC,
+ _1g_1variant_1new___3B_3B_FUNC,
+ _1g_1variant_1new___3B_3B_3B_FUNC,
_1g_1variant_1new_1boolean_FUNC,
_1g_1variant_1new_1byte_FUNC,
_1g_1variant_1new_1double_FUNC,
@@ -1333,7 +1339,9 @@ typedef enum {
_1g_1variant_1new_1string_FUNC,
_1g_1variant_1new_1tuple_FUNC,
_1g_1variant_1new_1uint64_FUNC,
+ _1g_1variant_1type_1free_FUNC,
_1g_1variant_1type_1new_FUNC,
+ _1g_1variant_1unref_FUNC,
_1getpid_FUNC,
_1glib_1major_1version_FUNC,
_1glib_1micro_1version_FUNC,
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 6e605618d6..213b7d8e70 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
@@ -1741,6 +1741,18 @@ public static final void g_free(long mem) {
}
}
/**
+ * @param variable cast=(const gchar *),flags=no_out
+ */
+public static final native long _g_getenv(byte [] variable);
+public static final long g_getenv(byte [] variable) {
+ lock.lock();
+ try {
+ return _g_getenv(variable);
+ } finally {
+ lock.unlock();
+ }
+}
+/**
* @param table cast=(GHashTable *)
*/
public static final native long _g_hash_table_get_values(long table);
@@ -2791,7 +2803,18 @@ public static final long g_value_peek_pointer (long value) {
lock.unlock();
}
}
-
+/**
+ * @param variable cast=(const gchar *),flags=no_out
+ */
+public static final native void _g_unsetenv(byte [] variable);
+public static final void g_unsetenv(byte [] variable) {
+ lock.lock();
+ try {
+ _g_unsetenv(variable);
+ } finally {
+ lock.unlock();
+ }
+}
/** @method flags=const */
public static final native int _glib_major_version();
public static final int glib_major_version() {
@@ -4237,6 +4260,20 @@ public static final void g_dbus_proxy_call (long proxy, byte[] method_name, long
/**
* @param proxy cast=(GDBusProxy *)
+ * @category gdbus
+ */
+public static final native long _g_dbus_proxy_get_name_owner (long proxy);
+public static final long g_dbus_proxy_get_name_owner (long proxy) {
+ lock.lock();
+ try {
+ return _g_dbus_proxy_get_name_owner (proxy);
+ } finally {
+ lock.unlock();
+ }
+}
+
+/**
+ * @param proxy cast=(GDBusProxy *)
* @param res cast=(GAsyncResult *)
* @param error cast=(GError **)
* @category gdbus
@@ -4374,6 +4411,21 @@ public static final void g_variant_builder_add_value (long builder, long value)
}
/**
+ * @param type cast=(GVariantType *)
+ * @category gdbus
+ */
+public static final native void _g_variant_type_free (long type);
+/** @category gdbus */
+public static final void g_variant_type_free (long type) {
+ lock.lock();
+ try {
+ _g_variant_type_free(type);
+ } finally {
+ lock.unlock();
+ }
+}
+
+/**
* @param type cast=(const gchar *)
* @category gdbus
*/
@@ -4419,6 +4471,56 @@ public static final void g_variant_builder_unref (long builder) {
}
/**
+ * @param format_string cast=(const gchar *),flags=no_out
+ * @param arg0 cast=(const gchar *),flags=no_out
+ * @category gdbus
+ */
+public static final native long _g_variant_new (byte[] format_string, byte[] arg0);
+/** @category gdbus */
+public static final long g_variant_new (byte[] format_string, byte[] arg0) {
+ lock.lock();
+ try {
+ return _g_variant_new(format_string, arg0);
+ } finally {
+ lock.unlock();
+ }
+}
+
+/**
+ * @param format_string cast=(const gchar *),flags=no_out
+ * @param arg0 cast=(gboolean)
+ * @param arg1 cast=(const gchar *),flags=no_out
+ * @category gdbus
+ */
+public static final native long _g_variant_new (byte[] format_string, boolean arg0, byte[] arg1);
+/** @category gdbus */
+public static final long g_variant_new (byte[] format_string, boolean arg0, byte[] arg1) {
+ lock.lock();
+ try {
+ return _g_variant_new(format_string, arg0, arg1);
+ } finally {
+ lock.unlock();
+ }
+}
+
+/**
+ * @param format_string cast=(const gchar *),flags=no_out
+ * @param arg0 cast=(const gchar *),flags=no_out
+ * @param arg1 cast=(const gchar *),flags=no_out
+ * @category gdbus
+ */
+public static final native long _g_variant_new (byte[] format_string, byte[] arg0, byte[] arg1);
+/** @category gdbus */
+public static final long g_variant_new (byte[] format_string, byte[] arg0, byte[] arg1) {
+ lock.lock();
+ try {
+ return _g_variant_new(format_string, arg0, arg1);
+ } finally {
+ lock.unlock();
+ }
+}
+
+/**
* @param intval cast=(gint32)
* @category gdbus
*/
@@ -4692,6 +4794,21 @@ public static final long g_variant_new_string (byte[] string) {
}
/**
+ * @param value cast=(GVariant *)
+ * @category gdbus
+ */
+public static final native void _g_variant_unref (long value);
+/** @category gdbus */
+public static final void g_variant_unref (long value) {
+ lock.lock();
+ try {
+ _g_variant_unref (value);
+ } finally {
+ lock.unlock();
+ }
+}
+
+/**
* @param object cast=(GObject *)
*/
public static final native long _g_object_ref_sink(long object);

Back to the top