Commit Graph

987 Commits

Author SHA1 Message Date
Yuxuan Shui 17831a7be3
config: remove xrender-sync
Deprecated since v5

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-11 16:17:30 +01:00
Yuxuan Shui bcb1ef1654
config: remove the --dbe command line option
Deprecated since v4

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-11 16:15:27 +01:00
Yuxuan Shui 9c4b8334ad
config: remove the --paint-on-overlay option
Deprecated since v4

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-11 16:15:21 +01:00
Yuxuan Shui 6d86d50213
config: remove deprecation message for glx-use-copysubbuffermesa and glx-copy-from-front
Deprecated since v3, removed since v6

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-11 16:12:15 +01:00
Yuxuan Shui 9767b4da5a
config: remove -S command line option
Deprecated since v5

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-11 16:04:31 +01:00
Yuxuan Shui 4be0d002a5
config: remove the no-name-pixmap option
Deprecated since v5

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-11 16:02:34 +01:00
Yuxuan Shui 7eb5c39f21
config: remove the -d command line option
Deprecated since v5

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-11 16:01:13 +01:00
Yuxuan Shui 6828f24454
config: remove the alpha-step option
Deprecated since v5

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-11 16:01:02 +01:00
Yuxuan Shui b063e9a3be
win: mark_client: print slightly more info in error logs
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-11 16:01:00 +01:00
Yuxuan Shui 8759fc6460
event: destroy: set pending_updates after mark window CLIENT_STALE
Fixes test failure in test issue299

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-11 02:53:37 +01:00
Yuxuan Shui 4d55bc8dbe
win: assert server is grabbed in win_recheck_client
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-11 02:40:50 +01:00
Yuxuan Shui f8f1758137
win: demote log_error in win_clear_flags
Flags might be cleared on a destroyed window, if it's set because of an
event received before the window is destroyed.

Eventually we want to delay the handling of destroy notify as well.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-11 02:39:23 +01:00
Yuxuan Shui 018294a65c
event: destroy: delay client recheck on destroy notify
Mark it CLIENT_STALE and clear the client instead of recheck it
immediately. It's better to recheck when we have the server grabbed.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-11 02:35:21 +01:00
Yuxuan Shui e15731f6cb
event: reparent: make sure windows are destroyed when they are reparented
Make sure the window struct is indeed destroyed and freed when a window
is reparented away from root. So we won't find it later and get
confused.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-11 02:23:58 +01:00
Yuxuan Shui e341267e8a
event: reparent: unmark client from previous frame
Don't just mark it as CLIENT_STALE. To make sure we don't later find the
old frame window as the frame of the client.

Fix assertion failure in ev_destroy_notify.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-11 02:16:33 +01:00
Yuxuan Shui 3765c13baa
event: reparent: mark frame CLIENT_STALE when old client detached
Related: #299

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-11 01:52:47 +01:00
Yuxuan Shui 660d16f555
win: update mode in win_on_factor_change
win_on_factor_change is called when client window changed for a frame,
in that case, the mode of the window could change.

Related: #299

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-11 01:52:47 +01:00
Yuxuan Shui 176718ad3b
Revert "Revert previous fix for #299"
This reverts commit 04fe4a76b2.

This brings back the previous incomplete fix attempt for #299. See the
commit message of the revert for why it's incomplete.

A different fix is then attempted, see commit xxxxxxx for how that fix
works.

However, the second fix is incomplete by itself as well. The reason is
that i3 reparent the real window to the frame first, before destroying
the placeholder client of that frame. So briefly, that frame would have
2 client windows. And the frame is mapped before the placeholder is
destroyed. So even though we only call win_recheck_client when/if the
frame window is mapped, it can still be called when there are 2 client
windows, it would pick up the wrong client window in that case.

So what we need is to combine both fixes.

The second fix makes sure we are up to date on the client window
information when we starts to listen for events on the frame window;
while the first fix would keep us up to date afterwards.

This revert also includes a fix for assertion failure raised in #371

See #299 for root cause of the bug.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-11 01:52:47 +01:00
Yuxuan Shui 440157f20b
win, event: delayed handling of reparent notify
Instead of handling reparent notify on the spot by updating the client
windows, setup a flag on the window and call win_recheck_client later.

