track geometry via configure events for tabbable own-windows
authorPaul Davis <paul@linuxaudiosystems.com>
Tue, 10 May 2016 13:46:12 +0000 (09:46 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Tue, 10 May 2016 13:46:12 +0000 (09:46 -0400)
libs/gtkmm2ext/gtkmm2ext/window_proxy.h
libs/gtkmm2ext/window_proxy.cc

index 3bb941bccf88e59be24d388c44b5a566a23b73d2..13c3486bdf4be942122380a73cc48bd5f1d759fc 100644 (file)
@@ -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 ();
index 28ec4fb28d37b7d5a4eddb1cacf2b3fa251ce1bd..ee91b7e26607cc5ba2a83dfc96c6e84bf2be676f 100644 (file)
@@ -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
 {