From 73f3abedea6f6ec112f26fe810ad6a7ec56a1e2e Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 7 Jun 2016 18:29:03 -0400 Subject: [PATCH] make it possible to disable VisibilityTracker's use of WM visibility --- libs/gtkmm2ext/gtkmm2ext/visibility_tracker.h | 5 ++++ libs/gtkmm2ext/gtkmm2ext/window_proxy.h | 1 + libs/gtkmm2ext/keyboard.cc | 5 +++- libs/gtkmm2ext/tabbable.cc | 1 + libs/gtkmm2ext/visibility_tracker.cc | 27 ++++++++++++++++--- 5 files changed, 34 insertions(+), 5 deletions(-) diff --git a/libs/gtkmm2ext/gtkmm2ext/visibility_tracker.h b/libs/gtkmm2ext/gtkmm2ext/visibility_tracker.h index 43f5b247ed..8860aba441 100644 --- a/libs/gtkmm2ext/gtkmm2ext/visibility_tracker.h +++ b/libs/gtkmm2ext/gtkmm2ext/visibility_tracker.h @@ -35,6 +35,8 @@ class LIBGTKMM2EXT_API VisibilityTracker : public virtual sigc::trackable { VisibilityTracker (Gtk::Window&); virtual ~VisibilityTracker() {} + static void set_use_window_manager_visibility (bool); + static bool use_window_manager_visibility() { return _use_window_manager_visibility; } void cycle_visibility (); bool fully_visible() const; @@ -46,6 +48,9 @@ class LIBGTKMM2EXT_API VisibilityTracker : public virtual sigc::trackable { private: Gtk::Window& _window; GdkVisibilityState _visibility; + + static bool _use_window_manager_visibility; + bool handle_visibility_notify_event (GdkEventVisibility*); }; diff --git a/libs/gtkmm2ext/gtkmm2ext/window_proxy.h b/libs/gtkmm2ext/gtkmm2ext/window_proxy.h index 13c3486bdf..52ccfc8c42 100644 --- a/libs/gtkmm2ext/gtkmm2ext/window_proxy.h +++ b/libs/gtkmm2ext/gtkmm2ext/window_proxy.h @@ -96,6 +96,7 @@ class LIBGTKMM2EXT_API WindowProxy : public PBD::StatefulDestructible, public vi sigc::connection delete_connection; sigc::connection configure_connection; + void save_pos_and_size (); void set_pos_and_size (); void set_pos (); diff --git a/libs/gtkmm2ext/keyboard.cc b/libs/gtkmm2ext/keyboard.cc index 983edbd0cf..08b0393d49 100644 --- a/libs/gtkmm2ext/keyboard.cc +++ b/libs/gtkmm2ext/keyboard.cc @@ -477,6 +477,7 @@ Keyboard::leave_window (GdkEventCrossing *ev, Gtk::Window* /*win*/) current_window = 0; } } else { + DEBUG_TRACE (DEBUG::Keyboard, "LEAVE window without event\n"); current_window = 0; } @@ -498,7 +499,9 @@ Keyboard::focus_out_window (GdkEventFocus * ev, Gtk::Window* win) state.clear (); current_window = 0; } else { - current_window = 0; + if (win == current_window) { + current_window = 0; + } } DEBUG_TRACE (DEBUG::Keyboard, string_compose ("Foucusing out window, title = %1\n", win->get_title())); diff --git a/libs/gtkmm2ext/tabbable.cc b/libs/gtkmm2ext/tabbable.cc index b84de2b10d..9aa1c3fe5f 100644 --- a/libs/gtkmm2ext/tabbable.cc +++ b/libs/gtkmm2ext/tabbable.cc @@ -304,6 +304,7 @@ Tabbable::show_tab () add_to_notebook (*_parent_notebook, _tab_title); } _parent_notebook->set_current_page (_parent_notebook->page_num (_contents)); + current_toplevel()->present (); } } diff --git a/libs/gtkmm2ext/visibility_tracker.cc b/libs/gtkmm2ext/visibility_tracker.cc index aac76a5021..170036eac1 100644 --- a/libs/gtkmm2ext/visibility_tracker.cc +++ b/libs/gtkmm2ext/visibility_tracker.cc @@ -23,6 +23,8 @@ using namespace Gtkmm2ext; +bool VisibilityTracker::_use_window_manager_visibility = true; + VisibilityTracker::VisibilityTracker (Gtk::Window& win) : _window (win) , _visibility (GdkVisibilityState (0)) @@ -31,11 +33,16 @@ VisibilityTracker::VisibilityTracker (Gtk::Window& win) _window.signal_visibility_notify_event().connect (sigc::mem_fun (*this, &VisibilityTracker::handle_visibility_notify_event)); } +void +VisibilityTracker::set_use_window_manager_visibility (bool yn) +{ + _use_window_manager_visibility = yn; +} + bool VisibilityTracker::handle_visibility_notify_event (GdkEventVisibility* ev) { _visibility = ev->state; - // std::cerr << "VT: " << _window.get_title() << " vis event, fv = " << fully_visible() << " pv = " << partially_visible() << " nv = " << not_visible() << std::endl; return false; } @@ -52,17 +59,29 @@ VisibilityTracker::cycle_visibility () bool VisibilityTracker::fully_visible () const { - return _window.is_mapped() && (_visibility == GDK_VISIBILITY_UNOBSCURED); + if (_use_window_manager_visibility) { + return _window.is_mapped() && (_visibility == GDK_VISIBILITY_UNOBSCURED); + } else { + return _window.is_mapped(); + } } bool VisibilityTracker::not_visible () const { - return !_window.is_mapped() || (_visibility == GDK_VISIBILITY_FULLY_OBSCURED); + if (_use_window_manager_visibility) { + return !_window.is_mapped() || (_visibility == GDK_VISIBILITY_FULLY_OBSCURED); + } else { + return !_window.is_mapped(); + } } bool VisibilityTracker::partially_visible () const { - return _window.is_mapped() && ((_visibility == GDK_VISIBILITY_PARTIAL) || (_visibility == GDK_VISIBILITY_UNOBSCURED)); + if (_use_window_manager_visibility) { + return _window.is_mapped() && ((_visibility == GDK_VISIBILITY_PARTIAL) || (_visibility == GDK_VISIBILITY_UNOBSCURED)); + } else { + return _window.is_mapped(); + } }