comparison dep/animone/src/win/x11.cc @ 277:a796e97cc86d

dep/animone: x11: correctly check for connection failure if there's no X server running then the previous code segfaults(!)
author Paper <paper@paper.us.eu.org>
date Mon, 22 Apr 2024 19:11:06 -0400
parents 1a6a5d3a94cd
children c41c14ff8c67
comparison
equal deleted inserted replaced
276:ec0a2b5493f8 277:a796e97cc86d
9 #include <climits> 9 #include <climits>
10 #include <cstdint> 10 #include <cstdint>
11 #include <cstring> 11 #include <cstring>
12 #include <set> 12 #include <set>
13 #include <string> 13 #include <string>
14 #include <memory>
14 15
15 #include <chrono> 16 #include <chrono>
16 17
17 #include <iostream> 18 #include <iostream>
18 19
154 bool EnumerateWindows(window_proc_t window_proc) { 155 bool EnumerateWindows(window_proc_t window_proc) {
155 if (!window_proc) 156 if (!window_proc)
156 return false; 157 return false;
157 158
158 xcb_connection_t* connection = ::xcb_connect(NULL, NULL); 159 xcb_connection_t* connection = ::xcb_connect(NULL, NULL);
159 if (!connection) 160 if (xcb_connection_has_error(connection))
160 return false; 161 return false;
161 162
162 std::set<xcb_window_t> windows; 163 std::set<xcb_window_t> windows;
163 { 164 {
164 std::vector<xcb_window_t> roots; 165 std::vector<xcb_window_t> roots;
166 xcb_screen_iterator_t iter = ::xcb_setup_roots_iterator(::xcb_get_setup(connection)); 167 xcb_screen_iterator_t iter = ::xcb_setup_roots_iterator(::xcb_get_setup(connection));
167 for (; iter.rem; ::xcb_screen_next(&iter)) 168 for (; iter.rem; ::xcb_screen_next(&iter))
168 roots.push_back(iter.data->root); 169 roots.push_back(iter.data->root);
169 } 170 }
170 171
171 if (!GetAllTopLevelWindowsEWMH(connection, roots, windows)) 172 //if (!GetAllTopLevelWindowsEWMH(connection, roots, windows))
172 GetAllTopLevelWindowsICCCM(connection, roots, windows); 173 GetAllTopLevelWindowsICCCM(connection, roots, windows);
173 } 174 }
174 175
175 struct WindowCookies { 176 struct WindowCookies {
176 xcb_window_t window; 177 xcb_window_t window;