@@ -135,6 +135,13 @@ class KeymapModel final : public GUI::Model {
135
135
invalidate ();
136
136
}
137
137
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
+
138
145
Vector<String> const & keymaps () const { return m_data; }
139
146
140
147
private:
@@ -173,6 +180,15 @@ KeyboardSettingsWidget::KeyboardSettingsWidget()
173
180
174
181
keymaps_list_model.set_active_keymap (m_initial_active_keymap);
175
182
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
+
176
192
m_add_keymap_button = find_descendant_of_type_named<GUI::Button>(" add_keymap_button" );
177
193
178
194
m_add_keymap_button->on_click = [&](auto ) {
@@ -185,23 +201,29 @@ KeyboardSettingsWidget::KeyboardSettingsWidget()
185
201
186
202
m_remove_keymap_button->on_click = [&](auto ) {
187
203
auto & selection = m_selected_keymaps_listview->selection ();
204
+ bool active_keymap_deleted = false ;
188
205
for (auto & index : selection.indices ()) {
206
+ if (keymaps_list_model.keymap_at (index.row ()) == keymaps_list_model.active_keymap ())
207
+ active_keymap_deleted = true ;
189
208
keymaps_list_model.remove_at (index.row ());
190
209
}
210
+ if (active_keymap_deleted)
211
+ keymaps_list_model.set_active_keymap (keymaps_list_model.keymap_at (0 ));
191
212
};
192
213
193
214
m_selected_keymaps_listview->on_selection_change = [&]() {
194
215
auto & selection = m_selected_keymaps_listview->selection ();
195
216
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 ());
196
218
};
197
219
198
220
m_test_typing_area = *find_descendant_of_type_named<GUI::TextEditor>(" test_typing_area" );
199
221
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 () );
201
223
};
202
224
203
225
m_test_typing_area->on_focusout = [&]() {
204
- set_keymaps (m_initial_keymap_list);
226
+ set_keymaps (m_initial_keymap_list, m_initial_active_keymap );
205
227
};
206
228
207
229
m_clear_test_typing_area_button = find_descendant_of_type_named<GUI::Button>(" button_clear_test_typing_area" );
@@ -216,36 +238,37 @@ KeyboardSettingsWidget::KeyboardSettingsWidget()
216
238
217
239
KeyboardSettingsWidget::~KeyboardSettingsWidget ()
218
240
{
219
- set_keymaps (m_initial_keymap_list);
241
+ set_keymaps (m_initial_keymap_list, m_initial_active_keymap );
220
242
}
221
243
222
244
void KeyboardSettingsWidget::window_activated (bool is_active_window)
223
245
{
224
246
if (is_active_window && m_test_typing_area->is_focused ()) {
225
247
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 () );
227
249
} else {
228
- set_keymaps (m_initial_keymap_list);
250
+ set_keymaps (m_initial_keymap_list, m_initial_active_keymap );
229
251
}
230
252
}
231
253
232
254
void KeyboardSettingsWidget::apply_settings ()
233
255
{
234
256
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 () );
236
258
m_initial_keymap_list.clear ();
237
259
for (auto & keymap : m_keymaps_list_model.keymaps ()) {
238
260
m_initial_keymap_list.append (keymap);
239
261
}
262
+ m_initial_active_keymap = m_keymaps_list_model.active_keymap ();
240
263
Config::write_bool (" KeyboardSettings" , " StartupEnable" , " NumLock" , m_num_lock_checkbox->is_checked ());
241
264
}
242
265
243
- void KeyboardSettingsWidget::set_keymaps (Vector<String> const & keymaps)
266
+ void KeyboardSettingsWidget::set_keymaps (Vector<String> const & keymaps, String const & active_keymap )
244
267
{
245
268
pid_t child_pid;
246
269
247
270
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 };
249
272
if ((errno = posix_spawn (&child_pid, " /bin/keymap" , nullptr , nullptr , const_cast <char **>(argv), environ))) {
250
273
perror (" posix_spawn" );
251
274
exit (1 );
0 commit comments