summaryrefslogtreecommitdiff
path: root/Userland/Applets/Keymap
diff options
context:
space:
mode:
authorTimur Sultanov <SultanovTS@yandex.ru>2022-01-19 14:44:56 +0300
committerAndreas Kling <kling@serenityos.org>2022-02-03 00:47:22 +0100
commitb9c558f6c6e4adb3e10d9bc94dcdbec793f5bc23 (patch)
tree67fdf26d250f5a6bce4339ff03ba5c706f6d5311 /Userland/Applets/Keymap
parent68a01f0e273675ba225e29c1522d997a5d898e61 (diff)
downloadserenity-b9c558f6c6e4adb3e10d9bc94dcdbec793f5bc23.zip
WindowServer+Keymap+LibGUI: Add widget to display current keymap
Diffstat (limited to 'Userland/Applets/Keymap')
-rw-r--r--Userland/Applets/Keymap/CMakeLists.txt13
-rw-r--r--Userland/Applets/Keymap/KeymapStatusWindow.cpp44
-rw-r--r--Userland/Applets/Keymap/KeymapStatusWindow.h27
-rw-r--r--Userland/Applets/Keymap/main.cpp30
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();
+}