diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2016-05-10 09:46:12 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2016-05-10 09:46:12 -0400 |
commit | 4963d65206a0817a662159cf0ea7d2d324ddad61 (patch) | |
tree | caa40992de72c6eac0fe85df7a83dd8a68d7746a /libs/gtkmm2ext | |
parent | ae7cc64377e60ec4d93de4c7199341e9fa942c5d (diff) |
track geometry via configure events for tabbable own-windows
Diffstat (limited to 'libs/gtkmm2ext')
-rw-r--r-- | libs/gtkmm2ext/gtkmm2ext/window_proxy.h | 3 | ||||
-rw-r--r-- | libs/gtkmm2ext/window_proxy.cc | 20 |
2 files changed, 22 insertions, 1 deletions
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,12 +252,28 @@ 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 { if (vistracker) { |