diff --git a/Userland/Applications/KeyboardMapper/KeyboardMapperWidget.cpp b/Userland/Applications/KeyboardMapper/KeyboardMapperWidget.cpp index 929dcb2382..4271223d75 100644 --- a/Userland/Applications/KeyboardMapper/KeyboardMapperWidget.cpp +++ b/Userland/Applications/KeyboardMapper/KeyboardMapperWidget.cpp @@ -21,6 +21,22 @@ KeyboardMapperWidget::KeyboardMapperWidget() create_frame(); } +bool KeyboardMapperWidget::request_close() +{ + if (!window()->is_modified()) + return true; + auto result = GUI::MessageBox::ask_about_unsaved_changes(window(), m_filename); + if (result == GUI::MessageBox::ExecYes) { + ErrorOr error_or = save(); + if (error_or.is_error()) + show_error_to_user(error_or.error()); + + if (!window()->is_modified()) + return true; + } + return result == GUI::MessageBox::ExecNo; +} + void KeyboardMapperWidget::create_frame() { set_fill_with_background_color(true); diff --git a/Userland/Applications/KeyboardMapper/KeyboardMapperWidget.h b/Userland/Applications/KeyboardMapper/KeyboardMapperWidget.h index fb84580f1d..f63c98d389 100644 --- a/Userland/Applications/KeyboardMapper/KeyboardMapperWidget.h +++ b/Userland/Applications/KeyboardMapper/KeyboardMapperWidget.h @@ -25,6 +25,8 @@ public: void show_error_to_user(Error); void set_automatic_modifier(bool checked); + bool request_close(); + protected: virtual void keydown_event(GUI::KeyEvent&) override; virtual void keyup_event(GUI::KeyEvent&) override; diff --git a/Userland/Applications/KeyboardMapper/main.cpp b/Userland/Applications/KeyboardMapper/main.cpp index 1ebab62cad..e532fb9d0c 100644 --- a/Userland/Applications/KeyboardMapper/main.cpp +++ b/Userland/Applications/KeyboardMapper/main.cpp @@ -47,6 +47,9 @@ ErrorOr serenity_main(Main::Arguments arguments) auto open_action = GUI::CommonActions::make_open_action( [&](auto&) { + if (!keyboard_mapper_widget->request_close()) + return; + Optional path = GUI::FilePicker::get_open_filepath(window, "Open", "/res/keymaps/"); if (!path.has_value()) return; @@ -99,6 +102,12 @@ ErrorOr serenity_main(Main::Arguments arguments) auto& help_menu = window->add_menu("&Help"); help_menu.add_action(GUI::CommonActions::make_about_action("Keyboard Mapper", app_icon, window)); + window->on_close_request = [&]() -> GUI::Window::CloseRequestDecision { + if (keyboard_mapper_widget->request_close()) + return GUI::Window::CloseRequestDecision::Close; + return GUI::Window::CloseRequestDecision::StayOpen; + }; + window->show(); return app->exec();