From 47b0afad194e92386d648e9056017c8ecd2906ab Mon Sep 17 00:00:00 2001 From: Artem Bochkarev Date: Wed, 30 Jan 2019 14:23:04 +0300 Subject: [PATCH] linux-menu: fixed mnemonics processing under KDE process key-events (for mnemonic shortcuts) within ide --- bin/linux/libdbm64.so | Bin 39208 -> 39520 bytes native/LinuxGlobalMenu/DbusMenuWrapper.c | 44 +++++------ native/LinuxGlobalMenu/DbusMenuWrapper.h | 7 +- .../openapi/wm/impl/GlobalMenuLinux.java | 70 ++++++++++++------ 4 files changed, 75 insertions(+), 46 deletions(-) diff --git a/bin/linux/libdbm64.so b/bin/linux/libdbm64.so index 8d086450278368ad09fdb5ca370fcc074756dfb0..d8fa66c6b661c2492cac81af1bb5b1a3e2ee20ab 100755 GIT binary patch delta 14672 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

U(24Y;`#F_>~E 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 Bz2N`= delta 14368 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 F{{x>-Et>!U diff --git a/native/LinuxGlobalMenu/DbusMenuWrapper.c b/native/LinuxGlobalMenu/DbusMenuWrapper.c index 42e0b70773fc..2d35071a0ae0 100644 --- a/native/LinuxGlobalMenu/DbusMenuWrapper.c +++ b/native/LinuxGlobalMenu/DbusMenuWrapper.c @@ -65,7 +65,7 @@ static void _printWndInfo(const WndInfo *wi, char *out, int outLen) { return; } - snprintf(out, outLen, "xid=0x%X menuPath='%s' registrar=0x%p server=0x%p menuroot=0x%p", wi->xid, wi->menuPath, + snprintf(out, (size_t)outLen, "xid=0x%X menuPath='%s' registrar=0x%p server=0x%p menuroot=0x%p", wi->xid, wi->menuPath, wi->registrar, wi->server, wi->menuroot); } @@ -163,7 +163,7 @@ static void _releaseMenuItem(gpointer data) { } } -static void _unregisterWindow(long xid, GDBusProxy * registrar) { +static void _unregisterWindow(guint32 xid, GDBusProxy * registrar) { // NOTE: sync call g_dbus_proxy_call_sync(wi->registrar, "UnregisterWindow", g_variant_new("(u)", wi->xid), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error) // under ubuntu18 (with GlobalMenu plugin) executes several minutes. // We make async call and don't care about results and errors (i.e. NULL callbacks) @@ -200,7 +200,7 @@ static void _releaseWindow(WndInfo *wi) { _unregisterWindow(wi->xid, wi->registrar); if (wi->linkedXids != NULL) { for (GList* l = wi->linkedXids; l != NULL; l = l->next) - _unregisterWindow(l->data, wi->registrar); + _unregisterWindow((guint32)l->data, wi->registrar); } g_object_unref(wi->registrar); @@ -240,7 +240,7 @@ void createMenuRootForWnd(WndInfo *wi) { dbusmenu_server_set_root(wi->server, wi->menuroot); } -WndInfo *registerWindow(long windowXid, jeventcallback handler) { +WndInfo *registerWindow(guint32 windowXid, jeventcallback handler) { // _info("register new window"); WndInfo *wi = (WndInfo *) malloc(sizeof(WndInfo)); @@ -248,7 +248,7 @@ WndInfo *registerWindow(long windowXid, jeventcallback handler) { wi->xid = (guint32) windowXid; wi->menuPath = malloc(64); - sprintf(wi->menuPath, "/com/canonical/menu/0x%lx", windowXid); + sprintf(wi->menuPath, "/com/canonical/menu/0x%x", windowXid); wi->menuroot = dbusmenu_menuitem_new(); if (wi->menuroot == NULL) { @@ -305,7 +305,7 @@ WndInfo *registerWindow(long windowXid, jeventcallback handler) { return wi; } -void bindNewWindow(WndInfo * wi, long windowXid) { +void bindNewWindow(WndInfo * wi, guint32 windowXid) { if (wi == NULL || wi->server == NULL || wi->menuPath == NULL) return; @@ -326,10 +326,10 @@ void bindNewWindow(WndInfo * wi, long windowXid) { } // _logmsg(LOG_LEVEL_INFO, "bind new window 0x%lx", windowXid); - wi->linkedXids = g_list_append(wi->linkedXids, windowXid); + wi->linkedXids = g_list_append(wi->linkedXids, (gpointer)windowXid); } -void unbindWindow(WndInfo * wi, long windowXid) { +void unbindWindow(WndInfo * wi, guint32 windowXid) { if (wi == NULL || wi->server == NULL || wi->menuPath == NULL) return; @@ -337,7 +337,7 @@ void unbindWindow(WndInfo * wi, long windowXid) { _unregisterWindow(windowXid, wi->registrar); if (wi->linkedXids != NULL) - wi->linkedXids = g_list_remove(wi->linkedXids, windowXid); + wi->linkedXids = g_list_remove(wi->linkedXids, (gpointer)windowXid); } static gboolean _execReleaseWindow(gpointer user_data) { @@ -390,8 +390,9 @@ static const char *_type2str(int type) { return "sig-shown"; case SIGNAL_CHILD_ADDED: return "sig-child-added"; + default: + return "unknown event type"; } - return "unknown event type"; } static void _handleItemSignal(DbusmenuMenuitem *item, int type) { @@ -479,7 +480,7 @@ DbusmenuMenuitem *addMenuItem(DbusmenuMenuitem *parent, int uid, const char * la if (position < 0) dbusmenu_menuitem_child_append(parent, item); else - dbusmenu_menuitem_child_add_position(parent, item, position); + dbusmenu_menuitem_child_add_position(parent, item, (guint)position); } return item; @@ -494,16 +495,23 @@ DbusmenuMenuitem* addSeparator(DbusmenuMenuitem * parent, int uid, int position) if (position < 0) dbusmenu_menuitem_child_append(parent, item); else - dbusmenu_menuitem_child_add_position(parent, item, position); + dbusmenu_menuitem_child_add_position(parent, item, (guint)position); } return item; } -void reorderMenuItem(DbusmenuMenuitem * parent, DbusmenuMenuitem* item, int position) { dbusmenu_menuitem_child_reorder(parent, item, position); } +void reorderMenuItem(DbusmenuMenuitem * parent, DbusmenuMenuitem* item, int position) { dbusmenu_menuitem_child_reorder(parent, item, (guint)position); } void removeMenuItem(DbusmenuMenuitem * parent, DbusmenuMenuitem* item) { dbusmenu_menuitem_child_delete(parent, item); } +static gboolean _showMenuItem(gpointer item) { + dbusmenu_menuitem_show_to_user(item, 0); + return FALSE; +} + +void showMenuItem(DbusmenuMenuitem* item) { g_idle_add(_showMenuItem, item); } + void setItemLabel(DbusmenuMenuitem *item, const char *label) { dbusmenu_menuitem_property_set(item, DBUSMENU_MENUITEM_PROP_LABEL, label); } @@ -513,14 +521,8 @@ void setItemEnabled(DbusmenuMenuitem *item, bool isEnabled) { } void setItemIcon(DbusmenuMenuitem *item, const char *iconBytesPng, int iconBytesCount) { - const gboolean propreturn = dbusmenu_menuitem_property_set_byte_array(item, DBUSMENU_MENUITEM_PROP_ICON_DATA, - (guchar *) iconBytesPng, iconBytesCount); + dbusmenu_menuitem_property_set_byte_array(item, DBUSMENU_MENUITEM_PROP_ICON_DATA, (guchar*)iconBytesPng, (gsize)iconBytesCount); // NOTE: memory copied (try to call memset(iconBytesPng, 0, iconBytesCount) after) - -// if (propreturn) -// _logmsg(LOG_LEVEL_INFO, "\tset %d icon bytes for item %s", iconBytesCount, _getItemLabel(item)); -// else -// _logmsg(LOG_LEVEL_ERROR, "\tcan't set %d icon bytes for item %s", iconBytesCount, _getItemLabel(item)); } // java modifiers @@ -530,7 +532,7 @@ static const int META_MASK = 1 << 2; static const int ALT_MASK = 1 << 3; void setItemShortcut(DbusmenuMenuitem *item, int jmodifiers, int x11keycode) { - char* xname = XKeysymToString(x11keycode); + char* xname = XKeysymToString((KeySym)x11keycode); if (xname == NULL) { // _logmsg(LOG_LEVEL_ERROR, "XKeysymToString returns null for x11keycode=%d", x11keycode); return; diff --git a/native/LinuxGlobalMenu/DbusMenuWrapper.h b/native/LinuxGlobalMenu/DbusMenuWrapper.h index 42264b053749..e10dc7add3cb 100644 --- a/native/LinuxGlobalMenu/DbusMenuWrapper.h +++ b/native/LinuxGlobalMenu/DbusMenuWrapper.h @@ -39,11 +39,11 @@ void runMainLoop(jlogger jlogger, jrunnable onAppmenuServiceAppeared, jrunnable void execOnMainLoop(jrunnable run); -WndInfo* registerWindow(long windowXid, jeventcallback handler); // creates menu-server and binds to xid +WndInfo* registerWindow(guint32 windowXid, jeventcallback handler); // creates menu-server and binds to xid void releaseWindowOnMainLoop(WndInfo* wi, jrunnable onReleased); -void bindNewWindow(WndInfo * wi, long windowXid); -void unbindWindow(WndInfo * wi, long windowXid); +void bindNewWindow(WndInfo * wi, guint32 windowXid); +void unbindWindow(WndInfo * wi, guint32 windowXid); void createMenuRootForWnd(WndInfo *wi); void clearRootMenu(WndInfo* wi); @@ -55,6 +55,7 @@ DbusmenuMenuitem* addSeparator(DbusmenuMenuitem * parent, int uid, int position) void reorderMenuItem(DbusmenuMenuitem * parent, DbusmenuMenuitem* item, int position); void removeMenuItem(DbusmenuMenuitem * parent, DbusmenuMenuitem* item); +void showMenuItem(DbusmenuMenuitem* item); void setItemLabel(DbusmenuMenuitem* item, const char * label); void setItemEnabled(DbusmenuMenuitem* item, bool isEnabled); 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 0b85dd9d5ce0..f5ebb5b28d6d 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 @@ -5,6 +5,7 @@ import com.intellij.execution.ExecutionException; import com.intellij.execution.configurations.GeneralCommandLine; import com.intellij.execution.process.ProcessOutput; import com.intellij.execution.util.ExecUtil; +import com.intellij.ide.IdeEventQueue; import com.intellij.ide.plugins.PluginManager; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.AnAction; @@ -30,6 +31,7 @@ import javax.imageio.ImageIO; import javax.swing.Timer; import javax.swing.*; import java.awt.*; +import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; import java.awt.peer.ComponentPeer; import java.io.ByteArrayOutputStream; @@ -63,6 +65,7 @@ interface GlobalMenuLib extends Library { void reorderMenuItem(Pointer parent, Pointer item, int position); void removeMenuItem(Pointer parent, Pointer item); + void showMenuItem(Pointer item); void setItemLabel(Pointer item, String label); void setItemEnabled(Pointer item, boolean isEnabled); @@ -208,6 +211,37 @@ public class GlobalMenuLinux implements GlobalMenuLib.EventHandler, Disposable { if (myIsDisposed) ourInstances.remove(myXid); }; + + if (SystemInfo.isKDE) { + // root menu items doesn't catch mnemonic shortcuts (in KDE), so process them inside IDE + IdeEventQueue.getInstance().addDispatcher(e -> { + if (!(e instanceof KeyEvent)) + return false; + + final KeyEvent event = (KeyEvent)e; + if (!event.isAltDown()) + return false; + + final Component src = event.getComponent(); + final Window wndParent = src instanceof Window ? (Window)src : SwingUtilities.windowForComponent(src); + final char eventChar = Character.toUpperCase(event.getKeyChar()); + + for (GlobalMenuLinux gml: ourInstances.values()) { + if (gml.myFrame == wndParent) { + for (MenuItemInternal root : gml.myRoots) { + if (eventChar == root.mnemonic) { + ourLib.showMenuItem(root.nativePeer); + return false; + } + } + return false; + } + } + + return false; + }, this); + } + ourInstances.put(myXid, this); } @@ -652,6 +686,7 @@ public class GlobalMenuLinux implements GlobalMenuLib.EventHandler, Disposable { String txt; String originTxt; + char mnemonic; boolean isEnabled = true; boolean isChecked = false; byte[] iconPngBytes; @@ -714,7 +749,19 @@ public class GlobalMenuLinux implements GlobalMenuLib.EventHandler, Disposable { void setLabelFromSwingPeer(@NotNull JMenuItem peer) { // exec at EDT originTxt = peer.getText(); - txt = _buildMnemonicLabel(peer); + txt = originTxt != null ? originTxt : ""; + mnemonic = 0; + + if (originTxt != null && !originTxt.isEmpty()) { + final int mnemonicCode = peer.getMnemonic(); + final int mnemonicIndex = peer.getDisplayedMnemonicIndex(); + if (mnemonicIndex >= 0 && mnemonicIndex < originTxt.length() && Character.toUpperCase(originTxt.charAt(mnemonicIndex)) == mnemonicCode) { + final StringBuilder res = new StringBuilder(originTxt); + res.insert(mnemonicIndex, '_'); + txt = res.toString(); + mnemonic = (char)mnemonicCode; + } + } } void updateNative() { @@ -900,27 +947,6 @@ public class GlobalMenuLinux implements GlobalMenuLib.EventHandler, Disposable { } } - private static String _buildMnemonicLabel(JMenuItem jmenuitem) { - String text = jmenuitem.getText(); - final int mnemonicCode = jmenuitem.getMnemonic(); - final int mnemonicIndex = jmenuitem.getDisplayedMnemonicIndex(); - if (text == null) - text = ""; - final int index; - if (mnemonicIndex >= 0 && mnemonicIndex < text.length() && Character.toUpperCase(text.charAt(mnemonicIndex)) == mnemonicCode) { - index = mnemonicIndex; - } else { - // Mnemonic mismatch index - index = -1; - // LOG.error("Mnemonic code " + mnemonicCode + " mismatch index " + mnemonicIndex + " with txt: " + text); - } - - final StringBuilder res = new StringBuilder(text); - if(index != -1) - res.insert(index, '_'); - return res.toString(); - } - private static Object _getPeerField(@NotNull Component object) { try { Field field = Component.class.getDeclaredField("peer");