Mercurial > minori
comparison dep/animone/src/a11y/atspi.cc @ 366:886f66775f31
animone: add preliminary AT-SPI stuff
anime_list: finish the regular singular right click menu
author | Paper <paper@tflc.us> |
---|---|
date | Sun, 17 Nov 2024 19:56:01 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
365:f81bed4e04ac | 366:886f66775f31 |
---|---|
1 #include <functional> | |
2 #include <string> | |
3 #include <vector> | |
4 #include <memory> | |
5 | |
6 #include "animone.h" | |
7 #include "animone/a11y/atspi.h" | |
8 | |
9 #include <atspi/atspi.h> | |
10 | |
11 namespace animone::internal::atspi { | |
12 | |
13 /* deleters */ | |
14 template<typename T> | |
15 struct g_object_del { | |
16 void operator()(T* p) const { ::g_object_unref(p); }; | |
17 }; | |
18 | |
19 template<typename T> | |
20 using GObjectPtr = std::unique_ptr<T, g_object_del<T>>; | |
21 | |
22 /* ----------------------------------------------------------------- */ | |
23 | |
24 // FIXME | atspi_exit() | |
25 bool GetWebBrowserInformation(const Result& result, web_browser_proc_t web_browser_proc) { | |
26 GObjectPtr<AtspiAccessible> desktop; | |
27 GObjectPtr<AtspiAccessible> application; | |
28 | |
29 { | |
30 int err = atspi_init(); | |
31 if (err != 0 && err != 1) | |
32 return false; | |
33 } | |
34 | |
35 // Currently only one desktop is supported, so this is equivalent to doing | |
36 // just atspi_get_desktop(0). However it's nice to futureproof where possible. | |
37 for (gint i = 0; i < atspi_get_desktop_count(); i++) { | |
38 desktop.reset(atspi_get_desktop(i)); | |
39 if (!desktop) | |
40 return false; | |
41 | |
42 for (gint j = 0; j < atspi_accessible_get_child_count(application.get(), nullptr); j++) { | |
43 application.reset(atspi_accessible_get_child_at_index(desktop.get(), j, nullptr)); | |
44 if (!application) | |
45 return false; | |
46 | |
47 GError *error = NULL; | |
48 | |
49 std::uint32_t pid = atspi_accessible_get_process_id(application.get(), &error); | |
50 if (error) { | |
51 ::g_error_free(error); | |
52 return false; | |
53 } | |
54 | |
55 if (pid == result.process.pid) | |
56 goto found; // found it | |
57 } | |
58 } | |
59 | |
60 // didn't get anything... lol | |
61 return false; | |
62 | |
63 found: | |
64 // found a matching application | |
65 | |
66 gchar *title = atspi_accessible_get_name(application.get(), NULL); | |
67 if (title) { | |
68 web_browser_proc({WebBrowserInformationType::Title, title}); | |
69 ::g_free(title); | |
70 } | |
71 | |
72 // TODO need to find address and tab? idk | |
73 | |
74 return true; | |
75 } | |
76 | |
77 } |