Do not "set" the wallpaper during startup (#4373)

"Set" the wallpaper during startup only sometimes

Since commit 4f5e0e7, i3 would take a screenshot and set that as the
background pixmap of the root window during startup. This is the easy
part of setting a proper X11 wallpaper.

The code in question was added because something either set the
background pixmap of the root window to NONE or the X11 server was
started with "-background none". This is apparently done by default by
e.g. gdm to avoid some flickering while the X11 server starts up.

This commit makes this code conditional: Only when no wallpaper is
detected is a screenshot taken.

Since I could not find any way to query the background of a window, a
more direct approach is taken to detect this situation: First, we find
some part of the root window that is not currently covered. Then we open
a white window there, close it again and grab a screenshot. If a
wallpaper is set, the X11 server will draw this wallpaper after the
window is closed and something else will be visible in the screenshot.

However, the wallpaper could have a white pixel at the tested position.
Thus, this procedure is repeated with a black window.

Only when this procedure produces two different pixel values is a
screenshot taken and set as the wallpaper.

Fixes: https://github.com/i3/i3/issues/4371
Fixes: https://github.com/i3/i3/issues/2869
Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
Uli Schlachter
2021-05-20 21:37:35 +02:00
committed by GitHub
parent fcae64f7fd
commit 60542da091
6 changed files with 192 additions and 17 deletions

View File

@@ -6,6 +6,23 @@
This is i3 v4.19. This version is considered stable. All users of i3 are
strongly encouraged to upgrade.
Background/wallpaper workaround:
Some login managers (e.g. gdm) start the X11 server with the -background none
flag. When this flag is set, a background needs to be explicitly set later in
the X11 session, otherwise stale copies of closed windows remain visible on the
X11 root window (symptom looks like “my terminal window is not closing”).
i3 works around this situation by setting a screenshot as background when
starting. Any background you set before starting i3 (e.g. in your Xsession) or
after starting i3 (e.g. via exec statements in the i3 config) will be visible.
A downside of this workaround is that if you have any windows already open in
your X11 session, those will be part of the screenshot.
To fix this issue, starting in v4.20, i3 detects whether the -background none
option is enabled and only then sets a screenshot as background.
┌────────────────────────────┐
│ Changes in i3 v4.20 │