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:
commit
77226594fa
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 }
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user