summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/gtkmm2ext/gtkmm2ext/window_proxy.h3
-rw-r--r--libs/gtkmm2ext/window_proxy.cc20
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) {