From 4963d65206a0817a662159cf0ea7d2d324ddad61 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 10 May 2016 09:46:12 -0400 Subject: [PATCH] track geometry via configure events for tabbable own-windows --- libs/gtkmm2ext/gtkmm2ext/window_proxy.h | 3 +++ libs/gtkmm2ext/window_proxy.cc | 20 +++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/libs/gtkmm2ext/gtkmm2ext/window_proxy.h b/libs/gtkmm2ext/gtkmm2ext/window_proxy.h index 3bb941bccf..13c3486bdf 100644 --- a/libs/gtkmm2ext/gtkmm2ext/window_proxy.h +++ b/libs/gtkmm2ext/gtkmm2ext/window_proxy.h @@ -93,12 +93,15 @@ class LIBGTKMM2EXT_API WindowProxy : public PBD::StatefulDestructible, public vi mutable int _height; ///< height Gtkmm2ext::VisibilityTracker* vistracker; StateMask _state_mask; + sigc::connection delete_connection; + sigc::connection configure_connection; void save_pos_and_size (); void set_pos_and_size (); void set_pos (); virtual bool delete_event_handler (GdkEventAny *ev); + virtual bool configure_handler (GdkEventConfigure*); virtual void setup (); void toggle (); diff --git a/libs/gtkmm2ext/window_proxy.cc b/libs/gtkmm2ext/window_proxy.cc index 28ec4fb28d..ee91b7e266 100644 --- a/libs/gtkmm2ext/window_proxy.cc +++ b/libs/gtkmm2ext/window_proxy.cc @@ -228,6 +228,8 @@ void WindowProxy::drop_window () { if (_window) { + delete_connection.disconnect (); + configure_connection.disconnect (); _window->hide (); delete _window; _window = 0; @@ -250,11 +252,27 @@ WindowProxy::setup () assert (_window); vistracker = new Gtkmm2ext::VisibilityTracker (*_window); - _window->signal_delete_event().connect (sigc::mem_fun (*this, &WindowProxy::delete_event_handler)); + + delete_connection = _window->signal_delete_event().connect (sigc::mem_fun (*this, &WindowProxy::delete_event_handler)); + configure_connection = _window->signal_configure_event().connect (sigc::mem_fun (*this, &WindowProxy::configure_handler), false); set_pos_and_size (); } +bool +WindowProxy::configure_handler (GdkEventConfigure* ev) +{ + /* stupidly, the geometry data in the event isn't the same as we get + from the window geometry APIs.so we have to actively interrogate + them to get the new information. + + the difference is generally down to window manager framing. + */ + save_pos_and_size (); + return false; +} + + bool WindowProxy::visible() const {