From c69a600ca494937c67c06e83dbcc2f356064f5ab Mon Sep 17 00:00:00 2001 From: Thibault Jouan Date: Mon, 20 Apr 2015 04:41:30 +0000 Subject: [PATCH 1/5] Return last hook return value in Dispatcher#emit --- lib/uh/wm/dispatcher.rb | 4 +++- spec/uh/wm/dispatcher_spec.rb | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/uh/wm/dispatcher.rb b/lib/uh/wm/dispatcher.rb index e49eac2..61a589c 100644 --- a/lib/uh/wm/dispatcher.rb +++ b/lib/uh/wm/dispatcher.rb @@ -16,7 +16,9 @@ module Uh end def emit *key, args: [] - @hooks[translate_key key].each { |e| e.call *args } + value = nil + @hooks[translate_key key].each { |e| value = e.call *args } + value end diff --git a/spec/uh/wm/dispatcher_spec.rb b/spec/uh/wm/dispatcher_spec.rb index 15cfc6c..00429bc 100644 --- a/spec/uh/wm/dispatcher_spec.rb +++ b/spec/uh/wm/dispatcher_spec.rb @@ -45,6 +45,11 @@ module Uh expect { dispatcher.emit :hook_key }.to throw_symbol :hook_code end + it 'returns the value returned by a registered hook' do + dispatcher.on(:hook_key) { :hook_code } + expect(dispatcher.emit :hook_key).to eq :hook_code + end + context 'when no hooks are registered for given key' do it 'does not call another hook' do dispatcher.on(:hook_key) { throw :hook_code } From 7fc695f25866c04082b3d42b05dbf883c7edaf8a Mon Sep 17 00:00:00 2001 From: Thibault Jouan Date: Mon, 20 Apr 2015 04:59:38 +0000 Subject: [PATCH 2/5] Implement Client#configure --- lib/uh/wm/client.rb | 5 +++++ spec/uh/wm/client_spec.rb | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/lib/uh/wm/client.rb b/lib/uh/wm/client.rb index 90828b2..e20225f 100644 --- a/lib/uh/wm/client.rb +++ b/lib/uh/wm/client.rb @@ -31,6 +31,11 @@ module Uh @wclass ||= @window.wclass end + def configure + @window.configure @geo + self + end + def moveresize @window.moveresize @geo self diff --git a/spec/uh/wm/client_spec.rb b/spec/uh/wm/client_spec.rb index 0904c88..22a2a13 100644 --- a/spec/uh/wm/client_spec.rb +++ b/spec/uh/wm/client_spec.rb @@ -50,6 +50,17 @@ module Uh end end + describe '#configure' do + it 'configures the window with client geo' do + expect(window).to receive(:configure).with geo + client.configure + end + + it 'returns self' do + expect(client.configure).to be client + end + end + describe '#moveresize' do it 'moveresizes the window with client geo' do expect(window).to receive(:moveresize).with geo From 1f7b2269c7726594656cf45e81e63fd94730b9d7 Mon Sep 17 00:00:00 2001 From: Thibault Jouan Date: Mon, 20 Apr 2015 04:59:55 +0000 Subject: [PATCH 3/5] Implement Manager#configure --- lib/uh/wm/manager.rb | 10 ++++++++++ spec/uh/wm/manager_spec.rb | 31 +++++++++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/lib/uh/wm/manager.rb b/lib/uh/wm/manager.rb index 1abd171..cd3a723 100644 --- a/lib/uh/wm/manager.rb +++ b/lib/uh/wm/manager.rb @@ -6,6 +6,7 @@ module Uh Events::SUBSTRUCTURE_REDIRECT_MASK | Events::SUBSTRUCTURE_NOTIFY_MASK | Events::STRUCTURE_NOTIFY_MASK + DEFAULT_GEO = Geo.new(0, 0, 320, 240).freeze attr_reader :modifier, :display, :clients @@ -45,6 +46,15 @@ module Uh @display.grab_key keysym.to_s, mod_mask end + def configure window + if client = client_for(window) + client.configure + else + geo = @events.emit :configure, args: window + window.configure_event geo ? geo : DEFAULT_GEO + end + end + def manage window return if window.override_redirect? || client_for(window) @clients << client = Client.new(window) diff --git a/spec/uh/wm/manager_spec.rb b/spec/uh/wm/manager_spec.rb index 63d3e81..e15638c 100644 --- a/spec/uh/wm/manager_spec.rb +++ b/spec/uh/wm/manager_spec.rb @@ -2,6 +2,7 @@ module Uh module WM RSpec.describe Manager do let(:block) { proc { } } + let(:window) { instance_spy Window, override_redirect?: false } let(:events) { Dispatcher.new } let(:modifier) { :mod1 } let(:display) { Display.new } @@ -106,9 +107,35 @@ module Uh end end - describe '#manage' do - let(:window) { instance_spy Window, override_redirect?: false } + describe '#configure' do + context 'with new window' do + it 'sends a configure event to the window with a default geo' do + expect(window) + .to receive(:configure_event).with(Geo.new(0, 0, 320, 240)) + manager.configure window + end + context 'when :configure event returns a geo' do + it 'sends a configure event with geo returned by event' do + geo = Geo.new(0, 0, 42, 42) + events.on(:configure) { geo } + expect(window).to receive(:configure_event).with geo + manager.configure window + end + end + end + + context 'with known window' do + before { manager.manage window } + + it 'tells the client to configure' do + expect(manager.clients[0]).to receive :configure + manager.configure window + end + end + end + + describe '#manage' do it 'registers a new client wrapping the given window' do manager.manage window expect(manager.clients[0]) From 84d92798a0f5b96aa9383e55d5465552df7b44bb Mon Sep 17 00:00:00 2001 From: Thibault Jouan Date: Mon, 20 Apr 2015 05:30:16 +0000 Subject: [PATCH 4/5] Modify manager to handle configure request events --- lib/uh/wm/manager.rb | 4 ++++ spec/uh/wm/manager_spec.rb | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/lib/uh/wm/manager.rb b/lib/uh/wm/manager.rb index cd3a723..e056b4e 100644 --- a/lib/uh/wm/manager.rb +++ b/lib/uh/wm/manager.rb @@ -89,6 +89,10 @@ module Uh @events.emit :key, *key_selector end + def handle_configure_request event + configure event.window + end + def handle_map_request event manage event.window end diff --git a/spec/uh/wm/manager_spec.rb b/spec/uh/wm/manager_spec.rb index e15638c..84bac44 100644 --- a/spec/uh/wm/manager_spec.rb +++ b/spec/uh/wm/manager_spec.rb @@ -241,6 +241,17 @@ module Uh manager.handle event end end + + context 'when configure request event is given' do + let(:event) do + double 'event', type: :configure_request, window: :window + end + + it 'configure the event window' do + expect(manager).to receive(:configure).with :window + manager.handle event + end + end end end end From 30cb15b5d3490f89b15ef6453da216f061e18acf Mon Sep 17 00:00:00 2001 From: Thibault Jouan Date: Mon, 20 Apr 2015 05:35:23 +0000 Subject: [PATCH 5/5] Register :configure event for layout in runner --- lib/uh/wm/runner.rb | 4 ++++ spec/uh/wm/runner_spec.rb | 11 +++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/uh/wm/runner.rb b/lib/uh/wm/runner.rb index a7477f7..22625a7 100644 --- a/lib/uh/wm/runner.rb +++ b/lib/uh/wm/runner.rb @@ -107,6 +107,10 @@ module Uh log "Registering layout `#{layout.class}'" layout.register display end + @events.on :configure do |window| + log "Configuring window: #{window}" + layout.suggest_geo + end @events.on :manage do |client| log "Managing client #{client}" layout << client diff --git a/spec/uh/wm/runner_spec.rb b/spec/uh/wm/runner_spec.rb index bda4bef..88e37f2 100644 --- a/spec/uh/wm/runner_spec.rb +++ b/spec/uh/wm/runner_spec.rb @@ -1,6 +1,7 @@ SomeLayout = Class.new do - define_method(:register) { |*args| } - define_method(:<<) { |*args| } + define_method(:register) { |*args| } + define_method(:suggest_geo) { Uh::Geo.new(0, 0, 42, 42) } + define_method(:<<) { |*args| } end module Uh @@ -80,6 +81,12 @@ module Uh runner.events.emit :connected, args: :display end + it 'registers layout hook for :configure event' do + runner.register_event_hooks + expect(runner.events.emit :configure, args: :window) + .to eq Geo.new(0, 0, 42, 42) + end + it 'registers layout hook for :manage event' do runner.register_event_hooks expect(env.layout).to receive(:<<).with :window