From 49f85bee356234397670efa2c09f95ec0da6a553 Mon Sep 17 00:00:00 2001 From: Thibault Jouan Date: Wed, 15 Apr 2015 03:39:09 +0000 Subject: [PATCH] Implement `quit' action keyword --- features/actions/quit.feature | 9 +++++++++ lib/uh/wm.rb | 1 + lib/uh/wm/actions_handler.rb | 17 +++++++++++++++++ lib/uh/wm/env.rb | 4 +++- lib/uh/wm/runner.rb | 14 ++++++++++---- spec/uh/wm/actions_handler_spec.rb | 23 +++++++++++++++++++++++ spec/uh/wm/env_spec.rb | 4 ++++ spec/uh/wm/runner_spec.rb | 13 +++++++++++++ 8 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 features/actions/quit.feature create mode 100644 lib/uh/wm/actions_handler.rb create mode 100644 spec/uh/wm/actions_handler_spec.rb diff --git a/features/actions/quit.feature b/features/actions/quit.feature new file mode 100644 index 0000000..b989fa6 --- /dev/null +++ b/features/actions/quit.feature @@ -0,0 +1,9 @@ +Feature: `quit' action keyword + + Scenario: requests quit when invoked + Given uhwm is running with this run control file: + """ + key(:f) { quit } + """ + When I press the alt+f keys + Then uhwm must terminate successfully diff --git a/lib/uh/wm.rb b/lib/uh/wm.rb index fcf448c..2bd157a 100644 --- a/lib/uh/wm.rb +++ b/lib/uh/wm.rb @@ -3,6 +3,7 @@ require 'logger' require 'optparse' require 'uh' +require 'uh/wm/actions_handler' require 'uh/wm/cli' require 'uh/wm/dispatcher' require 'uh/wm/env' diff --git a/lib/uh/wm/actions_handler.rb b/lib/uh/wm/actions_handler.rb new file mode 100644 index 0000000..904a33e --- /dev/null +++ b/lib/uh/wm/actions_handler.rb @@ -0,0 +1,17 @@ +module Uh + module WM + class ActionsHandler + def initialize env, events + @env, @events = env, events + end + + def evaluate code + instance_eval &code + end + + def quit + @events.emit :quit + end + end + end +end diff --git a/lib/uh/wm/env.rb b/lib/uh/wm/env.rb index 5cf8318..ae30fe1 100644 --- a/lib/uh/wm/env.rb +++ b/lib/uh/wm/env.rb @@ -19,7 +19,9 @@ module Uh def initialize output @output = output @rc_path = RC_PATH - @keybinds = {} + @keybinds = { + q: proc { quit } + } end def verbose? diff --git a/lib/uh/wm/runner.rb b/lib/uh/wm/runner.rb index f81c9a3..8e3c921 100644 --- a/lib/uh/wm/runner.rb +++ b/lib/uh/wm/runner.rb @@ -14,12 +14,13 @@ module Uh extend Forwardable def_delegator :@env, :layout - attr_reader :env, :events, :manager + attr_reader :env, :events, :manager, :actions def initialize env, manager: nil, stopped: false @env = env @events = Dispatcher.new @manager = manager || Manager.new(@events) + @actions = ActionsHandler.new(@env, @events) @stopped = stopped end @@ -36,6 +37,7 @@ module Uh end def register_event_hooks + register_runner_hooks register_manager_hooks register_layout_event_hooks register_key_bindings_hooks @@ -43,7 +45,6 @@ module Uh def connect_manager @manager.connect - @manager.grab_key :q @env.keybinds.each do |keysym, _| @manager.grab_key *keysym end @@ -56,6 +57,10 @@ module Uh private + def register_runner_hooks + @events.on(:quit) { stop! } + end + def register_manager_hooks @events.on(:connecting) do |display| @env.log_debug "Connecting to X server on `#{display}'" @@ -72,9 +77,10 @@ module Uh end 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 do + @actions.evaluate code + end end end end diff --git a/spec/uh/wm/actions_handler_spec.rb b/spec/uh/wm/actions_handler_spec.rb new file mode 100644 index 0000000..a593c7e --- /dev/null +++ b/spec/uh/wm/actions_handler_spec.rb @@ -0,0 +1,23 @@ +module Uh + module WM + RSpec.describe ActionsHandler do + let(:env) { Env.new(StringIO.new) } + let(:events) { Dispatcher.new } + subject(:actions) { described_class.new env, events } + + describe '#evaluate' do + it 'evaluates given code' do + expect { actions.evaluate proc { throw :action_code } } + .to throw_symbol :action_code + end + end + + describe '#quit' do + it 'emits the quit event' do + expect(events).to receive(:emit).with :quit + actions.quit + end + end + end + end +end diff --git a/spec/uh/wm/env_spec.rb b/spec/uh/wm/env_spec.rb index e5280c6..c357980 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 defaults key bindings set' do + expect(env.keybinds.keys).to eq %i[q] + end + describe '#verbose?' do context 'when verbose mode is disabled' do before { env.verbose = false } diff --git a/spec/uh/wm/runner_spec.rb b/spec/uh/wm/runner_spec.rb index f4ad6b9..007335a 100644 --- a/spec/uh/wm/runner_spec.rb +++ b/spec/uh/wm/runner_spec.rb @@ -63,6 +63,12 @@ module Uh end describe '#register_event_hooks' do + it 'registers quit event hook' do + runner.register_event_hooks + expect(runner).to receive(:stop!) + runner.events.emit :quit + end + it 'registers manager event hooks for logging' do runner.register_event_hooks expect(env).to receive(:log) @@ -86,6 +92,13 @@ module Uh runner.register_event_hooks expect(runner.events[:key, :f, :shift]).not_to be_empty end + + it 'registers key bindings code evaluation with the actions handler' do + env.keybinds[:f] = code = proc { } + runner.register_event_hooks + expect(runner.actions).to receive(:evaluate).with code + runner.events.emit :key, :f + end end describe '#connect_manager' do