#include <X11/extensions/XTest.h> #include <X11/Xlib.h> #include <X11/keysym.h> #include <X11/Xresource.h> #include <X11/Xatom.h> #include <iostream> #include <string> Window *listWin (Display *disp, unsigned long *len); char *nameWin (Display *disp, Window win); void sendKey(Display* disp, char letter); int main(int argc, char* argv[]){ int i, counter, selectWindow, currentState; unsigned long len; char *name; XKeyEvent esend; Display *disp = XOpenDisplay(NULL); Window *list, currentWindow; std::string data; XGetInputFocus(disp, ¤tWindow, ¤tState); // Getting the current focused window list = (Window*)listWin(disp,&len); // Getting all the windows for (i=0;i<(int)len;i++) { name = nameWin(disp,list[i]); std::cout << i << " : " << name << std::endl; // Display window's name } std::cout << "Wich window do you want to use ?" << std::endl; std::cin>>selectWindow; if(selectWindow<0 || selectWindow >i){ std::cout << "Invalid window" << std::endl; return 1; } std::cout << "Data to send ?" << std::endl; std::cin.ignore(); std::getline(std::cin,data); std::cout << "Number of sending : " << std::endl; std::cin >> counter; for(counter;counter > 0; counter--){ XSetInputFocus(disp, list[selectWindow],RevertToPointerRoot,0); for(i=0;i<data.size();i++) sendKey(disp, data[i]); // Send a char to the window sleep(1); // Sleep is needed, otherwise, the return caracter is not send. sendKey(disp, '\n'); } XSetInputFocus(disp, currentWindow, RevertToPointerRoot, 0); // Put the old window on focus XFlush(disp); return 0; } void sendKey(Display* disp, char letter){ // Send a char to the selected window KeySym key; switch(letter){ // this switch is requiered to handle all the keyboards, you can add case: if you need case '1': key = XK_1; break; case '2': key = XK_2; break; case '3': key = XK_3; break; case '4': key = XK_4; break; case '5': key = XK_5; break; case '6': key = XK_6; break; case '7': key = XK_7; break; case '8': key = XK_8; break; case '9': key = XK_9; break; case '0': key = XK_0; break; case 'a': key = XK_a; break; case 'b': key = XK_b; break; case 'c': key = XK_c; break; case 'd': key = XK_d; break; case 'e': key = XK_e; break; case 'f': key = XK_f; break; case 'g': key = XK_g; break; case 'h': key = XK_h; break; case 'i': key = XK_i; break; case 'j': key = XK_j; break; case 'k': key = XK_k; break; case 'l': key = XK_l; break; case 'm': key = XK_m; break; case 'n': key = XK_n; break; case 'o': key = XK_o; break; case 'p': key = XK_p; break; case 'q': key = XK_q; break; case 'r': key = XK_r; break; case 's': key = XK_s; break; case 't': key = XK_t; break; case 'u': key = XK_u; break; case 'v': key = XK_v; break; case 'w': key = XK_w; break; case 'x': key = XK_x; break; case 'y': key = XK_y; break; case 'z': key = XK_z; break; case 'A': key = XK_a; break; case 'B': key = XK_b; break; case 'C': key = XK_c; break; case 'D': key = XK_d; break; case 'E': key = XK_e; break; case 'F': key = XK_f; break; case 'G': key = XK_g; break; case 'H': key = XK_h; break; case 'I': key = XK_i; break; case 'J': key = XK_j; break; case 'K': key = XK_k; break; case 'L': key = XK_l; break; case 'M': key = XK_m; break; case 'N': key = XK_n; break; case 'O': key = XK_o; break; case 'P': key = XK_p; break; case 'Q': key = XK_q; break; case 'R': key = XK_r; break; case 'S': key = XK_s; break; case 'T': key = XK_t; break; case 'U': key = XK_u; break; case 'V': key = XK_v; break; case 'W': key = XK_w; break; case 'X': key = XK_x; break; case 'Y': key = XK_y; break; case 'Z': key = XK_z; break; case 'é': key = XK_2; break; case 'è': key = XK_7; break; case '!': key = XK_exclam; break; case ' ': key = XK_space; break; case '\n': key = XK_Return; break; default : key = XK_space; break; } XTestGrabControl (disp, True); XTestFakeKeyEvent (disp, XKeysymToKeycode(disp, key), True, 0); XTestFakeKeyEvent (disp, XKeysymToKeycode(disp, key), False, 0); XSync (disp, False); XTestGrabControl (disp, False); } Window *listWin (Display *disp, unsigned long *len) { // List all the application running on X Atom prop = XInternAtom(disp,"_NET_CLIENT_LIST",False), type; int form; unsigned long remain; unsigned char *list; if (XGetWindowProperty(disp,XDefaultRootWindow(disp),prop,0,1024,False,XA_WINDOW, &type,&form,len,&remain,&list) != Success) { return 0; } return (Window*)list; } char *nameWin (Display *disp, Window win) { // Return a window name Atom prop = XInternAtom(disp,"WM_NAME",False), type; int form; unsigned long remain, len; unsigned char *list; if (XGetWindowProperty(disp,win,prop,0,1024,False,AnyPropertyType, &type,&form,&len,&remain,&list) != Success) { return NULL; } return (char*)list; }
ex0ns