From 152c44ffb96143683a7fdaabac1c747aaf6ad0dc Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Thu, 7 Sep 2023 14:36:23 +0200 Subject: apps: split apps into directories --- source/app/CMakeLists.txt | 51 +------------- source/app/src/wandac.cpp | 93 ------------------------- source/app/src/wandad.cpp | 147 --------------------------------------- source/app/wandac/CMakeLists.txt | 25 +++++++ source/app/wandac/src/main.cpp | 93 +++++++++++++++++++++++++ source/app/wandad/CMakeLists.txt | 24 +++++++ source/app/wandad/src/main.cpp | 147 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 291 insertions(+), 289 deletions(-) delete mode 100644 source/app/src/wandac.cpp delete mode 100644 source/app/src/wandad.cpp create mode 100644 source/app/wandac/CMakeLists.txt create mode 100644 source/app/wandac/src/main.cpp create mode 100644 source/app/wandad/CMakeLists.txt create mode 100644 source/app/wandad/src/main.cpp diff --git a/source/app/CMakeLists.txt b/source/app/CMakeLists.txt index 175a901..1ac7ab1 100644 --- a/source/app/CMakeLists.txt +++ b/source/app/CMakeLists.txt @@ -2,52 +2,5 @@ include("CheckIPOSupported") check_ipo_supported(RESULT "WANDA_IPO_SUPPORTED") -find_package("lyra") -find_package("spdlog") - -#[=====[ Client ]=====] - -add_executable("wandac" - "src/wandac.cpp" -) - -target_link_libraries("${PROJECT_NAME}c" PRIVATE - "wanda::control" - "wanda::proto" - "wanda::system" - - "bfg::lyra" - "spdlog::spdlog_header_only" -) - -set_target_properties("wandac" PROPERTIES - CXX_STANDARD_REQUIRED YES - CXX_EXTENSIONS OFF - INTERPROCEDURAL_OPTIMIZATION ${WANDA_IPO_SUPPORTED} -) - -install(TARGETS "wandac") - -#[=====[ Server ]=====] - -add_executable("wandad" - "src/wandad.cpp" -) - -target_link_libraries("wandad" PRIVATE - "wanda::control" - "wanda::proto" - "wanda::std_ext" - "wanda::system" - - "bfg::lyra" - "spdlog::spdlog_header_only" -) - -set_target_properties("wandad" PROPERTIES - CXX_STANDARD_REQUIRED YES - CXX_EXTENSIONS OFF - INTERPROCEDURAL_OPTIMIZATION ${WANDA_IPO_SUPPORTED} -) - -install(TARGETS "wandad") +add_subdirectory("wandac") +add_subdirectory("wandad") \ No newline at end of file diff --git a/source/app/src/wandac.cpp b/source/app/src/wandac.cpp deleted file mode 100644 index 65af1db..0000000 --- a/source/app/src/wandac.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -struct cli -{ - std::string command{}; - bool help{}; - - lyra::cli_parser parser{}; - - auto parse(int argc, char const * const * argv, std::ostream & error) - { - parser |= // - lyra::help(help) | // - lyra::arg{command, "command"}("The command to send to the deamon").required(); - - auto result = parser.parse({argc, argv}); - - if (!result) - { - error << "Error while processing command line arguments: " << result.message() << '\n' << parser << '\n'; - return false; - } - - return true; - } -}; - -struct listener : wanda::control::commander::listener -{ - listener(::cli & cli, boost::asio::io_context & service) - : m_cli{cli} - , m_service{service} - { - } - - void on_connected(wanda::control::commander & commander) override - { - if (m_cli.command == "change") - { - commander.send(wanda::proto::make_change_command()); - - post(m_service, [&] { commander.stop(); }); - } - } - -private: - ::cli & m_cli; - boost::asio::io_context & m_service; -}; - -int main(int argc, char const * const * argv) -{ - auto cli = ::cli{}; - if (!cli.parse(argc, argv, std::cerr)) - { - return EXIT_FAILURE; - } - else if (cli.help) - { - std::cout << cli.parser << '\n'; - return EXIT_SUCCESS; - } - - wanda::system::initialize_logger(std::make_shared()); - - auto interface = - wanda::system::xdg_path_for(wanda::system::xdg_directory::runtime_dir, wanda::system::environment{}) / - ".wanda_interface"; - auto service = boost::asio::io_context{}; - auto listener = ::listener{cli, service}; - - auto commander = wanda::control::commander{service, interface, listener}; - - wanda::system::get_logger()->info("trying to connect to wanda control interface on '{}'", interface.native()); - commander.start(); - - service.run(); -} diff --git a/source/app/src/wandad.cpp b/source/app/src/wandad.cpp deleted file mode 100644 index 8d16a7e..0000000 --- a/source/app/src/wandad.cpp +++ /dev/null @@ -1,147 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -namespace -{ - constexpr auto image_filter = [](auto const & path) { - static auto const extensions = std::set{ - std::filesystem::path{".jpg"}, - std::filesystem::path{".png"}, - }; - - if (!std::filesystem::is_regular_file(path)) - { - return false; - } - - return extensions.find(path.extension()) != extensions.cend(); - }; - - struct cli - { - std::string wallpaper_directory{}; - bool help{}; - - lyra::cli_parser parser{}; - - auto parse(int argc, char const * const * argv, std::ostream & error) - { - parser |= // - lyra::help(help) | // - lyra::arg{wallpaper_directory, "directory"}("The wallpaper source directory").required(); - - auto result = parser.parse({argc, argv}); - - if (!result) - { - error << "Error while processing command line arguments: " << result.message() << '\n' << parser << '\n'; - return false; - } - - return true; - } - }; - - struct listener : wanda::control::interface::listener - { - listener(std::vector const & wallpapers) - : m_wallpapers{wallpapers} - { - } - - void on_received(wanda::control::interface & interface, wanda::proto::command command) override - { - switch (command.id) - { - case wanda::proto::command_id::change: { - auto wallpaper = wanda::system::random_pick(m_wallpapers); - wanda::system::get_logger()->info("changing wallpaper to '{}'", wallpaper.native()); - wanda::system::set_wallpaper(wallpaper); - break; - } - default: - wanda::system::get_logger()->error("received unknown command '{}'", static_cast(command.id)); - } - } - - private: - std::vector const & m_wallpapers; - }; - -} // namespace - -int main(int argc, char const * const * argv) -{ - using namespace wanda::std_ext; - - auto cli = ::cli{}; - if (!cli.parse(argc, argv, std::cerr)) - { - return EXIT_FAILURE; - } - else if (cli.help) - { - std::cout << cli.parser << '\n'; - return EXIT_SUCCESS; - } - - wanda::system::initialize_logger(std::make_shared()); - wanda::system::get_logger()->info("wanda is starting up"); - - with(wanda::system::scan({cli.wallpaper_directory}, image_filter), - [&](auto const & list) { - auto service = boost::asio::io_context{}; - auto socket_path = - wanda::system::xdg_path_for(wanda::system::xdg_directory::runtime_dir, wanda::system::environment{}) / - ".wanda_interface"; - - wanda::system::get_logger()->info("starting control interface on '{}'", socket_path.native()); - auto listener = ::listener{list}; - auto interface = wanda::control::make_interface(service, socket_path, listener); - - if (!interface) - { - wanda::system::get_logger()->error("failed to start control interface"); - return; - } - - if (interface->start()) - { - return; - } - - auto signals = boost::asio::signal_set{service, SIGINT, SIGTERM}; - signals.async_wait([&](auto const & error, auto const signal) { - if (!error) - { - wanda::system::get_logger()->info("Received signal {}. terminating...", signal); - interface->shutdown(); - service.stop(); - } - }); - - auto wallpaper = wanda::system::random_pick(list); - wanda::system::set_wallpaper(wallpaper); - - service.run(); - }) || - [&] { wanda::system::get_logger()->error("wallpaper directory does not exist"); }; -} diff --git a/source/app/wandac/CMakeLists.txt b/source/app/wandac/CMakeLists.txt new file mode 100644 index 0000000..a9b977c --- /dev/null +++ b/source/app/wandac/CMakeLists.txt @@ -0,0 +1,25 @@ +find_package("lyra") +find_package("spdlog") + +#[=====[ Client ]=====] + +add_executable("wandac" + "src/main.cpp" +) + +target_link_libraries("${PROJECT_NAME}c" PRIVATE + "wanda::control" + "wanda::proto" + "wanda::system" + + "bfg::lyra" + "spdlog::spdlog_header_only" +) + +set_target_properties("wandac" PROPERTIES + CXX_STANDARD_REQUIRED YES + CXX_EXTENSIONS OFF + INTERPROCEDURAL_OPTIMIZATION ${WANDA_IPO_SUPPORTED} +) + +install(TARGETS "wandac") diff --git a/source/app/wandac/src/main.cpp b/source/app/wandac/src/main.cpp new file mode 100644 index 0000000..65af1db --- /dev/null +++ b/source/app/wandac/src/main.cpp @@ -0,0 +1,93 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +struct cli +{ + std::string command{}; + bool help{}; + + lyra::cli_parser parser{}; + + auto parse(int argc, char const * const * argv, std::ostream & error) + { + parser |= // + lyra::help(help) | // + lyra::arg{command, "command"}("The command to send to the deamon").required(); + + auto result = parser.parse({argc, argv}); + + if (!result) + { + error << "Error while processing command line arguments: " << result.message() << '\n' << parser << '\n'; + return false; + } + + return true; + } +}; + +struct listener : wanda::control::commander::listener +{ + listener(::cli & cli, boost::asio::io_context & service) + : m_cli{cli} + , m_service{service} + { + } + + void on_connected(wanda::control::commander & commander) override + { + if (m_cli.command == "change") + { + commander.send(wanda::proto::make_change_command()); + + post(m_service, [&] { commander.stop(); }); + } + } + +private: + ::cli & m_cli; + boost::asio::io_context & m_service; +}; + +int main(int argc, char const * const * argv) +{ + auto cli = ::cli{}; + if (!cli.parse(argc, argv, std::cerr)) + { + return EXIT_FAILURE; + } + else if (cli.help) + { + std::cout << cli.parser << '\n'; + return EXIT_SUCCESS; + } + + wanda::system::initialize_logger(std::make_shared()); + + auto interface = + wanda::system::xdg_path_for(wanda::system::xdg_directory::runtime_dir, wanda::system::environment{}) / + ".wanda_interface"; + auto service = boost::asio::io_context{}; + auto listener = ::listener{cli, service}; + + auto commander = wanda::control::commander{service, interface, listener}; + + wanda::system::get_logger()->info("trying to connect to wanda control interface on '{}'", interface.native()); + commander.start(); + + service.run(); +} diff --git a/source/app/wandad/CMakeLists.txt b/source/app/wandad/CMakeLists.txt new file mode 100644 index 0000000..dfcaeb3 --- /dev/null +++ b/source/app/wandad/CMakeLists.txt @@ -0,0 +1,24 @@ +find_package("lyra") +find_package("spdlog") + +add_executable("wandad" + "src/main.cpp" +) + +target_link_libraries("wandad" PRIVATE + "wanda::control" + "wanda::proto" + "wanda::std_ext" + "wanda::system" + + "bfg::lyra" + "spdlog::spdlog_header_only" +) + +set_target_properties("wandad" PROPERTIES + CXX_STANDARD_REQUIRED YES + CXX_EXTENSIONS OFF + INTERPROCEDURAL_OPTIMIZATION ${WANDA_IPO_SUPPORTED} +) + +install(TARGETS "wandad") diff --git a/source/app/wandad/src/main.cpp b/source/app/wandad/src/main.cpp new file mode 100644 index 0000000..8d16a7e --- /dev/null +++ b/source/app/wandad/src/main.cpp @@ -0,0 +1,147 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace +{ + constexpr auto image_filter = [](auto const & path) { + static auto const extensions = std::set{ + std::filesystem::path{".jpg"}, + std::filesystem::path{".png"}, + }; + + if (!std::filesystem::is_regular_file(path)) + { + return false; + } + + return extensions.find(path.extension()) != extensions.cend(); + }; + + struct cli + { + std::string wallpaper_directory{}; + bool help{}; + + lyra::cli_parser parser{}; + + auto parse(int argc, char const * const * argv, std::ostream & error) + { + parser |= // + lyra::help(help) | // + lyra::arg{wallpaper_directory, "directory"}("The wallpaper source directory").required(); + + auto result = parser.parse({argc, argv}); + + if (!result) + { + error << "Error while processing command line arguments: " << result.message() << '\n' << parser << '\n'; + return false; + } + + return true; + } + }; + + struct listener : wanda::control::interface::listener + { + listener(std::vector const & wallpapers) + : m_wallpapers{wallpapers} + { + } + + void on_received(wanda::control::interface & interface, wanda::proto::command command) override + { + switch (command.id) + { + case wanda::proto::command_id::change: { + auto wallpaper = wanda::system::random_pick(m_wallpapers); + wanda::system::get_logger()->info("changing wallpaper to '{}'", wallpaper.native()); + wanda::system::set_wallpaper(wallpaper); + break; + } + default: + wanda::system::get_logger()->error("received unknown command '{}'", static_cast(command.id)); + } + } + + private: + std::vector const & m_wallpapers; + }; + +} // namespace + +int main(int argc, char const * const * argv) +{ + using namespace wanda::std_ext; + + auto cli = ::cli{}; + if (!cli.parse(argc, argv, std::cerr)) + { + return EXIT_FAILURE; + } + else if (cli.help) + { + std::cout << cli.parser << '\n'; + return EXIT_SUCCESS; + } + + wanda::system::initialize_logger(std::make_shared()); + wanda::system::get_logger()->info("wanda is starting up"); + + with(wanda::system::scan({cli.wallpaper_directory}, image_filter), + [&](auto const & list) { + auto service = boost::asio::io_context{}; + auto socket_path = + wanda::system::xdg_path_for(wanda::system::xdg_directory::runtime_dir, wanda::system::environment{}) / + ".wanda_interface"; + + wanda::system::get_logger()->info("starting control interface on '{}'", socket_path.native()); + auto listener = ::listener{list}; + auto interface = wanda::control::make_interface(service, socket_path, listener); + + if (!interface) + { + wanda::system::get_logger()->error("failed to start control interface"); + return; + } + + if (interface->start()) + { + return; + } + + auto signals = boost::asio::signal_set{service, SIGINT, SIGTERM}; + signals.async_wait([&](auto const & error, auto const signal) { + if (!error) + { + wanda::system::get_logger()->info("Received signal {}. terminating...", signal); + interface->shutdown(); + service.stop(); + } + }); + + auto wallpaper = wanda::system::random_pick(list); + wanda::system::set_wallpaper(wallpaper); + + service.run(); + }) || + [&] { wanda::system::get_logger()->error("wallpaper directory does not exist"); }; +} -- cgit v1.2.3