Mercurial > libanimone
comparison src/strategist.cc @ 31:668f4f31ddda
strategist: outward APIs are now in C
author | Paper <paper@tflc.us> |
---|---|
date | Mon, 10 Feb 2025 00:07:21 -0500 |
parents | fac2b2d242d3 |
children |
comparison
equal
deleted
inserted
replaced
30:a76e55e098d1 | 31:668f4f31ddda |
---|---|
8 #include "animone/util.h" | 8 #include "animone/util.h" |
9 | 9 |
10 /* This file was changed lots from anisthesia. Most notably we don't use classes here | 10 /* This file was changed lots from anisthesia. Most notably we don't use classes here |
11 * anymore, and we just pass the result vector to different function that append | 11 * anymore, and we just pass the result vector to different function that append |
12 * to the result (which is better imo) */ | 12 * to the result (which is better imo) */ |
13 | |
14 namespace animone::internal { | |
15 | 13 |
16 static bool ApplyWindowTitleFormat(const std::string& format, std::string& title) { | 14 static bool ApplyWindowTitleFormat(const std::string& format, std::string& title) { |
17 if (format.empty()) | 15 if (format.empty()) |
18 return false; | 16 return false; |
19 | 17 |
37 } | 35 } |
38 | 36 |
39 return true; | 37 return true; |
40 } | 38 } |
41 | 39 |
42 static MediaInfoType InferMediaInformationType(const std::string& str) { | 40 static animone::MediaInfoType InferMediaInformationType(const std::string& str) { |
43 const std::regex path_pattern(R"(^(?:[A-Za-z]:[/\\]|\\\\)[^<>:"/\\|?*]+)"); | 41 const std::regex path_pattern(R"(^(?:[A-Za-z]:[/\\]|\\\\)[^<>:"/\\|?*]+)"); |
44 return (std::regex_search(str, path_pattern)) ? MediaInfoType::File : MediaInfoType::Unknown; | 42 return (std::regex_search(str, path_pattern)) ? animone::MediaInfoType::File : animone::MediaInfoType::Unknown; |
45 } | 43 } |
46 | 44 |
47 static bool AddMedia(Result& result, const MediaInfo media_information) { | 45 static bool AddMedia(animone::Result *result, const animone::MediaInfo media_information) { |
48 if (media_information.value.empty()) | 46 if (media_information.value.empty()) |
49 return false; | 47 return false; |
50 | 48 |
51 Media media = { | 49 animone::Media media; |
52 .information = {media_information} | 50 media.information = {media_information}; |
53 }; | 51 result->media.push_back(std::move(media)); |
54 result.media.push_back(std::move(media)); | |
55 | 52 |
56 return true; | 53 return true; |
57 } | 54 } |
58 | 55 |
59 /* ------------------------------------------------------------------------- */ | 56 /* ------------------------------------------------------------------------- */ |
60 /* strategies */ | 57 /* strategies */ |
61 | 58 |
62 static bool ApplyWindowTitleStrategy(std::vector<Result>& results) { | 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) { | |
63 bool success = false; | 62 bool success = false; |
64 | 63 |
65 for (auto& result : results) { | 64 for (size_t i = 0; i < results_size; i++) { |
66 auto title = result.window.text; | 65 auto title = results[i].window.text; |
67 if (title.empty()) | 66 if (title.empty()) |
68 continue; | 67 continue; |
69 | 68 |
70 ApplyWindowTitleFormat(result.player.window_title_format, title); | 69 ApplyWindowTitleFormat(results[i].player.window_title_format, title); |
71 | 70 |
72 success |= AddMedia(result, {InferMediaInformationType(title), title}); | 71 success |= AddMedia(&results[i], {InferMediaInformationType(title), title}); |
73 } | 72 } |
74 | 73 |
75 return success; | 74 return success; |
76 } | 75 } |
77 | 76 |
78 static bool ApplyOpenFilesStrategy(std::vector<Result>& results) { | 77 static bool ApplyOpenFilesStrategy(animone::Result *results, size_t results_size) { |
79 bool success = false; | 78 bool success = false; |
80 | 79 |
81 /* map pids to our results, saves time with open_file_proc */ | 80 std::set<animone::internal::pid_t> pids; |
82 std::unordered_map<pid_t, Result*> pid_map; | |
83 std::set<pid_t> pids; | |
84 | 81 |
85 for (Result& result : results) { | 82 for (size_t i = 0; i < results_size; i++) |
86 const pid_t pid = result.process.pid; | 83 pids.insert(results[i].process.pid); |
87 if (!pid) | |
88 continue; | |
89 | 84 |
90 pid_map.insert({pid, &result}); | 85 auto open_file_proc = [&](const animone::internal::OpenFile& file) -> bool { |
91 pids.insert(pid); | 86 animone::Result *result = NULL; |
92 } | |
93 | 87 |
94 auto open_file_proc = [&](const OpenFile& file) -> bool { | 88 for (size_t i = 0; i < results_size; i++) { |
95 success |= AddMedia(*pid_map[file.pid], {MediaInfoType::File, file.path}); | 89 if (results[i].process.pid == file.pid) { |
90 result = &results[i]; | |
91 break; | |
92 } | |
93 } | |
94 | |
95 if (!result) | |
96 return false; | |
97 | |
98 success |= AddMedia(result, {animone::MediaInfoType::File, file.path}); | |
96 return true; | 99 return true; |
97 }; | 100 }; |
98 | 101 |
99 EnumerateOpenFiles(pids, open_file_proc); | 102 animone::internal::EnumerateOpenFiles(pids, open_file_proc); |
100 | 103 |
101 return success; | 104 return success; |
102 } | 105 } |
103 | 106 |
104 static bool ApplyAccessibilityStrategy(std::vector<Result>& results) { | 107 static bool ApplyAccessibilityStrategy(animone::Result *results, size_t results_size) { |
105 bool success = false; | 108 int success = 0; |
106 | 109 |
107 for (Result& result : results) { | 110 for (size_t i = 0; i < results_size; i++) { |
108 auto web_browser_proc = [&result](const WebBrowserInformation& info) { | 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 { | |
109 auto value = info.value; | 114 auto value = info.value; |
110 | 115 |
111 switch (info.type) { | 116 switch (info.type) { |
112 case WebBrowserInformationType::Address: | 117 case animone::internal::WebBrowserInformationType::Address: |
113 AddMedia(result, {MediaInfoType::Url, value}); | 118 AddMedia(&results[i], {animone::MediaInfoType::Url, value}); |
114 break; | 119 break; |
115 case WebBrowserInformationType::Title: | 120 case animone::internal::WebBrowserInformationType::Title: |
116 ApplyWindowTitleFormat(result.player.window_title_format, value); | 121 ApplyWindowTitleFormat(results[i].player.window_title_format, value); |
117 AddMedia(result, {MediaInfoType::Title, value}); | 122 AddMedia(&results[i], {animone::MediaInfoType::Title, value}); |
118 break; | 123 break; |
119 case WebBrowserInformationType::Tab: | 124 case animone::internal::WebBrowserInformationType::Tab: |
120 AddMedia(result, {MediaInfoType::Tab, value}); | 125 AddMedia(&results[i], {animone::MediaInfoType::Tab, value}); |
121 break; | 126 break; |
122 } | 127 } |
123 }; | 128 }; |
124 | 129 |
125 success |= GetWebBrowserInformation(result, web_browser_proc); | 130 success |= animone::internal::GetWebBrowserInformation(results[i], web_browser_proc); |
126 } | 131 } |
127 | 132 |
128 return success; | 133 return success; |
129 } | 134 } |
130 | 135 |
131 /* ------------------------------------------------------------------------- */ | 136 /* ------------------------------------------------------------------------- */ |
132 | 137 |
133 bool ApplyStrategies(std::vector<Result>& results) { | 138 int animone_internal_ApplyStrategies(animone::Result *results, size_t results_size) |
134 bool success = false; | 139 { |
140 static const strategy_spec_t strategies[] = { | |
141 ApplyWindowTitleStrategy, | |
142 ApplyOpenFilesStrategy, | |
143 ApplyAccessibilityStrategy | |
144 }; | |
135 | 145 |
136 success |= ApplyWindowTitleStrategy(results); | 146 int success = 0; |
137 success |= ApplyOpenFilesStrategy(results); | 147 |
138 success |= ApplyAccessibilityStrategy(results); | 148 for (size_t i = 0; i < (sizeof(strategies)/sizeof(*strategies)); i++) |
149 success |= strategies[i](results, results_size); | |
139 | 150 |
140 return success; | 151 return success; |
141 } | 152 } |
142 | 153 |
143 } // namespace animone::internal |