static XShmSegmentInfo shminfo;
DEBUG_DEFINE_DEBUGF(pages)
+DEBUG_DEFINE_SOME_DEBUGF(keymap,keydebugf)
#define xassert(what) \
((what) ? (void)0 : \
static KeySym *mapping;
static int mapwidth;
-static void keymap_lookup_modifier(MappedModifier *mm, KeySym sym,
- char ifnot) {
+static void keymap_lookup_modifier(MappedModifier *mm, const char *what,
+ KeySym sym, char ifnot) {
int kc;
+ keydebugf("KEYMAP modifier lookup %-10s %#lx or '%c' ", what,
+ (unsigned long)sym, ifnot);
mm->isdef= ifnot;
for (kc=kc_min; kc <= kc_max; kc++) {
if (mapping[(kc-kc_min)*mapwidth] == sym) {
+ keydebugf(" found kc=%d\n", kc);
mm->isdef= 'y';
mm->kc= kc;
return;
}
}
+ keydebugf(" none\n");
}
static void keymap_lookup_key(MappedKey *mk, KeySym sym, const char *what) {
cols[MAXMAPCOL]= 0;
for (col=0; col<mapwidth && col<MAXMAPCOL; col++) {
-
-#define CHECK_SHIFT(sh) do{ \
- if ((sh) && (sh)->isdef!='y') { \
- cols[col]= (sh)->isdef; \
- continue; \
- } \
+ keydebugf("KEYMAP lookup %-10s %#lx col=%d ",
+ what, (unsigned long)sym, col);
+
+#define CHECK_SHIFT(sh) do{ \
+ if ((sh) && (sh)->isdef!='y') { \
+ cols[col]= (sh)->isdef; \
+ keydebugf("no-modifier " #sh "'%c'\n", (sh)->isdef); \
+ continue; \
+ } \
}while(0)
shift= col & 1 ? &mm_shift : 0;
goto found;
}
cols[col]= '_';
+ keydebugf("not-found\n");
}
fprintf(stderr,"\n"
"Unable to find a key to press to generate %s.\n"
if (xshift) *fill++ = xshift->kc;
if (shift) *fill++ = shift->kc;
- *fill += kc;
+ *fill++ += kc;
mk->len= fill - mk->kc;
+ keydebugf("found kc=%d len=%d\n",kc,mk->len);
}
static void keymap_startup(void) {
xassert( XDisplayKeycodes(disp,&kc_min,&kc_max) );
+ keydebugf("KEYMAP keycodes %d..%d\n",kc_min,kc_max);
+
xassert( mapping= XGetKeyboardMapping(disp, kc_min, kc_max-kc_min+1,
&mapwidth) );
+ keydebugf("KEYMAP got keyboard map\n");
XModifierKeymap *modmap;
xassert( modmap= XGetModifierMapping(disp) );
+ keydebugf("KEYMAP got modifier map\n");
/* find a shift keycode */
mm_shift.isdef= 'x';
int modent;
for (modent=0; modent<modmap->max_keypermod; modent++) {
- KeySym shiftsym= modmap->modifiermap[modent];
- if (shiftsym==NoSymbol) continue;
- keymap_lookup_modifier(&mm_shift, shiftsym, 's');
- if (mm_shift.isdef!='y') break;
+ int kc= modmap->modifiermap[modent];
+ keydebugf("KEYMAP modifier #0 key #%d is %d ", modent, kc);
+ if (!kc) { keydebugf("none\n"); continue; }
+ keydebugf("ok\n");
+ mm_shift.kc= kc;
+ mm_shift.isdef= 'y';
+ break;
}
- /* find keycodes for mode_switch (column+=2) and ISO L3 shift (column+=4) */
- keymap_lookup_modifier(&mm_modeswitch, XK_Mode_switch, 0);
- keymap_lookup_modifier(&mm_isol3shift, XK_ISO_Level3_Shift, 0);
-
XFreeModifiermap(modmap);
+ /* find keycodes for mode_switch (column+=2) and ISO L3 shift (column+=4) */
+ keymap_lookup_modifier(&mm_modeswitch,"modeswitch", XK_Mode_switch, 'm');
+ keymap_lookup_modifier(&mm_isol3shift,"isol3shift", XK_ISO_Level3_Shift,'l');
+
#define KEY_MAP_LOOKUP(xk) \
keymap_lookup_key(&mk_##xk, xk, #xk);
KEYS(KEY_MAP_LOOKUP)
static void send_key(MappedKey *mk) {
int i;
check_not_disturbed();
+ keydebugf("KEYMAP SEND_KEY len=%d kc=%d\n", mk->len, mk->kc[mk->len-1]);
for (i=0; i<mk->len; i++) XTestFakeKeyEvent(disp, mk->kc[i], 1, 0);
for (i=mk->len; --i>=0; ) XTestFakeKeyEvent(disp, mk->kc[i], 0, 0);
}