window: Add support for opaque windows
This commit is contained in:
parent
8357cd61d8
commit
3be87d1931
|
@ -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…
Reference in New Issue