1
0
mirror of https://github.com/Llewellynvdm/conky.git synced 2025-02-06 05:58:36 +00:00

Fix bad query_x11_windows early returns (#1864)

* Fix bad early returns
* Prevent fallback tree traversal from propagation code

Signed-off-by: Tin Švagelj <tin.svagelj@live.com>
This commit is contained in:
Tin Švagelj 2024-04-26 00:09:20 +00:00 committed by GitHub
parent 0821c25533
commit 71c4e6ea52
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 42 additions and 32 deletions

View File

@ -1429,20 +1429,26 @@ std::vector<Window> x11_atom_window_list(Display *display, Window window,
return std::vector<Window>{}; return std::vector<Window>{};
} }
std::vector<Window> query_x11_windows(Display *display) { std::vector<Window> query_x11_windows(Display *display, bool eager) {
Window root = DefaultRootWindow(display); Window root = DefaultRootWindow(display);
Atom clients_atom = ATOM(_NET_CLIENT_LIST_STACKING); std::vector<Window> result;
std::vector<Window> result =
x11_atom_window_list(display, root, clients_atom);
if (result.empty()) { return result; }
clients_atom = ATOM(_NET_CLIENT_LIST); Atom clients_atom = XInternAtom(display, "_NET_CLIENT_LIST_STACKING", True);
if (clients_atom != 0) {
result = x11_atom_window_list(display, root, clients_atom); result = x11_atom_window_list(display, root, clients_atom);
if (result.empty()) { return result; } if (!result.empty()) { return result; }
}
clients_atom = XInternAtom(display, "_NET_CLIENT_LIST", True);
if (clients_atom != 0) {
result = x11_atom_window_list(display, root, clients_atom);
if (!result.empty()) { return result; }
}
// slowest method // slowest method
if (eager) {
std::vector<Window> queue = {DefaultVRootWindow(display)}; std::vector<Window> queue = {DefaultVRootWindow(display)};
Window _ignored, *children; Window _ignored, *children;
@ -1458,12 +1464,14 @@ std::vector<Window> query_x11_windows(Display *display) {
while (!queue.empty()) { while (!queue.empty()) {
Window current = queue.back(); Window current = queue.back();
queue.pop_back(); queue.pop_back();
if (XQueryTree(display, current, &_ignored, &_ignored, &children, &count)) { if (XQueryTree(display, current, &_ignored, &_ignored, &children,
&count)) {
for (size_t i = 0; i < count; i++) queue.push_back(children[i]); for (size_t i = 0; i < count; i++) queue.push_back(children[i]);
if (has_wm_hints(current)) result.push_back(current); if (has_wm_hints(current)) result.push_back(current);
if (count > 0) XFree(children); if (count > 0) XFree(children);
} }
} }
}
return result; return result;
} }
@ -1486,13 +1494,13 @@ Window query_x11_window_at_pos(Display *display, int x, int y) {
std::vector<Window> query_x11_windows_at_pos( std::vector<Window> query_x11_windows_at_pos(
Display *display, int x, int y, Display *display, int x, int y,
std::function<bool(XWindowAttributes &)> predicate) { std::function<bool(XWindowAttributes &)> predicate, bool eager) {
std::vector<Window> result; std::vector<Window> result;
Window root = DefaultVRootWindow(display); Window root = DefaultVRootWindow(display);
XWindowAttributes attr; XWindowAttributes attr;
for (Window current : query_x11_windows(display)) { for (Window current : query_x11_windows(display, eager)) {
int pos_x, pos_y; int pos_x, pos_y;
Window _ignore; Window _ignore;
// Doesn't account for decorations. There's no sane way to do that. // Doesn't account for decorations. There's no sane way to do that.

View File

@ -132,12 +132,13 @@ std::vector<Window> x11_atom_window_list(Display *display, Window window,
/// ///
/// If neither of the atoms are provided, this function tries traversing the /// If neither of the atoms are provided, this function tries traversing the
/// window graph in order to collect windows. In this case, map state of windows /// window graph in order to collect windows. In this case, map state of windows
/// is ignored. This also produces a lot of noise for some WM/DEs due to /// is ignored.
/// inserted window decorations.
/// ///
/// @param display which display to query for windows @return a (likely) ordered /// @param display which display to query for windows
/// list of windows /// @param eager fallback to very slow tree traversal to ensure a list of
std::vector<Window> query_x11_windows(Display *display); /// windows is returned even if window list atoms aren't defined
/// @return a (likely) ordered list of windows
std::vector<Window> query_x11_windows(Display *display, bool eager = false);
/// @brief Finds the last ascendant of a window (trunk) before root. /// @brief Finds the last ascendant of a window (trunk) before root.
/// ///
@ -171,7 +172,8 @@ Window query_x11_window_at_pos(Display *display, int x, int y);
std::vector<Window> query_x11_windows_at_pos( std::vector<Window> query_x11_windows_at_pos(
Display *display, int x, int y, Display *display, int x, int y,
std::function<bool(XWindowAttributes &)> predicate = std::function<bool(XWindowAttributes &)> predicate =
[](XWindowAttributes &a) { return true; }); [](XWindowAttributes &a) { return true; },
bool eager = false);
#ifdef BUILD_XDBE #ifdef BUILD_XDBE
void xdbe_swap_buffers(void); void xdbe_swap_buffers(void);