Send key event twice: To the focused window and the root window (for global shortcuts)

This commit is contained in:
Olaf Schulz 2011-10-22 18:09:25 +02:00
parent 863683e249
commit ee96bb89cf
3 changed files with 31 additions and 11 deletions

View File

@ -227,17 +227,31 @@ KeyMod keymod;
keymod = getKeyModCodes(rootwin, keysym, modifiers);
// Send a fake key press event to the window.
XKeyEvent event = createKeyEvent(display, winFocus, winRoot, True, keymod.keyval, keymod.modifiers);
XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);
XKeyEvent event;
// Send a fake key release event to the window.
event = createKeyEvent(display, winFocus, winRoot, False, keymod.keyval, keymod.modifiers);
XSendEvent(event.display, event.window, True, KeyReleaseMask, (XEvent *)&event);
// Send a fake key press event to the focused window.
event = createKeyEvent(display, winFocus, winRoot, True, keymod.keyval, keymod.modifiers);
XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);
// Done.
XCloseDisplay(display);
return 0;
// Send a fake key release event to the focused window.
event = createKeyEvent(display, winFocus, winRoot, False, keymod.keyval, keymod.modifiers);
XSendEvent(event.display, event.window, True, KeyReleaseMask, (XEvent *)&event);
// Send a fake key press event to root window.
event = createKeyEvent(display, winRoot, winRoot, True, keymod.keyval, keymod.modifiers);
XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);
// Send a fake key release event to root window.
event = createKeyEvent(display, winRoot, winRoot, False, keymod.keyval, keymod.modifiers);
XSendEvent(event.display, event.window, True, KeyReleaseMask, (XEvent *)&event);
// Present active window. Usefull, if alt+F1 oder alt+d clicked.
//XRaiseWindow(display, winFocus);
//XLowerWindow(display, winFocus);
// Done.
XCloseDisplay(display);
return 0;
}
int keysend2(uint keysym, uint modsym1, uint modsym2) {

View File

@ -693,7 +693,13 @@ namespace NeoLayoutViewer{
//debug(@"Modi: $modi");
if( ks < 1 ) return false;
keysend(ks,modi);
if( modi == 0 || true){
// Alt-Mask do not work :-(
keysend(ks,modi);
}else{
debug("Zweiter Modi");
keysend2(ks,modi & Gdk.ModifierType.CONTROL_MASK, modi & Gdk.ModifierType.MOD1_MASK );
}
return false;
});
}

View File

@ -51,6 +51,6 @@ namespace NeoLayoutViewer{
/* Extern C routines */
extern int keysend(uint keysym, int modifiers);
//extern int keysend2(uint keysym, uint modsym1, uint modsym2);
extern int keysend2(uint keysym, uint modsym1, uint modsym2);
extern bool checkCapsLock(X.Display* d);
extern void checkModifier(X.Display* d, int* keycodes, int nkeycodes, int* pressed );