diff --git a/lib/uh/wm/manager.rb b/lib/uh/wm/manager.rb index ab09703..1169c5e 100644 --- a/lib/uh/wm/manager.rb +++ b/lib/uh/wm/manager.rb @@ -71,6 +71,12 @@ module Uh end end + def destroy window + return unless client = client_for(window) + @clients.delete client + @events.emit :unmanage, args: client + end + def handle_next_event handle @display.next_event end diff --git a/spec/uh/wm/manager_spec.rb b/spec/uh/wm/manager_spec.rb index 3238b09..478ba39 100644 --- a/spec/uh/wm/manager_spec.rb +++ b/spec/uh/wm/manager_spec.rb @@ -214,6 +214,35 @@ module Uh end end + describe '#destroy' do + before { manager.map window } + + it 'unregisters the client' do + expect { manager.destroy window } + .to change { manager.clients.size }.from(1).to 0 + end + + it 'emits :unmanage event with the client' do + events.on :unmanage, &block + expect(block).to receive(:call).with manager.clients[0] + manager.destroy window + end + + context 'with unknown window' do + let(:unknown_window) { window.dup } + + it 'does not change registered clients' do + expect { manager.destroy unknown_window } + .not_to change { manager.clients } + end + + it 'does not emit any event' do + expect(events).not_to receive :emit + manager.destroy unknown_window + end + end + end + describe '#handle_next_event' do it 'handles the next available event on display' do event = double 'event'