Mercurial > libanimone
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 |
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 | 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 | 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 | 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 | 49 animone::Media media; |
50 media.information = {media_information}; | |
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 | 59 typedef bool (*strategy_spec_t)(animone::Result *results, size_t results_size); |
60 | |
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 | 64 for (size_t i = 0; i < results_size; i++) { |
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 | 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 | 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 | 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 | 80 std::set<animone::internal::pid_t> pids; |
81 | |
82 for (size_t i = 0; i < results_size; i++) | |
83 pids.insert(results[i].process.pid); | |
84 | |
85 auto open_file_proc = [&](const animone::internal::OpenFile& file) -> bool { | |
86 animone::Result *result = NULL; | |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
12
diff
changeset
|
87 |
31 | 88 for (size_t i = 0; i < results_size; i++) { |
89 if (results[i].process.pid == file.pid) { | |
90 result = &results[i]; | |
91 break; | |
92 } | |
93 } | |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
12
diff
changeset
|
94 |
31 | 95 if (!result) |
96 return false; | |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
12
diff
changeset
|
97 |
31 | 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 | 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 | 107 static bool ApplyAccessibilityStrategy(animone::Result *results, size_t results_size) { |
108 int success = 0; | |
23
1cfa7d57c022
dep/animone: add experimental accessibility strategy
Paper <paper@paper.us.eu.org>
parents:
14
diff
changeset
|
109 |
31 | 110 for (size_t i = 0; i < results_size; i++) { |
111 // TODO refactor our processing function specs to take in userdata | |
112 | |
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 | 117 case animone::internal::WebBrowserInformationType::Address: |
118 AddMedia(&results[i], {animone::MediaInfoType::Url, value}); | |
119 break; | |
120 case animone::internal::WebBrowserInformationType::Title: | |
121 ApplyWindowTitleFormat(results[i].player.window_title_format, value); | |
122 AddMedia(&results[i], {animone::MediaInfoType::Title, value}); | |
123 break; | |
124 case animone::internal::WebBrowserInformationType::Tab: | |
125 AddMedia(&results[i], {animone::MediaInfoType::Tab, value}); | |
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 | 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 | 138 int animone_internal_ApplyStrategies(animone::Result *results, size_t results_size) |
139 { | |
140 static const strategy_spec_t strategies[] = { | |
141 ApplyWindowTitleStrategy, | |
142 ApplyOpenFilesStrategy, | |
143 ApplyAccessibilityStrategy | |
144 }; | |
14
27b988a1048c
*: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents:
12
diff
changeset
|
145 |
31 | 146 int success = 0; |
147 | |
148 for (size_t i = 0; i < (sizeof(strategies)/sizeof(*strategies)); i++) | |
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 |