Merge lp:~kalgasnik/lightdm-gtk-greeter/alternative_layouts_indicator into lp:~lightdm-gtk-greeter-team/lightdm-gtk-greeter/trunk
- alternative_layouts_indicator
- Merge into trunk
Proposed by
Andrew P.
Status: | Merged |
---|---|
Merged at revision: | 286 |
Proposed branch: | lp:~kalgasnik/lightdm-gtk-greeter/alternative_layouts_indicator |
Merge into: | lp:~lightdm-gtk-greeter-team/lightdm-gtk-greeter/trunk |
Diff against target: |
460 lines (+307/-19) 6 files modified
configure.ac (+9/-0) src/Makefile.am (+14/-3) src/lightdm-gtk-greeter-application.css (+4/-0) src/lightdm-gtk-greeter-fallback.css (+12/-0) src/lightdm-gtk-greeter.c (+254/-16) src/lightdm-gtk-greeter.glade (+14/-0) |
To merge this branch: | bzr merge lp:~kalgasnik/lightdm-gtk-greeter/alternative_layouts_indicator |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
LightDM Gtk+ Greeter Development Team | Pending | ||
Review via email: mp+221187@code.launchpad.net |
Commit message
Description of the change
New builtin indicator: layout
Two implementations:
1. Default - using LightDM API
2. "--with-
CSS:
- application.css: loaded with APPLICATION priority
- fallback.css: loaded with FALLBACK priority of current theme do not have greeter support, with APPLICATION in other case.
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'configure.ac' | |||
2 | --- configure.ac 2014-05-04 11:59:11 +0000 | |||
3 | +++ configure.ac 2014-05-28 09:19:24 +0000 | |||
4 | @@ -105,6 +105,15 @@ | |||
5 | 105 | AC_DEFINE([START_INDICATOR_SERVICES], [], [Try to start indicator-services]) | 105 | AC_DEFINE([START_INDICATOR_SERVICES], [], [Try to start indicator-services]) |
6 | 106 | ]) | 106 | ]) |
7 | 107 | 107 | ||
8 | 108 | AC_ARG_WITH([libxklavier], AS_HELP_STRING([--with-libxklavier], [Use libxklavier to manage layouts (instead of LightDM API)])) | ||
9 | 109 | |||
10 | 110 | AS_IF([test "x$with_libxklavier" = "xyes"], | ||
11 | 111 | [ | ||
12 | 112 | PKG_CHECK_MODULES([LIBXKLAVIER], [libxklavier], [have_xklavier=yes]) | ||
13 | 113 | AC_DEFINE([HAVE_LIBXKLAVIER], [1], [Define if "libxklavier" is present]) | ||
14 | 114 | ], | ||
15 | 115 | []) | ||
16 | 116 | |||
17 | 108 | dnl ########################################################################### | 117 | dnl ########################################################################### |
18 | 109 | dnl Internationalization | 118 | dnl Internationalization |
19 | 110 | dnl ########################################################################### | 119 | dnl ########################################################################### |
20 | 111 | 120 | ||
21 | === modified file 'src/Makefile.am' | |||
22 | --- src/Makefile.am 2014-01-29 19:08:35 +0000 | |||
23 | +++ src/Makefile.am 2014-05-28 09:19:24 +0000 | |||
24 | @@ -1,7 +1,9 @@ | |||
25 | 1 | sbin_PROGRAMS = lightdm-gtk-greeter | 1 | sbin_PROGRAMS = lightdm-gtk-greeter |
26 | 2 | 2 | ||
27 | 3 | lightdm_gtk_greeter_built_sources = \ | 3 | lightdm_gtk_greeter_built_sources = \ |
29 | 4 | lightdm-gtk-greeter-ui.h | 4 | lightdm-gtk-greeter-ui.h \ |
30 | 5 | lightdm-gtk-greeter-css-fallback.h \ | ||
31 | 6 | lightdm-gtk-greeter-css-application.h | ||
32 | 5 | 7 | ||
33 | 6 | lightdm_gtk_greeter_SOURCES = \ | 8 | lightdm_gtk_greeter_SOURCES = \ |
34 | 7 | $(lightdm_gtk_greeter_built_sources) \ | 9 | $(lightdm_gtk_greeter_built_sources) \ |
35 | @@ -34,13 +36,20 @@ | |||
36 | 34 | $(LIGHTDMGOBJECT_LIBS) \ | 36 | $(LIGHTDMGOBJECT_LIBS) \ |
37 | 35 | $(LIBX11_LIBS) \ | 37 | $(LIBX11_LIBS) \ |
38 | 36 | $(LIBINDICATOR_LIBS) \ | 38 | $(LIBINDICATOR_LIBS) \ |
40 | 37 | $(LIBIDO_LIBS) | 39 | $(LIBIDO_LIBS) \ |
41 | 40 | $(LIBXKLAVIER_LIBS) | ||
42 | 38 | 41 | ||
43 | 39 | if MAINTAINER_MODE | 42 | if MAINTAINER_MODE |
44 | 40 | 43 | ||
45 | 41 | lightdm-gtk-greeter-ui.h: $(srcdir)/lightdm-gtk-greeter.glade Makefile | 44 | lightdm-gtk-greeter-ui.h: $(srcdir)/lightdm-gtk-greeter.glade Makefile |
46 | 42 | $(AM_V_GEN) exo-csource --static --strip-comments --strip-content --name=lightdm_gtk_greeter_ui $< >$@ | 45 | $(AM_V_GEN) exo-csource --static --strip-comments --strip-content --name=lightdm_gtk_greeter_ui $< >$@ |
47 | 43 | 46 | ||
48 | 47 | lightdm-gtk-greeter-css-fallback.h: $(srcdir)/lightdm-gtk-greeter-fallback.css Makefile | ||
49 | 48 | $(AM_V_GEN) exo-csource --static --name=lightdm_gtk_greeter_css_fallback $< >$@ | ||
50 | 49 | |||
51 | 50 | lightdm-gtk-greeter-css-application.h: $(srcdir)/lightdm-gtk-greeter-application.css Makefile | ||
52 | 51 | $(AM_V_GEN) exo-csource --static --name=lightdm_gtk_greeter_css_application $< >$@ | ||
53 | 52 | |||
54 | 44 | DISTCLEANFILES = \ | 53 | DISTCLEANFILES = \ |
55 | 45 | $(lightdm_gtk_greeter_built_sources) | 54 | $(lightdm_gtk_greeter_built_sources) |
56 | 46 | 55 | ||
57 | @@ -50,4 +59,6 @@ | |||
58 | 50 | endif | 59 | endif |
59 | 51 | 60 | ||
60 | 52 | EXTRA_DIST = \ | 61 | EXTRA_DIST = \ |
62 | 53 | lightdm-gtk-greeter.glade | 62 | lightdm-gtk-greeter.glade \ |
63 | 63 | lightdm-gtk-greeter-fallback.css \ | ||
64 | 64 | lightdm-gtk-greeter-application.css | ||
65 | 54 | 65 | ||
66 | === added file 'src/lightdm-gtk-greeter-application.css' | |||
67 | --- src/lightdm-gtk-greeter-application.css 1970-01-01 00:00:00 +0000 | |||
68 | +++ src/lightdm-gtk-greeter-application.css 2014-05-28 09:19:24 +0000 | |||
69 | @@ -0,0 +1,4 @@ | |||
70 | 1 | * | ||
71 | 2 | { | ||
72 | 3 | -GtkWidget-window-dragging: false; | ||
73 | 4 | } | ||
74 | 0 | 5 | ||
75 | === added file 'src/lightdm-gtk-greeter-fallback.css' | |||
76 | --- src/lightdm-gtk-greeter-fallback.css 1970-01-01 00:00:00 +0000 | |||
77 | +++ src/lightdm-gtk-greeter-fallback.css 2014-05-28 09:19:24 +0000 | |||
78 | @@ -0,0 +1,12 @@ | |||
79 | 1 | #layout_menuitem>GtkLabel | ||
80 | 2 | { | ||
81 | 3 | border: 1px solid alpha(@menu_fg_color, 0.8); | ||
82 | 4 | border-radius: 0.5em; | ||
83 | 5 | padding: 0px 0.25em; | ||
84 | 6 | background: alpha(@menu_fg_color, 0.2); | ||
85 | 7 | } | ||
86 | 8 | |||
87 | 9 | #layout_menuitem | ||
88 | 10 | { | ||
89 | 11 | padding: 1px; | ||
90 | 12 | } | ||
91 | 0 | 13 | ||
92 | === modified file 'src/lightdm-gtk-greeter.c' | |||
93 | --- src/lightdm-gtk-greeter.c 2014-05-10 00:31:27 +0000 | |||
94 | +++ src/lightdm-gtk-greeter.c 2014-05-28 09:19:24 +0000 | |||
95 | @@ -49,10 +49,19 @@ | |||
96 | 49 | #include "libido/libido.h" | 49 | #include "libido/libido.h" |
97 | 50 | #endif | 50 | #endif |
98 | 51 | 51 | ||
99 | 52 | #ifdef HAVE_LIBXKLAVIER | ||
100 | 53 | #include <libxklavier/xklavier.h> | ||
101 | 54 | #endif | ||
102 | 55 | |||
103 | 52 | #include <lightdm.h> | 56 | #include <lightdm.h> |
104 | 53 | 57 | ||
105 | 54 | #include <src/lightdm-gtk-greeter-ui.h> | 58 | #include <src/lightdm-gtk-greeter-ui.h> |
106 | 55 | 59 | ||
107 | 60 | #if GTK_CHECK_VERSION (3, 0, 0) | ||
108 | 61 | #include <src/lightdm-gtk-greeter-css-fallback.h> | ||
109 | 62 | #include <src/lightdm-gtk-greeter-css-application.h> | ||
110 | 63 | #endif | ||
111 | 64 | |||
112 | 56 | static LightDMGreeter *greeter; | 65 | static LightDMGreeter *greeter; |
113 | 57 | static GKeyFile *state; | 66 | static GKeyFile *state; |
114 | 58 | static gchar *state_filename; | 67 | static gchar *state_filename; |
115 | @@ -65,10 +74,11 @@ | |||
116 | 65 | /* Panel Widgets */ | 74 | /* Panel Widgets */ |
117 | 66 | static GtkWindow *panel_window; | 75 | static GtkWindow *panel_window; |
118 | 67 | static GtkWidget *clock_label; | 76 | static GtkWidget *clock_label; |
120 | 68 | static GtkWidget *menubar, *power_menuitem, *session_menuitem, *language_menuitem, *a11y_menuitem, *session_badge; | 77 | static GtkWidget *menubar, *power_menuitem, *session_menuitem, *language_menuitem, *a11y_menuitem, |
121 | 78 | *layout_menuitem, *session_badge; | ||
122 | 69 | static GtkWidget *suspend_menuitem, *hibernate_menuitem, *restart_menuitem, *shutdown_menuitem; | 79 | static GtkWidget *suspend_menuitem, *hibernate_menuitem, *restart_menuitem, *shutdown_menuitem; |
123 | 70 | static GtkWidget *keyboard_menuitem; | 80 | static GtkWidget *keyboard_menuitem; |
125 | 71 | static GtkMenu *session_menu, *language_menu; | 81 | static GtkMenu *session_menu, *language_menu, *layout_menu; |
126 | 72 | 82 | ||
127 | 73 | /* Login Window Widgets */ | 83 | /* Login Window Widgets */ |
128 | 74 | static GtkWindow *login_window; | 84 | static GtkWindow *login_window; |
129 | @@ -135,11 +145,22 @@ | |||
130 | 135 | DimensionPosition x, y; | 145 | DimensionPosition x, y; |
131 | 136 | } WindowPosition; | 146 | } WindowPosition; |
132 | 137 | 147 | ||
138 | 138 | const WindowPosition CENTERED_WINDOW_POS = { .x = {50, +1, TRUE, 0}, .y = {50, +1, TRUE, 0} }; | 148 | static const WindowPosition CENTERED_WINDOW_POS = { .x = {50, +1, TRUE, 0}, .y = {50, +1, TRUE, 0} }; |
139 | 139 | WindowPosition main_window_pos; | 149 | static WindowPosition main_window_pos; |
140 | 140 | 150 | ||
141 | 141 | GdkPixbuf* default_user_pixbuf = NULL; | 151 | static GdkPixbuf* default_user_pixbuf = NULL; |
142 | 142 | gchar* default_user_icon = "avatar-default"; | 152 | static gchar* default_user_icon = "avatar-default"; |
143 | 153 | |||
144 | 154 | static const gchar *LAYOUT_DATA_LABEL = "layout-label"; | ||
145 | 155 | #ifdef HAVE_LIBXKLAVIER | ||
146 | 156 | static const gchar *LAYOUT_DATA_GROUP = "layout-group"; | ||
147 | 157 | #else | ||
148 | 158 | static const gchar *LAYOUT_DATA_NAME = "layout-name"; | ||
149 | 159 | #endif | ||
150 | 160 | |||
151 | 161 | #ifdef HAVE_LIBXKLAVIER | ||
152 | 162 | static XklEngine *xkl_engine; | ||
153 | 163 | #endif | ||
154 | 143 | 164 | ||
155 | 144 | static void | 165 | static void |
156 | 145 | pam_message_finalize (PAMConversationMessage *message) | 166 | pam_message_finalize (PAMConversationMessage *message) |
157 | @@ -408,6 +429,7 @@ | |||
158 | 408 | g_hash_table_insert (builtin_items, "~session", session_menuitem); | 429 | g_hash_table_insert (builtin_items, "~session", session_menuitem); |
159 | 409 | g_hash_table_insert (builtin_items, "~language", language_menuitem); | 430 | g_hash_table_insert (builtin_items, "~language", language_menuitem); |
160 | 410 | g_hash_table_insert (builtin_items, "~a11y", a11y_menuitem); | 431 | g_hash_table_insert (builtin_items, "~a11y", a11y_menuitem); |
161 | 432 | g_hash_table_insert (builtin_items, "~layout", layout_menuitem); | ||
162 | 411 | 433 | ||
163 | 412 | g_hash_table_iter_init (&iter, builtin_items); | 434 | g_hash_table_iter_init (&iter, builtin_items); |
164 | 413 | while (g_hash_table_iter_next (&iter, NULL, &iter_value)) | 435 | while (g_hash_table_iter_next (&iter, NULL, &iter_value)) |
165 | @@ -2231,6 +2253,180 @@ | |||
166 | 2231 | return GDK_FILTER_CONTINUE; | 2253 | return GDK_FILTER_CONTINUE; |
167 | 2232 | } | 2254 | } |
168 | 2233 | 2255 | ||
169 | 2256 | /* Layout functions and callbacks */ | ||
170 | 2257 | |||
171 | 2258 | static void | ||
172 | 2259 | layout_selected_cb(GtkCheckMenuItem *menuitem, gpointer user_data) | ||
173 | 2260 | { | ||
174 | 2261 | if (gtk_check_menu_item_get_active (menuitem)) | ||
175 | 2262 | { | ||
176 | 2263 | #ifdef HAVE_LIBXKLAVIER | ||
177 | 2264 | gint group = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menuitem), LAYOUT_DATA_GROUP)); | ||
178 | 2265 | xkl_engine_lock_group (xkl_engine, group); | ||
179 | 2266 | #else | ||
180 | 2267 | const gchar *name = g_object_get_data (G_OBJECT (menuitem), LAYOUT_DATA_NAME); | ||
181 | 2268 | GList *item; | ||
182 | 2269 | for (item = lightdm_get_layouts (); item; item = g_list_next (item)) | ||
183 | 2270 | { | ||
184 | 2271 | if (g_strcmp0 (name, lightdm_layout_get_name (item->data)) == 0) | ||
185 | 2272 | { | ||
186 | 2273 | lightdm_set_layout (item->data); | ||
187 | 2274 | gtk_menu_item_set_label (GTK_MENU_ITEM (layout_menuitem), | ||
188 | 2275 | g_object_get_data (G_OBJECT (menuitem), LAYOUT_DATA_LABEL)); | ||
189 | 2276 | break; | ||
190 | 2277 | } | ||
191 | 2278 | } | ||
192 | 2279 | #endif | ||
193 | 2280 | } | ||
194 | 2281 | } | ||
195 | 2282 | |||
196 | 2283 | static void | ||
197 | 2284 | update_layouts_menu (void) | ||
198 | 2285 | { | ||
199 | 2286 | #ifdef HAVE_LIBXKLAVIER | ||
200 | 2287 | XklConfigRegistry *registry; | ||
201 | 2288 | XklConfigRec *config; | ||
202 | 2289 | XklConfigItem *config_item; | ||
203 | 2290 | GSList *menu_group = NULL; | ||
204 | 2291 | gint i; | ||
205 | 2292 | |||
206 | 2293 | g_list_free_full (gtk_container_get_children (GTK_CONTAINER (layout_menu)), | ||
207 | 2294 | (GDestroyNotify)gtk_widget_destroy); | ||
208 | 2295 | |||
209 | 2296 | config = xkl_config_rec_new (); | ||
210 | 2297 | if (!xkl_config_rec_get_from_server (config, xkl_engine)) | ||
211 | 2298 | { | ||
212 | 2299 | g_object_unref (config); | ||
213 | 2300 | g_warning ("Failed to get Xkl configuration from server"); | ||
214 | 2301 | return; | ||
215 | 2302 | } | ||
216 | 2303 | |||
217 | 2304 | config_item = xkl_config_item_new (); | ||
218 | 2305 | registry = xkl_config_registry_get_instance (xkl_engine); | ||
219 | 2306 | xkl_config_registry_load (registry, FALSE); | ||
220 | 2307 | |||
221 | 2308 | for (i = 0; config->layouts[i] != NULL; ++i) | ||
222 | 2309 | { | ||
223 | 2310 | const gchar *layout = config->layouts[i] ? config->layouts[i] : ""; | ||
224 | 2311 | const gchar *variant = config->variants[i] ? config->variants[i] : ""; | ||
225 | 2312 | gchar *label = strlen (variant) > 0 ? g_strdup_printf ("%s_%s", layout, variant) : g_strdup (layout); | ||
226 | 2313 | |||
227 | 2314 | GtkWidget *menuitem = gtk_radio_menu_item_new (menu_group); | ||
228 | 2315 | menu_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem)); | ||
229 | 2316 | |||
230 | 2317 | g_snprintf (config_item->name, sizeof (config_item->name), "%s", variant); | ||
231 | 2318 | if (xkl_config_registry_find_variant (registry, layout, config_item)) | ||
232 | 2319 | gtk_menu_item_set_label (GTK_MENU_ITEM (menuitem), config_item->description); | ||
233 | 2320 | else | ||
234 | 2321 | { | ||
235 | 2322 | g_snprintf (config_item->name, sizeof (config_item->name), "%s", layout); | ||
236 | 2323 | if (xkl_config_registry_find_layout (registry, config_item)) | ||
237 | 2324 | gtk_menu_item_set_label (GTK_MENU_ITEM (menuitem), config_item->description); | ||
238 | 2325 | else | ||
239 | 2326 | gtk_menu_item_set_label (GTK_MENU_ITEM (menuitem), label); | ||
240 | 2327 | } | ||
241 | 2328 | |||
242 | 2329 | g_object_set_data_full (G_OBJECT (menuitem), LAYOUT_DATA_LABEL, label, g_free); | ||
243 | 2330 | g_object_set_data (G_OBJECT (menuitem), LAYOUT_DATA_GROUP, GINT_TO_POINTER (i)); | ||
244 | 2331 | |||
245 | 2332 | g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (layout_selected_cb), NULL); | ||
246 | 2333 | gtk_menu_shell_append (GTK_MENU_SHELL (layout_menu), menuitem); | ||
247 | 2334 | gtk_widget_show (GTK_WIDGET (menuitem)); | ||
248 | 2335 | } | ||
249 | 2336 | |||
250 | 2337 | g_object_unref (registry); | ||
251 | 2338 | g_object_unref (config_item); | ||
252 | 2339 | g_object_unref (config); | ||
253 | 2340 | #else | ||
254 | 2341 | GSList *menu_group = NULL; | ||
255 | 2342 | GList *item; | ||
256 | 2343 | |||
257 | 2344 | g_list_free_full (gtk_container_get_children (GTK_CONTAINER (layout_menu)), | ||
258 | 2345 | (GDestroyNotify)gtk_widget_destroy); | ||
259 | 2346 | |||
260 | 2347 | for (item = lightdm_get_layouts (); item; item = g_list_next (item)) | ||
261 | 2348 | { | ||
262 | 2349 | LightDMLayout *layout = item->data; | ||
263 | 2350 | GtkWidget *menuitem = gtk_radio_menu_item_new (menu_group); | ||
264 | 2351 | menu_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem)); | ||
265 | 2352 | |||
266 | 2353 | g_object_set_data_full (G_OBJECT (menuitem), LAYOUT_DATA_LABEL, | ||
267 | 2354 | g_strdelimit (g_strdup (lightdm_layout_get_name (layout)), "\t ", '_'), g_free); | ||
268 | 2355 | g_object_set_data_full (G_OBJECT (menuitem), LAYOUT_DATA_NAME, | ||
269 | 2356 | g_strdup (lightdm_layout_get_name (layout)), g_free); | ||
270 | 2357 | |||
271 | 2358 | g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (layout_selected_cb), NULL); | ||
272 | 2359 | gtk_menu_item_set_label (GTK_MENU_ITEM (menuitem), lightdm_layout_get_description (layout)); | ||
273 | 2360 | gtk_menu_shell_append (GTK_MENU_SHELL (layout_menu), menuitem); | ||
274 | 2361 | gtk_widget_show (GTK_WIDGET (menuitem)); | ||
275 | 2362 | } | ||
276 | 2363 | #endif | ||
277 | 2364 | } | ||
278 | 2365 | |||
279 | 2366 | static void | ||
280 | 2367 | update_layouts_menu_state (void) | ||
281 | 2368 | { | ||
282 | 2369 | #ifdef HAVE_LIBXKLAVIER | ||
283 | 2370 | XklState *state = xkl_engine_get_current_state (xkl_engine); | ||
284 | 2371 | GList *menu_items = gtk_container_get_children (GTK_CONTAINER (layout_menu)); | ||
285 | 2372 | GtkCheckMenuItem *menu_item = g_list_nth_data (menu_items, state->group); | ||
286 | 2373 | |||
287 | 2374 | if (menu_item) | ||
288 | 2375 | { | ||
289 | 2376 | gtk_menu_item_set_label (GTK_MENU_ITEM (layout_menuitem), | ||
290 | 2377 | g_object_get_data (G_OBJECT (menu_item), LAYOUT_DATA_LABEL)); | ||
291 | 2378 | gtk_check_menu_item_set_active(menu_item, TRUE); | ||
292 | 2379 | } | ||
293 | 2380 | else | ||
294 | 2381 | gtk_menu_item_set_label (GTK_MENU_ITEM (layout_menuitem), "??"); | ||
295 | 2382 | g_list_free (menu_items); | ||
296 | 2383 | #else | ||
297 | 2384 | LightDMLayout *layout = lightdm_get_layout (); | ||
298 | 2385 | g_return_if_fail (layout != NULL); | ||
299 | 2386 | |||
300 | 2387 | const gchar *name = lightdm_layout_get_name (layout); | ||
301 | 2388 | GList *menu_items = gtk_container_get_children (GTK_CONTAINER (layout_menu)); | ||
302 | 2389 | GList *menu_iter; | ||
303 | 2390 | for (menu_iter = menu_items; menu_iter; menu_iter = g_list_next (menu_iter)) | ||
304 | 2391 | { | ||
305 | 2392 | if (g_strcmp0 (name, g_object_get_data (G_OBJECT (menu_iter->data), LAYOUT_DATA_NAME)) == 0) | ||
306 | 2393 | { | ||
307 | 2394 | gtk_check_menu_item_set_active (menu_iter->data, TRUE); | ||
308 | 2395 | gtk_menu_item_set_label (GTK_MENU_ITEM (layout_menuitem), | ||
309 | 2396 | g_object_get_data (G_OBJECT (menu_iter->data), LAYOUT_DATA_LABEL)); | ||
310 | 2397 | break; | ||
311 | 2398 | } | ||
312 | 2399 | } | ||
313 | 2400 | g_list_free (menu_items); | ||
314 | 2401 | #endif | ||
315 | 2402 | } | ||
316 | 2403 | |||
317 | 2404 | #ifdef HAVE_LIBXKLAVIER | ||
318 | 2405 | static void | ||
319 | 2406 | xkl_state_changed_cb (XklEngine *engine, XklEngineStateChange change, gint group, | ||
320 | 2407 | gboolean restore, gpointer user_data) | ||
321 | 2408 | { | ||
322 | 2409 | if (change == GROUP_CHANGED) | ||
323 | 2410 | update_layouts_menu_state (); | ||
324 | 2411 | } | ||
325 | 2412 | |||
326 | 2413 | static void | ||
327 | 2414 | xkl_config_changed_cb (XklEngine *engine, gpointer user_data) | ||
328 | 2415 | { | ||
329 | 2416 | /* tip: xkl_config_rec_get_from_server() return old settings */ | ||
330 | 2417 | update_layouts_menu (); | ||
331 | 2418 | update_layouts_menu_state (); | ||
332 | 2419 | } | ||
333 | 2420 | |||
334 | 2421 | static GdkFilterReturn | ||
335 | 2422 | xkl_xevent_filter (GdkXEvent *xev, GdkEvent *event, gpointer data) | ||
336 | 2423 | { | ||
337 | 2424 | XEvent *xevent = (XEvent *) xev; | ||
338 | 2425 | xkl_engine_filter_events (xkl_engine, xevent); | ||
339 | 2426 | return GDK_FILTER_CONTINUE; | ||
340 | 2427 | } | ||
341 | 2428 | #endif | ||
342 | 2429 | |||
343 | 2234 | int | 2430 | int |
344 | 2235 | main (int argc, char **argv) | 2431 | main (int argc, char **argv) |
345 | 2236 | { | 2432 | { |
346 | @@ -2445,16 +2641,9 @@ | |||
347 | 2445 | gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "hostname_label")), lightdm_get_hostname ()); | 2641 | gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "hostname_label")), lightdm_get_hostname ()); |
348 | 2446 | session_menu = GTK_MENU(gtk_builder_get_object (builder, "session_menu")); | 2642 | session_menu = GTK_MENU(gtk_builder_get_object (builder, "session_menu")); |
349 | 2447 | language_menu = GTK_MENU(gtk_builder_get_object (builder, "language_menu")); | 2643 | language_menu = GTK_MENU(gtk_builder_get_object (builder, "language_menu")); |
350 | 2644 | layout_menu = GTK_MENU(gtk_builder_get_object (builder, "layout_menu")); | ||
351 | 2448 | clock_label = GTK_WIDGET(gtk_builder_get_object (builder, "clock_label")); | 2645 | clock_label = GTK_WIDGET(gtk_builder_get_object (builder, "clock_label")); |
352 | 2449 | menubar = GTK_WIDGET (gtk_builder_get_object (builder, "menubar")); | 2646 | menubar = GTK_WIDGET (gtk_builder_get_object (builder, "menubar")); |
353 | 2450 | /* Never allow the panel-window to be moved via the menubar */ | ||
354 | 2451 | #if GTK_CHECK_VERSION (3, 0, 0) | ||
355 | 2452 | css_provider = gtk_css_provider_new (); | ||
356 | 2453 | gtk_css_provider_load_from_data (css_provider, "* { -GtkWidget-window-dragging: false; }", -1, NULL); | ||
357 | 2454 | gtk_style_context_add_provider (GTK_STYLE_CONTEXT(gtk_widget_get_style_context(GTK_WIDGET(menubar))), GTK_STYLE_PROVIDER (css_provider), 800); | ||
358 | 2455 | #endif | ||
359 | 2456 | |||
360 | 2457 | keyboard_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "keyboard_menuitem")); | ||
361 | 2458 | 2647 | ||
362 | 2459 | /* Login window */ | 2648 | /* Login window */ |
363 | 2460 | login_window = GTK_WINDOW (gtk_builder_get_object (builder, "login_window")); | 2649 | login_window = GTK_WINDOW (gtk_builder_get_object (builder, "login_window")); |
364 | @@ -2510,6 +2699,8 @@ | |||
365 | 2510 | language_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "language_menuitem")); | 2699 | language_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "language_menuitem")); |
366 | 2511 | a11y_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "a11y_menuitem")); | 2700 | a11y_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "a11y_menuitem")); |
367 | 2512 | power_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "power_menuitem")); | 2701 | power_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "power_menuitem")); |
368 | 2702 | layout_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "layout_menuitem")); | ||
369 | 2703 | keyboard_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "keyboard_menuitem")); | ||
370 | 2513 | 2704 | ||
371 | 2514 | gtk_accel_map_add_entry ("<Login>/a11y/font", GDK_KEY_F1, 0); | 2705 | gtk_accel_map_add_entry ("<Login>/a11y/font", GDK_KEY_F1, 0); |
372 | 2515 | gtk_accel_map_add_entry ("<Login>/a11y/contrast", GDK_KEY_F2, 0); | 2706 | gtk_accel_map_add_entry ("<Login>/a11y/contrast", GDK_KEY_F2, 0); |
373 | @@ -2596,7 +2787,7 @@ | |||
374 | 2596 | label = g_strdup_printf ("%s - %s", lightdm_language_get_name (language), country); | 2787 | label = g_strdup_printf ("%s - %s", lightdm_language_get_name (language), country); |
375 | 2597 | else | 2788 | else |
376 | 2598 | label = g_strdup (lightdm_language_get_name (language)); | 2789 | label = g_strdup (lightdm_language_get_name (language)); |
378 | 2599 | 2790 | ||
379 | 2600 | code = lightdm_language_get_code (language); | 2791 | code = lightdm_language_get_code (language); |
380 | 2601 | gchar *modifier = strchr (code, '@'); | 2792 | gchar *modifier = strchr (code, '@'); |
381 | 2602 | if (modifier != NULL) | 2793 | if (modifier != NULL) |
382 | @@ -2653,6 +2844,53 @@ | |||
383 | 2653 | g_signal_connect (G_OBJECT (power_menuitem),"activate", G_CALLBACK(power_menu_cb), NULL); | 2844 | g_signal_connect (G_OBJECT (power_menuitem),"activate", G_CALLBACK(power_menu_cb), NULL); |
384 | 2654 | } | 2845 | } |
385 | 2655 | 2846 | ||
386 | 2847 | /* Layout menu */ | ||
387 | 2848 | if (gtk_widget_get_visible (layout_menuitem)) | ||
388 | 2849 | { | ||
389 | 2850 | #ifdef HAVE_LIBXKLAVIER | ||
390 | 2851 | xkl_engine = xkl_engine_get_instance (XOpenDisplay (NULL)); | ||
391 | 2852 | if (xkl_engine) | ||
392 | 2853 | { | ||
393 | 2854 | xkl_engine_start_listen (xkl_engine, XKLL_TRACK_KEYBOARD_STATE); | ||
394 | 2855 | g_signal_connect (xkl_engine, "X-state-changed", | ||
395 | 2856 | G_CALLBACK (xkl_state_changed_cb), NULL); | ||
396 | 2857 | g_signal_connect (xkl_engine, "X-config-changed", | ||
397 | 2858 | G_CALLBACK (xkl_config_changed_cb), NULL); | ||
398 | 2859 | gdk_window_add_filter (NULL, (GdkFilterFunc) xkl_xevent_filter, NULL); | ||
399 | 2860 | |||
400 | 2861 | /* refresh */ | ||
401 | 2862 | XklConfigRec *config_rec = xkl_config_rec_new (); | ||
402 | 2863 | if (xkl_config_rec_get_from_server (config_rec, xkl_engine)) | ||
403 | 2864 | xkl_config_rec_activate (config_rec, xkl_engine); | ||
404 | 2865 | g_object_unref (config_rec); | ||
405 | 2866 | } | ||
406 | 2867 | else | ||
407 | 2868 | { | ||
408 | 2869 | g_warning ("Failed to get XklEngine instance"); | ||
409 | 2870 | gtk_widget_hide (layout_menuitem); | ||
410 | 2871 | } | ||
411 | 2872 | #endif | ||
412 | 2873 | update_layouts_menu (); | ||
413 | 2874 | update_layouts_menu_state (); | ||
414 | 2875 | } | ||
415 | 2876 | |||
416 | 2877 | #if GTK_CHECK_VERSION (3, 0, 0) | ||
417 | 2878 | /* A bit of CSS */ | ||
418 | 2879 | css_provider = gtk_css_provider_new (); | ||
419 | 2880 | gtk_css_provider_load_from_data (css_provider, lightdm_gtk_greeter_css_application, lightdm_gtk_greeter_css_application_length, NULL); | ||
420 | 2881 | gtk_style_context_add_provider_for_screen(gdk_screen_get_default (), GTK_STYLE_PROVIDER (css_provider), | ||
421 | 2882 | GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); | ||
422 | 2883 | css_provider = gtk_css_provider_new (); | ||
423 | 2884 | guint fallback_css_priority = GTK_STYLE_PROVIDER_PRIORITY_APPLICATION; | ||
424 | 2885 | if (gtk_style_context_lookup_color (gtk_widget_get_style_context (GTK_WIDGET (login_window)), | ||
425 | 2886 | "lightdm-gtk-greeter-override-defaults", | ||
426 | 2887 | &background_color)) | ||
427 | 2888 | fallback_css_priority = GTK_STYLE_PROVIDER_PRIORITY_FALLBACK; | ||
428 | 2889 | gtk_css_provider_load_from_data (css_provider, lightdm_gtk_greeter_css_fallback, lightdm_gtk_greeter_css_fallback_length, NULL); | ||
429 | 2890 | gtk_style_context_add_provider_for_screen(gdk_screen_get_default (), GTK_STYLE_PROVIDER (css_provider), | ||
430 | 2891 | fallback_css_priority); | ||
431 | 2892 | #endif | ||
432 | 2893 | |||
433 | 2656 | /* Users combobox */ | 2894 | /* Users combobox */ |
434 | 2657 | renderer = gtk_cell_renderer_text_new(); | 2895 | renderer = gtk_cell_renderer_text_new(); |
435 | 2658 | gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (user_combo), renderer, TRUE); | 2896 | gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (user_combo), renderer, TRUE); |
436 | 2659 | 2897 | ||
437 | === modified file 'src/lightdm-gtk-greeter.glade' | |||
438 | --- src/lightdm-gtk-greeter.glade 2014-02-23 12:13:12 +0000 | |||
439 | +++ src/lightdm-gtk-greeter.glade 2014-05-28 09:19:24 +0000 | |||
440 | @@ -165,6 +165,20 @@ | |||
441 | 165 | </child> | 165 | </child> |
442 | 166 | </object> | 166 | </object> |
443 | 167 | </child> | 167 | </child> |
444 | 168 | <child> | ||
445 | 169 | <object class="GtkMenuItem" id="layout_menuitem"> | ||
446 | 170 | <property name="name">layout_menuitem</property> | ||
447 | 171 | <property name="visible">True</property> | ||
448 | 172 | <property name="can_focus">True</property> | ||
449 | 173 | <property name="label">[layout]</property> | ||
450 | 174 | <child type="submenu"> | ||
451 | 175 | <object class="GtkMenu" id="layout_menu"> | ||
452 | 176 | <property name="visible">True</property> | ||
453 | 177 | <property name="can_focus">False</property> | ||
454 | 178 | </object> | ||
455 | 179 | </child> | ||
456 | 180 | </object> | ||
457 | 181 | </child> | ||
458 | 168 | </object> | 182 | </object> |
459 | 169 | <packing> | 183 | <packing> |
460 | 170 | <property name="expand">False</property> | 184 | <property name="expand">False</property> |