74
75
/* Panel Widgets */
75
76
static GtkWindow *panel_window;
76
static GtkWidget *clock_label;
77
static GtkWidget *menubar, *power_menuitem, *session_menuitem, *language_menuitem, *a11y_menuitem,
77
static GtkWidget *menubar;
78
static GtkWidget *power_menuitem, *session_menuitem, *language_menuitem, *a11y_menuitem,
78
79
*layout_menuitem, *session_badge;
79
80
static GtkWidget *suspend_menuitem, *hibernate_menuitem, *restart_menuitem, *shutdown_menuitem;
80
static GtkWidget *keyboard_menuitem;
81
static GtkWidget *keyboard_menuitem, *clock_menuitem, *clock_label, *host_menuitem;
81
82
static GtkMenu *session_menu, *language_menu, *layout_menu;
83
84
/* Login Window Widgets */
172
202
g_free (message);
205
#if GTK_CHECK_VERSION (3, 0, 0)
207
panel_item_enter_notify_cb (GtkWidget *widget, GdkEvent *event, gpointer enter)
209
GtkStyleContext *context = gtk_widget_get_style_context (widget);
210
if (GPOINTER_TO_INT (enter))
211
gtk_style_context_add_class (context, PANEL_ITEM_STYLE_HOVERED);
213
gtk_style_context_remove_class (context, PANEL_ITEM_STYLE_HOVERED);
176
add_indicator_to_panel (GtkWidget *indicator_item, gint index)
219
panel_add_item (GtkWidget *widget, gint index, GreeterPanelItemType item_type)
178
221
gint insert_pos = 0;
179
222
GList* items = gtk_container_get_children (GTK_CONTAINER (menubar));
181
224
for (item = items; item; item = item->next)
183
if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item->data), "indicator-custom-index-data")) < index)
226
if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item->data), PANEL_ITEM_DATA_INDEX)) < index)
187
230
g_list_free (items);
189
gtk_menu_shell_insert (GTK_MENU_SHELL (menubar), GTK_WIDGET (indicator_item), insert_pos);
232
#if GTK_CHECK_VERSION (3, 0, 0)
233
gtk_style_context_add_class (gtk_widget_get_style_context (widget), PANEL_ITEM_STYLE);
234
gtk_style_context_add_class (gtk_widget_get_style_context (widget), PANEL_ITEM_STYLES[item_type]);
235
if (item_type == PANEL_ITEM_INDICATOR)
237
g_signal_connect (G_OBJECT (widget), "enter-notify-event",
238
G_CALLBACK (panel_item_enter_notify_cb), GINT_TO_POINTER(TRUE));
239
g_signal_connect (G_OBJECT (widget), "leave-notify-event",
240
G_CALLBACK (panel_item_enter_notify_cb), GINT_TO_POINTER(FALSE));
244
gtk_widget_show (widget);
245
gtk_menu_shell_insert (GTK_MENU_SHELL (menubar), widget, insert_pos);
192
248
#ifdef HAVE_LIBINDICATOR
194
entry_scrolled (GtkWidget *menuitem, GdkEventScroll *event, gpointer data)
250
indicator_entry_scrolled_cb (GtkWidget *menuitem, GdkEventScroll *event, gpointer data)
196
252
IndicatorObject *io;
197
253
IndicatorObjectEntry *entry;
199
255
g_return_val_if_fail (GTK_IS_WIDGET (menuitem), FALSE);
201
io = g_object_get_data (G_OBJECT (menuitem), "indicator-custom-object-data");
202
entry = g_object_get_data (G_OBJECT (menuitem), "indicator-custom-entry-data");
257
io = g_object_get_data (G_OBJECT (menuitem), INDICATOR_ITEM_DATA_OBJECT);
258
entry = g_object_get_data (G_OBJECT (menuitem), INDICATOR_ITEM_DATA_ENTRY);
204
260
g_return_val_if_fail (INDICATOR_IS_OBJECT (io), FALSE);
241
297
gtk_widget_add_events(GTK_WIDGET(menuitem), GDK_SCROLL_MASK);
243
g_object_set_data (G_OBJECT (menuitem), "indicator-custom-box-data", box);
244
g_object_set_data (G_OBJECT (menuitem), "indicator-custom-object-data", io);
245
g_object_set_data (G_OBJECT (menuitem), "indicator-custom-entry-data", entry);
246
g_object_set_data (G_OBJECT (menuitem), "indicator-custom-index-data", GINT_TO_POINTER (index));
299
g_object_set_data (G_OBJECT (menuitem), INDICATOR_ITEM_DATA_BOX, box);
300
g_object_set_data (G_OBJECT (menuitem), INDICATOR_ITEM_DATA_OBJECT, io);
301
g_object_set_data (G_OBJECT (menuitem), INDICATOR_ITEM_DATA_ENTRY, entry);
302
g_object_set_data (G_OBJECT (menuitem), PANEL_ITEM_DATA_INDEX, GINT_TO_POINTER (index));
248
g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (entry_activated), NULL);
249
g_signal_connect (G_OBJECT (menuitem), "scroll-event", G_CALLBACK (entry_scrolled), NULL);
304
g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (indicator_entry_activated_cb), NULL);
305
g_signal_connect (G_OBJECT (menuitem), "scroll-event", G_CALLBACK (indicator_entry_scrolled_cb), NULL);
251
307
if (entry->image)
252
308
gtk_box_pack_start (GTK_BOX(box), GTK_WIDGET(entry->image), FALSE, FALSE, 1);
260
316
gtk_container_add (GTK_CONTAINER (menuitem), box);
261
317
gtk_widget_show (box);
262
add_indicator_to_panel (menuitem, index);
318
panel_add_item(menuitem, index, PANEL_ITEM_INDICATOR);
268
entry_added (IndicatorObject *io, IndicatorObjectEntry *entry, gpointer user_data)
324
indicator_entry_added_cb (IndicatorObject *io, IndicatorObjectEntry *entry, gpointer user_data)
270
326
GHashTable *menuitem_lookup;
271
327
GtkWidget *menuitem;
273
329
/* if the menuitem doesn't already exist, create it now */
274
menuitem_lookup = g_object_get_data (G_OBJECT (io), "indicator-custom-menuitems-data");
330
menuitem_lookup = g_object_get_data (G_OBJECT (io), INDICATOR_DATA_MENUITEMS);
275
331
g_return_if_fail (menuitem_lookup);
276
332
menuitem = g_hash_table_lookup (menuitem_lookup, entry);
277
333
if (!GTK_IS_WIDGET (menuitem))
279
menuitem = create_menuitem (io, entry, GTK_WIDGET (user_data));
335
menuitem = indicator_entry_create_menuitem (io, entry, GTK_WIDGET (user_data));
280
336
g_hash_table_insert (menuitem_lookup, entry, menuitem);
287
entry_removed_cb (GtkWidget *widget, gpointer userdata)
343
remove_indicator_entry_cb (GtkWidget *widget, gpointer userdata)
289
345
IndicatorObject *io;
290
346
GHashTable *menuitem_lookup;
291
347
GtkWidget *menuitem;
294
io = g_object_get_data (G_OBJECT (widget), "indicator-custom-object-data");
350
io = g_object_get_data (G_OBJECT (widget), INDICATOR_ITEM_DATA_OBJECT);
295
351
if (!INDICATOR_IS_OBJECT (io))
298
entry = g_object_get_data (G_OBJECT (widget), "indicator-custom-entry-data");
354
entry = g_object_get_data (G_OBJECT (widget), INDICATOR_ITEM_DATA_ENTRY);
299
355
if (entry != userdata)
302
menuitem_lookup = g_object_get_data (G_OBJECT (io), "indicator-custom-menuitems-data");
358
menuitem_lookup = g_object_get_data (G_OBJECT (io), INDICATOR_DATA_MENUITEMS);
303
359
g_return_if_fail (menuitem_lookup);
304
360
menuitem = g_hash_table_lookup (menuitem_lookup, entry);
305
361
if (GTK_IS_WIDGET (menuitem))
312
entry_removed (IndicatorObject *io, IndicatorObjectEntry *entry, gpointer user_data)
368
indicator_entry_removed_cb (IndicatorObject *io, IndicatorObjectEntry *entry, gpointer user_data)
314
gtk_container_foreach (GTK_CONTAINER (user_data), entry_removed_cb, entry);
370
gtk_container_foreach (GTK_CONTAINER (user_data), remove_indicator_entry_cb, entry);
318
menu_show (IndicatorObject *io, IndicatorObjectEntry *entry, guint32 timestamp, gpointer user_data)
374
indicator_menu_show_cb (IndicatorObject *io, IndicatorObjectEntry *entry, guint32 timestamp, gpointer user_data)
320
376
IndicatorObjectEntry *entrydata;
321
377
GtkWidget *menuitem;
426
if (names && !fallback)
487
if (!names || fallback)
428
builtin_items = g_hash_table_new (g_str_hash, g_str_equal);
430
g_hash_table_insert (builtin_items, "~power", power_menuitem);
431
g_hash_table_insert (builtin_items, "~session", session_menuitem);
432
g_hash_table_insert (builtin_items, "~language", language_menuitem);
433
g_hash_table_insert (builtin_items, "~a11y", a11y_menuitem);
434
g_hash_table_insert (builtin_items, "~layout", layout_menuitem);
436
g_hash_table_iter_init (&iter, builtin_items);
437
while (g_hash_table_iter_next (&iter, NULL, &iter_value))
438
gtk_container_remove (GTK_CONTAINER (menubar), iter_value);
489
names = (gchar**)DEFAULT_LAYOUT;
490
length = g_strv_length (names);
493
builtin_items = g_hash_table_new (g_str_hash, g_str_equal);
495
g_hash_table_insert (builtin_items, "~power", power_menuitem);
496
g_hash_table_insert (builtin_items, "~session", session_menuitem);
497
g_hash_table_insert (builtin_items, "~language", language_menuitem);
498
g_hash_table_insert (builtin_items, "~a11y", a11y_menuitem);
499
g_hash_table_insert (builtin_items, "~layout", layout_menuitem);
500
g_hash_table_insert (builtin_items, "~host", host_menuitem);
501
g_hash_table_insert (builtin_items, "~clock", clock_menuitem);
503
g_hash_table_iter_init (&iter, builtin_items);
504
while (g_hash_table_iter_next (&iter, NULL, &iter_value))
505
gtk_container_remove (GTK_CONTAINER (menubar), iter_value);
441
507
for (i = 0; i < length; ++i)
443
if (names[i][0] == '~' && g_hash_table_lookup_extended (builtin_items, names[i], NULL, &iter_value))
509
if (names[i][0] == '~')
444
510
{ /* Built-in indicators */
445
g_object_set_data (G_OBJECT (iter_value), "indicator-custom-index-data", GINT_TO_POINTER (i));
446
add_indicator_to_panel (iter_value, i);
447
g_hash_table_remove (builtin_items, (gconstpointer)names[i]);
511
GreeterPanelItemType item_type = PANEL_ITEM_INDICATOR;
512
if (g_hash_table_lookup_extended (builtin_items, names[i], NULL, &iter_value))
513
g_hash_table_remove (builtin_items, (gconstpointer)names[i]);
514
else if (g_strcmp0 (names[i], "~separator") == 0)
516
#if GTK_CHECK_VERSION (3, 0, 0)
517
GtkWidget *separator = gtk_separator_new (GTK_ORIENTATION_VERTICAL);
519
GtkWidget *separator = gtk_vseparator_new ();
521
item_type = PANEL_ITEM_SEPARATOR;
522
iter_value = gtk_separator_menu_item_new ();
523
gtk_widget_show (separator);
524
gtk_container_add (iter_value, separator);
526
else if (g_strcmp0 (names[i], "~spacer") == 0)
528
item_type = PANEL_ITEM_SPACER;
529
iter_value = gtk_separator_menu_item_new ();
530
gtk_menu_item_set_label (iter_value, "");
531
#if GTK_CHECK_VERSION (3, 0, 0)
532
gtk_widget_set_hexpand (iter_value, TRUE);
534
g_object_set_data(G_OBJECT(iter_value), GREETER_MENU_BAR_EXPAND_PROP, "1");
537
else if (names[i][1] == '~')
539
item_type = PANEL_ITEM_TEXT;
540
iter_value = gtk_separator_menu_item_new ();
541
gtk_menu_item_set_label (iter_value, &names[i][2]);
546
g_object_set_data (G_OBJECT (iter_value), PANEL_ITEM_DATA_INDEX, GINT_TO_POINTER (i));
547
panel_add_item (iter_value, i, item_type);
497
597
GList *entries, *lp;
499
599
/* used to store/fetch menu entries */
500
g_object_set_data_full (G_OBJECT (io), "indicator-custom-menuitems-data",
600
g_object_set_data_full (G_OBJECT (io), INDICATOR_DATA_MENUITEMS,
501
601
g_hash_table_new (g_direct_hash, g_direct_equal),
502
602
(GDestroyNotify) g_hash_table_destroy);
503
g_object_set_data (G_OBJECT (io), "indicator-custom-index-data", GINT_TO_POINTER (i));
603
g_object_set_data (G_OBJECT (io), PANEL_ITEM_DATA_INDEX, GINT_TO_POINTER (i));
505
605
g_signal_connect (G_OBJECT (io), INDICATOR_OBJECT_SIGNAL_ENTRY_ADDED,
506
G_CALLBACK (entry_added), menubar);
606
G_CALLBACK (indicator_entry_added_cb), menubar);
507
607
g_signal_connect (G_OBJECT (io), INDICATOR_OBJECT_SIGNAL_ENTRY_REMOVED,
508
G_CALLBACK (entry_removed), menubar);
608
G_CALLBACK (indicator_entry_removed_cb), menubar);
509
609
g_signal_connect (G_OBJECT (io), INDICATOR_OBJECT_SIGNAL_MENU_SHOW,
510
G_CALLBACK (menu_show), menubar);
610
G_CALLBACK (indicator_menu_show_cb), menubar);
512
612
entries = indicator_object_get_entries (io);
513
613
for (lp = entries; lp; lp = g_list_next (lp))
514
entry_added (io, lp->data, menubar);
614
indicator_entry_added_cb (io, lp->data, menubar);
515
615
g_list_free (entries);
2646
2741
gtk_style_context_add_class(GTK_STYLE_CONTEXT(gtk_widget_get_style_context(GTK_WIDGET(panel_window))), GTK_STYLE_CLASS_MENUBAR);
2647
2742
g_signal_connect (G_OBJECT (panel_window), "draw", G_CALLBACK (background_window_draw), NULL);
2649
gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "hostname_label")), lightdm_get_hostname ());
2650
session_menu = GTK_MENU(gtk_builder_get_object (builder, "session_menu"));
2651
language_menu = GTK_MENU(gtk_builder_get_object (builder, "language_menu"));
2652
layout_menu = GTK_MENU(gtk_builder_get_object (builder, "layout_menu"));
2653
clock_label = GTK_WIDGET(gtk_builder_get_object (builder, "clock_label"));
2654
2744
menubar = GTK_WIDGET (gtk_builder_get_object (builder, "menubar"));
2656
2746
/* Login window */
2705
2795
/* Indicators */
2706
2796
session_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "session_menuitem"));
2797
session_menu = GTK_MENU(gtk_builder_get_object (builder, "session_menu"));
2707
2798
language_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "language_menuitem"));
2799
language_menu = GTK_MENU(gtk_builder_get_object (builder, "language_menu"));
2708
2800
a11y_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "a11y_menuitem"));
2709
2801
power_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "power_menuitem"));
2710
2802
layout_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "layout_menuitem"));
2803
layout_menu = GTK_MENU(gtk_builder_get_object (builder, "layout_menu"));
2711
2804
keyboard_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "keyboard_menuitem"));
2805
clock_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "clock_menuitem"));
2806
host_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "host_menuitem"));
2713
2808
gtk_accel_map_add_entry ("<Login>/a11y/font", GDK_KEY_F1, 0);
2714
2809
gtk_accel_map_add_entry ("<Login>/a11y/contrast", GDK_KEY_F2, 0);
2882
2968
update_layouts_menu_state ();
2972
if (gtk_widget_get_visible (host_menuitem))
2973
gtk_menu_item_set_label (GTK_MENU_ITEM (host_menuitem), lightdm_get_hostname ());
2976
if (gtk_widget_get_visible (clock_menuitem))
2978
gtk_menu_item_set_label (GTK_MENU_ITEM (clock_menuitem), "");
2979
clock_label = gtk_bin_get_child (GTK_BIN (clock_menuitem));
2980
clock_format = g_key_file_get_value (config, "greeter", "clock-format", NULL);
2982
clock_format = "%a, %H:%M";
2983
clock_timeout_thread ();
2984
gdk_threads_add_timeout (1000, (GSourceFunc) clock_timeout_thread, NULL);
2885
2987
#if GTK_CHECK_VERSION (3, 0, 0)
2886
2988
/* A bit of CSS */
2887
2989
css_provider = gtk_css_provider_new ();