Sha256: f9be8990e080b2bdd93fcf2cc06be0c4c02870430ee2b0baffaecc7a9074d039
Contents?: true
Size: 1.97 KB
Versions: 1
Compression:
Stored size: 1.97 KB
Contents
require "xkeyrap/version" require 'xkeyrap/key' require "xkeyrap/command" require 'xlib-objects' require "evdev" require 'libevdev' require 'uinput/device' module Xkeyrap class Cli def self.run(input_device, config_file) display = XlibObj::Display.new(':0') device = Uinput::Device.new do self.name = "Xkeyrap virtual device" self.type = LinuxInput::BUS_VIRTUAL Xkeyrap::Key::ALL_KEYS.each do |k| self.add_key(k) end self.add_event(:EV_KEY) self.add_event(:EV_SYN) end keyboard = Evdev.new(input_device) keyboard.grab command = Command.new(device, config_file) key_handler = keyboard.on(*Xkeyrap::Key::ALL_KEYS) do |state, key| root_window = display.screens.first.root_window top_level_windows = root_window.property(:_NET_CLIENT_LIST_STACKING) focused_window = display.focused_window wm_class_name = if focused_window.property("WM_CLASS") focused_window.property("WM_CLASS")[1] else get_parent_window_name(display, top_level_windows, focused_window) end command.receive(state, key, wm_class_name) end loop do begin keyboard.handle_event rescue Evdev::AwaitEvent Kernel.select([keyboard.event_channel]) retry end end end def self.get_parent_window_name(display, top_level_windows, focused_window) root = FFI::MemoryPointer.new :Window parent = FFI::MemoryPointer.new :Window number = FFI::MemoryPointer.new :uint children = FFI::MemoryPointer.new :pointer q = Xlib.XQueryTree(display.to_native, focused_window.to_native, root, parent, children, number) parent_window_id = parent.read(:int) parent_window = top_level_windows.select {|tlw| tlw.id == parent_window_id }.first parent_window.property("WM_CLASS")[1] end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
xkeyrap-0.0.2 | lib/xkeyrap.rb |