From bdbeca399a86eda27e9b17be7b76834ae6df6652 Mon Sep 17 00:00:00 2001 From: Thibault Jouan Date: Sun, 19 Apr 2015 05:11:01 +0000 Subject: [PATCH] Ensure only one client is managed for given window --- features/manager/manage.feature | 14 ++++++++++++++ features/steps/output_steps.rb | 4 ++++ features/steps/run_steps.rb | 5 +++++ features/steps/x_steps.rb | 4 ++++ lib/uh/wm/manager.rb | 6 +++++- lib/uh/wm/testing/acceptance_helpers.rb | 5 +++-- spec/uh/wm/manager_spec.rb | 5 +++++ 7 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 features/manager/manage.feature diff --git a/features/manager/manage.feature b/features/manager/manage.feature new file mode 100644 index 0000000..a1338b5 --- /dev/null +++ b/features/manager/manage.feature @@ -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 diff --git a/features/steps/output_steps.rb b/features/steps/output_steps.rb index c7ec627..47ceeb8 100644 --- a/features/steps/output_steps.rb +++ b/features/steps/output_steps.rb @@ -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 diff --git a/features/steps/run_steps.rb b/features/steps/run_steps.rb index 9ce5204..15203af 100644 --- a/features/steps/run_steps.rb +++ b/features/steps/run_steps.rb @@ -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 diff --git a/features/steps/x_steps.rb b/features/steps/x_steps.rb index 735e65a..32465bd 100644 --- a/features/steps/x_steps.rb +++ b/features/steps/x_steps.rb @@ -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 diff --git a/lib/uh/wm/manager.rb b/lib/uh/wm/manager.rb index 3077d76..1abd171 100644 --- a/lib/uh/wm/manager.rb +++ b/lib/uh/wm/manager.rb @@ -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 diff --git a/lib/uh/wm/testing/acceptance_helpers.rb b/lib/uh/wm/testing/acceptance_helpers.rb index f99989d..838d05f 100644 --- a/lib/uh/wm/testing/acceptance_helpers.rb +++ b/lib/uh/wm/testing/acceptance_helpers.rb @@ -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 diff --git a/spec/uh/wm/manager_spec.rb b/spec/uh/wm/manager_spec.rb index ab2fef7..63d3e81 100644 --- a/spec/uh/wm/manager_spec.rb +++ b/spec/uh/wm/manager_spec.rb @@ -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 }