|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Yuriy Kaminskiy 2:5020/517.21 25 Jan 2002 10:53:29 To : Artem Chuprina Subject : Re: Програмное переключение десктопов в fvwm2 -------------------------------------------------------------------------------- Content-Type: text/plain; charset=koi8-r Content-Transfer-Encoding: 8bit Hello, Artem! >>>>> On 13:36 24/1/2002, ran@ice.ru writes: AC> А вот за сэмулировать нажатие клавиши... Вообще по идее в X можно AC> послать программе событие нажатия клавиши. А вот хватит ли на это AC> прав по жизни... Прав-то хватит, только вот программа может такие события игнорировать (в xterm этим можно рулить из менюшки, в xemacs - M-: (setq x-allow-sendevents t) [по-умолчанию - nil] rxvt и нетшкаф - по-умолчанию позволяют, ручек для изменения - я не нашел :( -- Yuriy Kaminskiy. --=-=-= Content-Type: application/octet-stream Content-Disposition: inline; filename=xsendevent.c Content-Transfer-Encoding: 7bit /* * compile & link: gcc -pipe -O2 -o xsendevent{,.c} -L /usr/X11R6/lib -lX11 * run: ./xsendevent "$WINDOWID" 1 2 3 4 * # sends keys 1, 2, 3 and 4 to window $WINDOWID */ #include <stdio.h> #include <stdlib.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xmu/WinUtil.h> #include <string.h> #define arraysize(X) (sizeof(X)/sizeof((X)[0])) static int parsemodifiers(char const ** s) { static const struct { int val; const char * desc; } map[] = { { ShiftMask, "Shift" }, { ControlMask, "Control" }, { ControlMask, "Ctrl" }, { Mod1Mask, "Meta" }, { Mod1Mask, "Alt" }, { Mod1Mask, "Mod1" }, { Mod2Mask, "Mod2" }, { Mod2Mask, "Super" }, { Mod3Mask, "Mod3" }, { Mod4Mask, "Mod4" }, { Mod4Mask, "Hyper" }, { Mod5Mask, "Mod5" }, }; int modifiers = 0; const char * p = *s; const char * q = p; while((p = strchr(p,'+'))!=NULL && p[1]) { int i; for(i = 0; i < arraysize(map); i++) if(strncasecmp(q, map[i].desc, p-q) == 0) { modifiers |= map[i].val; break; } if(i == arraysize(map)) break; q = p + 1; } *s = q; return modifiers; } int main(int argc, char *argv[]) { Display *dpy; Window window; char *prog; char *s; int i; if ((prog=strrchr(argv[0],'/'))==NULL) prog=argv[0]; else prog++; if (argc < 2) { printf("Usage: %s windowid [[+-][+shift][+control][+meta][+alt]keysym...]\n", prog); return 1; } dpy = XOpenDisplay(NULL); if (dpy == NULL) { fprintf(stderr,"%s: Cannot open display\n",prog); return 1; } window = (Window)strtol(argv[1], &s, 0); if(*s) { fprintf(stderr, "%s: bad windowid: `%s'\n%*c\n", prog,argv[1],strlen(prog)+17+1+(s-argv[1]),'^'); XCloseDisplay(dpy); return 1; } for(i = 2; i < argc; i++) { char state; XEvent ev; KeySym key; ev.xkey.window = window; ev.xkey.root = ev.xkey.subwindow = None; ev.xkey.time = 0; ev.xkey.x = ev.xkey.y = ev.xkey.x_root = ev.xkey.y_root = 0; s = argv[i]; ev.xkey.state = parsemodifiers(&s); switch(*s) { case '+': case '-': state = *s++; break; default: state = 0; } key = XStringToKeysym(s); if(key == None) { fprintf(stderr,"cannot parse keysym `%s'\n", s); continue; } ev.xkey.keycode = XKeysymToKeycode(dpy,key); ev.xkey.same_screen = True; switch(state) { case 0: case '+': ev.xkey.type = KeyPress; XSendEvent(dpy, window, True, KeyPressMask, &ev); } switch(state) { case 0: case '-': ev.xkey.type = KeyRelease; XSendEvent(dpy, window, True, KeyReleaseMask, &ev); } } XCloseDisplay(dpy); return 0; } /* vim: aw */ --=-=-=-- --- Gnus/5.0808 (Gnus v5.8.8) XEmacs/21.1 (Cuyahoga Valley) * Origin: none (2:5020/517.21@fidonet) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/174279c8cadc6.html, оценка из 5, голосов 10
|