From 83eeacb48911e3a457b2eb3a0c8f7c908265f854 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Sat, 18 Jun 2011 04:20:54 -0400 Subject: [PATCH] compositor-x11: Support fullscreen mode --- compositor/compositor-x11.c | 59 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/compositor/compositor-x11.c b/compositor/compositor-x11.c index 3517fad..52d094b 100644 --- a/compositor/compositor-x11.c +++ b/compositor/compositor-x11.c @@ -58,6 +58,8 @@ struct x11_compositor { xcb_atom_t wm_class; xcb_atom_t net_wm_name; xcb_atom_t net_wm_icon; + xcb_atom_t net_wm_state; + xcb_atom_t net_wm_state_fullscreen; xcb_atom_t string; xcb_atom_t utf8_string; xcb_atom_t cardinal; @@ -225,6 +227,38 @@ x11_output_set_wm_protocols(struct x11_output *output) list); } +static void +x11_output_change_state(struct x11_output *output, int add, xcb_atom_t state) +{ + xcb_client_message_event_t event; + struct x11_compositor *c = + (struct x11_compositor *) output->base.compositor; + xcb_screen_iterator_t iter; + +#define _NET_WM_STATE_REMOVE 0 /* remove/unset property */ +#define _NET_WM_STATE_ADD 1 /* add/set property */ +#define _NET_WM_STATE_TOGGLE 2 /* toggle property */ + + memset(&event, 0, sizeof event); + event.response_type = XCB_CLIENT_MESSAGE; + event.format = 32; + event.window = output->window; + event.type = c->atom.net_wm_state; + + event.data.data32[0] = add ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE; + event.data.data32[1] = state; + event.data.data32[2] = 0; + event.data.data32[3] = 0; + event.data.data32[4] = 0; + + iter = xcb_setup_roots_iterator(xcb_get_setup(c->conn)); + xcb_send_event(c->conn, 0, iter.data->root, + XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | + XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, + (void *) &event); +} + + struct wm_normal_hints { uint32_t flags; uint32_t pad[4]; @@ -267,7 +301,8 @@ x11_output_set_icon(struct x11_compositor *c, } static int -x11_compositor_create_output(struct x11_compositor *c, int width, int height) +x11_compositor_create_output(struct x11_compositor *c, + int width, int height, int fullscreen) { static const char name[] = "Wayland Compositor"; static const char class[] = "wayland-1\0Wayland Compositor"; @@ -340,6 +375,10 @@ x11_compositor_create_output(struct x11_compositor *c, int width, int height) x11_output_set_wm_protocols(output); + if (fullscreen) + x11_output_change_state(output, 1, + c->atom.net_wm_state_fullscreen); + output->egl_surface = eglCreateWindowSurface(c->base.display, c->base.config, output->window, NULL); @@ -585,6 +624,8 @@ x11_compositor_get_resources(struct x11_compositor *c) { "WM_CLASS", F(atom.wm_class) }, { "_NET_WM_NAME", F(atom.net_wm_name) }, { "_NET_WM_ICON", F(atom.net_wm_icon) }, + { "_NET_WM_STATE", F(atom.net_wm_state) }, + { "_NET_WM_STATE_FULLSCREEN", F(atom.net_wm_state_fullscreen) }, { "STRING", F(atom.string) }, { "UTF8_STRING", F(atom.utf8_string) }, { "CARDINAL", F(atom.cardinal) }, @@ -628,7 +669,8 @@ x11_destroy(struct wlsc_compositor *ec) } static struct wlsc_compositor * -x11_compositor_create(struct wl_display *display, int width, int height) +x11_compositor_create(struct wl_display *display, + int width, int height, int fullscreen) { struct x11_compositor *c; struct wl_event_loop *loop; @@ -666,7 +708,7 @@ x11_compositor_create(struct wl_display *display, int width, int height) if (wlsc_compositor_init(&c->base, display) < 0) return NULL; - if (x11_compositor_create_output(c, width, height) < 0) + if (x11_compositor_create_output(c, width, height, fullscreen) < 0) return NULL; if (x11_input_create(c) < 0) @@ -689,10 +731,12 @@ backend_init(struct wl_display *display, char *options); WL_EXPORT struct wlsc_compositor * backend_init(struct wl_display *display, char *options) { - int width = 1024, height = 640, i; + int width = 1024, height = 640, fullscreen = 0, i; char *p, *value; - static char * const tokens[] = { "width", "height", NULL }; + static char * const tokens[] = { + "width", "height", "fullscreen", NULL + }; p = options; while (i = getsubopt(&p, tokens, &value), i != -1) { @@ -703,8 +747,11 @@ backend_init(struct wl_display *display, char *options) case 1: height = strtol(value, NULL, 0); break; + case 2: + fullscreen = 1; + break; } } - return x11_compositor_create(display, width, height); + return x11_compositor_create(display, width, height, fullscreen); } -- 2.7.4