![]() This is part of the effort to remove reliance on the X critical section for internal consistency. The rational will be explained in later commits when it is complete. Instead of using server grabbing to guarantee that our tree is synchronized with the X server, this commit moves the wm tree to an "eventually consistent" model, utilizing the newly introduced async X request infrastructure (See commit: "x: add support for receiving replies as part of the event stream"). The algorithm is like this: let's look at each tree node individually, every node has a list of children. If this list consistent with the X server for each of the tree nodes, the entire tree is consistent. Let's also define a "partial consistency" concept. A tree is partially consistent, if for all the nodes in the tree, their lists of chilren are either consistent, or empty. Meaning some nodes might exist on the X server, but not replicated on our side. If a node's parent isn't in our tree, we call that node "orphaned". (Conveniently, a toplevel can never be orphaned, because the root window is always in the tree.) To achieve partial consistency, when each node is discovered (either via a CreateNotify from the server, or via a QueryTree request, you will see later), we set up an event mask on it to receive further updates, and then send a QueryTree request for it. The trick is that the reply to the QueryTree request will be processed in order with all the other events, errors and replies. Assuming the tree started out partially consistent, it will still be partially consistent after we processed the reply. Because the reply contains up-to-date information about that node at that point in time; and we have also processed all events that came before that reply, so all other nodes are consistent too. Further more, the tree will stay partially consistent, because the event mask we set up will keep bringing us new information for the newly discovered node. This partial consistency will eventually become full consistency after all of our requests to the X server have completed. Note this means we might start rendering with a partial window tree. In practice, that should hardly be noticeable. (The explanation above glossed over many implementation concerns, some of those are documentation in code comments.) Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com> |
||
---|---|---|
.circleci | ||
.github | ||
bin | ||
dbus-examples | ||
include | ||
LICENSES | ||
man | ||
media | ||
meson | ||
src | ||
subprojects | ||
tests | ||
.clang-format | ||
.clang-tidy | ||
.editorconfig | ||
.gitignore | ||
CHANGELOG.md | ||
compton-default-fshader-win.glsl | ||
compton-fake-transparency-fshader-win.glsl | ||
compton.desktop | ||
CONTRIBUTORS | ||
COPYING | ||
desc.txt | ||
Doxyfile | ||
flake.lock | ||
flake.nix | ||
History.md | ||
LICENSE.spdx | ||
meson.build | ||
meson_options.txt | ||
picom-dbus.desktop | ||
picom.desktop | ||
picom.sample.conf | ||
README.md |
picom
picom is a compositor for X, and a fork of Compton.
This is a development branch, bugs to be expected
You can leave your feedback or thoughts in the discussion tab, or chat with other users on discord!
Change Log
See Releases
Build
Dependencies
Assuming you already have all the usual building tools installed (e.g. gcc, python, meson, ninja, etc.), you still need:
- libx11
- libx11-xcb
- xproto
- xcb
- xcb-util
- xcb-damage
- xcb-xfixes
- xcb-shape
- xcb-renderutil
- xcb-render
- xcb-randr
- xcb-composite
- xcb-image
- xcb-present
- xcb-glx
- pixman
- libconfig
- libdbus (optional, disable with the
-Ddbus=false
meson configure flag) - libGL, libEGL, libepoxy (optional, disable with the
-Dopengl=false
meson configure flag) - libpcre2 (optional, disable with the
-Dregex=false
meson configure flag) - libev
- uthash
On Debian based distributions (e.g. Ubuntu), the needed packages are
libconfig-dev libdbus-1-dev libegl-dev libev-dev libgl-dev libepoxy-dev libpcre2-dev libpixman-1-dev libx11-xcb-dev libxcb1-dev libxcb-composite0-dev libxcb-damage0-dev libxcb-glx0-dev libxcb-image0-dev libxcb-present-dev libxcb-randr0-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-shape0-dev libxcb-util-dev libxcb-xfixes0-dev meson ninja-build uthash-dev
On Fedora, the needed packages are
dbus-devel gcc git libconfig-devel libdrm-devel libev-devel libX11-devel libX11-xcb libxcb-devel libGL-devel libEGL-devel libepoxy-devel meson pcre2-devel pixman-devel uthash-devel xcb-util-image-devel xcb-util-renderutil-devel xorg-x11-proto-devel xcb-util-devel
To build the documents, you need asciidoc
To build
$ meson setup --buildtype=release build
$ ninja -C build
Built binary can be found in build/src
If you have libraries and/or headers installed at non-default location (e.g. under /usr/local/
), you might need to tell meson about them, since meson doesn't look for dependencies there by default.
You can do that by setting the CPPFLAGS
and LDFLAGS
environment variables when running meson
. Like this:
$ LDFLAGS="-L/path/to/libraries" CPPFLAGS="-I/path/to/headers" meson setup --buildtype=release build
As an example, on FreeBSD, you might have to run meson with:
$ LDFLAGS="-L/usr/local/lib" CPPFLAGS="-I/usr/local/include" meson setup --buildtype=release build
$ ninja -C build
To install
$ ninja -C build install
Default install prefix is /usr/local
, you can change it with meson configure -Dprefix=<path> build
How to Contribute
All contributions are welcome!
New features you think should be included in picom, a fix for a bug you found - please open a PR!
You can take a look at the Issues.
Contributions to the documents and wiki are also appreciated.
Even if you don't want to add anything to picom, you are still helping by compiling and running this branch, and report any issue you can find.
Become a Collaborator
Becoming a collaborator of picom requires significant time commitment. You are expected to reply to issue reports, reviewing PRs, and sometimes fix bugs or implement new feature. You won't be able to push to the main branch directly, and all you code still has to go through code review.
If this sounds good to you, feel free to contact me.
Contributors
See CONTRIBUTORS
The README for the original Compton project can be found here.
Licensing
picom is free software, made available under the MIT and MPL-2.0 software licenses. See the individual source files for details.