annotate src/strategist.cc @ 32:93224b26a0ee default tip

player: efforts towards C-ization
author Paper <paper@tflc.us>
date Mon, 10 Feb 2025 19:17:29 -0500
parents 668f4f31ddda
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
1 #include <regex>
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
2 #include <unordered_map>
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
3
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
4 #include "animone.h"
23
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
5 #include "animone/a11y.h"
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
6 #include "animone/fd.h"
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
7 #include "animone/strategies.h"
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
8 #include "animone/util.h"
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
9
23
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
10 /* This file was changed lots from anisthesia. Most notably we don't use classes here
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
11 * anymore, and we just pass the result vector to different function that append
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
12 * to the result (which is better imo) */
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
13
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
14 static bool ApplyWindowTitleFormat(const std::string& format, std::string& title) {
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
15 if (format.empty())
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
16 return false;
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
17
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
18 const std::regex pattern(format);
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
19 std::smatch match;
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
20 std::regex_match(title, match, pattern);
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
21
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
22 // Use the first non-empty match result, because the regular expression may
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
23 // contain multiple sub-expressions.
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
24 for (size_t i = 1; i < match.size(); ++i) {
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
25 if (!match.str(i).empty()) {
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
26 title = match.str(i);
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
27 return true;
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
28 }
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
29 }
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
30
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
31 // Results are empty, but the match was successful
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
32 if (!match.empty()) {
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
33 title.clear();
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
34 return true;
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
35 }
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
36
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
37 return true;
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
38 }
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
39
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
40 static animone::MediaInfoType InferMediaInformationType(const std::string& str) {
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
41 const std::regex path_pattern(R"(^(?:[A-Za-z]:[/\\]|\\\\)[^<>:"/\\|?*]+)");
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
42 return (std::regex_search(str, path_pattern)) ? animone::MediaInfoType::File : animone::MediaInfoType::Unknown;
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
43 }
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
44
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
45 static bool AddMedia(animone::Result *result, const animone::MediaInfo media_information) {
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
46 if (media_information.value.empty())
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
47 return false;
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
48
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
49 animone::Media media;
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
50 media.information = {media_information};
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
51 result->media.push_back(std::move(media));
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
52
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
53 return true;
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
54 }
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
55
23
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
56 /* ------------------------------------------------------------------------- */
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
57 /* strategies */
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
58
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
59 typedef bool (*strategy_spec_t)(animone::Result *results, size_t results_size);
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
60
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
61 static bool ApplyWindowTitleStrategy(animone::Result *results, size_t results_size) {
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
62 bool success = false;
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
63
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
64 for (size_t i = 0; i < results_size; i++) {
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
65 auto title = results[i].window.text;
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
66 if (title.empty())
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
67 continue;
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
68
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
69 ApplyWindowTitleFormat(results[i].player.window_title_format, title);
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
70
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
71 success |= AddMedia(&results[i], {InferMediaInformationType(title), title});
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
72 }
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
73
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
74 return success;
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
75 }
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
76
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
77 static bool ApplyOpenFilesStrategy(animone::Result *results, size_t results_size) {
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
78 bool success = false;
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
79
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
80 std::set<animone::internal::pid_t> pids;
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
81
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
82 for (size_t i = 0; i < results_size; i++)
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
83 pids.insert(results[i].process.pid);
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
84
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
85 auto open_file_proc = [&](const animone::internal::OpenFile& file) -> bool {
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
86 animone::Result *result = NULL;
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
87
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
88 for (size_t i = 0; i < results_size; i++) {
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
89 if (results[i].process.pid == file.pid) {
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
90 result = &results[i];
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
91 break;
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
92 }
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
93 }
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
94
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
95 if (!result)
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
96 return false;
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
97
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
98 success |= AddMedia(result, {animone::MediaInfoType::File, file.path});
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
99 return true;
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
100 };
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
101
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
102 animone::internal::EnumerateOpenFiles(pids, open_file_proc);
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
103
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
104 return success;
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
105 }
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
106
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
107 static bool ApplyAccessibilityStrategy(animone::Result *results, size_t results_size) {
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
108 int success = 0;
23
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
109
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
110 for (size_t i = 0; i < results_size; i++) {
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
111 // TODO refactor our processing function specs to take in userdata
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
112
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
113 auto web_browser_proc = [results, i](const animone::internal::WebBrowserInformation& info) -> void {
23
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
114 auto value = info.value;
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
115
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
116 switch (info.type) {
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
117 case animone::internal::WebBrowserInformationType::Address:
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
118 AddMedia(&results[i], {animone::MediaInfoType::Url, value});
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
119 break;
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
120 case animone::internal::WebBrowserInformationType::Title:
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
121 ApplyWindowTitleFormat(results[i].player.window_title_format, value);
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
122 AddMedia(&results[i], {animone::MediaInfoType::Title, value});
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
123 break;
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
124 case animone::internal::WebBrowserInformationType::Tab:
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
125 AddMedia(&results[i], {animone::MediaInfoType::Tab, value});
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
126 break;
23
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
127 }
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
128 };
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
129
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
130 success |= animone::internal::GetWebBrowserInformation(results[i], web_browser_proc);
23
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
131 }
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
132
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
133 return success;
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
134 }
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
135
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
136 /* ------------------------------------------------------------------------- */
1cfa7d57c022 dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents: 14
diff changeset
137
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
138 int animone_internal_ApplyStrategies(animone::Result *results, size_t results_size)
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
139 {
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
140 static const strategy_spec_t strategies[] = {
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
141 ApplyWindowTitleStrategy,
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
142 ApplyOpenFilesStrategy,
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
143 ApplyAccessibilityStrategy
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
144 };
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
145
31
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
146 int success = 0;
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
147
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
148 for (size_t i = 0; i < (sizeof(strategies)/sizeof(*strategies)); i++)
668f4f31ddda strategist: outward APIs are now in C
Paper <paper@tflc.us>
parents: 28
diff changeset
149 success |= strategies[i](results, results_size);
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
150
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
151 return success;
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
152 }
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 12
diff changeset
153