comparison dep/animia/src/win/x11.cc @ 214:8d35061e7505

dep/animia: win/x11: simplify getting strings
author Paper <mrpapersonic@gmail.com>
date Sun, 07 Jan 2024 11:19:28 -0500
parents 58e81b42a0d6
children 8ccf0302afb1
comparison
equal deleted inserted replaced
213:58e81b42a0d6 214:8d35061e7505
18 /* specify that these are X types. */ 18 /* specify that these are X types. */
19 typedef ::Window XWindow; 19 typedef ::Window XWindow;
20 typedef ::Display XDisplay; 20 typedef ::Display XDisplay;
21 typedef ::Atom XAtom; 21 typedef ::Atom XAtom;
22 22
23 /* should return UTF8_STRING or STRING */ 23 /* should return UTF8_STRING or STRING. this means we are not
24 static bool GetWindowPropertyAsString(XDisplay* display, XWindow window, XAtom atom, std::string& result, XAtom reqtype = AnyPropertyType) { 24 * *guaranteed* a UTF-8 string back.
25 if (atom == None || reqtype == None) 25 */
26 return false; 26 static bool GetWindowPropertyAsString(XDisplay* display, XWindow window, XAtom atom, std::string& result) {
27 if (atom == None)
28 return false;
29
30 XAtom Atom_UTF8_STRING = ::XInternAtom(display, "UTF8_STRING", False);
27 31
28 int format; 32 int format;
29 unsigned long leftover_bytes, num_of_items; 33 unsigned long leftover_bytes, num_of_items;
30 XAtom type; 34 XAtom type;
31 unsigned char* data; 35 unsigned char* data;
32 36
33 int status = ::XGetWindowProperty(display, window, atom, 0L, (~0L), False, reqtype, 37 int status = ::XGetWindowProperty(display, window, atom, 0L, (~0L), False, AnyPropertyType,
34 &type, &format, &num_of_items, &leftover_bytes, &data); 38 &type, &format, &num_of_items, &leftover_bytes, &data);
35 if (status != Success || !(reqtype == AnyPropertyType || type == reqtype) || !num_of_items) 39 if (status != Success || !(type == Atom_UTF8_STRING || type == XA_STRING) || !num_of_items)
36 return false; 40 return false;
37 41
38 result = std::string((char*)data, num_of_items); 42 result = std::string((char*)data, num_of_items);
39 43
40 ::XFree(data); 44 ::XFree(data);
89 93
90 return true; 94 return true;
91 } 95 }
92 96
93 static bool FetchName(XDisplay* display, XWindow window, std::string& result) { 97 static bool FetchName(XDisplay* display, XWindow window, std::string& result) {
94 /* TODO: Check if XInternAtom created None or not... */ 98 if (GetWindowPropertyAsString(display, window, ::XInternAtom(display, "_NET_WM_NAME", True), result))
95 if (GetWindowPropertyAsString(display, window, ::XInternAtom(display, "_NET_WM_NAME", True),
96 result, ::XInternAtom(display, "UTF8_STRING", True)))
97 return true; 99 return true;
98 100
99 if (GetWindowPropertyAsString(display, window, ::XInternAtom(display, "WM_NAME", True), 101 if (GetWindowPropertyAsString(display, window, ::XInternAtom(display, "WM_NAME", True), result))
100 result, XA_STRING))
101 return true; 102 return true;
102 103
103 /* Fallback to XGetWMName() */ 104 /* Fallback to XGetWMName() */
104 XTextProperty text; 105 XTextProperty text;
105 106
145 &format, &num_of_items, &bytes_after, &data 146 &format, &num_of_items, &bytes_after, &data
146 ); 147 );
147 148
148 if (status < Success || !num_of_items) 149 if (status < Success || !num_of_items)
149 return false; 150 return false;
150
151 if (format != 32) {
152 ::XFree(data);
153 return false;
154 }
155 } 151 }
156 152
157 XWindow* arr = (XWindow*)data; 153 XWindow* arr = (XWindow*)data;
158 154
159 for (uint32_t i = 0; i < num_of_items; i++) 155 for (uint32_t i = 0; i < num_of_items; i++)