From 9c9aa1dabb66ea4a053254ed0ee5596b1c7e4151 Mon Sep 17 00:00:00 2001 From: Thibault Jouan Date: Wed, 15 Apr 2015 01:09:18 +0000 Subject: [PATCH] Configure upcased key as combination with shift mod --- features/run_control/key.feature | 9 +++++++++ lib/uh/wm/manager.rb | 12 +++++++++--- lib/uh/wm/run_control.rb | 6 +++++- lib/uh/wm/runner.rb | 2 +- spec/uh/wm/manager_spec.rb | 32 ++++++++++++++++++++++++++++---- spec/uh/wm/run_control_spec.rb | 5 +++++ spec/uh/wm/runner_spec.rb | 6 ++++++ 7 files changed, 63 insertions(+), 9 deletions(-) diff --git a/features/run_control/key.feature b/features/run_control/key.feature index 1c9533c..5731935 100644 --- a/features/run_control/key.feature +++ b/features/run_control/key.feature @@ -17,3 +17,12 @@ Feature: `key' run control keyword And uhwm is running When I press the alt+Return keys Then the output must contain "trigger return key code" + + Scenario: translates upcased key names to combination with shift key + Given a run control file with: + """ + key(:F) { puts 'trigger shift+f key code' } + """ + And uhwm is running + When I press the alt+shift+f keys + Then the output must contain "trigger shift+f key code" diff --git a/lib/uh/wm/manager.rb b/lib/uh/wm/manager.rb index b679f8f..db043a6 100644 --- a/lib/uh/wm/manager.rb +++ b/lib/uh/wm/manager.rb @@ -21,8 +21,10 @@ module Uh @events.emit :connected, args: @display end - def grab_key keysym - @display.grab_key keysym.to_s, KEY_MODIFIERS[:mod1] + def grab_key keysym, mod = nil + mod_mask = KEY_MODIFIERS[:mod1] + mod_mask |= KEY_MODIFIERS[mod] if mod + @display.grab_key keysym.to_s, mod_mask end def handle_pending_events @@ -31,7 +33,11 @@ module Uh def handle event case event.type - when :key_press then @events.emit :key, event.key.to_sym + when :key_press + key_selector = event.modifier_mask & KEY_MODIFIERS[:shift] == 1 ? + [event.key.to_sym, :shift] : + event.key.to_sym + @events.emit :key, *key_selector end end diff --git a/lib/uh/wm/run_control.rb b/lib/uh/wm/run_control.rb index 79e8a00..9beb390 100644 --- a/lib/uh/wm/run_control.rb +++ b/lib/uh/wm/run_control.rb @@ -32,7 +32,11 @@ module Uh private def translate_keysym keysym - KEYSYM_TRANSLATIONS.key?(keysym) ? KEYSYM_TRANSLATIONS[keysym] : keysym + translate_key = keysym.to_s.downcase.to_sym + translated_keysym = KEYSYM_TRANSLATIONS.key?(translate_key) ? + KEYSYM_TRANSLATIONS[translate_key] : + translate_key + keysym =~ /[A-Z]/ ? [translated_keysym, :shift] : translated_keysym end end end diff --git a/lib/uh/wm/runner.rb b/lib/uh/wm/runner.rb index 18a3262..f81c9a3 100644 --- a/lib/uh/wm/runner.rb +++ b/lib/uh/wm/runner.rb @@ -74,7 +74,7 @@ module Uh def register_key_bindings_hooks @events.on(:key, :q) { stop! } @env.keybinds.each do |keysym, code| - @events.on :key, keysym, &code + @events.on :key, *keysym, &code end end end diff --git a/spec/uh/wm/manager_spec.rb b/spec/uh/wm/manager_spec.rb index ea19f82..54f066c 100644 --- a/spec/uh/wm/manager_spec.rb +++ b/spec/uh/wm/manager_spec.rb @@ -49,8 +49,17 @@ module Uh describe '#grab_key' do it 'grabs given key on the display' do expect(manager.display) - .to receive(:grab_key).with('q', KEY_MODIFIERS[:mod1]) - manager.grab_key :q + .to receive(:grab_key).with('f', KEY_MODIFIERS[:mod1]) + manager.grab_key :f + end + + context 'when a modifier is given' do + it 'grabs the key with given modifier' do + expect(manager.display) + .to receive(:grab_key) + .with('f', KEY_MODIFIERS[:mod1] | KEY_MODIFIERS[:shift]) + manager.grab_key :f, :shift + end end end @@ -84,12 +93,27 @@ module Uh describe '#handle' do context 'when key_press event is given' do - let(:event) { double 'event', type: :key_press, key: 'q' } + let(:mod_mask) { KEY_MODIFIERS[:mod1] } + let(:event) do + double 'event', + type: :key_press, + key: 'f', + modifier_mask: mod_mask + end it 'emits :key event with the corresponding key' do - events.on(:key, :q) { throw :key_press_code } + events.on(:key, :f) { throw :key_press_code } expect { manager.handle event }.to throw_symbol :key_press_code end + + context 'whith shift key modifier' do + let(:mod_mask) { KEY_MODIFIERS[:mod1] | KEY_MODIFIERS[:shift] } + + it 'emits :key event with the corresponding key and :shift' do + events.on(:key, :f, :shift) { throw :key_press_code } + expect { manager.handle event }.to throw_symbol :key_press_code + end + end end end end diff --git a/spec/uh/wm/run_control_spec.rb b/spec/uh/wm/run_control_spec.rb index 43498e5..a0f2f97 100644 --- a/spec/uh/wm/run_control_spec.rb +++ b/spec/uh/wm/run_control_spec.rb @@ -66,6 +66,11 @@ module Uh rc.key :enter, &code expect(env.keybinds.keys).to include :Return end + + it 'translates upcased key name to a combination with shift' do + rc.key :F, &code + expect(env.keybinds.keys).to include %i[f shift] + end end end end diff --git a/spec/uh/wm/runner_spec.rb b/spec/uh/wm/runner_spec.rb index 3dd8630..f4ad6b9 100644 --- a/spec/uh/wm/runner_spec.rb +++ b/spec/uh/wm/runner_spec.rb @@ -80,6 +80,12 @@ module Uh runner.register_event_hooks expect(runner.events[:key, :f]).not_to be_empty end + + it 'registers combined key bindings event hooks' do + env.keybinds[[:f, :shift]] = -> { } + runner.register_event_hooks + expect(runner.events[:key, :f, :shift]).not_to be_empty + end end describe '#connect_manager' do