Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: Програмное переключение десктопов в fvwm2   Yuriy Kaminskiy   25 Jan 2002 10:53:29 
Архивное /ru.linux/174279c8cadc6.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional