26
39
static GtkButton *login_button, *cancel_button;
27
40
static GtkLabel *message_label, *prompt_label;
28
41
static GtkWidget *login_box, *prompt_box;
42
static GtkImage *user_avatar;
29
43
static GtkEntry *prompt_entry;
30
44
static GtkComboBox *user_combo;
31
45
static GtkComboBox *session_combo;
32
46
static GtkComboBox *language_combo;
33
47
static gchar *default_font_name, *default_theme_name, *default_icon_theme_name;
34
48
static GdkPixbuf *default_background_pixbuf = NULL;
49
#if GTK_CHECK_VERSION (3, 0, 0)
35
50
static GdkRGBA *default_background_color = NULL;
52
static GdkColor *default_background_color = NULL;
36
54
static gboolean cancelling = FALSE, prompted = FALSE;
57
#ifdef HAVE_LIBINDICATOR
59
entry_scrolled (GtkWidget *menuitem, GdkEventScroll *event, gpointer data)
62
IndicatorObjectEntry *entry;
64
g_return_val_if_fail (GTK_IS_WIDGET (menuitem), FALSE);
66
io = g_object_get_data (G_OBJECT (menuitem), "indicator-custom-object-data");
67
entry = g_object_get_data (G_OBJECT (menuitem), "indicator-custom-entry-data");
69
g_return_val_if_fail (INDICATOR_IS_OBJECT (io), FALSE);
71
g_signal_emit_by_name (io, "scroll", 1, event->direction);
72
g_signal_emit_by_name (io, "scroll-entry", entry, 1, event->direction);
78
entry_activated (GtkWidget *widget, gpointer user_data)
81
IndicatorObjectEntry *entry;
83
g_return_if_fail (GTK_IS_WIDGET (widget));
85
io = g_object_get_data (G_OBJECT (widget), "indicator-custom-object-data");
86
entry = g_object_get_data (G_OBJECT (widget), "indicator-custom-entry-data");
88
g_return_if_fail (INDICATOR_IS_OBJECT (io));
90
return indicator_object_entry_activate (io, entry, gtk_get_current_event_time ());
94
create_menuitem (IndicatorObject *io, IndicatorObjectEntry *entry, GtkWidget *menubar)
96
GtkWidget *box, *menuitem;
98
#if GTK_CHECK_VERSION (3, 0, 0)
99
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
101
box = gtk_hbox_new (FALSE, 0);
103
menuitem = gtk_menu_item_new ();
105
gtk_widget_add_events(GTK_WIDGET(menuitem), GDK_SCROLL_MASK);
107
g_object_set_data (G_OBJECT (menuitem), "indicator-custom-box-data", box);
108
g_object_set_data (G_OBJECT (menuitem), "indicator-custom-object-data", io);
109
g_object_set_data (G_OBJECT (menuitem), "indicator-custom-entry-data", entry);
111
g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (entry_activated), NULL);
112
g_signal_connect (G_OBJECT (menuitem), "scroll-event", G_CALLBACK (entry_scrolled), NULL);
115
gtk_box_pack_start (GTK_BOX(box), GTK_WIDGET(entry->image), FALSE, FALSE, 1);
118
gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(entry->label), FALSE, FALSE, 1);
121
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), GTK_WIDGET (entry->menu));
123
gtk_container_add (GTK_CONTAINER (menuitem), box);
124
gtk_widget_show (box);
125
gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
131
entry_added (IndicatorObject *io, IndicatorObjectEntry *entry, gpointer user_data)
133
GHashTable *menuitem_lookup;
136
/* if the menuitem doesn't already exist, create it now */
137
menuitem_lookup = g_object_get_data (G_OBJECT (io), "indicator-custom-menuitems-data");
138
g_return_if_fail (menuitem_lookup);
139
menuitem = g_hash_table_lookup (menuitem_lookup, entry);
140
if (!GTK_IS_WIDGET (menuitem))
142
menuitem = create_menuitem (io, entry, GTK_WIDGET (user_data));
143
g_hash_table_insert (menuitem_lookup, entry, menuitem);
146
gtk_widget_show (menuitem);
150
entry_removed_cb (GtkWidget *widget, gpointer userdata)
153
GHashTable *menuitem_lookup;
157
io = g_object_get_data (G_OBJECT (widget), "indicator-custom-object-data");
158
if (!INDICATOR_IS_OBJECT (io))
161
entry = g_object_get_data (G_OBJECT (widget), "indicator-custom-entry-data");
162
if (entry != userdata)
165
menuitem_lookup = g_object_get_data (G_OBJECT (io), "indicator-custom-menuitems-data");
166
g_return_if_fail (menuitem_lookup);
167
menuitem = g_hash_table_lookup (menuitem_lookup, entry);
168
if (GTK_IS_WIDGET (menuitem))
169
gtk_widget_hide (menuitem);
171
gtk_widget_destroy (widget);
175
entry_removed (IndicatorObject *io, IndicatorObjectEntry *entry, gpointer user_data)
177
gtk_container_foreach (GTK_CONTAINER (user_data), entry_removed_cb, entry);
181
menu_show (IndicatorObject *io, IndicatorObjectEntry *entry, guint32 timestamp, gpointer user_data)
183
IndicatorObjectEntry *entrydata;
187
menuitem = GTK_WIDGET (user_data);
191
/* Close any open menus instead of opening one */
192
entries = indicator_object_get_entries (io);
193
for (lp = entries; lp; lp = g_list_next (entry))
195
entrydata = lp->data;
196
gtk_menu_popdown (entrydata->menu);
198
g_list_free (entries);
200
/* And tell the menuitem to exit activation mode too */
201
gtk_menu_shell_cancel (GTK_MENU_SHELL (menuitem));
206
load_module (const gchar *name, GtkWidget *menubar)
212
g_return_val_if_fail (name, FALSE);
214
if (!g_str_has_suffix (name, G_MODULE_SUFFIX))
217
path = g_build_filename (INDICATOR_DIR, name, NULL);
218
io = indicator_object_new_from_file (path);
221
/* used to store/fetch menu entries */
222
g_object_set_data_full (G_OBJECT (io), "indicator-custom-menuitems-data",
223
g_hash_table_new (g_direct_hash, g_direct_equal),
224
(GDestroyNotify) g_hash_table_destroy);
226
g_signal_connect (G_OBJECT (io), INDICATOR_OBJECT_SIGNAL_ENTRY_ADDED,
227
G_CALLBACK (entry_added), menubar);
228
g_signal_connect (G_OBJECT (io), INDICATOR_OBJECT_SIGNAL_ENTRY_REMOVED,
229
G_CALLBACK (entry_removed), menubar);
230
g_signal_connect (G_OBJECT (io), INDICATOR_OBJECT_SIGNAL_MENU_SHOW,
231
G_CALLBACK (menu_show), menubar);
233
entries = indicator_object_get_entries (io);
234
for (lp = entries; lp; lp = g_list_next (lp))
235
entry_added (io, lp->data, menubar);
237
g_list_free (entries);
947
1211
session_combo = GTK_COMBO_BOX (gtk_builder_get_object (builder, "session_combobox"));
948
1212
language_combo = GTK_COMBO_BOX (gtk_builder_get_object (builder, "language_combobox"));
949
1213
panel_window = GTK_WINDOW (gtk_builder_get_object (builder, "panel_window"));
952
value = g_key_file_get_value (config, "greeter", "logo", NULL);
956
GtkImage *logo = GTK_IMAGE (gtk_builder_get_object (builder, "logo"));
957
GdkPixbuf *logo_pixbuf = NULL;
958
GError *error = NULL;
960
if (g_path_is_absolute (value))
961
path = g_strdup (value);
963
path = g_build_filename (GREETER_DATA_DIR, value, NULL);
965
g_debug ("Loading logo %s", path);
966
logo_pixbuf = gdk_pixbuf_new_from_file (path, &error);
968
gtk_image_set_from_pixbuf (logo, logo_pixbuf);
970
g_warning ("Failed to load logo: %s", error->message);
971
g_clear_error (&error);
972
g_object_unref (logo_pixbuf);
1214
user_avatar = GTK_IMAGE (gtk_builder_get_object (builder, "user_avatar"));
977
1216
gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "hostname_label")), lightdm_get_hostname ());
979
1218
/* Glade can't handle custom menuitems, so set them up manually */
1219
#ifdef HAVE_LIBINDICATOR
1220
/* whitelisted indicator modules to show */
1221
whitelist = g_key_file_get_string_list (config, "greeter", "show-indicators", &length, NULL);
1222
menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "menubar"));
1223
/* load indicators */
1224
if (g_file_test (INDICATOR_DIR, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)))
1227
dir = g_dir_open (INDICATOR_DIR, 0, NULL);
1229
while ((name = g_dir_read_name (dir)))
1231
gboolean match = FALSE;
1232
for (i = 0; i < length; ++i)
1233
if ((match = (g_strcmp0 (name, whitelist[i]) == 0)))
1236
if (G_LIKELY (!match))
1238
g_debug ("Ignoring module (not in whitelist): %s", name);
1242
if (load_module (name, menuitem))
1243
++indicators_loaded;
1250
g_strfreev (whitelist);
1252
if (indicators_loaded > 0)
1254
gtk_widget_set_can_focus (menuitem, TRUE);
1255
gtk_widget_show (menuitem);
980
1259
menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "power_menuitem"));
1260
#if GTK_CHECK_VERSION (3, 0, 0)
981
1261
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
1263
hbox = gtk_hbox_new (FALSE, 0);
982
1265
gtk_widget_show (hbox);
983
1266
gtk_container_add (GTK_CONTAINER (menuitem), hbox);
984
1267
image = gtk_image_new_from_icon_name ("system-shutdown", GTK_ICON_SIZE_MENU);