diff options
author | Timur Sultanov <SultanovTS@yandex.ru> | 2022-01-19 14:44:56 +0300 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-02-03 00:47:22 +0100 |
commit | b9c558f6c6e4adb3e10d9bc94dcdbec793f5bc23 (patch) | |
tree | 67fdf26d250f5a6bce4339ff03ba5c706f6d5311 /Userland/Applets/Keymap | |
parent | 68a01f0e273675ba225e29c1522d997a5d898e61 (diff) | |
download | serenity-b9c558f6c6e4adb3e10d9bc94dcdbec793f5bc23.zip |
WindowServer+Keymap+LibGUI: Add widget to display current keymap
Diffstat (limited to 'Userland/Applets/Keymap')
-rw-r--r-- | Userland/Applets/Keymap/CMakeLists.txt | 13 | ||||
-rw-r--r-- | Userland/Applets/Keymap/KeymapStatusWindow.cpp | 44 | ||||
-rw-r--r-- | Userland/Applets/Keymap/KeymapStatusWindow.h | 27 | ||||
-rw-r--r-- | Userland/Applets/Keymap/main.cpp | 30 |
4 files changed, 114 insertions, 0 deletions
diff --git a/Userland/Applets/Keymap/CMakeLists.txt b/Userland/Applets/Keymap/CMakeLists.txt new file mode 100644 index 0000000000..2092d2de68 --- /dev/null +++ b/Userland/Applets/Keymap/CMakeLists.txt @@ -0,0 +1,13 @@ +serenity_component( + Keymap.Applet + REQUIRED + TARGETS Keymap.Applet +) + +set(SOURCES + KeymapStatusWindow.cpp + main.cpp +) + +serenity_bin(Keymap.Applet) +target_link_libraries(Keymap.Applet LibGUI LibCore LibGfx LibMain LibKeyboard) diff --git a/Userland/Applets/Keymap/KeymapStatusWindow.cpp b/Userland/Applets/Keymap/KeymapStatusWindow.cpp new file mode 100644 index 0000000000..e8db0d0b0f --- /dev/null +++ b/Userland/Applets/Keymap/KeymapStatusWindow.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2021, Timur Sultanov <SultanovTS@yandex.ru> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "KeymapStatusWindow.h" +#include <LibGUI/Painter.h> +#include <LibGUI/WindowManagerServerConnection.h> +#include <LibKeyboard/CharacterMap.h> + +KeymapStatusWindow::KeymapStatusWindow() +{ + set_window_type(GUI::WindowType::Applet); + set_has_alpha_channel(true); + m_label = &set_main_widget<GUI::Label>(); + + auto current_keymap = MUST(Keyboard::CharacterMap::fetch_system_map()); + auto current_keymap_name = current_keymap.character_map_name(); + m_label->set_tooltip(current_keymap_name); + m_label->set_text(current_keymap_name.substring(0, 2)); +} + +KeymapStatusWindow::~KeymapStatusWindow() +{ +} + +void KeymapStatusWindow::wm_event(GUI::WMEvent& event) +{ + if (event.type() == GUI::WMEvent::WM_KeymapChanged) { + auto& keymap_event = static_cast<GUI::WMKeymapChangedEvent&>(event); + auto keymap = keymap_event.keymap(); + set_keymap_text(keymap); + } +} + +void KeymapStatusWindow::set_keymap_text(const String& keymap) +{ + GUI::Painter painter(*m_label); + painter.clear_rect(m_label->rect(), Color::from_rgba(0)); + + m_label->set_tooltip(keymap); + m_label->set_text(keymap.substring(0, 2)); +} diff --git a/Userland/Applets/Keymap/KeymapStatusWindow.h b/Userland/Applets/Keymap/KeymapStatusWindow.h new file mode 100644 index 0000000000..8f460c1026 --- /dev/null +++ b/Userland/Applets/Keymap/KeymapStatusWindow.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2021, Timur Sultanov <SultanovTS@yandex.ru> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <LibGUI/Label.h> +#include <LibGUI/Window.h> + +class KeymapStatusWidget; + +class KeymapStatusWindow final : public GUI::Window { + C_OBJECT(KeymapStatusWindow) +public: + virtual ~KeymapStatusWindow() override; + +private: + void wm_event(GUI::WMEvent&) override; + + KeymapStatusWindow(); + + RefPtr<GUI::Label> m_label; + + void set_keymap_text(String const& keymap); +}; diff --git a/Userland/Applets/Keymap/main.cpp b/Userland/Applets/Keymap/main.cpp new file mode 100644 index 0000000000..0dc68e811d --- /dev/null +++ b/Userland/Applets/Keymap/main.cpp @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2021, Timur Sultanov <SultanovTS@yandex.ru> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "KeymapStatusWindow.h" +#include <LibCore/System.h> +#include <LibGUI/Application.h> +#include <LibGUI/WindowManagerServerConnection.h> +#include <LibMain/Main.h> +#include <WindowServer/Window.h> + +ErrorOr<int> serenity_main(Main::Arguments arguments) +{ + TRY(Core::System::pledge("stdio recvfd sendfd rpath unix getkeymap")); + + auto app = TRY(GUI::Application::try_create(arguments)); + + auto window = TRY(KeymapStatusWindow::try_create()); + window->set_has_alpha_channel(true); + window->set_title("Keymap"); + window->resize(16, 16); + window->show(); + window->make_window_manager(WindowServer::WMEventMask::KeymapChanged); + + TRY(Core::System::pledge("stdio recvfd sendfd rpath getkeymap")); + + return app->exec(); +} |