From: Michael Stapelberg Date: Thu, 12 Jun 2014 19:16:45 +0000 (+0200) Subject: handle windows whose WM_TRANSIENT_FOR points to themselve X-Git-Tag: 4.8~13 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=5beaea3034fe1a6fbac884cb802fcee546b34833;p=i3%2Fi3 handle windows whose WM_TRANSIENT_FOR points to themselve I consider this behavior broken and not respecting the standard, but it happens in real life, and it’s better for i3 to not busy-loop in such a situation :). fixes #1259 --- diff --git a/src/manage.c b/src/manage.c index 3afde994..de4f6fd7 100644 --- a/src/manage.c +++ b/src/manage.c @@ -407,6 +407,11 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki Con *next_transient = con_by_window_id(transient_win->transient_for); if (next_transient == NULL) break; + /* Some clients (e.g. x11-ssh-askpass) actually set + * WM_TRANSIENT_FOR to their own window id, so break instead of + * looping endlessly. */ + if (transient_win == next_transient->window) + break; transient_win = next_transient->window; } } diff --git a/src/render.c b/src/render.c index f996d964..2cc50d57 100644 --- a/src/render.c +++ b/src/render.c @@ -286,7 +286,15 @@ void render_con(Con *con, bool render_fullscreen) { is_transient_for = true; break; } - transient_con = con_by_window_id(transient_con->window->transient_for); + Con *next_transient = con_by_window_id(transient_con->window->transient_for); + if (next_transient == NULL) + break; + /* Some clients (e.g. x11-ssh-askpass) actually set + * WM_TRANSIENT_FOR to their own window id, so break instead of + * looping endlessly. */ + if (transient_con == next_transient) + break; + transient_con = next_transient; } if (!is_transient_for)