Merge branch 'configure-requests-handling'

Handle configure requests events: asks the layout to suggest a geo,
generates configure events for new windows, else just configure the
client if it is known, or return a default hard-coded geometry.
This commit is contained in:
Thibault Jouan 2015-04-20 05:50:05 +00:00
commit 77226594fa
8 changed files with 91 additions and 5 deletions

View File

@ -31,6 +31,11 @@ module Uh
@wclass ||= @window.wclass @wclass ||= @window.wclass
end end
def configure
@window.configure @geo
self
end
def moveresize def moveresize
@window.moveresize @geo @window.moveresize @geo
self self

View File

@ -16,7 +16,9 @@ module Uh
end end
def emit *key, args: [] 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 end

View File

@ -6,6 +6,7 @@ module Uh
Events::SUBSTRUCTURE_REDIRECT_MASK | Events::SUBSTRUCTURE_REDIRECT_MASK |
Events::SUBSTRUCTURE_NOTIFY_MASK | Events::SUBSTRUCTURE_NOTIFY_MASK |
Events::STRUCTURE_NOTIFY_MASK Events::STRUCTURE_NOTIFY_MASK
DEFAULT_GEO = Geo.new(0, 0, 320, 240).freeze
attr_reader :modifier, :display, :clients attr_reader :modifier, :display, :clients
@ -45,6 +46,15 @@ module Uh
@display.grab_key keysym.to_s, mod_mask @display.grab_key keysym.to_s, mod_mask
end 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 def manage window
return if window.override_redirect? || client_for(window) return if window.override_redirect? || client_for(window)
@clients << client = Client.new(window) @clients << client = Client.new(window)
@ -79,6 +89,10 @@ module Uh
@events.emit :key, *key_selector @events.emit :key, *key_selector
end end
def handle_configure_request event
configure event.window
end
def handle_map_request event def handle_map_request event
manage event.window manage event.window
end end

View File

@ -107,6 +107,10 @@ module Uh
log "Registering layout `#{layout.class}'" log "Registering layout `#{layout.class}'"
layout.register display layout.register display
end end
@events.on :configure do |window|
log "Configuring window: #{window}"
layout.suggest_geo
end
@events.on :manage do |client| @events.on :manage do |client|
log "Managing client #{client}" log "Managing client #{client}"
layout << client layout << client

View File

@ -50,6 +50,17 @@ module Uh
end end
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 describe '#moveresize' do
it 'moveresizes the window with client geo' do it 'moveresizes the window with client geo' do
expect(window).to receive(:moveresize).with geo expect(window).to receive(:moveresize).with geo

View File

@ -45,6 +45,11 @@ module Uh
expect { dispatcher.emit :hook_key }.to throw_symbol :hook_code expect { dispatcher.emit :hook_key }.to throw_symbol :hook_code
end 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 context 'when no hooks are registered for given key' do
it 'does not call another hook' do it 'does not call another hook' do
dispatcher.on(:hook_key) { throw :hook_code } dispatcher.on(:hook_key) { throw :hook_code }

View File

@ -2,6 +2,7 @@ module Uh
module WM module WM
RSpec.describe Manager do RSpec.describe Manager do
let(:block) { proc { } } let(:block) { proc { } }
let(:window) { instance_spy Window, override_redirect?: false }
let(:events) { Dispatcher.new } let(:events) { Dispatcher.new }
let(:modifier) { :mod1 } let(:modifier) { :mod1 }
let(:display) { Display.new } let(:display) { Display.new }
@ -106,9 +107,35 @@ module Uh
end end
end end
describe '#manage' do describe '#configure' do
let(:window) { instance_spy Window, override_redirect?: false } 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 it 'registers a new client wrapping the given window' do
manager.manage window manager.manage window
expect(manager.clients[0]) expect(manager.clients[0])
@ -214,6 +241,17 @@ module Uh
manager.handle event manager.handle event
end end
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 end
end end

View File

@ -1,5 +1,6 @@
SomeLayout = Class.new do SomeLayout = Class.new do
define_method(:register) { |*args| } define_method(:register) { |*args| }
define_method(:suggest_geo) { Uh::Geo.new(0, 0, 42, 42) }
define_method(:<<) { |*args| } define_method(:<<) { |*args| }
end end
@ -80,6 +81,12 @@ module Uh
runner.events.emit :connected, args: :display runner.events.emit :connected, args: :display
end 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 it 'registers layout hook for :manage event' do
runner.register_event_hooks runner.register_event_hooks
expect(env.layout).to receive(:<<).with :window expect(env.layout).to receive(:<<).with :window