[metacity] compositor: return cairo_surface_t instead of pixmap



commit 68bdf1ab9de815e07f5cd75b2e1fa24ba92ae319
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Sat Sep 5 20:39:44 2015 +0300

    compositor: return cairo_surface_t instead of pixmap
    
    Replace get_window_pixmap with get_window_surface and move surface
    creation from ui to compositor. This allows us to use correct
    visual for surface creation.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=754009

 src/compositor/compositor-private.h |    6 +++-
 src/compositor/compositor-xrender.c |   43 +++++++++++++++++++++++++---------
 src/compositor/compositor.c         |   14 +++++-----
 src/core/screen.c                   |    9 ++++---
 src/include/compositor.h            |    6 +++-
 src/include/ui.h                    |    2 +-
 src/ui/ui.c                         |   27 +++++-----------------
 7 files changed, 58 insertions(+), 49 deletions(-)
---
diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h
index a45fdc9..9ced913 100644
--- a/src/compositor/compositor-private.h
+++ b/src/compositor/compositor-private.h
@@ -42,8 +42,10 @@ struct _MetaCompositor
   void (*process_event) (MetaCompositor *compositor,
                          XEvent         *event,
                          MetaWindow     *window);
-  Pixmap (*get_window_pixmap) (MetaCompositor *compositor,
-                               MetaWindow     *window);
+
+  cairo_surface_t *(* get_window_surface) (MetaCompositor *compositor,
+                                           MetaWindow     *window);
+
   void (*set_active_window) (MetaCompositor *compositor,
                              MetaScreen     *screen,
                              MetaWindow     *window);
diff --git a/src/compositor/compositor-xrender.c b/src/compositor/compositor-xrender.c
index fbae9a7..b05a205 100644
--- a/src/compositor/compositor-xrender.c
+++ b/src/compositor/compositor-xrender.c
@@ -32,6 +32,7 @@
 #include <unistd.h>
 
 #include <gdk/gdk.h>
+#include <cairo/cairo-xlib.h>
 
 #include "display.h"
 #include "screen.h"
@@ -2905,24 +2906,42 @@ xrender_process_event (MetaCompositor *compositor,
 #endif
 }
 
-static Pixmap
-xrender_get_window_pixmap (MetaCompositor *compositor,
-                           MetaWindow     *window)
+static cairo_surface_t *
+xrender_get_window_surface (MetaCompositor *compositor,
+                            MetaWindow     *window)
 {
 #ifdef HAVE_COMPOSITE_EXTENSIONS
-  MetaCompWindow *cw = NULL;
-  MetaScreen *screen = meta_window_get_screen (window);
-  MetaFrame *frame = meta_window_get_frame (window);
+  MetaFrame *frame;
+  Window xwindow;
+  MetaScreen *screen;
+  MetaCompWindow *cw;
+  MetaCompositorXRender *xrc;
+  Display *display;
+  Pixmap pixmap;
+
+  frame = meta_window_get_frame (window);
+
+  if (frame)
+    xwindow = meta_frame_get_xwindow (frame);
+  else
+    xwindow = meta_window_get_xwindow (window);
+
+  screen = meta_window_get_screen (window);
+  cw = find_window_for_screen (screen, xwindow);
 
-  cw = find_window_for_screen (screen, frame ? meta_frame_get_xwindow (frame) :
-                               meta_window_get_xwindow (window));
   if (cw == NULL)
-    return None;
+    return NULL;
+
+  xrc = (MetaCompositorXRender *) compositor;
+  display = meta_display_get_xdisplay (xrc->display);
 
   if (meta_window_is_shaded (window))
-    return cw->shaded_back_pixmap;
+    pixmap = cw->shaded_back_pixmap;
   else
-    return cw->back_pixmap;
+    pixmap = cw->back_pixmap;
+
+  return cairo_xlib_surface_create (display, pixmap, cw->attrs.visual,
+                                    cw->attrs.width, cw->attrs.height);
 #endif
 }
 
