From 02861a63d4766b1fe2e863a70ba87e7f84113a3d Mon Sep 17 00:00:00 2001 From: Thibault Jouan Date: Sun, 19 Apr 2015 04:35:37 +0000 Subject: [PATCH] Prevent manager from handling override_redirect windows --- lib/uh/wm/manager.rb | 9 ++++++-- spec/uh/wm/manager_spec.rb | 42 +++++++++++++++++++++++++------------- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/lib/uh/wm/manager.rb b/lib/uh/wm/manager.rb index 3d8c83d..8fdf57e 100644 --- a/lib/uh/wm/manager.rb +++ b/lib/uh/wm/manager.rb @@ -45,6 +45,12 @@ module Uh @display.grab_key keysym.to_s, mod_mask end + def manage window + return if window.override_redirect? + @clients << client = Client.new(window) + @events.emit :manage, args: client + end + def handle_next_event handle @display.next_event end @@ -74,8 +80,7 @@ module Uh end def handle_map_request event - @clients << client = Client.new(event.window) - @events.emit :manage, args: client + manage event.window end def check_other_wm! diff --git a/spec/uh/wm/manager_spec.rb b/spec/uh/wm/manager_spec.rb index f45d839..ab2fef7 100644 --- a/spec/uh/wm/manager_spec.rb +++ b/spec/uh/wm/manager_spec.rb @@ -106,6 +106,32 @@ module Uh end end + describe '#manage' do + let(:window) { instance_spy Window, override_redirect?: false } + + it 'registers a new client wrapping the given window' do + manager.manage window + expect(manager.clients[0]) + .to be_a(Client) + .and have_attributes(window: window) + 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 } + end + + it 'emits :manage event with the registered client' do + events.on :manage, &block + expect(block).to receive :call do |client| + expect(client) + .to be_a(Client) + .and have_attributes(window: window) + end + manager.manage window + end + end + describe '#handle_next_event' do it 'handles the next available event on display' do event = double 'event' @@ -178,20 +204,8 @@ module Uh context 'when map_request event is given' do let(:event) { double 'event', type: :map_request, window: :window } - it 'registers a new client wrapping the event window' do - manager.handle event - expect(manager.clients[0]) - .to be_a(Client) - .and have_attributes(window: :window) - end - - it 'emits :manage event with the registered client' do - events.on :manage, &block - expect(block).to receive :call do |client| - expect(client) - .to be_a(Client) - .and have_attributes(window: :window) - end + it 'manages the event window' do + expect(manager).to receive(:manage).with :window manager.handle event end end