diff --git a/src/compositor-x11.c b/src/compositor-x11.c index 7a9998cb..9cc41fd5 100644 --- a/src/compositor-x11.c +++ b/src/compositor-x11.c @@ -85,6 +85,8 @@ struct x11_compositor { uint8_t xkb_event_base; int use_pixman; + int has_net_wm_state_fullscreen; + /* We could map multi-pointer X to multiple wayland seats, but * for now we only support core X input. */ struct weston_seat core_seat; @@ -96,6 +98,8 @@ struct x11_compositor { xcb_atom_t wm_delete_window; xcb_atom_t wm_class; xcb_atom_t net_wm_name; + xcb_atom_t net_supporting_wm_check; + xcb_atom_t net_supported; xcb_atom_t net_wm_icon; xcb_atom_t net_wm_state; xcb_atom_t net_wm_state_fullscreen; @@ -512,8 +516,6 @@ x11_output_wait_for_map(struct x11_compositor *c, struct x11_output *output) switch (response_type) { case XCB_MAP_NOTIFY: - fprintf(stderr, "got XCB_MAP_NOTIFY\n"); - map_notify = (xcb_map_notify_event_t *) event; if (map_notify->window == output->window) mapped = 1; @@ -523,10 +525,6 @@ x11_output_wait_for_map(struct x11_compositor *c, struct x11_output *output) configure_notify = (xcb_configure_notify_event_t *) event; - fprintf(stderr, "got XCB_CONFIGURE_NOTIFY %dx%d\n", - configure_notify->width, - configure_notify->height); - output->mode.width = configure_notify->width; output->mode.height = configure_notify->height; configured = 1; @@ -769,7 +767,8 @@ x11_compositor_create_output(struct x11_compositor *c, int x, int y, xcb_map_window(c->conn, output->window); - x11_output_wait_for_map(c, output); + if (fullscreen) + x11_output_wait_for_map(c, output); output->base.origin = output->base.current; if (c->use_pixman) @@ -1267,6 +1266,9 @@ x11_compositor_get_resources(struct x11_compositor *c) { "_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) }, + { "_NET_SUPPORTING_WM_CHECK", + F(atom.net_supporting_wm_check) }, + { "_NET_SUPPORTED", F(atom.net_supported) }, { "STRING", F(atom.string) }, { "UTF8_STRING", F(atom.utf8_string) }, { "CARDINAL", F(atom.cardinal) }, @@ -1304,6 +1306,29 @@ x11_compositor_get_resources(struct x11_compositor *c) xcb_free_pixmap(c->conn, pixmap); } +static void +x11_compositor_get_wm_info(struct x11_compositor *c) +{ + xcb_get_property_cookie_t cookie; + xcb_get_property_reply_t *reply; + xcb_atom_t *atom; + unsigned int i; + + cookie = xcb_get_property(c->conn, 0, c->screen->root, + c->atom.net_supported, + XCB_ATOM_ATOM, 0, 1024); + reply = xcb_get_property_reply(c->conn, cookie, NULL); + if (reply == NULL) + return; + + atom = (xcb_atom_t *) xcb_get_property_value(reply); + + for (i = 0; i < reply->value_len; i++) { + if (atom[i] == c->atom.net_wm_state_fullscreen) + c->has_net_wm_state_fullscreen = 1; + } +} + static void x11_restore(struct weston_compositor *ec) { @@ -1377,6 +1402,13 @@ x11_compositor_create(struct wl_display *display, wl_array_init(&c->keys); x11_compositor_get_resources(c); + x11_compositor_get_wm_info(c); + + if (!c->has_net_wm_state_fullscreen && fullscreen) { + weston_log("Can not fullscreen without window manager support" + "(need _NET_WM_STATE_FULLSCREEN)\n"); + fullscreen = 0; + } c->base.wl_display = display; c->use_pixman = use_pixman;