diff --git a/bin/linux/libdbm64.so b/bin/linux/libdbm64.so index a2ed4f7b04f4..98e5bcc6b359 100755 Binary files a/bin/linux/libdbm64.so and b/bin/linux/libdbm64.so differ diff --git a/native/LinuxGlobalMenu/DbusMenuWrapper.c b/native/LinuxGlobalMenu/DbusMenuWrapper.c index da30f1af8829..c34f32302b95 100644 --- a/native/LinuxGlobalMenu/DbusMenuWrapper.c +++ b/native/LinuxGlobalMenu/DbusMenuWrapper.c @@ -93,6 +93,12 @@ void stopWatchDbus() { // _info("glib main loop is stopped"); } +// used when javaFX can't be started +void runMainLoop(jlogger jlogger, jrunnable onAppmenuServiceAppeared, jrunnable onAppmenuServiceVanished) { + startWatchDbus(jlogger, onAppmenuServiceAppeared, onAppmenuServiceVanished); + g_main_loop_run(g_main_loop_new(NULL/*will be used g_main_context_default()*/, FALSE)); +} + static void _onDbusOwnerChange(GObject *gobject, GParamSpec *pspec, gpointer user_data) { GDBusProxy *proxy = G_DBUS_PROXY(gobject); diff --git a/native/LinuxGlobalMenu/DbusMenuWrapper.h b/native/LinuxGlobalMenu/DbusMenuWrapper.h index bc023f36b81c..1f216a1d68f0 100644 --- a/native/LinuxGlobalMenu/DbusMenuWrapper.h +++ b/native/LinuxGlobalMenu/DbusMenuWrapper.h @@ -39,6 +39,9 @@ extern "C"{ // must be called from java thread (to avoid detach, so jna-callbacks will be invoked from same thread) void startWatchDbus(jlogger jlogger, jrunnable onAppmenuServiceAppeared, jrunnable onAppmenuServiceVanished); void stopWatchDbus(); + +void runMainLoop(jlogger jlogger, jrunnable onAppmenuServiceAppeared, jrunnable onAppmenuServiceVanished); + void execOnMainLoop(jrunnable run); WndInfo* registerWindow(long windowXid, jeventcallback handler); // creates menu-server and binds to xid diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/GlobalMenuLinux.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/GlobalMenuLinux.java index 40a3c3db41a7..ef1067f9532c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/GlobalMenuLinux.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/GlobalMenuLinux.java @@ -40,6 +40,9 @@ import com.sun.javafx.application.PlatformImpl; interface GlobalMenuLib extends Library { void startWatchDbus(JLogger jlogger, JRunnable onAppmenuServiceAppeared, JRunnable onAppmenuServiceVanished); void stopWatchDbus(); + + void runMainLoop(JLogger jlogger, JRunnable onAppmenuServiceAppeared, JRunnable onAppmenuServiceVanished); + void execOnMainLoop(JRunnable run); Pointer registerWindow(long windowXid, EventHandler handler); @@ -164,9 +167,15 @@ public class GlobalMenuLinux implements GlobalMenuLib.EventHandler, Disposable { }; // NOTE: linux implementation of javaFX starts native main loop with GtkApplication._runLoop() - PlatformImpl.startup(()-> { - ourLib.startWatchDbus(ourGLogger, ourOnAppmenuServiceAppeared, ourOnAppmenuServiceVanished); - }); + try { + PlatformImpl.startup(() -> { + ourLib.startWatchDbus(ourGLogger, ourOnAppmenuServiceAppeared, ourOnAppmenuServiceVanished); + }); + } catch (Throwable e) { + LOG.info("can't start main loop via javaFX (will run it manualy): " + e.getMessage()); + final Thread glibMain = new Thread(()->ourLib.runMainLoop(ourGLogger, ourOnAppmenuServiceAppeared, ourOnAppmenuServiceVanished)); + glibMain.start(); + } } else { ourGLogger = null; ourProcessQueue = null;