Mercurial > minori
view dep/animia/src/animia.cc @ 229:adc20fa321c1
theme: force Fusion style on platforms other than Win32 or OS X
I was reluctant to do this, but most of the other styles just
look like pure shite regardless of whether I force a stylesheet
on them or not. KDE's style is actually hilariously bad paired
with my stylesheet, so I've decided to also make the stylesheet
Windows-specific as well, because that's really the only platform
where it makes sense in the first place.
author | Paper <paper@paper.us.eu.org> |
---|---|
date | Wed, 10 Jan 2024 21:23:57 -0500 |
parents | 031a257ee019 |
children | 4d461ef7d424 |
line wrap: on
line source
#include "animia.h" #include "animia/fd.h" #include "animia/strategies.h" #include "animia/types.h" #include "animia/util.h" #include "animia/win.h" #include <set> #include <string> #include <vector> namespace animia { namespace internal { static bool IsExecutableInList(const Player& player, const std::string& name) { std::string stem; #ifdef WIN32 if (!util::Stem(name, stem)) #endif stem = name; for (const auto& pattern : player.executables) if (util::CheckPattern(pattern, stem)) return true; return false; } static bool IsWindowInList(const Player& player, const std::string& name) { for (const auto& pattern : player.windows) if (util::CheckPattern(pattern, name)) return true; return false; } static bool PlayerHasStrategy(const Player& player, const Strategy& strategy) { for (const auto& pstrategy : player.strategies) if (pstrategy == strategy) return true; return false; } } // namespace internal bool GetResults(const std::vector<Player>& players, std::vector<Result>& results) { /* Start out with file descriptors. */ auto process_proc = [&](const Process& process) -> bool { for (const auto& player : players) { if (!internal::PlayerHasStrategy(player, Strategy::OpenFiles)) continue; if (!internal::IsExecutableInList(player, process.name)) continue; results.push_back({ResultType::Process, player, process, {}, {}}); break; } return true; }; if (!internal::EnumerateOpenProcesses(process_proc)) return false; /* Then add our cool windows. Note: X11 is stupid and there's no reliable way to get a PID from a given window. This is because some windows might not even have a process attached to them. We should set the PID of the process if we can get it, but that'll be for when I can actually be arsed to implement the X11 backend. */ auto window_proc = [&](const Process& process, const Window& window) -> bool { for (const auto& player : players) { if (!internal::PlayerHasStrategy(player, Strategy::WindowTitle)) continue; if (!internal::IsWindowInList(player, window.class_name)) continue; results.push_back({ResultType::Window, player, process, window, {}}); break; } return true; }; if (!internal::EnumerateWindows(window_proc)) return false; return internal::ApplyStrategies(results); } } // namespace animia