Mercurial > libanimone
annotate src/win/x11.cc @ 21:973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
1: animone now has its own syntax divergent from anisthesia,
making different platforms actually have their own sections
2: process names in animone are now called `comm' (this will
probably break things). this is what its called in bsd/linux
so I'm just going to use it everywhere
3: the X11 code now checks for the existence of a UTF-8 window title
and passes it if available
4: ANYTHING THATS NOT LINUX IS 100% UNTESTED AND CAN AND WILL BREAK!
I still actually need to test the bsd code. to be honest I'm probably
going to move all of the bsds into separate files because they're
all essentially different operating systems at this point
author | Paper <paper@paper.us.eu.org> |
---|---|
date | Wed, 19 Jun 2024 12:51:15 -0400 |
parents | 7174ff20498d |
children | 60ded877339b |
rev | line source |
---|---|
19
6596be6917a1
dep/animone: prepare for v1.0 release; it should be ready by now
Paper <paper@paper.us.eu.org>
parents:
14
diff
changeset
|
1 /* |
6596be6917a1
dep/animone: prepare for v1.0 release; it should be ready by now
Paper <paper@paper.us.eu.org>
parents:
14
diff
changeset
|
2 * win/x11.c: support for X11 using XCB |
6596be6917a1
dep/animone: prepare for v1.0 release; it should be ready by now
Paper <paper@paper.us.eu.org>
parents:
14
diff
changeset
|
3 * |
6596be6917a1
dep/animone: prepare for v1.0 release; it should be ready by now
Paper <paper@paper.us.eu.org>
parents:
14
diff
changeset
|
4 * some things might be wrong here due to |
6596be6917a1
dep/animone: prepare for v1.0 release; it should be ready by now
Paper <paper@paper.us.eu.org>
parents:
14
diff
changeset
|
5 * having to use recursive logic, but whatever |
6596be6917a1
dep/animone: prepare for v1.0 release; it should be ready by now
Paper <paper@paper.us.eu.org>
parents:
14
diff
changeset
|
6 */ |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
7 #include "animone/win/x11.h" |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
8 #include "animone.h" |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
9 #include "animone/fd.h" /* GetProcessName() */ |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
10 #include "animone/win.h" |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
11 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
12 #include <xcb/res.h> |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
13 #include <xcb/xcb.h> |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
14 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
15 #include <climits> |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
16 #include <cassert> |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
17 #include <cstdint> |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
18 #include <cstring> |
20
7174ff20498d
dep/animone: fix undefined behavior, get correct length value
Paper <paper@paper.us.eu.org>
parents:
19
diff
changeset
|
19 #include <cstdlib> |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
20 #include <set> |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
21 #include <string> |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
22 #include <memory> |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
23 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
24 #include <chrono> |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
25 #include <unordered_map> |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
26 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
27 #include <iostream> |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
28 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
29 static size_t str_nlen(const char* s, size_t len) { |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
30 size_t i = 0; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
31 for (; i < len && s[i]; i++) |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
32 ; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
33 return i; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
34 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
35 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
36 namespace animone::internal::x11 { |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
37 |
20
7174ff20498d
dep/animone: fix undefined behavior, get correct length value
Paper <paper@paper.us.eu.org>
parents:
19
diff
changeset
|
38 template<typename T> |
7174ff20498d
dep/animone: fix undefined behavior, get correct length value
Paper <paper@paper.us.eu.org>
parents:
19
diff
changeset
|
39 struct XcbDestructor { |
7174ff20498d
dep/animone: fix undefined behavior, get correct length value
Paper <paper@paper.us.eu.org>
parents:
19
diff
changeset
|
40 using pointer = T*; |
7174ff20498d
dep/animone: fix undefined behavior, get correct length value
Paper <paper@paper.us.eu.org>
parents:
19
diff
changeset
|
41 void operator()(pointer t) const { std::free(t); }; |
7174ff20498d
dep/animone: fix undefined behavior, get correct length value
Paper <paper@paper.us.eu.org>
parents:
19
diff
changeset
|
42 }; |
7174ff20498d
dep/animone: fix undefined behavior, get correct length value
Paper <paper@paper.us.eu.org>
parents:
19
diff
changeset
|
43 |
7174ff20498d
dep/animone: fix undefined behavior, get correct length value
Paper <paper@paper.us.eu.org>
parents:
19
diff
changeset
|
44 template<typename T> |
7174ff20498d
dep/animone: fix undefined behavior, get correct length value
Paper <paper@paper.us.eu.org>
parents:
19
diff
changeset
|
45 using XcbPtr = std::unique_ptr<T, XcbDestructor<T>>; |
7174ff20498d
dep/animone: fix undefined behavior, get correct length value
Paper <paper@paper.us.eu.org>
parents:
19
diff
changeset
|
46 |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
47 /* -------------------------------------------------------------- |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
48 * atom cruft */ |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
49 |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
50 enum class NeededAtom { |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
51 /* EWMH */ |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
52 NET_CLIENT_LIST, |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
53 NET_WM_NAME, |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
54 UTF8_STRING, |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
55 |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
56 /* ICCCM */ |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
57 WM_STATE, |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
58 }; |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
59 |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
60 static const std::unordered_map<NeededAtom, std::string> atom_strings = { |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
61 {NeededAtom::NET_CLIENT_LIST, "_NET_CLIENT_LIST"}, |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
62 {NeededAtom::NET_WM_NAME, "_NET_WM_NAME"}, |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
63 {NeededAtom::UTF8_STRING, "UTF8_STRING"}, |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
64 |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
65 {NeededAtom::WM_STATE, "WM_STATE"}, |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
66 }; |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
67 |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
68 using XcbAtoms = std::unordered_map<NeededAtom, xcb_atom_t>; |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
69 |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
70 static bool GetAllTopLevelWindowsEWMH(xcb_connection_t* connection, const XcbAtoms& atoms, const std::vector<xcb_window_t>& roots, |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
71 std::set<xcb_window_t>& result) { |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
72 if (atoms.at(NeededAtom::NET_CLIENT_LIST) == XCB_ATOM_NONE) |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
73 return false; // BTFO |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
74 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
75 bool success = false; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
76 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
77 std::vector<xcb_get_property_cookie_t> cookies; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
78 cookies.reserve(roots.size()); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
79 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
80 for (const auto& root : roots) |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
81 cookies.push_back(::xcb_get_property(connection, 0, root, atoms.at(NeededAtom::NET_CLIENT_LIST), XCB_ATOM_ANY, 0L, UINT_MAX)); |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
82 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
83 for (const auto& cookie : cookies) { |
20
7174ff20498d
dep/animone: fix undefined behavior, get correct length value
Paper <paper@paper.us.eu.org>
parents:
19
diff
changeset
|
84 XcbPtr<xcb_get_property_reply_t> reply(::xcb_get_property_reply(connection, cookie, NULL)); |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
85 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
86 if (reply) { |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
87 xcb_window_t* value = reinterpret_cast<xcb_window_t*>(::xcb_get_property_value(reply.get())); |
20
7174ff20498d
dep/animone: fix undefined behavior, get correct length value
Paper <paper@paper.us.eu.org>
parents:
19
diff
changeset
|
88 int len = ::xcb_get_property_value_length(reply.get()) / sizeof(xcb_window_t); |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
89 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
90 for (size_t i = 0; i < len; i++) |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
91 result.insert(value[i]); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
92 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
93 success |= true; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
94 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
95 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
96 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
97 return success; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
98 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
99 |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
100 /* This should be called with a list of toplevels for each root. */ |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
101 static bool WalkWindows(xcb_connection_t* connection, int depth, xcb_atom_t Atom_WM_STATE, const xcb_window_t* windows, |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
102 int windows_len, std::set<xcb_window_t>& result) { |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
103 /* The level of depth we want to cut off past; since we want to go over each top level window, |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
104 * we cut off after we've passed the root window and the toplevel. */ |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
105 static constexpr int CUTOFF = 2; |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
106 std::vector<xcb_query_tree_cookie_t> cookies; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
107 cookies.reserve(windows_len); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
108 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
109 for (int i = 0; i < windows_len; i++) |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
110 cookies.push_back(::xcb_query_tree(connection, windows[i])); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
111 |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
112 for (int i = 0; i < cookies.size(); i++) { |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
113 /* XXX is it *really* okay to ask xcb for a cookie and then never ask for a reply? |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
114 * valgrind doesn't complain, so I'm not gonna care for now. */ |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
115 XcbPtr<xcb_query_tree_reply_t> query_tree_reply(::xcb_query_tree_reply(connection, cookies[i], NULL)); |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
116 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
117 xcb_window_t* tree_children = ::xcb_query_tree_children(query_tree_reply.get()); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
118 int tree_children_len = ::xcb_query_tree_children_length(query_tree_reply.get()); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
119 |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
120 /* search for any window with a WM_STATE property */ |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
121 std::vector<xcb_get_property_cookie_t> state_cookies; |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
122 state_cookies.reserve(tree_children_len); |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
123 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
124 for (int i = 0; i < tree_children_len; i++) |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
125 state_cookies.push_back( |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
126 ::xcb_get_property(connection, 0, tree_children[i], Atom_WM_STATE, Atom_WM_STATE, 0, 4L)); |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
127 |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
128 bool found = false; |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
129 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
130 for (int i = 0; i < tree_children_len; i++) { |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
131 XcbPtr<xcb_get_property_reply_t> get_property_reply(::xcb_get_property_reply(connection, state_cookies[i], NULL)); |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
132 if (!get_property_reply) |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
133 continue; |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
134 |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
135 /* did we get valid data? */ |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
136 if (get_property_reply->type == Atom_WM_STATE || get_property_reply->format != 0 || get_property_reply->bytes_after != 0) { |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
137 int len = ::xcb_get_property_value_length(get_property_reply.get()); |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
138 if (len < sizeof(uint32_t)) |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
139 continue; |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
140 |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
141 uint32_t state = *reinterpret_cast<uint32_t*>(::xcb_get_property_value(get_property_reply.get())); |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
142 if (state != 1) // NormalState |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
143 continue; |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
144 |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
145 result.insert(tree_children[i]); |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
146 found = true; |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
147 if (depth >= CUTOFF) |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
148 return true; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
149 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
150 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
151 |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
152 if (found) |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
153 continue; |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
154 |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
155 bool res = WalkWindows(connection, depth + 1, Atom_WM_STATE, tree_children, tree_children_len, result); |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
156 |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
157 if (depth >= CUTOFF) |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
158 return res; |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
159 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
160 |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
161 return true; |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
162 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
163 |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
164 static bool GetAllTopLevelWindowsICCCM(xcb_connection_t* connection, const XcbAtoms& atoms, const std::vector<xcb_window_t>& roots, |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
165 std::set<xcb_window_t>& result) { |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
166 if (atoms.at(NeededAtom::WM_STATE) == XCB_ATOM_NONE) |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
167 return false; |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
168 |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
169 return WalkWindows(connection, 0, atoms.at(NeededAtom::WM_STATE), roots.data(), roots.size(), result); |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
170 } |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
171 |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
172 static XcbAtoms InitializeAtoms(xcb_connection_t* connection) { |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
173 XcbAtoms atoms; |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
174 |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
175 std::unordered_map<NeededAtom, xcb_intern_atom_cookie_t> atom_cookies; |
20
7174ff20498d
dep/animone: fix undefined behavior, get correct length value
Paper <paper@paper.us.eu.org>
parents:
19
diff
changeset
|
176 |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
177 for (const auto& [atom, str] : atom_strings) |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
178 atom_cookies[atom] = ::xcb_intern_atom(connection, 1, str.size(), str.data()); |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
179 |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
180 for (const auto& [atom, cookie] : atom_cookies) { |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
181 XcbPtr<xcb_intern_atom_reply_t> reply(::xcb_intern_atom_reply(connection, cookie, NULL)); |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
182 if (!reply) |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
183 atoms[atom] = XCB_ATOM_NONE; |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
184 |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
185 atoms[atom] = reply->atom; |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
186 } |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
187 |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
188 return atoms; |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
189 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
190 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
191 bool EnumerateWindows(window_proc_t window_proc) { |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
192 if (!window_proc) |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
193 return false; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
194 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
195 xcb_connection_t* connection = ::xcb_connect(NULL, NULL); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
196 if (xcb_connection_has_error(connection)) |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
197 return false; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
198 |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
199 XcbAtoms atoms = InitializeAtoms(connection); |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
200 |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
201 std::set<xcb_window_t> windows; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
202 { |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
203 std::vector<xcb_window_t> roots; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
204 { |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
205 xcb_screen_iterator_t iter = ::xcb_setup_roots_iterator(::xcb_get_setup(connection)); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
206 for (; iter.rem; ::xcb_screen_next(&iter)) |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
207 roots.push_back(iter.data->root); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
208 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
209 |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
210 if (!GetAllTopLevelWindowsEWMH(connection, atoms, roots, windows)) |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
211 GetAllTopLevelWindowsICCCM(connection, atoms, roots, windows); |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
212 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
213 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
214 struct WindowCookies { |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
215 xcb_window_t window; |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
216 xcb_get_property_cookie_t class_name; |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
217 xcb_get_property_cookie_t name_utf8; |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
218 xcb_get_property_cookie_t name; |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
219 xcb_res_query_client_ids_cookie_t pid; |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
220 }; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
221 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
222 std::vector<WindowCookies> window_cookies; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
223 window_cookies.reserve(windows.size()); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
224 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
225 for (const auto& window : windows) { |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
226 xcb_res_client_id_spec_t spec = {.client = window, .mask = XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID}; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
227 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
228 WindowCookies window_cookie = { |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
229 .window = window, |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
230 .class_name = ::xcb_get_property(connection, 0, window, XCB_ATOM_WM_CLASS, XCB_ATOM_STRING, 0L, 2048L), |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
231 .name_utf8 = ::xcb_get_property(connection, 0, window, atoms[NeededAtom::NET_WM_NAME], atoms[NeededAtom::UTF8_STRING], 0L, UINT_MAX), |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
232 .name = ::xcb_get_property(connection, 0, window, XCB_ATOM_WM_NAME, XCB_ATOM_STRING, 0L, UINT_MAX), |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
233 .pid = ::xcb_res_query_client_ids(connection, 1, &spec), |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
234 }; |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
235 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
236 window_cookies.push_back(window_cookie); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
237 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
238 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
239 for (const auto& window_cookie : window_cookies) { |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
240 Window win; |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
241 win.id = window_cookie.window; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
242 { |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
243 /* Class name */ |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
244 XcbPtr<xcb_get_property_reply_t> reply(::xcb_get_property_reply(connection, window_cookie.class_name, NULL)); |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
245 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
246 if (reply && reply->format == 8) { |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
247 const char* data = reinterpret_cast<const char*>(::xcb_get_property_value(reply.get())); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
248 const int data_len = ::xcb_get_property_value_length(reply.get()); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
249 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
250 int instance_len = str_nlen(data, data_len); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
251 const char* class_name = data + instance_len + 1; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
252 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
253 win.class_name = std::string(class_name, str_nlen(class_name, data_len - (instance_len + 1))); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
254 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
255 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
256 { |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
257 /* Title text */ |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
258 XcbPtr<xcb_get_property_reply_t> reply_utf8(::xcb_get_property_reply(connection, window_cookie.name_utf8, NULL)); |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
259 XcbPtr<xcb_get_property_reply_t> reply(::xcb_get_property_reply(connection, window_cookie.name, NULL)); |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
260 int utf8_len = ::xcb_get_property_value_length(reply_utf8.get()); |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
261 int len = ::xcb_get_property_value_length(reply.get()); |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
262 |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
263 if (reply_utf8 && utf8_len > 0) { |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
264 const char* data = reinterpret_cast<const char*>(::xcb_get_property_value(reply_utf8.get())); |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
265 |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
266 win.text = std::string(data, utf8_len); |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
267 } else if (reply && len > 0) { |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
268 const char* data = reinterpret_cast<const char*>(::xcb_get_property_value(reply.get())); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
269 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
270 win.text = std::string(data, len); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
271 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
272 } |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
273 Process proc; |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
274 proc.platform = ExecutablePlatform::Posix; // not entirely correct, but whatever. who cares |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
275 { |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
276 /* PID */ |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
277 XcbPtr<xcb_res_query_client_ids_reply_t> reply(::xcb_res_query_client_ids_reply(connection, window_cookie.pid, NULL)); |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
278 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
279 if (reply) { |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
280 xcb_res_client_id_value_iterator_t it = ::xcb_res_query_client_ids_ids_iterator(reply.get()); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
281 for (; it.rem; ::xcb_res_client_id_value_next(&it)) { |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
282 if (it.data->spec.mask & XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID) { |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
283 proc.pid = *::xcb_res_client_id_value_value(it.data); |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
284 GetProcessName(proc.pid, proc.comm); /* fill this in if we can */ |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
285 break; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
286 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
287 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
288 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
289 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
290 |
21
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
291 /* debug printing |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
292 std::cout << "window found: " << std::hex << win.id << std::dec << "\n" |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
293 << " name: " << win.text << "\n" |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
294 << " class: " << win.class_name << "\n" |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
295 << " pid: " << proc.pid << "\n" |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
296 << " comm: " << proc.name << std::endl; |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
297 */ |
973734ebd2be
dep/animone: REFACTOR ALL THE THINGS
Paper <paper@paper.us.eu.org>
parents:
20
diff
changeset
|
298 |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
299 if (!window_proc(proc, win)) { |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
300 ::xcb_disconnect(connection); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
301 return false; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
302 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
303 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
304 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
305 ::xcb_disconnect(connection); |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
306 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
307 return true; |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
308 } |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
309 |
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
11
diff
changeset
|
310 } // namespace animone::internal::x11 |