summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Fourdan <fourdan@xfce.org>2015-01-22 21:51:11 +0100
committerOlivier Fourdan <fourdan@xfce.org>2015-01-22 22:52:28 +0100
commitf6d5236b887c062117ee504358e54e63a98e3a54 (patch)
tree92cd9555ce8519cf69a7db25303575865b3287af
parentbc992fccfc3eac800bb16d3242892d8c52f6d059 (diff)
downloadxfwm4-f6d5236b887c062117ee504358e54e63a98e3a54.tar.gz
compositor: Add API to retrieve window pixmap
Signed-off-by: Olivier Fourdan <fourdan@xfce.org>
-rw-r--r--src/compositor.c65
-rw-r--r--src/compositor.h2
2 files changed, 66 insertions, 1 deletions
diff --git a/src/compositor.c b/src/compositor.c
index a862694ec..c047ac651 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -124,6 +124,8 @@ struct _CWindow
Damage damage;
#if HAVE_NAME_WINDOW_PIXMAP
Pixmap name_window_pixmap;
+ /* Save a copy for use when the window is unmapped */
+ Pixmap saved_window_pixmap;
#endif /* HAVE_NAME_WINDOW_PIXMAP */
Picture picture;
Picture shadow;
@@ -732,9 +734,22 @@ free_win_data (CWindow *cw, gboolean delete)
display_info = screen_info->display_info;
#if HAVE_NAME_WINDOW_PIXMAP
+ if (cw->saved_window_pixmap)
+ {
+ XFreePixmap (display_info->dpy, cw->saved_window_pixmap);
+ cw->saved_window_pixmap = None;
+ }
+
if (cw->name_window_pixmap)
{
- XFreePixmap (display_info->dpy, cw->name_window_pixmap);
+ if (delete)
+ {
+ XFreePixmap (display_info->dpy, cw->name_window_pixmap);
+ }
+ else
+ {
+ cw->saved_window_pixmap = cw->name_window_pixmap;
+ }
cw->name_window_pixmap = None;
}
#endif
@@ -2172,6 +2187,7 @@ add_win (DisplayInfo *display_info, Window id, Client *c)
}
#if HAVE_NAME_WINDOW_PIXMAP
new->name_window_pixmap = None;
+ new->saved_window_pixmap = None;
#endif
new->picture = None;
new->alphaPict = None;
@@ -2293,6 +2309,11 @@ resize_win (CWindow *cw, gint x, gint y, gint width, gint height, gint bw)
XFreePixmap (display_info->dpy, cw->name_window_pixmap);
cw->name_window_pixmap = None;
}
+ if (cw->saved_window_pixmap)
+ {
+ XFreePixmap (display_info->dpy, cw->saved_window_pixmap);
+ cw->saved_window_pixmap = None;
+ }
#endif
if (cw->picture)
{
@@ -2973,6 +2994,48 @@ compositorResizeWindow (DisplayInfo *display_info, Window id, int x, int y, int
#endif /* HAVE_COMPOSITOR */
}
+/* May return None if:
+ * - The xserver does not support name window pixmaps
+ * - The compositor is disabled at run time
+ * - The compositor is disabled at build time
+ * The pixmap may be an older copy of the last know good pixmap
+ * if the window is unmapped.
+ */
+Pixmap
+compositorGetWindowPixmap (DisplayInfo *display_info, Window id)
+{
+#ifdef HAVE_NAME_WINDOW_PIXMAP
+#ifdef HAVE_COMPOSITOR
+ CWindow *cw;
+
+ g_return_val_if_fail (id != None, None);
+ TRACE ("entering compositorGetPixmap: 0x%lx", id);
+
+ if (!compositorIsUsable (display_info))
+ {
+ return None;
+ }
+
+ if (!display_info->have_name_window_pixmap)
+ {
+ return None;
+ }
+
+ cw = find_cwindow_in_display (display_info, id);
+ if (cw)
+ {
+ if (cw->name_window_pixmap != None)
+ {
+ return cw->name_window_pixmap;
+ }
+ return cw->saved_window_pixmap;
+ }
+#endif /* HAVE_COMPOSITOR */
+#endif /* HAVE_NAME_WINDOW_PIXMAP */
+
+ return None;
+}
+
void
compositorHandleEvent (DisplayInfo *display_info, XEvent *ev)
{
diff --git a/src/compositor.h b/src/compositor.h
index d8894497f..91a2b3996 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -51,6 +51,8 @@ void compositorResizeWindow (DisplayInfo *,
int,
int,
int);
+Pixmap compositorGetWindowPixmap (DisplayInfo *,
+ Window);
void compositorHandleEvent (DisplayInfo *,
XEvent *);
void compositorZoomIn (ScreenInfo *,