[Xfce4-commits] [xfce/xfce4-panel] 12/12: Make panel hide intelligently with shaded windows (Bug #11371)

noreply at xfce.org noreply at xfce.org
Mon Feb 27 22:51:53 CET 2017


This is an automated email from the git hooks/post-receive script.

ochosi pushed a commit to branch master
in repository xfce/xfce4-panel.

commit 5936dbafe7cf406046f85e4ac9679908df2a6607
Author: Simon Steinbeiss <simon.steinbeiss at elfenbeinturm.at>
Date:   Mon Feb 27 21:22:59 2017 +0100

    Make panel hide intelligently with shaded windows (Bug #11371)
---
 panel/panel-window.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/panel/panel-window.c b/panel/panel-window.c
index a8723a0..3f27da3 100644
--- a/panel/panel-window.c
+++ b/panel/panel-window.c
@@ -33,6 +33,7 @@
 #ifdef GDK_WINDOWING_X11
 #include <gdk/gdkx.h>
 #include <X11/Xlib.h>
+#include <X11/Xatom.h>
 #endif
 
 #include <libwnck/libwnck.h>
@@ -152,6 +153,10 @@ static void         panel_window_active_window_changed                (WnckScree
                                                                        PanelWindow      *window);
 static void         panel_window_active_window_geometry_changed       (WnckWindow       *active_window,
                                                                        PanelWindow      *window);
+static void         panel_window_active_window_state_changed          (WnckWindow       *active_window,
+                                                                       WnckWindowState   changed,
+                                                                       WnckWindowState   new,
+                                                                       PanelWindow      *window);
 static void         panel_window_autohide_queue                       (PanelWindow      *window,
                                                                        AutohideState     new_state);
 static void         panel_window_set_autohide_behavior                (PanelWindow      *window,
@@ -2261,6 +2266,32 @@ panel_window_active_window_geometry_changed (WnckWindow  *active_window,
                                     &window_area.x, &window_area.y,
                                     &window_area.width, &window_area.height);
 
+          /* if a window is shaded, check the height of the window's
+           * decoration as exposed through the _NET_FRAME_EXTENTS application
+           * window property */
+          if (wnck_window_is_shaded (active_window))
+          {
+            Display *display;
+            Atom real_type;
+            int real_format;
+            unsigned long items_read, items_left;
+            guint32 *data;
+
+            display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
+            if (XGetWindowProperty (display, wnck_window_get_xid (active_window),
+                                    XInternAtom(display, "_NET_FRAME_EXTENTS", True),
+                                    0, 4, FALSE, AnyPropertyType,
+                                    &real_type, &real_format, &items_read, &items_left,
+                                    (unsigned char **) &data) == Success
+                                    && (items_read >= 4))
+              window_area.height = data[2] + data[3];
+
+            if (data)
+            {
+              XFree (data);
+            }
+          }
+
           /* obtain position and dimension from the panel */
           panel_window_size_allocate_set_xy (window,
                                              window->alloc.width,
@@ -2296,6 +2327,20 @@ panel_window_active_window_geometry_changed (WnckWindow  *active_window,
 
 
 
+static void
+panel_window_active_window_state_changed (WnckWindow  *active_window,
+                                          WnckWindowState changed,
+                                          WnckWindowState new,
+                                          PanelWindow *window)
+{
+  panel_return_if_fail (WNCK_IS_WINDOW (active_window));
+
+  if (changed & WNCK_WINDOW_STATE_SHADED)
+    panel_window_active_window_geometry_changed (active_window, window);
+}
+
+
+
 static gboolean
 panel_window_autohide_timeout (gpointer user_data)
 {
@@ -2574,6 +2619,8 @@ panel_window_update_autohide_window (PanelWindow *window,
         {
           g_signal_handlers_disconnect_by_func (window->wnck_active_window,
               panel_window_active_window_geometry_changed, window);
+          g_signal_handlers_disconnect_by_func (window->wnck_active_window,
+              panel_window_active_window_state_changed, window);
         }
 
       /* remember the new window */
@@ -2584,6 +2631,8 @@ panel_window_update_autohide_window (PanelWindow *window,
         {
           g_signal_connect (G_OBJECT (active_window), "geometry-changed",
               G_CALLBACK (panel_window_active_window_geometry_changed), window);
+          g_signal_connect (G_OBJECT (active_window), "state-changed",
+              G_CALLBACK (panel_window_active_window_state_changed), window);
 
           /* simulate a geometry change for immediate hiding when the new active
            * window already overlaps the panel */

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list