5
5
#include <string.h>
6
6
#include <strings.h>
7
7
#include <sys/stat.h>
8
+ #include "keyboard-layouts.h"
8
9
#include "tweaks.h"
9
10
#include "xml.h"
10
11
@@ -15,6 +16,7 @@ static GtkWidget *icon_theme_name;
15
16
static GtkWidget * cursor_theme_name ;
16
17
static GtkWidget * cursor_size ;
17
18
static GtkWidget * natural_scroll ;
19
+ static GtkWidget * keyboard_layout ;
18
20
19
21
static struct themes openbox_themes = { 0 };
20
22
static struct themes gtk_themes = { 0 };
@@ -35,7 +37,6 @@ spawn_sync(char const *command)
35
37
}
36
38
}
37
39
38
-
39
40
static void
40
41
environment_set (const char * key , const char * value )
41
42
{
@@ -94,6 +95,15 @@ set_value_num(GSettings *settings, const char *key, int value)
94
95
g_settings_set_value (settings , key , g_variant_new ("i" , value ));
95
96
}
96
97
98
+ const char * first_field (const char * s , char delim )
99
+ {
100
+ char * p = strchr (s , delim );
101
+ if (p ) {
102
+ * p = '\0' ;
103
+ }
104
+ return s ;
105
+ }
106
+
97
107
#define COMBO_TEXT (w ) gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(w))
98
108
#define SPIN_BUTTON_VAL (w ) gtk_spin_button_get_value(GTK_SPIN_BUTTON(w))
99
109
#define SPIN_BUTTON_VAL_INT (w ) (int)SPIN_BUTTON_VAL(w)
@@ -116,6 +126,7 @@ update(GtkWidget *widget, gpointer data)
116
126
/* ~/.config/labwc/environment */
117
127
environment_set ("XCURSOR_THEME" , COMBO_TEXT (cursor_theme_name ));
118
128
environment_set_num ("XCURSOR_SIZE" , SPIN_BUTTON_VAL_INT (cursor_size ));
129
+ environment_set ("XKB_DEFAULT_LAYOUT" , first_field (COMBO_TEXT (keyboard_layout ), ' ' ));
119
130
120
131
if (!g_strcmp0 (COMBO_TEXT (openbox_theme_name ), "GTK" )) {
121
132
spawn_sync ("labwc-gtktheme.py" );
@@ -225,7 +236,7 @@ activate(GtkApplication *app, gpointer user_data)
225
236
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (cursor_theme_name ), theme -> name );
226
237
}
227
238
gtk_combo_box_set_active (GTK_COMBO_BOX (cursor_theme_name ), active );
228
- gtk_grid_attach (GTK_GRID (grid ),cursor_theme_name , 1 , row ++ , 1 , 1 );
239
+ gtk_grid_attach (GTK_GRID (grid ), cursor_theme_name , 1 , row ++ , 1 , 1 );
229
240
230
241
/* cursor size spinbutton */
231
242
widget = gtk_label_new ("cursor size" );
@@ -246,6 +257,35 @@ activate(GtkApplication *app, gpointer user_data)
246
257
gtk_combo_box_set_active (GTK_COMBO_BOX (natural_scroll ), xml_get_bool_text ("/labwc_config/libinput/device/naturalscroll" ));
247
258
gtk_grid_attach (GTK_GRID (grid ), natural_scroll , 1 , row ++ , 1 , 1 );
248
259
260
+
261
+ /* keyboard layout */
262
+ GList * keyboard_layouts = NULL ;
263
+ keyboard_layouts_init (& keyboard_layouts , "/usr/share/X11/xkb/rules/evdev.lst" );
264
+
265
+ widget = gtk_label_new ("keyboard layout" );
266
+ gtk_widget_set_halign (widget , GTK_ALIGN_START );
267
+ gtk_grid_attach (GTK_GRID (grid ), widget , 0 , row , 1 , 1 );
268
+ keyboard_layout = gtk_combo_box_text_new ();
269
+
270
+ active_id = "gb" ;
271
+ active = -1 ;
272
+
273
+ GList * iter ;
274
+ int i = 0 ;
275
+ for (iter = keyboard_layouts ; iter ; iter = iter -> next ) {
276
+ struct layout * layout = (struct layout * )iter -> data ;
277
+ if (!strcmp (layout -> lang , active_id )) {
278
+ active = i ;
279
+ }
280
+ char buf [256 ];
281
+ snprintf (buf , sizeof (buf ), "%s %s" , layout -> lang , layout -> description );
282
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (keyboard_layout ), buf );
283
+ ++ i ;
284
+ }
285
+ gtk_combo_box_set_active (GTK_COMBO_BOX (keyboard_layout ), active );
286
+ gtk_grid_attach (GTK_GRID (grid ), keyboard_layout , 1 , row ++ , 1 , 1 );
287
+ keyboard_layouts_finish (keyboard_layouts );
288
+
249
289
/* bottom button box */
250
290
hbbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL );
251
291
gtk_box_pack_start (GTK_BOX (vbox ), hbbox , TRUE, TRUE, 5 );
0 commit comments