Handle termination properly
* Tell the manager to close the display before terminating; * Log about quit request and process termination.
This commit is contained in:
parent
d3f1fe6d34
commit
1575a2d369
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user