X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fgtkmm2ext%2Fvisibility_tracker.cc;h=170036eac114a28a7809f49ab5b8fda07fb64418;hb=00b8cff66fb971ead1a54e4b11e6dd869256461b;hp=c0aabdfca6d15d2d3e1832dc0af72c108fc30110;hpb=bd2d4d42475214fffbdc670eb22963249cecf744;p=ardour.git diff --git a/libs/gtkmm2ext/visibility_tracker.cc b/libs/gtkmm2ext/visibility_tracker.cc index c0aabdfca6..170036eac1 100644 --- a/libs/gtkmm2ext/visibility_tracker.cc +++ b/libs/gtkmm2ext/visibility_tracker.cc @@ -16,19 +16,27 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - +#include #include #include "gtkmm2ext/visibility_tracker.h" using namespace Gtkmm2ext; +bool VisibilityTracker::_use_window_manager_visibility = true; + VisibilityTracker::VisibilityTracker (Gtk::Window& win) - : window (win) + : _window (win) , _visibility (GdkVisibilityState (0)) { - window.add_events (Gdk::VISIBILITY_NOTIFY_MASK); - window.signal_visibility_notify_event().connect (sigc::mem_fun (*this, &VisibilityTracker::handle_visibility_notify_event)); + _window.add_events (Gdk::VISIBILITY_NOTIFY_MASK); + _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 @@ -41,10 +49,39 @@ VisibilityTracker::handle_visibility_notify_event (GdkEventVisibility* ev) void VisibilityTracker::cycle_visibility () { - if (window.is_mapped() && (_visibility == GDK_VISIBILITY_UNOBSCURED)) { - window.hide (); + if (fully_visible ()) { + _window.hide (); + } else { + _window.present (); + } +} + +bool +VisibilityTracker::fully_visible () const +{ + if (_use_window_manager_visibility) { + return _window.is_mapped() && (_visibility == GDK_VISIBILITY_UNOBSCURED); } else { - window.present (); + return _window.is_mapped(); } } +bool +VisibilityTracker::not_visible () const +{ + if (_use_window_manager_visibility) { + return !_window.is_mapped() || (_visibility == GDK_VISIBILITY_FULLY_OBSCURED); + } else { + return !_window.is_mapped(); + } +} + +bool +VisibilityTracker::partially_visible () const +{ + if (_use_window_manager_visibility) { + return _window.is_mapped() && ((_visibility == GDK_VISIBILITY_PARTIAL) || (_visibility == GDK_VISIBILITY_UNOBSCURED)); + } else { + return _window.is_mapped(); + } +}