diff --git a/lib/uh/wm/manager.rb b/lib/uh/wm/manager.rb index 645eb84..5fb9089 100644 --- a/lib/uh/wm/manager.rb +++ b/lib/uh/wm/manager.rb @@ -42,6 +42,7 @@ module Uh end def handle event + @events.emit :xevent, args: event return unless respond_to? handler = "handle_#{event.type}".to_sym, true send handler, event end diff --git a/lib/uh/wm/runner.rb b/lib/uh/wm/runner.rb index 181ecd4..8d8094a 100644 --- a/lib/uh/wm/runner.rb +++ b/lib/uh/wm/runner.rb @@ -78,6 +78,7 @@ module Uh @env.log "Connected to X server on `#{display}'" end @events.on(:disconnected) { @env.log "Disconnected from X server" } + @events.on(:xevent) { |event| XEventLogger.new(env).log_event event } end def register_layout_hooks @@ -94,6 +95,29 @@ module Uh @events.on(:key, *keysym) { @actions.evaluate code } end end + + + class XEventLogger + def initialize env + @env = env + end + + def log_event xev + complement = case xev.type + when :key_press + "window: #{xev.window} key: #{xev.key} mask: #{xev.modifier_mask}" + when :map_request + "window: #{xev.window}" + end + + @env.log_debug [ + 'XEvent', + xev.type, + xev.send_event ? 'SENT' : nil, + complement + ].compact.join ' ' + end + end end end end diff --git a/spec/uh/wm/manager_spec.rb b/spec/uh/wm/manager_spec.rb index 6fe3a61..4c498b3 100644 --- a/spec/uh/wm/manager_spec.rb +++ b/spec/uh/wm/manager_spec.rb @@ -116,6 +116,13 @@ module Uh end describe '#handle' do + let(:event) { double 'event', type: :any } + + it 'emits :xevent event with the X event' do + events.on :xevent, &block + manager.handle event + end + context 'when key_press event is given' do let(:mod_mask) { KEY_MODIFIERS[modifier] } let(:event) do