From: Ian Jackson Date: Wed, 18 Nov 2009 21:33:04 +0000 (+0000) Subject: Bugfixes and debugging for sending shifted keys etc.; now works X-Git-Tag: 5.7~2 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.main.git;a=commitdiff_plain;h=159f707628410b3a5ad07e74f4fd102a20ec3336 Bugfixes and debugging for sending shifted keys etc.; now works --- diff --git a/yarrg/convert.h b/yarrg/convert.h index 75f6179..a9e6a68 100644 --- a/yarrg/convert.h +++ b/yarrg/convert.h @@ -31,6 +31,7 @@ #define DEBUG_FLAG_LIST \ DF(findypp) \ DF(pages) \ + DF(keymap) \ DF(rect) \ DF(pixmap) \ DF(struct) \ diff --git a/yarrg/pages.c b/yarrg/pages.c index 955add9..d52cec1 100644 --- a/yarrg/pages.c +++ b/yarrg/pages.c @@ -55,6 +55,7 @@ static XImage *shmim; static XShmSegmentInfo shminfo; DEBUG_DEFINE_DEBUGF(pages) +DEBUG_DEFINE_SOME_DEBUGF(keymap,keydebugf) #define xassert(what) \ ((what) ? (void)0 : \ @@ -91,18 +92,22 @@ static MappedModifier mm_shift, mm_modeswitch, mm_isol3shift; 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) { @@ -114,12 +119,15 @@ static void keymap_lookup_key(MappedKey *mk, KeySym sym, const char *what) { cols[MAXMAPCOL]= 0; for (col=0; colisdef!='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; @@ -135,6 +143,7 @@ static void keymap_lookup_key(MappedKey *mk, KeySym sym, const char *what) { goto found; } cols[col]= '_'; + keydebugf("not-found\n"); } fprintf(stderr,"\n" "Unable to find a key to press to generate %s.\n" @@ -149,31 +158,39 @@ static void keymap_lookup_key(MappedKey *mk, KeySym sym, const char *what) { 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; modentmax_keypermod; modent++) { KeySym shiftsym= modmap->modifiermap[modent]; - if (shiftsym==NoSymbol) continue; - keymap_lookup_modifier(&mm_shift, shiftsym, 's'); - if (mm_shift.isdef!='y') break; + keydebugf("KEYMAP modifier #0 keysym #%d is %#lx ", + modent, (unsigned long)shiftsym); + if (shiftsym==NoSymbol) { keydebugf("NoSymbol\n"); continue; } + keydebugf("...\n"); + keymap_lookup_modifier(&mm_shift, "shift", shiftsym, 's'); + if (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); + keymap_lookup_modifier(&mm_modeswitch,"modeswitch", XK_Mode_switch, 'm'); + keymap_lookup_modifier(&mm_isol3shift,"isol3shift", XK_ISO_Level3_Shift,'l'); XFreeModifiermap(modmap); @@ -294,6 +311,7 @@ static void check_pointer_not_disturbed(void) { 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; ilen; i++) XTestFakeKeyEvent(disp, mk->kc[i], 1, 0); for (i=mk->len; --i>=0; ) XTestFakeKeyEvent(disp, mk->kc[i], 0, 0); }