summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Sokolovsky <pmiscml@gmail.com>2007-11-29 11:03:24 +0000
committerPaul Sokolovsky <pmiscml@gmail.com>2007-11-29 11:03:24 +0000
commit437af8f045847a573bd30b5cc4d82cb4faded0fd (patch)
tree06759fcbd5a42697e5b4f17a51d4d7d6be3948c0
parent52b15d1b1c6f46cf6ad78609d6c1238bdfa7ddc6 (diff)
matchbox-applet-inputmanager 0.6: Implement smart IM visibility protocol.
* One of the very noticeable pain points in matchbox' IM handling is high latency of IM popping up, which can take up to half-second with complex screen layouts. This is rooted in the fact that IM process is killed when IM window is hidden, and started again afterwards. * I wanted to address this on inputmanager level, transparently to actual IM implementation, by hiding/showing IM's window by the manager. Unfortunately, there appears to be no reliable method to figure out window IDs from process properties (for example, _MB_CLIENT_EXEC_MAP X property, maintained by matcbox, doesm't capture all apps started, in particular, it captures neither xkbd nor matchbox-keyboard, GPE's term app is not caught too, while either GPE apps are). Then, wanted to implement custom PropertyNotify-based protocol, though there would be left issue of distinguishing IMs which support this protocol and ones which don't. Finally, by random gerpping, I found that xkbd supports Unix signal based visibility protocol! By receiving SIGUSR1, it hides/shows its window. This seems like 100% win, as the default behavior for SIGUSR1 is process termination, so unsupporting clients will be just terminated as before.
-rw-r--r--packages/matchbox-applet-inputmanager/files/visibility-protocol.patch33
-rw-r--r--packages/matchbox-applet-inputmanager/matchbox-applet-inputmanager_0.6.bb3
2 files changed, 35 insertions, 1 deletions
diff --git a/packages/matchbox-applet-inputmanager/files/visibility-protocol.patch b/packages/matchbox-applet-inputmanager/files/visibility-protocol.patch
new file mode 100644
index 0000000000..545d4808d9
--- /dev/null
+++ b/packages/matchbox-applet-inputmanager/files/visibility-protocol.patch
@@ -0,0 +1,33 @@
+# HG changeset patch
+# User "Paul Sokolovsky <pfalcon@users.sourceforge.net>"
+# Date 1196333272 -7200
+# Node ID 4ec785864bbe896eda3b933e65a5f2d71864b9b3
+# Parent 375f9e4a30d3de9852b00cd1decb259f4f04446e
+Implement an IM [Unix-]signal-based visibility protocol, as supported
+by xkbd. By receiving SISUSR1, IM implementation toggles its visibility.
+The most valuable, default action for SIGUSR1 is process termination, so
+we can send SIGUSR1 unconditionally, replacing old method of sending
+SIGTERM (and there's also check for process existence before sending
+signal, so if process is dead, it will be just restarted).
+
+diff -r 375f9e4a30d3 -r 4ec785864bbe mbinputmgr.c
+--- a/mbinputmgr.c Wed Nov 28 03:41:20 2007 +0200
++++ b/mbinputmgr.c Thu Nov 29 12:47:52 2007 +0200
+@@ -1,3 +1,4 @@
++#include <signal.h>
+ #include "mbinputmgr.h"
+
+ static void
+@@ -233,8 +234,10 @@ mbinputmgr_toggle_selected_method (MBInp
+ if ( (inpmgr->PidCurrent != -1) /* Something running */
+ && (kill(inpmgr->PidCurrent, 0) != -1) )
+ {
+- kill(inpmgr->PidCurrent, 15); /* kill it */
+- inpmgr->PidCurrent = -1;
++ /* Send a SIGUSR1. Smart IMs will toggle their visibility.
++ Dumb, which don't handle it at all, will just die
++ per default action for SIGUSR1, termination. */
++ kill(inpmgr->PidCurrent, SIGUSR1);
+ }
+ else fork_exec(inpmgr, inpmgr->MethodSelected->exec);
+ }
diff --git a/packages/matchbox-applet-inputmanager/matchbox-applet-inputmanager_0.6.bb b/packages/matchbox-applet-inputmanager/matchbox-applet-inputmanager_0.6.bb
index 4afdd426db..09f2a7d999 100644
--- a/packages/matchbox-applet-inputmanager/matchbox-applet-inputmanager_0.6.bb
+++ b/packages/matchbox-applet-inputmanager/matchbox-applet-inputmanager_0.6.bb
@@ -3,11 +3,12 @@ LICENSE = "GPL"
DEPENDS = "matchbox-wm libmatchbox"
SECTION = "x11/wm"
-PR = "r3"
+PR = "r4"
SRC_URI = "http://projects.o-hand.com/matchbox/sources/mb-applet-input-manager/${PV}/mb-applet-input-manager-${PV}.tar.gz \
file://update-to-svn.diff;patch=1 \
file://mbinputmgr-libgtkinput.patch;patch=1 \
+ file://visibility-protocol.patch;patch=1 \
"
S = "${WORKDIR}/mb-applet-input-manager-${PV}"