Linux, Kringgå winmanager finesser ?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6953
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Linux, Kringgå winmanager finesser ?

Inlägg av Marta »

Winmanagers får allt mera blaj som tar hand om allt fler tangentkombinationer. Alt-Tab och Alt-Space är ett par som jag vill bevara, men allt krafs vill jag att programmets egna funktioner skall ta prioritet över.

Har experimenterat med XGrabKeyboard och att totalt ta över tangentbordet funkar, men att släppa igenom vissa tangenter till winmanager det vill sig inte.

Är XGrabKeyboard en framkomlig väg och hur bör jag göra istället för nedanstående sk*tkod?

Debugutskrift tangenter: alt ner, tab ner, tab upp, alt upp
keydown 40 00
keydown 17 08
keydown 17 08
keyup 17 08
keyup 40 08

Kod: Markera allt

      case KeyRelease:                                  //key up
        printf("keyup   %02x   %02x\n", ev.xkey.keycode, ev.xkey.state); //alt up?
        if (ev.xkey.keycode==0x40 && isGrabbed){        //kbd brabbed?
          XUngrabKeyboard(S.dpy, CurrentTime);          //yes, ungrab
          isGrabbed=false;                              //flag not ggrabbed
        };
        //do other stuff
      break;

      case KeyPress:                                    //key down
        printf("keydown %02x   %02x\n", ev.xkey.keycode, ev.xkey.state);
        if (ev.xkey.keycode==0x40 && ev.xkey.state==0x00){  //grab kbd when alt pressed
          XGrabKeyboard(S.dpy, S.win, false, GrabModeAsync, GrabModeAsync, CurrentTime);
          isGrabbed=true;                                   //flag grabbed
        };
        if (ev.xkey.keycode==0x17 && ev.xkey.state==0x08){  //alt-tab ?
          if (ev.xkey.send_event) break;                    //stop cascading
          XUngrabKeyboard(S.dpy, CurrentTime);              //restore normal
          isGrabbed=false;                                  //flag not gabbed
          XSendEvent(S.dpy, S.win, false, KeyPressMask, &ev); //re-issue event
          //break;                                            //done
        };
        //do other stuff
      break;

Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6953
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Linux, Kringgå winmanager finesser ?

Inlägg av Marta »

Problemet tycks vara att winmgr ignorerar keypress som emuleras med XSendEvent. Om det aldrig når fram, eller det är ev.xkey.send_event==true som orsakar detta, är okänt.

Finns det något sätt att emulera en äkta tangenttryckning?
Skriv svar