From 6e4eb1884625483e8d4f2a6a827160bec4b510cd Mon Sep 17 00:00:00 2001 From: Simon Steinbeiss Date: Sat, 13 Dec 2014 16:15:00 +0100 Subject: [PATCH] Make panel hide intelligently with shaded windows (bug #11371) --- panel/panel-window.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/panel/panel-window.c b/panel/panel-window.c index 52f9f09..cae474c 100644 --- a/panel/panel-window.c +++ b/panel/panel-window.c @@ -31,6 +31,7 @@ #ifdef GDK_WINDOWING_X11 #include #include +#include #endif #include @@ -136,6 +137,10 @@ static void panel_window_active_window_changed (WnckScreen 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, @@ -2172,6 +2177,29 @@ panel_window_active_window_geometry_changed (WnckWindow *active_window, &window_area.x, &window_area.y, &window_area.width, &window_area.height); + if (wnck_window_is_shaded (active_window)) + { + Display *display; + Atom real_type; + int real_format; + unsigned long items_read, items_left; + guint32 *data; + + display = XOpenDisplay(0); + 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)) + 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, @@ -2207,6 +2235,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) { @@ -2484,6 +2526,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 */ @@ -2494,6 +2538,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 */ -- 1.9.1