window: Add support for opaque windows

dev
Kristian Høgsberg 14 years ago
parent 8357cd61d8
commit 3be87d1931
  1. 4
      clients/dnd.c
  2. 57
      clients/window.c
  3. 7
      clients/window.h

@ -110,7 +110,7 @@ item_create(struct display *display, int x, int y, int seed)
rect.width = item_width; rect.width = item_width;
rect.height = item_height; rect.height = item_height;
item->surface = display_create_surface(display, NULL, &rect); item->surface = display_create_surface(display, NULL, &rect, 0);
item->x = x; item->x = x;
item->y = y; item->y = y;
@ -527,7 +527,7 @@ create_drag_cursor(struct dnd_drag *dnd_drag,
rectangle.width = item_width + 2 * pointer_width; rectangle.width = item_width + 2 * pointer_width;
rectangle.height = item_height + 2 * pointer_height; rectangle.height = item_height + 2 * pointer_height;
surface = display_create_surface(dnd->display, NULL, &rectangle); surface = display_create_surface(dnd->display, NULL, &rectangle, 0);
cr = cairo_create(surface); cr = cairo_create(surface);
cairo_translate(cr, pointer_width, pointer_height); cairo_translate(cr, pointer_width, pointer_height);

@ -99,6 +99,7 @@ struct window {
int margin; int margin;
int fullscreen; int fullscreen;
int decoration; int decoration;
int transparent;
struct input *grab_device; struct input *grab_device;
struct input *keyboard_device; struct input *keyboard_device;
uint32_t name; uint32_t name;
@ -212,11 +213,11 @@ egl_window_surface_data_destroy(void *p)
static cairo_surface_t * static cairo_surface_t *
display_create_egl_window_surface(struct display *display, display_create_egl_window_surface(struct display *display,
struct wl_surface *surface, struct wl_surface *surface,
struct wl_visual *visual,
struct rectangle *rectangle) struct rectangle *rectangle)
{ {
cairo_surface_t *cairo_surface; cairo_surface_t *cairo_surface;
struct egl_window_surface_data *data; struct egl_window_surface_data *data;
struct wl_visual *visual;
data = malloc(sizeof *data); data = malloc(sizeof *data);
if (data == NULL) if (data == NULL)
@ -225,8 +226,6 @@ display_create_egl_window_surface(struct display *display,
data->display = display; data->display = display;
data->surface = surface; data->surface = surface;
visual = display->premultiplied_argb_visual;
data->window = wl_egl_window_create(surface, data->window = wl_egl_window_create(surface,
rectangle->width, rectangle->width,
rectangle->height, rectangle->height,
@ -283,12 +282,12 @@ display_get_image_for_egl_image_surface(struct display *display,
static cairo_surface_t * static cairo_surface_t *
display_create_egl_image_surface(struct display *display, display_create_egl_image_surface(struct display *display,
struct wl_visual *visual,
struct rectangle *rectangle) struct rectangle *rectangle)
{ {
struct egl_image_surface_data *data; struct egl_image_surface_data *data;
EGLDisplay dpy = display->dpy; EGLDisplay dpy = display->dpy;
cairo_surface_t *surface; cairo_surface_t *surface;
struct wl_visual *visual;
data = malloc(sizeof *data); data = malloc(sizeof *data);
if (data == NULL) if (data == NULL)
@ -296,7 +295,6 @@ display_create_egl_image_surface(struct display *display,
data->display = display; data->display = display;
visual = display->premultiplied_argb_visual;
data->pixmap = wl_egl_pixmap_create(rectangle->width, data->pixmap = wl_egl_pixmap_create(rectangle->width,
rectangle->height, rectangle->height,
visual, 0); visual, 0);
@ -347,6 +345,7 @@ display_create_egl_image_surface_from_file(struct display *display,
int stride, i; int stride, i;
unsigned char *pixels, *p, *end; unsigned char *pixels, *p, *end;
struct egl_image_surface_data *data; struct egl_image_surface_data *data;
struct wl_visual *visual;
pixbuf = gdk_pixbuf_new_from_file_at_scale(filename, pixbuf = gdk_pixbuf_new_from_file_at_scale(filename,
rect->width, rect->height, rect->width, rect->height,
@ -378,7 +377,8 @@ display_create_egl_image_surface_from_file(struct display *display,
} }
} }
surface = display_create_egl_image_surface(display, rect); visual = display->premultiplied_argb_visual;
surface = display_create_egl_image_surface(display, visual, rect);
if (surface == NULL) { if (surface == NULL) {
g_object_unref(pixbuf); g_object_unref(pixbuf);
return NULL; return NULL;
@ -427,11 +427,11 @@ shm_surface_data_destroy(void *p)
static cairo_surface_t * static cairo_surface_t *
display_create_shm_surface(struct display *display, display_create_shm_surface(struct display *display,
struct rectangle *rectangle) struct rectangle *rectangle, uint32_t flags)
{ {
struct shm_surface_data *data; struct shm_surface_data *data;
cairo_surface_t *surface;
struct wl_visual *visual; struct wl_visual *visual;
cairo_surface_t *surface;
int stride, fd; int stride, fd;
char filename[] = "/tmp/wayland-shm-XXXXXX"; char filename[] = "/tmp/wayland-shm-XXXXXX";
@ -472,7 +472,11 @@ display_create_shm_surface(struct display *display,
cairo_surface_set_user_data (surface, &surface_data_key, cairo_surface_set_user_data (surface, &surface_data_key,
data, shm_surface_data_destroy); data, shm_surface_data_destroy);
visual = display->premultiplied_argb_visual; if (flags & SURFACE_OPAQUE)
visual = display->rgb_visual;
else
visual = display->premultiplied_argb_visual;
data->data.buffer = wl_shm_create_buffer(display->shm, data->data.buffer = wl_shm_create_buffer(display->shm,
fd, fd,
rectangle->width, rectangle->width,
@ -512,7 +516,7 @@ display_create_shm_surface_from_file(struct display *display,
stride = gdk_pixbuf_get_rowstride(pixbuf); stride = gdk_pixbuf_get_rowstride(pixbuf);
pixels = gdk_pixbuf_get_pixels(pixbuf); pixels = gdk_pixbuf_get_pixels(pixbuf);
surface = display_create_shm_surface(display, rect); surface = display_create_shm_surface(display, rect, 0);
if (surface == NULL) { if (surface == NULL) {
g_object_unref(pixbuf); g_object_unref(pixbuf);
return NULL; return NULL;
@ -557,8 +561,16 @@ check_size(struct rectangle *rect)
cairo_surface_t * cairo_surface_t *
display_create_surface(struct display *display, display_create_surface(struct display *display,
struct wl_surface *surface, struct wl_surface *surface,
struct rectangle *rectangle) struct rectangle *rectangle,
uint32_t flags)
{ {
struct wl_visual *visual;
if (flags & SURFACE_OPAQUE)
visual = display->rgb_visual;
else
visual = display->premultiplied_argb_visual;
if (check_size(rectangle) < 0) if (check_size(rectangle) < 0)
return NULL; return NULL;
#ifdef HAVE_CAIRO_EGL #ifdef HAVE_CAIRO_EGL
@ -566,13 +578,15 @@ display_create_surface(struct display *display,
if (surface) if (surface)
return display_create_egl_window_surface(display, return display_create_egl_window_surface(display,
surface, surface,
visual,
rectangle); rectangle);
else else
return display_create_egl_image_surface(display, return display_create_egl_image_surface(display,
visual,
rectangle); rectangle);
} }
#endif #endif
return display_create_shm_surface(display, rectangle); return display_create_shm_surface(display, rectangle, flags);
} }
static cairo_surface_t * static cairo_surface_t *
@ -783,7 +797,11 @@ void
window_create_surface(struct window *window) window_create_surface(struct window *window)
{ {
cairo_surface_t *surface; cairo_surface_t *surface;
uint32_t flags = 0;
if (!window->transparent)
flags = SURFACE_OPAQUE;
switch (window->buffer_type) { switch (window->buffer_type) {
#ifdef HAVE_CAIRO_EGL #ifdef HAVE_CAIRO_EGL
case WINDOW_BUFFER_TYPE_EGL_WINDOW: case WINDOW_BUFFER_TYPE_EGL_WINDOW:
@ -793,17 +811,17 @@ window_create_surface(struct window *window)
} }
surface = display_create_surface(window->display, surface = display_create_surface(window->display,
window->surface, window->surface,
&window->allocation); &window->allocation, flags);
break; break;
case WINDOW_BUFFER_TYPE_EGL_IMAGE: case WINDOW_BUFFER_TYPE_EGL_IMAGE:
surface = display_create_surface(window->display, surface = display_create_surface(window->display,
NULL, NULL,
&window->allocation); &window->allocation, flags);
break; break;
#endif #endif
case WINDOW_BUFFER_TYPE_SHM: case WINDOW_BUFFER_TYPE_SHM:
surface = display_create_shm_surface(window->display, surface = display_create_shm_surface(window->display,
&window->allocation); &window->allocation, flags);
break; break;
default: default:
surface = NULL; surface = NULL;
@ -1421,6 +1439,12 @@ window_set_keyboard_focus_handler(struct window *window,
window->keyboard_focus_handler = handler; window->keyboard_focus_handler = handler;
} }
void
window_set_transparent(struct window *window, int transparent)
{
window->transparent = transparent;
}
void void
window_set_title(struct window *window, const char *title) window_set_title(struct window *window, const char *title)
{ {
@ -1473,6 +1497,7 @@ window_create_internal(struct display *display, struct window *parent,
window->saved_allocation = window->allocation; window->saved_allocation = window->allocation;
window->margin = 16; window->margin = 16;
window->decoration = 1; window->decoration = 1;
window->transparent = 1;
if (display->dpy) if (display->dpy)
/* FIXME: make TYPE_EGL_IMAGE choosable for testing */ /* FIXME: make TYPE_EGL_IMAGE choosable for testing */

@ -79,10 +79,13 @@ display_get_image_for_egl_image_surface(struct display *display,
#endif #endif
#endif #endif
#define SURFACE_OPAQUE 0x01
cairo_surface_t * cairo_surface_t *
display_create_surface(struct display *display, display_create_surface(struct display *display,
struct wl_surface *surface, struct wl_surface *surface,
struct rectangle *rectangle); struct rectangle *rectangle,
uint32_t flags);
struct wl_buffer * struct wl_buffer *
display_get_buffer_for_surface(struct display *display, display_get_buffer_for_surface(struct display *display,
@ -163,6 +166,8 @@ void
window_get_child_allocation(struct window *window, window_get_child_allocation(struct window *window,
struct rectangle *allocation); struct rectangle *allocation);
void
window_set_transparent(struct window *window, int transparent);
void void
window_set_child_size(struct window *window, int32_t width, int32_t height); window_set_child_size(struct window *window, int32_t width, int32_t height);
void void

Loading…
Cancel
Save