From: Michael Stapelberg Date: Fri, 13 Mar 2009 03:51:17 +0000 (+0100) Subject: Fix fullscreen for xpdf (at least on debian, with proper _NET_WM_STATE hints) X-Git-Tag: 3.a~20 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=e3085b4f7574f3891e280f44c650af2b0b03f1ba;p=i3%2Fi3 Fix fullscreen for xpdf (at least on debian, with proper _NET_WM_STATE hints) xpdf sets the _NET_WM_STATE before actually mapping the window. i3 only checked for changes of this hint, but not if it is already set when intially managing the window. Note that you need to patch your xpdf to support _NET_WM_STATE, because, while only being reported at 2004, upstream still did not merge the patch *grrr* See this debian bug report: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=247602 Or directly download the patch from: http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=61;filename=31_fullscreen.dpatch;att=1;bug=247602 --- diff --git a/src/mainx.c b/src/mainx.c index 43511b0d..0b0e1bb1 100644 --- a/src/mainx.c +++ b/src/mainx.c @@ -126,7 +126,7 @@ void reparent_window(xcb_connection_t *conn, xcb_window_t child, xcb_visualid_t visual, xcb_window_t root, uint8_t depth, int16_t x, int16_t y, uint16_t width, uint16_t height) { - xcb_get_property_cookie_t wm_type_cookie, strut_cookie; + xcb_get_property_cookie_t wm_type_cookie, strut_cookie, state_cookie; uint32_t mask = 0; uint32_t values[3]; @@ -141,6 +141,7 @@ void reparent_window(xcb_connection_t *conn, xcb_window_t child, /* Place requests for properties ASAP */ wm_type_cookie = xcb_get_any_property_unchecked(conn, false, child, atoms[_NET_WM_WINDOW_TYPE], UINT32_MAX); strut_cookie = xcb_get_any_property_unchecked(conn, false, child, atoms[_NET_WM_STRUT_PARTIAL], UINT32_MAX); + state_cookie = xcb_get_any_property_unchecked(conn, false, child, atoms[_NET_WM_STATE], UINT32_MAX); Client *new = table_get(byChild, child); @@ -273,6 +274,20 @@ void reparent_window(xcb_connection_t *conn, xcb_window_t child, SLIST_INSERT_HEAD(&(new->container->workspace->focus_stack), new, focus_clients); } + /* Check if the window already got the fullscreen hint set */ + xcb_atom_t *state; + if ((preply = xcb_get_property_reply(conn, state_cookie, NULL)) != NULL && + (state = xcb_get_property_value(preply)) != NULL) + /* Check all set _NET_WM_STATEs */ + for (int i = 0; i < xcb_get_property_value_length(preply); i++) + if (state[i] == atoms[_NET_WM_STATE_FULLSCREEN]) { + /* If the window got the fullscreen state, we just toggle fullscreen + and don’t event bother to redraw the layout – that would not change + anything anyways */ + toggle_fullscreen(conn, new); + return; + } + render_layout(conn); }