/// <summary> /// Matches catched key combination to hotkey and executes it's action. /// </summary> /// <param name="xEvent">X event arguments.</param> /// <param name="gdkEvent">Gdk event arguments.</param> private FilterReturn OnHotkeyPressed(IntPtr xEvent, Event gdkEvent) { try { IXKeyEvent evnt = null; ModifierType modifiers; switch (this.Architecture) { case Architectures.X86: evnt = (XKeyEvent32)Marshal.PtrToStructure(xEvent, typeof(XKeyEvent32)); break; case Architectures.X86_64: evnt = (XKeyEvent64)Marshal.PtrToStructure(xEvent, typeof(XKeyEvent64)); break; } if (evnt.Type == XEventTypeKeyPress) { modifiers = evnt.Modifiers; if (modifiers.ToString().Contains(ModifierType.LockMask.ToString())) { modifiers = (ModifierType)((int)modifiers - (int)ModifierType.LockMask); } if (modifiers.ToString().Contains(ModifierType.Mod2Mask.ToString())) { modifiers = (ModifierType)((int)modifiers - (int)ModifierType.Mod2Mask); } Hotkey hotkey = this.grabbedHotkeys.FirstOrDefault(h => h.KeyCode == evnt.KeyCode && h.Modifiers == modifiers); if (hotkey != null && hotkey.OnHotkeyPressed != null) { hotkey.OnHotkeyPressed(); } } } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } return(FilterReturn.Continue); }
/// <summary> /// Catches key combination end emits HotkeyGrabbed event. /// </summary> /// <param name="xEvent">X event arguments.</param> /// <param name="gdkEvent">Gdk event arguments.</param> /// <returns>Filter state.</returns> private FilterReturn OnHotkeyGrabbed(IntPtr xEvent, Event gdkEvent) { try { IXKeyEvent evnt = null; Key key; ModifierType modifiers = ModifierType.None; switch (this.Architecture) { case Architectures.X86: evnt = (XKeyEvent32)Marshal.PtrToStructure(xEvent, typeof(XKeyEvent32)); break; case Architectures.X86_64: evnt = (XKeyEvent64)Marshal.PtrToStructure(xEvent, typeof(XKeyEvent64)); break; } key = (Key)XKeycodeToKeysym(this.XDisplay, evnt.KeyCode, 0); modifiers = evnt.Modifiers; if (key == Key.Escape || key == Key.BackSpace) { this.UngrabKeyboard(); if (this.hotkeyGrabbedFunc != null) { this.hotkeyGrabbedFunc(this, null); } return(FilterReturn.Continue); } if (OmittedModifiers.Contains(modifiers) || OmittedKeys.Contains(key)) { return(FilterReturn.Continue); } if (modifiers.ToString().Contains(ModifierType.LockMask.ToString())) { modifiers = (ModifierType)((int)modifiers - (int)ModifierType.LockMask); } if (modifiers.ToString().Contains(ModifierType.Mod2Mask.ToString())) { modifiers = (ModifierType)((int)modifiers - (int)ModifierType.Mod2Mask); } if (this.hotkeyGrabbedFunc != null) { this.hotkeyGrabbedFunc(this, new HotkeyGrabbedArgs(modifiers, key)); } this.UngrabKeyboard(); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } return(FilterReturn.Continue); }