@@ -3108,7 +3127,7 @@ static MetaCompositor comp_info = {
   xrender_remove_window,
   xrender_set_updates,
   xrender_process_event,
-  xrender_get_window_pixmap,
+  xrender_get_window_surface,
   xrender_set_active_window,
   xrender_free_window,
   xrender_maximize_window,
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
index 1fea362..f2ba167 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -105,17 +105,17 @@ meta_compositor_process_event (MetaCompositor *compositor,
 #endif
 }
 
-Pixmap
-meta_compositor_get_window_pixmap (MetaCompositor *compositor,
-                                   MetaWindow     *window)
+cairo_surface_t *
+meta_compositor_get_window_surface (MetaCompositor *compositor,
+                                    MetaWindow     *window)
 {
 #ifdef HAVE_COMPOSITE_EXTENSIONS
-  if (compositor && compositor->get_window_pixmap)
-    return compositor->get_window_pixmap (compositor, window);
+  if (compositor && compositor->get_window_surface)
+    return compositor->get_window_surface (compositor, window);
   else
-    return None;
+    return NULL;
 #else
-  return None;
+  return NULL;
 #endif
 }
 
diff --git a/src/core/screen.c b/src/core/screen.c
index 7c9ca88..bc950c8 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -1220,16 +1220,17 @@ get_window_pixbuf (MetaWindow *window,
                    int        *width,
                    int        *height)
 {
-  Pixmap pmap;
+  cairo_surface_t *surface;
   GdkPixbuf *pixbuf, *scaled;
   double ratio;
 
-  pmap = meta_compositor_get_window_pixmap (window->display->compositor,
+  surface = meta_compositor_get_window_surface (window->display->compositor,
                                             window);
-  if (pmap == None)
+  if (surface == NULL)
     return NULL;
 
-  pixbuf = meta_ui_get_pixbuf_from_pixmap (pmap);
+  pixbuf = meta_ui_get_pixbuf_from_surface (surface);
+  cairo_surface_destroy (surface);
   if (pixbuf == NULL) 
     return NULL;
 
diff --git a/src/include/compositor.h b/src/include/compositor.h
index 38d7607..ad4411b 100644
--- a/src/include/compositor.h
+++ b/src/include/compositor.h
@@ -48,8 +48,10 @@ void meta_compositor_set_updates (MetaCompositor *compositor,
 void meta_compositor_process_event (MetaCompositor *compositor,
                                     XEvent         *event,
                                     MetaWindow     *window);
-Pixmap meta_compositor_get_window_pixmap (MetaCompositor *compositor,
-                                          MetaWindow     *window);
+
+cairo_surface_t *meta_compositor_get_window_surface (MetaCompositor *compositor,
+                                                     MetaWindow     *window);
+
 void meta_compositor_set_active_window (MetaCompositor *compositor,
                                         MetaScreen     *screen,
                                         MetaWindow     *window);
diff --git a/src/include/ui.h b/src/include/ui.h
index 4d031c1..d85446f 100644
--- a/src/include/ui.h
+++ b/src/include/ui.h
@@ -178,7 +178,7 @@ int      meta_ui_get_drag_threshold       (MetaUI *ui);
 
 MetaUIDirection meta_ui_get_direction (void);
 
-GdkPixbuf *meta_ui_get_pixbuf_from_pixmap (Pixmap   pmap);
+GdkPixbuf *meta_ui_get_pixbuf_from_surface (cairo_surface_t *surface);
 
 #include "tabpopup.h"
 #include "tile-preview.h"
diff --git a/src/ui/ui.c b/src/ui/ui.c
index 239c63f..c647c90 100644
--- a/src/ui/ui.c
+++ b/src/ui/ui.c
@@ -943,28 +943,13 @@ meta_ui_get_direction (void)
 }
 
 GdkPixbuf *
-meta_ui_get_pixbuf_from_pixmap (Pixmap pixmap)
+meta_ui_get_pixbuf_from_surface (cairo_surface_t *surface)
 {
-  Display *display;
-  Window root;
-  int x, y;
-  unsigned int width, height, border, depth;
-  GdkVisual *visual;
-  cairo_surface_t *surface;
-  GdkPixbuf *pixbuf;
-
-  display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
+  gint width;
+  gint height;
 
-  if (!XGetGeometry (display, pixmap, &root, &x, &y, &width, &height, &border, &depth))
-    return NULL;
-
-  visual = gdk_screen_get_rgba_visual (gdk_screen_get_default());
-  if (!visual)
-    visual = gdk_screen_get_system_visual (gdk_screen_get_default());
-
-  surface = cairo_xlib_surface_create (display, pixmap, GDK_VISUAL_XVISUAL (visual), width, height);
-  pixbuf = gdk_pixbuf_get_from_surface (surface, x, y, width, height);
-  cairo_surface_destroy (surface);
+  width = cairo_xlib_surface_get_width (surface);
+  height = cairo_xlib_surface_get_height (surface);
 
-  return pixbuf;
+  return gdk_pixbuf_get_from_surface (surface, 0, 0, width, height);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]