From 09d7b6ebb5290345246263874cebf374af6fc7f7 Mon Sep 17 00:00:00 2001 From: Thibault Jouan Date: Mon, 20 Apr 2015 10:17:51 +0000 Subject: [PATCH] Implement Manager#unmap --- lib/uh/wm/manager.rb | 10 ++++++++ spec/uh/wm/manager_spec.rb | 50 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/lib/uh/wm/manager.rb b/lib/uh/wm/manager.rb index 8192a93..69307e1 100644 --- a/lib/uh/wm/manager.rb +++ b/lib/uh/wm/manager.rb @@ -61,6 +61,16 @@ module Uh @events.emit :manage, args: client end + def unmap window + return unless client = client_for(window) + if client.unmap_count > 0 + client.unmap_count -= 1 + else + @clients.delete client + @events.emit :unmanage, args: client + end + 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 372b008..26298ba 100644 --- a/spec/uh/wm/manager_spec.rb +++ b/spec/uh/wm/manager_spec.rb @@ -164,6 +164,56 @@ module Uh end end + describe '#unmap' do + before { manager.map window } + + context 'when client unmap count is 0 or less' do + it 'preserves the client unmap count' do + client = manager.clients[0] + expect { manager.unmap window } + .not_to change { client.unmap_count } + end + + it 'unregisters the client' do + expect { manager.unmap 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.unmap window + end + end + + context 'when client unmap count is strictly positive' do + before { manager.clients[0].unmap_count += 1 } + + it 'does not unregister the client' do + expect { manager.unmap window }.not_to change { manager.clients } + end + + it 'decrements the unmap count' do + manager.unmap window + expect(manager.clients[0].unmap_count).to eq 0 + end + end + + context 'with unknown window' do + let(:unknown_window) { window.dup } + + it 'does not change registered clients' do + expect { manager.unmap unknown_window } + .not_to change { manager.clients } + end + + it 'does not emit any event' do + expect(events).not_to receive :emit + manager.unmap unknown_window + end + end + end + describe '#handle_next_event' do it 'handles the next available event on display' do event = double 'event'