This makes handling of complex scenarios easier. As example, see the
case in issue #299.

Note this is not a complete fix for #299
2020-04-11 01:52:47 +01:00
Bernd Busse 132332c483
win: remove unused parameter `ignore_state`
remove unrequired parameter `ignore_state` of
`win_calc_opacity_target()` that was always `false` now.
2020-04-08 23:22:11 +01:00
Bernd Busse ad8632b017
New backends: smoothly fade blur-texture on fade-in/-out
* Add new field `opacity_target_old` to `struct managed_win` for
tracking relevant `opacity_target` changes.
* Smoothly fade blur-texture opacity on window opacity changes (based on
window opacity), when the window was or will be fully transparent
(`w->opacity ~< 0.004`).
* Fixed alpha-clipping of the blur-texture when using `inactive-opacity` or
repeatedly setting window opacity with large fade intervals (should fix #314).
2020-04-08 23:22:06 +01:00
Yuxuan Shui 32754b0262
win: merge win::pending_updates and win::flags
These two flags are intended for subtly different things. I can probably
justify the distinction, but it's definitely difficult to explain. And
there is no obvious benefits to keep them separate.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-06 20:52:32 +01:00
Yuxuan Shui df0be9e990
Move find_client_win to win.c
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-06 20:24:16 +01:00
Yuxuan Shui 04fe4a76b2
Revert previous fix for #299
Commits reverted:
b652e8b58d
bdf809d039
e9ab970989
481ac54f67

While those commits themselves could be useful even if they don't
completely fix #299, they come with the risks of introduce more
unforeseen bugs, which outweigh their benefit, so revert them.

A brief explanation of their problem:

The fix hinges on the destroy event of the client window to work.
However, the client window could be destroyed so fast, before we even
handle the map, or even the create, event of the frame. And we won't be
listening for substructure events on the frame at the point the client
window is destroyed. Thus completely miss the client window destroy
event.

Because of the inherent racy nature of Xorg, this approach is really
difficult to make work.

Fixes #371

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-06 20:22:54 +01:00
Yuxuan Shui bdf809d039
core: listen for substructure notify on frame windows
So we can pick up destroy notify of the client windows. Because we need
the destroy notify of the client window to trigger a client window
recheck on the frame window. This is to handle the case where a frame
window is later reused, and the case where multiple client windows are
momentarily attached to the same frame[1].

This will also cause events previously unseen to be generated. Most of
the events would be ignored, because they don't have a corresponding
managed window. Change has been made to ev_reparent_notify, so it would
handle the case where a client window is reparented from one frame to
another[2]. Previously such events are not received by picom.

Related[1]: e9ab970989
Related[2]: 481ac54f67
Related: #299

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-05 22:45:49 +01:00
Yuxuan Shui e9ab970989
event: destroy: recheck client instead of unmark client
We detach the client window from its frame when it's destroyed, so later
a new window can be attached to that frame. But turns out that's not
enough.

When i3 restarts, it attaches a placeholder window to the frame, then
the real window, and only after that, it will destroy the placeholder.
The real window will fail to attach as the frame already has a client.
When the placeholder is destroyed, we have to call recheck client to
pick up the real window that failed to attach previously.

Related: #299

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-05 22:45:35 +01:00
Yuxuan Shui 481ac54f67
event: reparent: handle reparenting from one frame to another
Basically, don't ignore the reparent notify if the window is already a
client window. We already unmark it from its previous frame, so this
commit make sure it gets marked with its new frame.

Related: #299

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-05 22:02:51 +01:00
Yuxuan Shui fb24e33d52
x: handle NULL pointer in x_strerror
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-05 21:45:51 +01:00
Yuxuan Shui b652e8b58d
event: destroy: unmark client when a client window is destroyed
We do nothing when a non-wm-frame window is destroyed. This will cause
trouble if a wm-frame window is reused (i.e. its child is destroyed then
a new child is reparented to it), because we didn't clear client_win.

So this commit adds a call to win_unmark_client for that case.

Related: #299

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-05 21:43:29 +01:00
Yuxuan Shui 68fa49cf59
win: rename find_toplevel_nocache to find_managed_window_or_parent
My previous understanding of this function is incorrect. Hopefully I got
it right this time.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-05 21:20:58 +01:00
Yuxuan Shui 71e1a8a06f
event: reparent: always detach window from its previous parent
Otherwise we might see a window becoming child of two different parent
windows.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-05 21:12:57 +01:00
Yuxuan Shui 53bb488530
win: rename find_toplevel2 to find_toplevel_nocache
So it is slightly clearer what is the difference to find_toplevel().

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-05 20:46:20 +01:00
Yuxuan Shui 8e440af222
win: print more debug messages on opacity change
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-05 02:50:14 +01:00
Yuxuan Shui 969cbeaf17
config_libconfig: add force-win-blend option
It use to be a command line only option.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-05 02:32:54 +01:00
Yuxuan Shui a23bac727c
new backend: assert blur_opacity is in [0, 1]
Related to: #314 #318

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-04 15:55:30 +01:00
Yuxuan Shui 0e158c508f
new backend: clear background if there is no wallpaper
So windows won't left a trail when you move them, because they are drawn
over previously drawn stuff.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-04-02 17:37:52 +01:00
Yuxuan Shui c2a18f11d3
Fix nogl build
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-03-31 07:11:02 +01:00
Yuxuan Shui 2372127c0f
core: query glx extension in session_init
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-03-31 06:07:09 +01:00
Yuxuan Shui fd4d43aa02
x: fix glx error codes
compton was using wrong set of constants as glx error codes.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-03-31 05:59:44 +01:00
Yuxuan Shui bdf3aabb75
x: use xcb constants in _x_strerror as mush as possible
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-03-31 05:46:28 +01:00
Yuxuan Shui 9332cba8df core: delayed handling of root ConfigureNotify
Previously, root ConfigureNotify is handled immediately, by resetting
the backend, which in turn releases all the window images. This puts all
the windows into a state where they don't have images attached, which
they really should be in when the screen is redirected.

(To expand a little, a window without images should only exist if:
    * It's an unmanaged window.
    * Screen is unredirected.)

Normally, this kind of window could be fine, as the next render phase
will re-acquire images for them. However, if a window in this state is
destroyed with fading enabled, then the render phase won't try to
acquire images for it, causing it to go into the main rendering function
without images attached, and trigger an assertion.

This commit delays the handling of root ConfigureNotify until the render
phase. This way, the images will be immediately re-acquired after they
are released, thus prevent this problem from happening.

Also adds a testcase for this.

Fixes #357

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-03-31 05:20:56 +01:00
Yuxuan Shui 5a22fb0828 core: mark updates pending when a root flag is set
To make sure handle_root_flags will be called.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-03-31 05:20:56 +01:00
Yuxuan Shui 4c22d564b2
dbus: expose use_damage always
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-03-29 19:17:52 +01:00
Yuxuan Shui b6a5bf720d
dbus: unexpose track_wdata and track_leader
These are internal states.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-03-29 19:17:09 +01:00
Yuxuan Shui ee35bd873a
win: always track property changes
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-03-29 19:15:07 +01:00
Yuxuan Shui 3ba7a2aa4d
core: failed to ungrab server should be fatal
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-03-28 00:18:07 +00:00
Yuxuan Shui 23068c300c
Make some of the error logs more informative
Print the X error causing the error as well.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-03-28 00:15:45 +00:00
Yuxuan Shui 58582eb639
x: add function for converting x error to string
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-03-27 23:07:19 +00:00
Yuxuan Shui 574eca3c25
x: move redirection failure abort out of x_print_error
x_print_error aborts the program when it sees a redirect_subwindow
failure. A function called x_print_error really shouldn't cause the
program to terminate.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-03-27 21:03:37 +00:00
Yuxuan Shui b88d98d6b1
Re-acquire root pixmap after root reconfiguration
In configure_root, the root pixmap is freed by destroy_backend, and is
never acquired again.

Usually this doesn't seem to cause any problems, maybe because we
immediately receives a root damage notification. But under rare
circumstances we ended up not showing the wallpaper.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
2020-03-27 20:51:40 +00:00