I need some test reports for this on both US and non-US (aka silly) keyboards please.
On Sat, Jan 09, 2010 at 01:22:53PM +0100, Alexandre Ratchov wrote: > On .fr keyboards you have to press shift to get digits, so > XKeycodeToKeysym(display, keycode, 0) doesn't return a > digit, so by default switching between workspaces doesn't > work. > > Similarly, ``M-.'' doesn't work, because shift modifier must > be used to get ``.'' > > More generally, M-<sym> and M-S-<sym> cannot be reliably > distinguished accross different keyboard models, except for > digits, letters, tab, arrows, enter, esc and so on. For > instance if a keyboard has ``,'' and ``.'' on the same key > M-. and M-, won't work. > > The diff below fixes digits. On .fr keyboards ``,'' and > ``.'' are on separate keys, so it fixes M-. too. IMHO, if > scrotwm defaults are supposed to work on any model, default > keybindings should use letters, digits, space, enter and so > on only. > > -- Alexandre > > Index: Makefile > =================================================================== > RCS file: /cvs/ports/x11/scrotwm/Makefile,v > retrieving revision 1.15 > diff -u -p -r1.15 Makefile > --- Makefile 7 Jan 2010 01:57:28 -0000 1.15 > +++ Makefile 9 Jan 2010 12:16:13 -0000 > @@ -7,6 +7,7 @@ SHARED_LIBS= swmhack 0.0 > DISTNAME= scrotwm-0.9.21 > EXTRACT_SUFX= .tgz > CATEGORIES= x11 > +PKGNAME= ${DISTNAME}p0 > > HOMEPAGE= http://www.scrotwm.org/ > MAINTAINER= Marco Peereboom <ma...@peereboom.us> > Index: patches/patch-scrotwm_c > =================================================================== > RCS file: /cvs/ports/x11/scrotwm/patches/patch-scrotwm_c,v > retrieving revision 1.9 > diff -u -p -r1.9 patch-scrotwm_c > --- patches/patch-scrotwm_c 7 Jan 2010 01:57:28 -0000 1.9 > +++ patches/patch-scrotwm_c 9 Jan 2010 12:16:13 -0000 > @@ -10,3 +10,21 @@ $OpenBSD: patch-scrotwm_c,v 1.9 2010/01/ > #endif > > char **start_argv; > +@@ -3852,14 +3852,15 @@ void > + keypress(XEvent *e) > + { > + unsigned int i; > +- KeySym keysym; > ++ KeySym keysym, skeysym; > + XKeyEvent *ev = &e->xkey; > + > + DNPRINTF(SWM_D_EVENT, "keypress: window: %lu\n", ev->window); > + > + keysym = XKeycodeToKeysym(display, (KeyCode)ev->keycode, 0); > ++ skeysym = XKeycodeToKeysym(display, (KeyCode)ev->keycode, 1); > + for (i = 0; i < keys_length; i++) > +- if (keysym == keys[i].keysym > ++ if ((keysym == keys[i].keysym || skeysym == keys[i].keysym) > + && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) > + && keyfuncs[keys[i].funcid].func) { > + if (keys[i].funcid == kf_spawn_custom)