Handle termination properly

* Tell the manager to close the display before terminating;
* Log about quit request and process termination.
This commit is contained in:
Thibault Jouan 2015-04-15 12:26:24 +00:00
parent d3f1fe6d34
commit 1575a2d369
5 changed files with 48 additions and 3 deletions

View File

@ -1,6 +1,13 @@
Feature: program termination Feature: program termination
Scenario: terminates when requested to quit Background:
Given uhwm is running Given uhwm is running
Scenario: terminates on quit request
When I tell uhwm to quit When I tell uhwm to quit
Then uhwm must terminate successfully Then uhwm must terminate successfully
Scenario: logs about termination
When I tell uhwm to quit
Then uhwm must terminate successfully
And the output must match /terminat/i

View File

@ -22,6 +22,11 @@ module Uh
@events.emit :connected, args: @display @events.emit :connected, args: @display
end end
def disconnect
@display.close
@events.emit :disconnected
end
def grab_key keysym, mod = nil def grab_key keysym, mod = nil
mod_mask = KEY_MODIFIERS[@modifier] mod_mask = KEY_MODIFIERS[@modifier]
mod_mask |= KEY_MODIFIERS[mod] if mod mod_mask |= KEY_MODIFIERS[mod] if mod

View File

@ -8,6 +8,7 @@ module Uh
runner.register_event_hooks runner.register_event_hooks
runner.connect_manager runner.connect_manager
runner.run_until { runner.stopped? } runner.run_until { runner.stopped? }
runner.terminate
end end
end end
@ -57,6 +58,11 @@ module Uh
manager.handle_pending_events until block.call manager.handle_pending_events until block.call
end end
def terminate
@env.log "Terminating..."
manager.disconnect
end
private private
@ -71,6 +77,7 @@ module Uh
@events.on :connected do |display| @events.on :connected do |display|
@env.log "Connected to X server on `#{display}'" @env.log "Connected to X server on `#{display}'"
end end
@events.on(:disconnected) { @env.log "Disconnected from X server" }
end end
def register_layout_hooks def register_layout_hooks

View File

@ -1,6 +1,7 @@
module Uh module Uh
module WM module WM
RSpec.describe Manager do RSpec.describe Manager do
let(:block) { proc { } }
let(:events) { Dispatcher.new } let(:events) { Dispatcher.new }
let(:modifier) { :mod1 } let(:modifier) { :mod1 }
let(:display) { Display.new } let(:display) { Display.new }
@ -11,8 +12,6 @@ module Uh
end end
describe '#connect', :xvfb do describe '#connect', :xvfb do
let(:block) { proc { } }
it 'opens the display' do it 'opens the display' do
expect(manager.display).to receive(:open).and_call_original expect(manager.display).to receive(:open).and_call_original
manager.connect manager.connect
@ -45,6 +44,20 @@ module Uh
end end
end end
describe '#disconnect' do
it 'closes the display' do
expect(display).to receive :close
manager.disconnect
end
it 'emits :disconnected event' do
allow(display).to receive :close
events.on :disconnected, &block
expect(block).to receive :call
manager.disconnect
end
end
describe '#grab_key' do describe '#grab_key' do
it 'grabs given key on the display' do it 'grabs given key on the display' do
expect(manager.display) expect(manager.display)

View File

@ -129,6 +129,19 @@ module Uh
runner.run_until &block runner.run_until &block
end end
end end
describe '#terminate' do
it 'tells the manager to disconnect' do
expect(runner.manager).to receive :disconnect
runner.terminate
end
it 'logs about program termination' do
allow(runner.manager).to receive :disconnect
expect(env).to receive(:log).with /terminat/i
runner.terminate
end
end
end end
end end
end end