Ensure only one client is managed for given window

This commit is contained in:
Thibault Jouan 2015-04-19 05:11:01 +00:00
parent 036ca1f989
commit bdbeca399a
7 changed files with 40 additions and 3 deletions

View File

@ -0,0 +1,14 @@
Feature: manager client management
Background:
Given uhwm is running
Scenario: logs when a new client is managed
When a window requests to be mapped
Then the output must match /manage.+xclient/i
Scenario: manages a given client only once
When a window requests to be mapped 2 times
And I quit uhwm
Then the output must not match /manage.*\n.*manage/mi
And the output must not match /xerror/i

View File

@ -23,6 +23,10 @@ Then /^the output must match \/([^\/]+)\/([a-z]*)$/ do |pattern, options|
uhwm_wait_output Regexp.new(pattern, options)
end
Then /^the output must not match \/([^\/]+)\/([a-z]*)$/ do |pattern, options|
expect(all_output).not_to match Regexp.new(pattern, options)
end
Then /^the output must contain:$/ do |content|
uhwm_wait_output content.to_s
end

View File

@ -27,6 +27,11 @@ When /^I tell uhwm to quit$/ do
x_key 'alt+shift+q'
end
When /^I quit uhwm$/ do
x_key 'alt+shift+q'
assert_exit_status 0
end
Then /^the exit status must be (\d+)$/ do |exit_status|
assert_exit_status exit_status.to_i
end

View File

@ -6,6 +6,10 @@ When /^a window requests to be mapped$/ do
x_window_map
end
When /^a window requests to be mapped (\d+) times$/ do |times|
x_window_map times: times.to_i
end
Then /^it must connect to X display$/ do
uhwm_wait_output 'Connected to'
expect(x_socket_check uhwm_pid).to be true

View File

@ -46,7 +46,7 @@ module Uh
end
def manage window
return if window.override_redirect?
return if window.override_redirect? || client_for(window)
@clients << client = Client.new(window)
@events.emit :manage, args: client
end
@ -83,6 +83,10 @@ module Uh
manage event.window
end
def client_for window
@clients.find { |e| e.window == window }
end
def check_other_wm!
Display.on_error { fail OtherWMRunningError }
@display.listen_events INPUT_MASK

View File

@ -89,8 +89,9 @@ module Uh
@x_client.window_name
end
def x_window_map
x_client.map.sync
def x_window_map times: 1
times.times { x_client.map }
x_client.sync
end
def x_window_map_state

View File

@ -116,6 +116,11 @@ module Uh
.and have_attributes(window: window)
end
it 'registers new client only once for a given window' do
manager.manage window
expect { manager.manage window }.not_to change { manager.clients }
end
it 'ignores event when window has override redirect' do
allow(window).to receive(:override_redirect?) { true }
expect { manager.manage window }.not_to change { manager.clients }