[metacity] compositor: return cairo_surface_t instead of pixmap
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [metacity] compositor: return cairo_surface_t instead of pixmap
- Date: Thu, 10 Sep 2015 08:10:07 +0000 (UTC)
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]