[Xquartz-dev] My hack for reading .Xmodmap
Martin Otte
otte at duke.edu
Sun Oct 18 19:45:22 PDT 2009
Hi,
I was doing some experimenting with the latest servers, and found that
the only way to get my custom .Xmodmap to be loaded automatically at
startup was to force it to be read at the end of the
DarwinKeyboardReloadHandler routine.
Is it safe to call xmodmap at the end of the
DarwinKeyboardReloadHandler routine? Using xmodmap is much easier than
trying to parse the .Xmodmap files and then calling
XkbApplyMappingChange. I had to background the calls to xmodmap or
else the server would hang waiting for the xmodmap processes. I also
only call xmodmap on the second (or any subsequent) calls to
DarwinKeyboardReloadHandler. Here is my ugly hack to quartzKeyboard.c
that seems to be working for me:
diff -up xorg-server-1.4.2-apple49/hw/xquartz/quartzKeyboard.c.orig
xorg-server-1.4.2-apple49/hw/xquartz/quartzKeyboard.c
--- xorg-server-1.4.2-apple49/hw/xquartz/quartzKeyboard.c.orig
2009-10-14 11:06:49.000000000 -0400
+++ xorg-server-1.4.2-apple49/hw/xquartz/quartzKeyboard.c
2009-10-14 00:07:14.000000000 -0400
@@ -172,6 +172,7 @@ const static struct {
darwinKeyboardInfo keyInfo;
pthread_mutex_t keyInfo_mutex = PTHREAD_MUTEX_INITIALIZER;
+int ran_darwin_kbdreload = 0;
static void DarwinChangeKeyboardControl(DeviceIntPtr device,
KeybdCtrl *ctrl) {
// FIXME: to be implemented
@@ -372,6 +373,9 @@ void DarwinKeyboardReloadHandler(void) {
CFIndex initialKeyRepeatValue, keyRepeatValue;
BOOL ok;
DeviceIntPtr pDev = darwinKeyboard;
+ const char *xmodmap = PROJECTROOT "/bin/xmodmap";
+ const char *sysmodmap = PROJECTROOT "/lib/X11/xinit/.Xmodmap";
+ char *homedir, usermodmap[1024], cmd[1024];
DEBUG_LOG("DarwinKeyboardReloadHandler\n");
@@ -415,6 +419,28 @@ void DarwinKeyboardReloadHandler(void) {
}
XkbUpdateCoreDescription(darwinKeyboard, 0);
} pthread_mutex_unlock(&keyInfo_mutex);
+
+ if (ran_darwin_kbdreload > 0 && access(xmodmap, F_OK) == 0) {
+
+ /* Check for system .Xmodmap */
+ if (access(sysmodmap, F_OK) == 0) {
+ snprintf (cmd, sizeof(cmd), "exec %s %s &", xmodmap, sysmodmap);
+ System(cmd);
+ }
+
+ /* Check for user's local .Xmodmap */
+ homedir = getenv("HOME");
+ if (homedir != NULL) {
+ snprintf (usermodmap, sizeof(usermodmap), "%s/.Xmodmap",
homedir);
+ if (access(usermodmap, F_OK) == 0) {
+ snprintf (cmd, sizeof(cmd), "exec %s %s &", xmodmap,
usermodmap);
+ System(cmd);
+ }
+ }
+
+ } else
+ ran_darwin_kbdreload++;
+
}
//-----------------------------------------------------------------------------
Thanks,
Martin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: xquartz-force-xmodmap.patch
Type: application/octet-stream
Size: 1861 bytes
Desc: not available
URL: <http://lists.macosforge.org/pipermail/xquartz-dev/attachments/20091018/40826449/attachment.obj>
-------------- next part --------------
More information about the Xquartz-dev
mailing list