diff --git a/features/run_control/modifier.feature b/features/run_control/modifier.feature new file mode 100644 index 0000000..24da25c --- /dev/null +++ b/features/run_control/modifier.feature @@ -0,0 +1,10 @@ +Feature: `modifier' run control keyword + + Scenario: configures the modifier key + Given a run control file with: + """ + modifier :ctrl + """ + And uhwm is running + When I press the ctrl+q keys + Then uhwm must terminate successfully diff --git a/lib/uh/wm/env.rb b/lib/uh/wm/env.rb index ae30fe1..aa223c1 100644 --- a/lib/uh/wm/env.rb +++ b/lib/uh/wm/env.rb @@ -3,6 +3,8 @@ module Uh class Env RC_PATH = '~/.uhwmrc.rb'.freeze + MODIFIER = :mod1 + LOGGER_LEVEL = Logger::WARN LOGGER_LEVEL_VERBOSE = Logger::INFO LOGGER_LEVEL_DEBUG = Logger::DEBUG @@ -14,11 +16,12 @@ module Uh def_delegator :@output, :print attr_reader :output, :keybinds - attr_accessor :verbose, :debug, :rc_path, :layout_class + attr_accessor :verbose, :debug, :rc_path, :layout_class, :modifier def initialize output @output = output @rc_path = RC_PATH + @modifier = MODIFIER @keybinds = { q: proc { quit } } diff --git a/lib/uh/wm/manager.rb b/lib/uh/wm/manager.rb index db043a6..9943a8d 100644 --- a/lib/uh/wm/manager.rb +++ b/lib/uh/wm/manager.rb @@ -3,10 +3,11 @@ module Uh class Manager INPUT_MASK = Events::SUBSTRUCTURE_REDIRECT_MASK - attr_reader :display + attr_reader :modifier, :display - def initialize events, display = Display.new + def initialize events, modifier, display = Display.new @events = events + @modifier = modifier @display = display end @@ -22,7 +23,7 @@ module Uh end def grab_key keysym, mod = nil - mod_mask = KEY_MODIFIERS[:mod1] + mod_mask = KEY_MODIFIERS[@modifier] mod_mask |= KEY_MODIFIERS[mod] if mod @display.grab_key keysym.to_s, mod_mask end diff --git a/lib/uh/wm/run_control.rb b/lib/uh/wm/run_control.rb index 7c68a3d..2d511be 100644 --- a/lib/uh/wm/run_control.rb +++ b/lib/uh/wm/run_control.rb @@ -24,6 +24,10 @@ module Uh instance_eval code, path end + def modifier mod + @env.modifier = mod + end + def key keysym, &block @env.keybinds[translate_keysym keysym] = block end diff --git a/lib/uh/wm/runner.rb b/lib/uh/wm/runner.rb index 8e3c921..5ee8d08 100644 --- a/lib/uh/wm/runner.rb +++ b/lib/uh/wm/runner.rb @@ -14,12 +14,12 @@ module Uh extend Forwardable def_delegator :@env, :layout - attr_reader :env, :events, :manager, :actions + attr_reader :env, :events, :actions def initialize env, manager: nil, stopped: false @env = env @events = Dispatcher.new - @manager = manager || Manager.new(@events) + @manager = manager @actions = ActionsHandler.new(@env, @events) @stopped = stopped end @@ -32,6 +32,10 @@ module Uh @stopped = true end + def manager + @manager ||= Manager.new(@events, @env.modifier) + end + def evaluate_run_control RunControl.evaluate(env) end @@ -44,14 +48,14 @@ module Uh end def connect_manager - @manager.connect + manager.connect @env.keybinds.each do |keysym, _| - @manager.grab_key *keysym + manager.grab_key *keysym end end def run_until &block - @manager.handle_pending_events until block.call + manager.handle_pending_events until block.call end diff --git a/spec/uh/wm/env_spec.rb b/spec/uh/wm/env_spec.rb index c357980..1d157dd 100644 --- a/spec/uh/wm/env_spec.rb +++ b/spec/uh/wm/env_spec.rb @@ -21,6 +21,10 @@ module Uh expect(env.layout_class).not_to be end + it 'has the default modifier set' do + expect(env.modifier).to eq :mod1 + end + it 'has defaults key bindings set' do expect(env.keybinds.keys).to eq %i[q] end diff --git a/spec/uh/wm/manager_spec.rb b/spec/uh/wm/manager_spec.rb index 6ac3c03..3f6474f 100644 --- a/spec/uh/wm/manager_spec.rb +++ b/spec/uh/wm/manager_spec.rb @@ -2,8 +2,9 @@ module Uh module WM RSpec.describe Manager do let(:events) { Dispatcher.new } + let(:modifier) { :mod1 } let(:display) { Display.new } - subject(:manager) { described_class.new events, display } + subject(:manager) { described_class.new events, modifier, display } it 'has a new display' do expect(manager.display).to be_a Display @@ -47,7 +48,7 @@ module Uh describe '#grab_key' do it 'grabs given key on the display' do expect(manager.display) - .to receive(:grab_key).with('f', KEY_MODIFIERS[:mod1]) + .to receive(:grab_key).with('f', KEY_MODIFIERS[modifier]) manager.grab_key :f end @@ -55,7 +56,7 @@ module Uh it 'grabs the key with given modifier' do expect(manager.display) .to receive(:grab_key) - .with('f', KEY_MODIFIERS[:mod1] | KEY_MODIFIERS[:shift]) + .with('f', KEY_MODIFIERS[modifier] | KEY_MODIFIERS[:shift]) manager.grab_key :f, :shift end end @@ -91,7 +92,7 @@ module Uh describe '#handle' do context 'when key_press event is given' do - let(:mod_mask) { KEY_MODIFIERS[:mod1] } + let(:mod_mask) { KEY_MODIFIERS[modifier] } let(:event) do double 'event', type: :key_press, @@ -105,7 +106,7 @@ module Uh end context 'whith shift key modifier' do - let(:mod_mask) { KEY_MODIFIERS[:mod1] | KEY_MODIFIERS[:shift] } + let(:mod_mask) { KEY_MODIFIERS[modifier] | KEY_MODIFIERS[:shift] } it 'emits :key event with the corresponding key and :shift' do events.on(:key, :f, :shift) { throw :key_press_code } diff --git a/spec/uh/wm/run_control_spec.rb b/spec/uh/wm/run_control_spec.rb index 421ccc3..7684b8e 100644 --- a/spec/uh/wm/run_control_spec.rb +++ b/spec/uh/wm/run_control_spec.rb @@ -50,6 +50,13 @@ module Uh end end + describe '#modifier' do + it 'updates env modifier' do + rc.modifier :ctrl + expect(env.modifier).to eq :ctrl + end + end + describe '#key' do let(:code) { -> { :keybind_code } } diff --git a/spec/uh/wm/runner_spec.rb b/spec/uh/wm/runner_spec.rb index 6b14780..2d605c1 100644 --- a/spec/uh/wm/runner_spec.rb +++ b/spec/uh/wm/runner_spec.rb @@ -21,10 +21,6 @@ module Uh expect(runner.events).to be_a Dispatcher end - it 'has a manager' do - expect(runner.manager).to be_a Manager - end - it 'is not stopped' do expect(runner).not_to be_stopped end @@ -53,6 +49,16 @@ module Uh end end + describe '#manager' do + it 'returns the manager' do + expect(runner.manager).to be_a Manager + end + + it 'sets the manager modifier as env modifier' do + expect(runner.manager.modifier).to eq env.modifier + end + end + describe '#evaluate_run_control' do it 'evaluates the run control file with RunControl and current env' do expect(RunControl).to receive(:evaluate).with env