User:Paolo Liberatore/Xf1abcd.c
From Wikipedia, the free encyclopedia
< User:Paolo Liberatore
/* This program changes the keysyms associated with the keycode that is currently associated to F1 to "a b c d", wait for 20 seconds and then switches back to the normal association. The function for switching back to the old association is also called on SIGINT, SIGQUIT, and SIGTERM. Pressing F1 during the 20 seconds sleep produces the character "a". The other characters are produced according to a combination of factors. In Linux, the second character is obtained by pressing Control-Alt-F1. The third and fourth require a keycode to be associated to the keysym Mode_switch and that this keycode is also added as a modifer in Mod1-Mod5. */ #include<X11/Xlib.h> #include<signal.h> #include<X11/keysym.h> void printMapping(KeySym *v, int knum) { int i; // printf("knum=%d\n", knum); for(i=0; i<knum; i++) if(v[i]==NoSymbol) printf("NoSymbol "); else printf("0x%04X ", v[i]); printf("\n"); } Display *d; KeySym *orig; int knum; KeyCode f1; void restore(int s) { printf("Restoring mapping.\n"); XChangeKeyboardMapping(d, 0x43, 4, orig, 1); XCloseDisplay(d); exit(0); } int main(int argn, char *argv[]) { KeySym new[4]={XK_a, XK_b, XK_c, XK_d}; KeySym *temp; int ntemp; int add; /* your computer will crush and burn... */ printf("This program changes the assignment of characters to the F1 key.\n"); printf("After execution that key *might* not be usable. Continue (y/n)? "); if(getchar()!='y') return 0; /* open connection with the server */ d=XOpenDisplay(NULL); if(d==NULL) { printf("Cannot open display\n"); exit(1); } /* get keycode of the F1 key */ f1=XKeysymToKeycode(d, XK_F1); printf("Keycode of f1=0x%02X\n", f1); if(f1==0) { printf("No keycode is associated to F1, change not done\n"); exit(1); } /* get modifier mapping */ printf("Current mapping: "); orig=XGetKeyboardMapping(d, f1, 1, &knum); printMapping(orig, knum); /* register signal handler (restore state) */ signal(SIGTERM, restore); signal(SIGQUIT, restore); signal(SIGINT, restore); /* change modifier */ XChangeKeyboardMapping(d, f1, 4, new, 1); printf("Changed mapping.\n"); printf("Current mapping: "); temp=XGetKeyboardMapping(d, f1, 1, &ntemp); printMapping(temp, ntemp); /* sleep and change back */ sleep(20); restore(0); XCloseDisplay(d); return 0; }