main.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /*
  2. * Copyright (c) 2022, Oleg Kosenkov <oleg@kosenkov.ca>
  3. * Copyright (c) 2022, the SerenityOS developers.
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include "ColorLines.h"
  8. #include <AK/URL.h>
  9. #include <LibConfig/Client.h>
  10. #include <LibCore/System.h>
  11. #include <LibDesktop/Launcher.h>
  12. #include <LibGUI/Action.h>
  13. #include <LibGUI/Application.h>
  14. #include <LibGUI/Icon.h>
  15. #include <LibGUI/Menu.h>
  16. #include <LibGUI/Menubar.h>
  17. #include <LibGUI/Window.h>
  18. #include <LibMain/Main.h>
  19. ErrorOr<int> serenity_main(Main::Arguments arguments)
  20. {
  21. TRY(Core::System::pledge("stdio rpath recvfd sendfd unix"));
  22. auto app = TRY(GUI::Application::create(arguments));
  23. auto const app_name = "ColorLines"sv;
  24. auto const title = "Color Lines"_string;
  25. auto const man_file = "/usr/share/man/man6/ColorLines.md"sv;
  26. Config::pledge_domain(app_name);
  27. TRY(Desktop::Launcher::add_allowed_handler_with_only_specific_urls("/bin/Help", { URL::create_with_file_scheme(man_file) }));
  28. TRY(Desktop::Launcher::seal_allowlist());
  29. TRY(Core::System::pledge("stdio rpath recvfd sendfd"));
  30. TRY(Core::System::unveil("/tmp/session/%sid/portal/launch", "rw"));
  31. TRY(Core::System::unveil("/res", "r"));
  32. TRY(Core::System::unveil(nullptr, nullptr));
  33. auto app_icon = TRY(GUI::Icon::try_create_default_icon("app-colorlines"sv));
  34. auto window = TRY(GUI::Window::try_create());
  35. window->set_double_buffering_enabled(false);
  36. window->set_title(title.bytes_as_string_view());
  37. window->resize(436, 481);
  38. window->set_resizable(false);
  39. auto game = TRY(window->set_main_widget<ColorLines>(app_name));
  40. auto game_menu = window->add_menu("&Game"_string);
  41. game_menu->add_action(GUI::Action::create("&New Game", { Mod_None, Key_F2 }, TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/reload.png"sv)), [&](auto&) {
  42. game->reset();
  43. }));
  44. game_menu->add_separator();
  45. game_menu->add_action(GUI::CommonActions::make_quit_action([](auto&) {
  46. GUI::Application::the()->quit();
  47. }));
  48. auto help_menu = window->add_menu("&Help"_string);
  49. help_menu->add_action(GUI::CommonActions::make_command_palette_action(window));
  50. help_menu->add_action(GUI::CommonActions::make_help_action([&man_file](auto&) {
  51. Desktop::Launcher::open(URL::create_with_file_scheme(man_file), "/bin/Help");
  52. }));
  53. help_menu->add_action(GUI::CommonActions::make_about_action(title, app_icon, window));
  54. window->show();
  55. window->set_icon(app_icon.bitmap_for_size(16));
  56. return app->exec();
  57. }