Merge lp:~lightdm-gtk-greeter-team/lightdm-gtk-greeter/set_session_check into lp:~lightdm-gtk-greeter-team/lightdm-gtk-greeter/trunk

Proposed by Andrew P.
Status: Merged
Merged at revision: 276
Proposed branch: lp:~lightdm-gtk-greeter-team/lightdm-gtk-greeter/set_session_check
Merge into: lp:~lightdm-gtk-greeter-team/lightdm-gtk-greeter/trunk
Diff against target: 183 lines (+68/-96)
1 file modified
src/lightdm-gtk-greeter.c (+68/-96)
To merge this branch: bzr merge lp:~lightdm-gtk-greeter-team/lightdm-gtk-greeter/set_session_check
Reviewer Review Type Date Requested Status
Sean Davis Approve
Review via email: mp+217931@code.launchpad.net

Commit message

set_session(): checking for invalid value

Description of the change

set_session(): current_session must always be set to a valid value.

- checking lightdm_greeter_get_default_session_hint() result
- recursion removed
- logic stay the same: passed value -> "last-session" -> default_session_hint
- get_session(): current_value always have valid or NULL value, so unnecessary code removed

To post a comment you must log in.
Revision history for this message
Sean Davis (bluesabre) wrote :

Looks sane to me.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/lightdm-gtk-greeter.c'
2--- src/lightdm-gtk-greeter.c 2014-04-27 13:51:12 +0000
3+++ src/lightdm-gtk-greeter.c 2014-05-01 15:36:44 +0000
4@@ -514,111 +514,83 @@
5 }
6 }
7
8+static gboolean
9+is_valid_session (GList* items, const gchar* session)
10+{
11+ for (; items; items = g_list_next (items))
12+ if (g_strcmp0 (session, lightdm_session_get_key (items->data)) == 0)
13+ return TRUE;
14+ return FALSE;
15+}
16+
17 static gchar *
18 get_session (void)
19 {
20- GList *menu_items, *menu_iter;
21-
22- /* if the user manually selected a session, use it */
23- if (current_session)
24- return g_strdup (current_session);
25-
26- menu_items = gtk_container_get_children(GTK_CONTAINER(session_menu));
27-
28- for (menu_iter = menu_items; menu_iter != NULL; menu_iter = g_list_next(menu_iter))
29- {
30- if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_iter->data)))
31- {
32- return g_strdup(g_object_get_data (G_OBJECT (menu_iter->data), "session-key"));
33- }
34- }
35-
36- return g_strdup (lightdm_greeter_get_default_session_hint (greeter));
37+ return g_strdup (current_session);
38 }
39
40 static void
41 set_session (const gchar *session)
42 {
43- const gchar *default_session;
44- gchar *last_session;
45- GList *menu_items, *menu_iter;
46- GList *items, *item;
47-#if GTK_CHECK_VERSION (3, 0, 0)
48- GtkIconTheme *icon_theme = gtk_icon_theme_get_default();
49-#endif
50-
51- if (!gtk_widget_get_visible (session_menuitem))
52- {
53- g_free (current_session);
54- current_session = g_strdup (session);
55- return;
56- }
57-
58- menu_items = gtk_container_get_children(GTK_CONTAINER(session_menu));
59-
60- if (session)
61- {
62- for (menu_iter = menu_items; menu_iter != NULL; menu_iter = g_list_next(menu_iter))
63- {
64- gchar *s;
65- gboolean matched;
66- s = g_strdup(g_object_get_data (G_OBJECT (menu_iter->data), "session-key"));
67- matched = g_strcmp0 (s, session) == 0;
68- g_free (s);
69- if (matched)
70- {
71- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_iter->data), TRUE);
72- g_free (current_session);
73- current_session = g_strdup(session);
74- /* Set menuitem-image to session-badge */
75-#if GTK_CHECK_VERSION (3, 0, 0)
76- if (gtk_icon_theme_has_icon(icon_theme, g_strdup_printf ("%s_badge-symbolic", g_ascii_strdown (session, strlen (session)))))
77- gtk_image_set_from_icon_name (GTK_IMAGE(session_badge), g_strdup_printf ("%s_badge-symbolic", g_ascii_strdown (session, strlen (session))), GTK_ICON_SIZE_MENU);
78- else
79- gtk_image_set_from_icon_name (GTK_IMAGE(session_badge), "document-properties-symbolic", GTK_ICON_SIZE_MENU);
80-#endif
81- return;
82- }
83- }
84- }
85-
86- /* If failed to find this session, then try the previous, then the default */
87- last_session = g_key_file_get_value (state, "greeter", "last-session", NULL);
88- if (last_session && g_strcmp0 (session, last_session) != 0)
89- {
90- /* Go thru all sessions and compare them to our last_session otherwise we can get a segfault
91- * if last_session is set to a non-existing or removed session
92- */
93- items = lightdm_get_sessions ();
94- for (item = items; item; item = item->next)
95- {
96- LightDMSession *session = item->data;
97- gchar *s;
98- gboolean matched;
99- s = g_strdup(lightdm_session_get_key (session));
100- matched = g_strcmp0 (s, last_session) == 0;
101- s = NULL;
102- g_free(s);
103- if (matched)
104- {
105- set_session (last_session);
106- g_free (last_session);
107- return;
108- }
109- }
110- }
111+ gchar *last_session = NULL;
112+ GList *sessions = lightdm_get_sessions ();
113+
114+ /* Validation */
115+ if (!session || !is_valid_session (sessions, session))
116+ {
117+ /* previous session */
118+ last_session = g_key_file_get_value (state, "greeter", "last-session", NULL);
119+ if (last_session && g_strcmp0 (session, last_session) != 0 &&
120+ is_valid_session (sessions, last_session))
121+ session = last_session;
122+ else
123+ {
124+ /* default */
125+ const gchar* default_session = lightdm_greeter_get_default_session_hint (greeter);
126+ if (g_strcmp0 (session, default_session) != 0 &&
127+ is_valid_session (sessions, default_session))
128+ session = default_session;
129+ /* first in the sessions list */
130+ else if (sessions)
131+ session = lightdm_session_get_key (sessions->data);
132+ /* give up */
133+ else
134+ session = NULL;
135+ }
136+ }
137+
138+ if (gtk_widget_get_visible (session_menuitem))
139+ {
140+ GList *menu_iter = NULL;
141+ GList *menu_items = gtk_container_get_children (GTK_CONTAINER (session_menu));
142+ if (session)
143+ {
144+ for (menu_iter = menu_items; menu_iter != NULL; menu_iter = g_list_next(menu_iter))
145+ if (g_strcmp0 (session, g_object_get_data (G_OBJECT (menu_iter->data), "session-key")) == 0)
146+ {
147+#if GTK_CHECK_VERSION (3, 0, 0)
148+ /* Set menuitem-image to session-badge */
149+ GtkIconTheme *icon_theme = gtk_icon_theme_get_default();
150+ gchar* session_name = g_ascii_strdown (session, -1);
151+ gchar* icon_name = g_strdup_printf ("%s_badge-symbolic", session_name);
152+ g_free (session_name);
153+ if (gtk_icon_theme_has_icon(icon_theme, icon_name))
154+ gtk_image_set_from_icon_name (GTK_IMAGE(session_badge), icon_name, GTK_ICON_SIZE_MENU);
155+ else
156+ gtk_image_set_from_icon_name (GTK_IMAGE(session_badge), "document-properties-symbolic", GTK_ICON_SIZE_MENU);
157+ g_free (icon_name);
158+#endif
159+ break;
160+ }
161+ }
162+ if (!menu_iter)
163+ menu_iter = menu_items;
164+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_iter->data), TRUE);
165+ }
166+
167+ g_free (current_session);
168+ current_session = g_strdup(session);
169 g_free (last_session);
170-
171- default_session = lightdm_greeter_get_default_session_hint (greeter);
172- if (default_session && g_strcmp0 (session, default_session) != 0)
173- {
174- set_session (lightdm_greeter_get_default_session_hint (greeter));
175- return;
176- }
177- /* Otherwise just pick the first session */
178- menu_iter = g_list_first(menu_items);
179- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_iter->data), TRUE);
180- return;
181 }
182
183 static gchar *

Subscribers

People subscribed via source and target branches