Mercurial > minori
comparison dep/animone/src/win/x11.cc @ 266:1a6a5d3a94cd
dep/animone: make bsd.cc and x11.cc actually work
apparently I broke these, and even now the x11 code *still* doesn't want
to work correctly (at least on FreeBSD). half of the PID response codes
are just 0 or the PID for the X server itself... wtf?
maybe dwm just doesn't support the XRes extension, or I'm just stupid.
i don't know.
| author | Paper <paper@paper.us.eu.org> |
|---|---|
| date | Thu, 11 Apr 2024 22:05:41 -0400 |
| parents | 862d0d8619f6 |
| children | a796e97cc86d |
comparison
equal
deleted
inserted
replaced
| 265:ff0b2052b234 | 266:1a6a5d3a94cd |
|---|---|
| 51 | 51 |
| 52 for (const auto& cookie : cookies) { | 52 for (const auto& cookie : cookies) { |
| 53 std::unique_ptr<xcb_get_property_reply_t> reply(::xcb_get_property_reply(connection, cookie, NULL)); | 53 std::unique_ptr<xcb_get_property_reply_t> reply(::xcb_get_property_reply(connection, cookie, NULL)); |
| 54 | 54 |
| 55 if (reply) { | 55 if (reply) { |
| 56 xcb_window_t* value = reinterpret_cast<xcb_window_t*>(::xcb_get_property_value(reply)); | 56 xcb_window_t* value = reinterpret_cast<xcb_window_t*>(::xcb_get_property_value(reply.get())); |
| 57 int len = ::xcb_get_property_value_length(reply); | 57 int len = ::xcb_get_property_value_length(reply.get()); |
| 58 | 58 |
| 59 for (size_t i = 0; i < len; i++) | 59 for (size_t i = 0; i < len; i++) |
| 60 result.insert(value[i]); | 60 result.insert(value[i]); |
| 61 | 61 |
| 62 success |= true; | 62 success |= true; |
| 72 * 3. If that failed... return the original window | 72 * 3. If that failed... return the original window |
| 73 */ | 73 */ |
| 74 static bool WalkWindows(xcb_connection_t* connection, int depth, xcb_atom_t Atom_WM_STATE, const xcb_window_t* windows, | 74 static bool WalkWindows(xcb_connection_t* connection, int depth, xcb_atom_t Atom_WM_STATE, const xcb_window_t* windows, |
| 75 int windows_len, std::set<xcb_window_t>& result) { | 75 int windows_len, std::set<xcb_window_t>& result) { |
| 76 /* The depth we should start returning at. */ | 76 /* The depth we should start returning at. */ |
| 77 static constexpr int CUTOFF = 2; | 77 static constexpr int CUTOFF = 1; |
| 78 | 78 |
| 79 bool success = false; | 79 bool success = false; |
| 80 | 80 |
| 81 std::vector<xcb_query_tree_cookie_t> cookies; | 81 std::vector<xcb_query_tree_cookie_t> cookies; |
| 82 cookies.reserve(windows_len); | 82 cookies.reserve(windows_len); |
| 85 cookies.push_back(::xcb_query_tree(connection, windows[i])); | 85 cookies.push_back(::xcb_query_tree(connection, windows[i])); |
| 86 | 86 |
| 87 for (const auto& cookie : cookies) { | 87 for (const auto& cookie : cookies) { |
| 88 std::unique_ptr<xcb_query_tree_reply_t> query_tree_reply(::xcb_query_tree_reply(connection, cookie, NULL)); | 88 std::unique_ptr<xcb_query_tree_reply_t> query_tree_reply(::xcb_query_tree_reply(connection, cookie, NULL)); |
| 89 | 89 |
| 90 xcb_window_t* tree_children = ::xcb_query_tree_children(query_tree_reply); | 90 xcb_window_t* tree_children = ::xcb_query_tree_children(query_tree_reply.get()); |
| 91 int tree_children_len = ::xcb_query_tree_children_length(query_tree_reply); | 91 int tree_children_len = ::xcb_query_tree_children_length(query_tree_reply.get()); |
| 92 | 92 |
| 93 std::vector<xcb_get_property_cookie_t> state_property_cookies; | 93 std::vector<xcb_get_property_cookie_t> state_property_cookies; |
| 94 state_property_cookies.reserve(tree_children_len); | 94 state_property_cookies.reserve(tree_children_len); |
| 95 | 95 |
| 96 for (int i = 0; i < tree_children_len; i++) | 96 for (int i = 0; i < tree_children_len; i++) |
| 161 | 161 |
| 162 std::set<xcb_window_t> windows; | 162 std::set<xcb_window_t> windows; |
| 163 { | 163 { |
| 164 std::vector<xcb_window_t> roots; | 164 std::vector<xcb_window_t> roots; |
| 165 { | 165 { |
| 166 xcb_screen_iterator_t iter = ::xcb_setup_roots_iterator(xcb_get_setup(connection)); | 166 xcb_screen_iterator_t iter = ::xcb_setup_roots_iterator(::xcb_get_setup(connection)); |
| 167 for (; iter.rem; ::xcb_screen_next(&iter)) | 167 for (; iter.rem; ::xcb_screen_next(&iter)) |
| 168 roots.push_back(iter.data->root); | 168 roots.push_back(iter.data->root); |
| 169 } | 169 } |
| 170 | 170 |
| 171 if (!GetAllTopLevelWindowsEWMH(connection, roots, windows)) | 171 if (!GetAllTopLevelWindowsEWMH(connection, roots, windows)) |
| 200 /* Class name */ | 200 /* Class name */ |
| 201 std::unique_ptr<xcb_get_property_reply_t> reply( | 201 std::unique_ptr<xcb_get_property_reply_t> reply( |
| 202 ::xcb_get_property_reply(connection, window_cookie.class_property_cookie, NULL)); | 202 ::xcb_get_property_reply(connection, window_cookie.class_property_cookie, NULL)); |
| 203 | 203 |
| 204 if (reply && reply->format == 8) { | 204 if (reply && reply->format == 8) { |
| 205 const char* data = reinterpret_cast<char*>(::xcb_get_property_value(reply.get())); | 205 const char* data = reinterpret_cast<const char*>(::xcb_get_property_value(reply.get())); |
| 206 const int data_len = ::xcb_get_property_value_length(reply.get()); | 206 const int data_len = ::xcb_get_property_value_length(reply.get()); |
| 207 | 207 |
| 208 int instance_len = str_nlen(data, data_len); | 208 int instance_len = str_nlen(data, data_len); |
| 209 const char* class_name = data + instance_len + 1; | 209 const char* class_name = data + instance_len + 1; |
| 210 | 210 |
| 215 /* Title text */ | 215 /* Title text */ |
| 216 std::unique_ptr<xcb_get_property_reply_t> reply( | 216 std::unique_ptr<xcb_get_property_reply_t> reply( |
| 217 ::xcb_get_property_reply(connection, window_cookie.name_property_cookie, NULL)); | 217 ::xcb_get_property_reply(connection, window_cookie.name_property_cookie, NULL)); |
| 218 | 218 |
| 219 if (reply) { | 219 if (reply) { |
| 220 const char* data = reinterpret_cast<char*>(::xcb_get_property_value(reply.get())); | 220 const char* data = reinterpret_cast<const char*>(::xcb_get_property_value(reply.get())); |
| 221 int len = ::xcb_get_property_value_length(reply.get()); | 221 int len = ::xcb_get_property_value_length(reply.get()); |
| 222 | 222 |
| 223 win.text = std::string(data, len); | 223 win.text = std::string(data, len); |
| 224 } | 224 } |
| 225 } | 225 } |
| 228 /* PID */ | 228 /* PID */ |
| 229 std::unique_ptr<xcb_res_query_client_ids_reply_t> reply( | 229 std::unique_ptr<xcb_res_query_client_ids_reply_t> reply( |
| 230 ::xcb_res_query_client_ids_reply(connection, window_cookie.pid_property_cookie, NULL)); | 230 ::xcb_res_query_client_ids_reply(connection, window_cookie.pid_property_cookie, NULL)); |
| 231 | 231 |
| 232 if (reply) { | 232 if (reply) { |
| 233 xcb_res_client_id_value_iterator_t it = ::xcb_res_query_client_ids_ids_iterator(reply); | 233 xcb_res_client_id_value_iterator_t it = ::xcb_res_query_client_ids_ids_iterator(reply.get()); |
| 234 for (; it.rem; ::xcb_res_client_id_value_next(&it)) { | 234 for (; it.rem; ::xcb_res_client_id_value_next(&it)) { |
| 235 if (it.data->spec.mask & XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID) { | 235 if (it.data->spec.mask & XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID) { |
| 236 proc.pid = *reinterpret_cast<uint32_t*>(::xcb_res_client_id_value_value(it.data)); | 236 proc.pid = *::xcb_res_client_id_value_value(it.data); |
| 237 fd::GetProcessName(proc.pid, proc.name); /* fill this in if we can */ | 237 GetProcessName(proc.pid, proc.name); /* fill this in if we can */ |
| 238 break; | 238 break; |
| 239 } | 239 } |
| 240 } | 240 } |
| 241 } | 241 } |
| 242 } | 242 } |
| 243 | 243 |
| 244 std::cout << "got window: " << win.id << "\n" | |
| 245 << "class name: " << win.class_name << "\n" | |
| 246 << "title: " << win.text << "\n" | |
| 247 << "PID: " << proc.pid << "\n" | |
| 248 << "executable: " << proc.name << "\n" << std::endl; | |
| 249 | |
| 244 if (!window_proc(proc, win)) { | 250 if (!window_proc(proc, win)) { |
| 245 ::xcb_disconnect(connection); | 251 ::xcb_disconnect(connection); |
| 246 return false; | 252 return false; |
| 247 } | 253 } |
| 248 } | 254 } |
