Serenity Operating System
at master 112 lines 4.2 kB view raw
1/* 2 * Copyright (c) 2020, Hüseyin Aslıtürk <asliturk@hotmail.com> 3 * Copyright (c) 2021, Rasmus Nylander <RasmusNylander.SerenityOS@gmail.com> 4 * 5 * SPDX-License-Identifier: BSD-2-Clause 6 */ 7 8#include "KeyboardMapperWidget.h" 9#include <LibCore/ArgsParser.h> 10#include <LibCore/System.h> 11#include <LibGUI/Action.h> 12#include <LibGUI/Application.h> 13#include <LibGUI/FilePicker.h> 14#include <LibGUI/Icon.h> 15#include <LibGUI/Menu.h> 16#include <LibGUI/Menubar.h> 17#include <LibMain/Main.h> 18 19ErrorOr<int> serenity_main(Main::Arguments arguments) 20{ 21 StringView path; 22 Core::ArgsParser args_parser; 23 args_parser.add_positional_argument(path, "Keyboard character mapping file.", "file", Core::ArgsParser::Required::No); 24 args_parser.parse(arguments); 25 26 TRY(Core::System::pledge("stdio getkeymap thread rpath cpath wpath recvfd sendfd unix")); 27 28 auto app = TRY(GUI::Application::try_create(arguments)); 29 30 TRY(Core::System::pledge("stdio getkeymap thread rpath cpath wpath recvfd sendfd")); 31 32 auto app_icon = GUI::Icon::default_icon("app-keyboard-mapper"sv); 33 34 auto window = GUI::Window::construct(); 35 window->set_title("Keyboard Mapper"); 36 window->set_icon(app_icon.bitmap_for_size(16)); 37 auto keyboard_mapper_widget = TRY(window->set_main_widget<KeyboardMapperWidget>()); 38 window->resize(775, 315); 39 window->set_resizable(false); 40 41 if (path.is_empty()) 42 TRY(keyboard_mapper_widget->load_map_from_system()); 43 else 44 TRY(keyboard_mapper_widget->load_map_from_file(path)); 45 46 TRY(Core::System::pledge("stdio thread rpath cpath wpath recvfd sendfd")); 47 48 auto open_action = GUI::CommonActions::make_open_action( 49 [&](auto&) { 50 if (!keyboard_mapper_widget->request_close()) 51 return; 52 53 Optional<DeprecatedString> path = GUI::FilePicker::get_open_filepath(window, "Open"sv, "/res/keymaps/"sv); 54 if (!path.has_value()) 55 return; 56 57 if (auto error_or = keyboard_mapper_widget->load_map_from_file(path.value()); error_or.is_error()) 58 keyboard_mapper_widget->show_error_to_user(error_or.release_error()); 59 }); 60 61 auto save_action = GUI::CommonActions::make_save_action( 62 [&](auto&) { 63 if (auto error_or = keyboard_mapper_widget->save(); error_or.is_error()) 64 keyboard_mapper_widget->show_error_to_user(error_or.release_error()); 65 }); 66 67 auto save_as_action = GUI::CommonActions::make_save_as_action([&](auto&) { 68 DeprecatedString name = "Unnamed"; 69 Optional<DeprecatedString> save_path = GUI::FilePicker::get_save_filepath(window, name, "json"); 70 if (!save_path.has_value()) 71 return; 72 73 if (auto error_or = keyboard_mapper_widget->save_to_file(save_path.value()); error_or.is_error()) 74 keyboard_mapper_widget->show_error_to_user(error_or.release_error()); 75 }); 76 77 auto quit_action = GUI::CommonActions::make_quit_action( 78 [&](auto&) { 79 app->quit(); 80 }); 81 82 auto auto_modifier_action = GUI::Action::create("Auto Modifier", [&](auto& act) { 83 keyboard_mapper_widget->set_automatic_modifier(act.is_checked()); 84 }); 85 auto_modifier_action->set_status_tip("Toggle automatic modifier"); 86 auto_modifier_action->set_checkable(true); 87 auto_modifier_action->set_checked(false); 88 89 auto& file_menu = window->add_menu("&File"); 90 file_menu.add_action(open_action); 91 file_menu.add_action(save_action); 92 file_menu.add_action(save_as_action); 93 file_menu.add_separator(); 94 file_menu.add_action(quit_action); 95 96 auto& settings_menu = window->add_menu("&Settings"); 97 settings_menu.add_action(auto_modifier_action); 98 99 auto& help_menu = window->add_menu("&Help"); 100 help_menu.add_action(GUI::CommonActions::make_command_palette_action(window)); 101 help_menu.add_action(GUI::CommonActions::make_about_action("Keyboard Mapper", app_icon, window)); 102 103 window->on_close_request = [&]() -> GUI::Window::CloseRequestDecision { 104 if (keyboard_mapper_widget->request_close()) 105 return GUI::Window::CloseRequestDecision::Close; 106 return GUI::Window::CloseRequestDecision::StayOpen; 107 }; 108 109 window->show(); 110 111 return app->exec(); 112}