Skip to content

Commit 2c44c7f

Browse files
nfrapradoawesomekling
authored andcommitted
KeyboardSettings: Allow changing and applying active keymap
Previously only the list of allowed keymaps could be modified and applied to the system. Add a new button to activate the selected keymap from the list. When applying the changes to the system, also apply the active keymap.
1 parent a48d7d6 commit 2c44c7f

File tree

3 files changed

+40
-9
lines changed

3 files changed

+40
-9
lines changed

Userland/Applications/KeyboardSettings/Keyboard.gml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@
3939
spacing: 4
4040
}
4141

42+
@GUI::Button {
43+
name: "activate_keymap_button"
44+
text: "Activate keymap"
45+
enabled: false
46+
}
47+
4248
@GUI::Button {
4349
name: "add_keymap_button"
4450
text: "Add keymap"

Userland/Applications/KeyboardSettings/KeyboardSettingsWidget.cpp

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,13 @@ class KeymapModel final : public GUI::Model {
135135
invalidate();
136136
}
137137

138+
String const& active_keymap() { return m_active_keymap; }
139+
140+
String const& keymap_at(size_t index)
141+
{
142+
return m_data[index];
143+
}
144+
138145
Vector<String> const& keymaps() const { return m_data; }
139146

140147
private:
@@ -173,6 +180,15 @@ KeyboardSettingsWidget::KeyboardSettingsWidget()
173180

174181
keymaps_list_model.set_active_keymap(m_initial_active_keymap);
175182

183+
m_activate_keymap_button = find_descendant_of_type_named<GUI::Button>("activate_keymap_button");
184+
m_activate_keymap_button->on_click = [&](auto) {
185+
auto& selection = m_selected_keymaps_listview->selection();
186+
if (!selection.is_empty()) {
187+
auto& selected_keymap = keymaps_list_model.keymap_at(selection.first().row());
188+
keymaps_list_model.set_active_keymap(selected_keymap);
189+
}
190+
};
191+
176192
m_add_keymap_button = find_descendant_of_type_named<GUI::Button>("add_keymap_button");
177193

178194
m_add_keymap_button->on_click = [&](auto) {
@@ -185,23 +201,29 @@ KeyboardSettingsWidget::KeyboardSettingsWidget()
185201

186202
m_remove_keymap_button->on_click = [&](auto) {
187203
auto& selection = m_selected_keymaps_listview->selection();
204+
bool active_keymap_deleted = false;
188205
for (auto& index : selection.indices()) {
206+
if (keymaps_list_model.keymap_at(index.row()) == keymaps_list_model.active_keymap())
207+
active_keymap_deleted = true;
189208
keymaps_list_model.remove_at(index.row());
190209
}
210+
if (active_keymap_deleted)
211+
keymaps_list_model.set_active_keymap(keymaps_list_model.keymap_at(0));
191212
};
192213

193214
m_selected_keymaps_listview->on_selection_change = [&]() {
194215
auto& selection = m_selected_keymaps_listview->selection();
195216
m_remove_keymap_button->set_enabled(!selection.is_empty() && keymaps_list_model.keymaps().size() > 1);
217+
m_activate_keymap_button->set_enabled(!selection.is_empty());
196218
};
197219

198220
m_test_typing_area = *find_descendant_of_type_named<GUI::TextEditor>("test_typing_area");
199221
m_test_typing_area->on_focusin = [&]() {
200-
set_keymaps(keymaps_list_model.keymaps());
222+
set_keymaps(keymaps_list_model.keymaps(), keymaps_list_model.active_keymap());
201223
};
202224

203225
m_test_typing_area->on_focusout = [&]() {
204-
set_keymaps(m_initial_keymap_list);
226+
set_keymaps(m_initial_keymap_list, m_initial_active_keymap);
205227
};
206228

207229
m_clear_test_typing_area_button = find_descendant_of_type_named<GUI::Button>("button_clear_test_typing_area");
@@ -216,36 +238,37 @@ KeyboardSettingsWidget::KeyboardSettingsWidget()
216238

217239
KeyboardSettingsWidget::~KeyboardSettingsWidget()
218240
{
219-
set_keymaps(m_initial_keymap_list);
241+
set_keymaps(m_initial_keymap_list, m_initial_active_keymap);
220242
}
221243

222244
void KeyboardSettingsWidget::window_activated(bool is_active_window)
223245
{
224246
if (is_active_window && m_test_typing_area->is_focused()) {
225247
auto& keymaps_list_model = static_cast<KeymapModel&>(*m_selected_keymaps_listview->model());
226-
set_keymaps(keymaps_list_model.keymaps());
248+
set_keymaps(keymaps_list_model.keymaps(), keymaps_list_model.active_keymap());
227249
} else {
228-
set_keymaps(m_initial_keymap_list);
250+
set_keymaps(m_initial_keymap_list, m_initial_active_keymap);
229251
}
230252
}
231253

232254
void KeyboardSettingsWidget::apply_settings()
233255
{
234256
auto& m_keymaps_list_model = static_cast<KeymapModel&>(*m_selected_keymaps_listview->model());
235-
set_keymaps(m_keymaps_list_model.keymaps());
257+
set_keymaps(m_keymaps_list_model.keymaps(), m_keymaps_list_model.active_keymap());
236258
m_initial_keymap_list.clear();
237259
for (auto& keymap : m_keymaps_list_model.keymaps()) {
238260
m_initial_keymap_list.append(keymap);
239261
}
262+
m_initial_active_keymap = m_keymaps_list_model.active_keymap();
240263
Config::write_bool("KeyboardSettings", "StartupEnable", "NumLock", m_num_lock_checkbox->is_checked());
241264
}
242265

243-
void KeyboardSettingsWidget::set_keymaps(Vector<String> const& keymaps)
266+
void KeyboardSettingsWidget::set_keymaps(Vector<String> const& keymaps, String const& active_keymap)
244267
{
245268
pid_t child_pid;
246269

247270
auto keymaps_string = String::join(',', keymaps);
248-
const char* argv[] = { "/bin/keymap", "-s", keymaps_string.characters(), nullptr };
271+
const char* argv[] = { "/bin/keymap", "-s", keymaps_string.characters(), "-m", active_keymap.characters(), nullptr };
249272
if ((errno = posix_spawn(&child_pid, "/bin/keymap", nullptr, nullptr, const_cast<char**>(argv), environ))) {
250273
perror("posix_spawn");
251274
exit(1);

Userland/Applications/KeyboardSettings/KeyboardSettingsWidget.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,16 @@ class KeyboardSettingsWidget final : public GUI::SettingsWindow::Tab {
2626
private:
2727
KeyboardSettingsWidget();
2828

29-
void set_keymaps(Vector<String> const& keymaps);
29+
void set_keymaps(Vector<String> const& keymaps, String const& active_keymap);
3030

3131
Vector<String> m_initial_keymap_list;
3232

3333
String m_initial_active_keymap;
3434

3535
RefPtr<GUI::ListView> m_selected_keymaps_listview;
36+
RefPtr<GUI::Label> m_active_keymap_label;
3637
RefPtr<GUI::CheckBox> m_num_lock_checkbox;
38+
RefPtr<GUI::Button> m_activate_keymap_button;
3739
RefPtr<GUI::Button> m_add_keymap_button;
3840
RefPtr<GUI::Button> m_remove_keymap_button;
3941
RefPtr<GUI::TextEditor> m_test_typing_area;

0 commit comments

Comments
 (0)