Merge lp:~kalgasnik/lightdm-gtk-greeter/pre2.0-bugfixes into lp:~lightdm-gtk-greeter-team/lightdm-gtk-greeter/trunk

Proposed by Andrew P.
Status: Merged
Merged at revision: 318
Proposed branch: lp:~kalgasnik/lightdm-gtk-greeter/pre2.0-bugfixes
Merge into: lp:~lightdm-gtk-greeter-team/lightdm-gtk-greeter/trunk
Diff against target: 454 lines (+166/-88)
2 files modified
configure.ac (+40/-13)
src/lightdm-gtk-greeter.c (+126/-75)
To merge this branch: bzr merge lp:~kalgasnik/lightdm-gtk-greeter/pre2.0-bugfixes
Reviewer Review Type Date Requested Status
Sean Davis Approve
Review via email: mp+247653@code.launchpad.net

Description of the change

Fixes:
1. Some regressions after merging background branch (greeter do not close spawned processes correctly)
2. Using INDICATOR_OBJECT_SIGNAL_ENTRY_SCROLLED signal instead of obsolete "scroll-entry"
3. Invalid loop in indicator_menu_show_cb()
4. lp1398619 (upstart). "configure" options:

  --enable-at-spi-command[=/command/to/execute]
    Command to launch at-spi bus.
    Enabled by default, command: "/usr/lib/at-spi2-core/at-spi-bus-launcher --launch-immediately"

  --enable-indicator-services-command[=/command/to/execute]
    Command to launch indicators service.
    Enabled by default, command: "upstart --user --startup-event indicator-services-start"

  --enable-indicator-services is obsolete now.

Required changes:
  Remove "--enable-indicator-services" from configure command line.
  Specify correct (old) value of --enable-indicator-services-command option for systems without installed "systemd-sysv" package:
  --enable-indicator-services-command="init --user --startup-event indicator-services-start"

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

Looks good to me, thanks!

review: Approve

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-08-10 12:48:13 +0000
3+++ configure.ac 2015-01-26 21:11:48 +0000
4@@ -36,6 +36,8 @@
5 INDICATOR_PKG=indicator3-0.4
6 IDO_PKG=libido3-0.1
7
8+dnl ###########################################################################
9+
10 AC_ARG_ENABLE([libindicator],
11 AC_HELP_STRING([--enable-libindicator], [Enable libindicator support])
12 AC_HELP_STRING([--disable-libindicator], [Disable libindicator support]),
13@@ -67,6 +69,8 @@
14 AC_MSG_RESULT([disabled])
15 ])
16
17+dnl ###########################################################################
18+
19 AC_ARG_ENABLE([libido],
20 AC_HELP_STRING([--enable-libido], [Enable libido support])
21 AC_HELP_STRING([--disable-libido], [Disable libido support]),
22@@ -86,23 +90,46 @@
23 AC_MSG_RESULT([disabled])
24 ])
25
26-AC_ARG_ENABLE([indicator-services],
27- AC_HELP_STRING([--enable-indicator-services], [Try to start indicator services])
28- AC_HELP_STRING([--disable-indicator-services], [Do not start indicator services]),
29- [], [enable_indicator_services=no])
30-
31-AS_IF([test "x$enable_indicator_services" != "xno" && test "x$have_libindicator" = "xyes"], [
32- AC_DEFINE([START_INDICATOR_SERVICES], [], [Try to start indicator-services])
33-])
34+dnl ###########################################################################
35
36 AC_ARG_WITH([libxklavier], AS_HELP_STRING([--with-libxklavier], [Use libxklavier to manage layouts (instead of LightDM API)]))
37
38 AS_IF([test "x$with_libxklavier" = "xyes"],
39- [
40- PKG_CHECK_MODULES([LIBXKLAVIER], [libxklavier], [have_xklavier=yes])
41- AC_DEFINE([HAVE_LIBXKLAVIER], [1], [Define if "libxklavier" is present])
42- ],
43- [])
44+[
45+ PKG_CHECK_MODULES([LIBXKLAVIER], [libxklavier], [have_xklavier=yes])
46+ AC_DEFINE([HAVE_LIBXKLAVIER], [1], [Define if "libxklavier" is present])
47+],
48+[])
49+
50+dnl ###########################################################################
51+
52+AC_ARG_ENABLE([at-spi-command],
53+ AC_HELP_STRING([--enable-at-spi-command[=command]], [Try to start at-spi service]])
54+ AC_HELP_STRING([--disable-at-spi-command], [Do not start at-spi service]),
55+ [], [])
56+
57+AS_IF([test "x$enable_at_spi_command" != "xno"],
58+[
59+ if test "x$enable_at_spi_command" = "xyes" || test "x$enable_at_spi_command" = "x"; then
60+ enable_at_spi_command="/usr/lib/at-spi2-core/at-spi-bus-launcher --launch-immediately"
61+ fi
62+ AC_DEFINE_UNQUOTED([AT_SPI_COMMAND], ["$enable_at_spi_command"], [Command to start at-spi service])
63+])
64+
65+dnl ###########################################################################
66+
67+AC_ARG_ENABLE([indicator-services-command],
68+ AC_HELP_STRING([--enable-indicator-services-command[=command]], [Try to start indicators service]])
69+ AC_HELP_STRING([--disable-indicator-services-command], [Do not start indicators service]),
70+ [], [])
71+
72+AS_IF([test "x$enable_indicator_services_command" != "xno"],
73+[
74+ if test "x$enable_indicator_services_command" = "xyes" || test "x$enable_indicator_services_command" = "x"; then
75+ enable_indicator_services_command="upstart --user --startup-event indicator-services-start"
76+ fi
77+ AC_DEFINE_UNQUOTED([INDICATOR_SERVICES_COMMAND], ["$enable_indicator_services_command"], [Command to start indicators service])
78+])
79
80 dnl ###########################################################################
81 dnl Internationalization
82
83=== modified file 'src/lightdm-gtk-greeter.c'
84--- src/lightdm-gtk-greeter.c 2015-01-17 13:45:58 +0000
85+++ src/lightdm-gtk-greeter.c 2015-01-26 21:11:48 +0000
86@@ -53,7 +53,6 @@
87 #include "src/lightdm-gtk-greeter-css-fallback.h"
88 #include "src/lightdm-gtk-greeter-css-application.h"
89
90-
91 static LightDMGreeter *greeter;
92
93 /* State file */
94@@ -61,10 +60,14 @@
95 static gchar *state_filename;
96 static void save_state_file (void);
97
98-/* Terminating */
99-GSList *pids_to_close = NULL;
100+/* List of spawned processes */
101+static GSList *pids_to_close = NULL;
102+static GPid spawn_argv_pid (gchar **argv, GSpawnFlags flags, gint *pfd, GError **perror);
103+#if defined(AT_SPI_COMMAND) || defined(INDICATOR_SERVICES_COMMAND)
104+static GPid spawn_line_pid (const gchar *line, GSpawnFlags flags, GError **perror);
105+#endif
106+static void close_pid (GPid pid, gboolean remove);
107 static void sigterm_cb (gpointer user_data);
108-static void close_pid (GPid *pid, gboolean remove);
109
110 /* Screen window */
111 static GtkOverlay *screen_overlay;
112@@ -148,6 +151,8 @@
113 /* External command (keyboard, reader) */
114 typedef struct
115 {
116+ const gchar *name;
117+
118 gchar **argv;
119 gint argc;
120
121@@ -156,8 +161,9 @@
122 GtkWidget *widget;
123 } MenuCommand;
124
125-static MenuCommand *menu_command_parse (const gchar *value, GtkWidget *menu_item);
126-static MenuCommand *menu_command_parse_extended (const gchar *value, GtkWidget *menu_item,
127+static MenuCommand *menu_command_parse (const gchar *name, const gchar *value, GtkWidget *menu_item);
128+static MenuCommand *menu_command_parse_extended (const gchar *name,
129+ const gchar *value, GtkWidget *menu_item,
130 const gchar *xid_app, const gchar *xid_arg);
131 static gboolean menu_command_run (MenuCommand *command);
132 static gboolean menu_command_stop (MenuCommand *command);
133@@ -349,6 +355,79 @@
134
135 /* Terminating */
136
137+static GPid
138+spawn_argv_pid (gchar **argv, GSpawnFlags flags, gint *pfd, GError **perror)
139+{
140+ GPid pid = 0;
141+ GError *error = NULL;
142+ gboolean spawned = FALSE;
143+
144+ if (pfd)
145+ spawned = g_spawn_async_with_pipes (NULL, argv, NULL, flags, NULL, NULL, &pid, NULL, pfd, NULL, perror);
146+ else
147+ spawned = g_spawn_async (NULL, argv, NULL, flags, NULL, NULL, &pid, &error);
148+
149+ if (spawned)
150+ {
151+ pids_to_close = g_slist_prepend (pids_to_close, GINT_TO_POINTER (pid));
152+ g_debug ("[PIDs] Command executed (#%d): %s", pid, argv[0]);
153+ }
154+ else if (perror)
155+ {
156+ *perror = error;
157+ }
158+ else
159+ {
160+ g_warning ("[PIDs] Failed to execute command: %s", argv[0]);
161+ g_clear_error (&error);
162+ }
163+
164+ return pid;
165+}
166+
167+#if defined(AT_SPI_COMMAND) || defined(INDICATOR_SERVICES_COMMAND)
168+static GPid
169+spawn_line_pid (const gchar *line, GSpawnFlags flags, GError **perror)
170+{
171+ gint argc = 0;
172+ gchar **argv = NULL;
173+ GError *error = NULL;
174+
175+ if (g_shell_parse_argv (line, &argc, &argv, &error))
176+ {
177+ GPid pid = spawn_argv_pid (argv, flags, NULL, perror);
178+ g_strfreev (argv);
179+ return pid;
180+ }
181+ else if (!perror && error)
182+ {
183+ g_warning ("[PIDs] Failed to parse command line: %s, %s", error->message, line);
184+ g_clear_error (&error);
185+ }
186+ else if (error)
187+ *perror = error;
188+
189+ return 0;
190+}
191+#endif
192+
193+static void
194+close_pid (GPid pid, gboolean remove)
195+{
196+ if (!pid)
197+ return;
198+
199+ if (remove)
200+ pids_to_close = g_slist_remove (pids_to_close, GINT_TO_POINTER (pid));
201+
202+ if (kill (pid, SIGTERM) == 0)
203+ g_debug ("[PIDs] Process terminated: #%d", pid);
204+ else
205+ g_warning ("[PIDs] Failed to terminate process #%d: %s", pid, g_strerror (errno));
206+
207+ waitpid (pid, NULL, 0);
208+}
209+
210 static void
211 sigterm_cb (gpointer user_data)
212 {
213@@ -358,20 +437,6 @@
214 gtk_main_quit ();
215 }
216
217-static void
218-close_pid (GPid *ppid, gboolean remove)
219-{
220- if (!ppid || !*ppid)
221- return;
222-
223- if (remove)
224- pids_to_close = g_slist_remove (pids_to_close, GINT_TO_POINTER (*ppid));
225-
226- kill (*ppid, SIGTERM);
227- waitpid (*ppid, NULL, 0);
228- *ppid = 0;
229-}
230-
231 /* Power window */
232
233 static gboolean
234@@ -682,13 +747,14 @@
235 /* MenuCommand */
236
237 static MenuCommand*
238-menu_command_parse (const gchar *value, GtkWidget *menu_item)
239+menu_command_parse (const gchar *name, const gchar *value, GtkWidget *menu_item)
240 {
241- return menu_command_parse_extended (value, menu_item, NULL, NULL);
242+ return menu_command_parse_extended (name, value, menu_item, NULL, NULL);
243 }
244
245 static MenuCommand*
246-menu_command_parse_extended (const gchar *value, /* String to parse */
247+menu_command_parse_extended (const gchar *name,
248+ const gchar *value, /* String to parse */
249 GtkWidget *menu_item, /* Menu item to connect */
250 const gchar *xid_app, /* Program that have "xembed" mode support */
251 const gchar *xid_arg) /* Argument that must be added to command line */
252@@ -703,7 +769,7 @@
253 if (!g_shell_parse_argv (value, &argc, &argv, &error))
254 {
255 if (error)
256- g_warning ("Failed to parse command line: %s", error->message);
257+ g_warning ("[Command/%s] Failed to parse command line: %s", name, error->message);
258 g_clear_error (&error);
259 return NULL;
260 }
261@@ -737,7 +803,7 @@
262 else
263 {
264 if (error)
265- g_warning ("Failed to parse command line: %s", error->message);
266+ g_warning ("[Command/%s] Failed to parse command line: %s", name, error->message);
267 g_clear_error (&error);
268 }
269 g_free (new_value);
270@@ -749,6 +815,7 @@
271 gtk_overlay_add_overlay (screen_overlay, command->widget);
272 }
273 }
274+ command->name = name;
275 return command;
276 }
277
278@@ -758,14 +825,17 @@
279 g_return_val_if_fail (command && g_strv_length (command->argv), FALSE);
280
281 GError *error = NULL;
282- gboolean spawned = FALSE;
283+ command->pid = 0;
284+
285+ g_debug ("[Command/%s] Running command", command->name);
286+
287 if (command->widget)
288 {
289 GtkSocket* socket = NULL;
290 gint out_fd = 0;
291+ GPid pid = spawn_argv_pid (command->argv, G_SPAWN_SEARCH_PATH, &out_fd, &error);
292
293- if (g_spawn_async_with_pipes (NULL, command->argv, NULL, G_SPAWN_SEARCH_PATH,
294- NULL, NULL, &command->pid, NULL, &out_fd, NULL, &error))
295+ if (pid && out_fd)
296 {
297 gchar* text = NULL;
298 GIOChannel* out_channel = g_io_channel_unix_new (out_fd);
299@@ -782,37 +852,36 @@
300 gtk_container_add (GTK_CONTAINER (command->widget), GTK_WIDGET (socket));
301 gtk_socket_add_id (socket, id);
302 gtk_widget_show_all (GTK_WIDGET (command->widget));
303- spawned = TRUE;
304+
305+ command->pid = pid;
306 }
307 else
308- g_warning ("Failed to get '%s' socket: unrecognized output", command->argv[0]);
309+ g_warning ("[Command/%s] Failed to get '%s' socket for: unrecognized output",
310+ command->name, command->argv[0]);
311
312 g_free (text);
313 }
314 }
315+
316+ if (!command->pid && pid)
317+ close_pid (pid, TRUE);
318 }
319 else
320 {
321- spawned = g_spawn_async (NULL, command->argv, NULL,
322- G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
323- NULL, NULL, &command->pid, &error);
324- if (spawned)
325+ command->pid = spawn_argv_pid (command->argv, G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, NULL, &error);
326+ if (command->pid)
327 g_child_watch_add (command->pid, (GChildWatchFunc)menu_command_terminated_cb, command);
328 }
329
330- if (spawned)
331- {
332- pids_to_close = g_slist_prepend (pids_to_close, GINT_TO_POINTER (command->pid));
333- }
334- else
335+ if (!command->pid)
336 {
337 if (error)
338- g_warning ("Command spawning error: '%s'", error->message);
339- command->pid = 0;
340+ g_warning ("[Command/%s] Failed to run: %s", command->name, error->message);
341 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (command->menu_item), FALSE);
342 }
343 g_clear_error (&error);
344- return spawned;
345+
346+ return command->pid;
347 }
348
349 static gboolean
350@@ -822,7 +891,9 @@
351
352 if (command->pid)
353 {
354- close_pid (&command->pid, TRUE);
355+ g_debug ("[Command/%s] Stopping command", command->name);
356+ close_pid (command->pid, TRUE);
357+ command->pid = 0;
358 if (command->menu_item)
359 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (command->menu_item), FALSE);
360 if (command->widget)
361@@ -1156,8 +1227,7 @@
362
363 g_return_val_if_fail (INDICATOR_IS_OBJECT (io), FALSE);
364
365- g_signal_emit_by_name (io, "scroll", 1, event->direction);
366- g_signal_emit_by_name (io, "scroll-entry", entry, 1, event->direction);
367+ g_signal_emit_by_name(io, INDICATOR_OBJECT_SIGNAL_ENTRY_SCROLLED, entry, 1, event->direction);
368
369 return FALSE;
370 }
371@@ -1275,7 +1345,7 @@
372 {
373 /* Close any open menus instead of opening one */
374 entries = indicator_object_get_entries (io);
375- for (lp = entries; lp; lp = g_list_next (entry))
376+ for (lp = entries; lp; lp = g_list_next (lp))
377 {
378 entrydata = lp->data;
379 gtk_menu_popdown (entrydata->menu);
380@@ -1434,18 +1504,6 @@
381 /* Don't allow virtual file systems? */
382 greeter_set_env ("GIO_USE_VFS", "local");
383 greeter_set_env ("GVFS_DISABLE_FUSE", "1");
384-
385- #ifdef START_INDICATOR_SERVICES
386- gchar *INDICATORS_CMD[] = {"init", "--user", "--startup-event", "indicator-services-start", NULL};
387- GError *error = NULL;
388- GPid pid = 0;
389-
390- if (g_spawn_async (NULL, INDICATORS_CMD, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &pid, &error))
391- pids_to_close = g_slist_prepend (pids_to_close, GINT_TO_POINTER (pid));
392- else
393- g_warning ("[Greeter] Failed to run 'init --startup-event indicator-services-start': %s", error->message);
394- g_clear_error (&error);
395- #endif
396 inited = TRUE;
397 }
398
399@@ -2553,7 +2611,7 @@
400 bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
401 textdomain (GETTEXT_PACKAGE);
402
403- g_unix_signal_add (SIGTERM, (GSourceFunc)sigterm_cb, pids_to_close);
404+ g_unix_signal_add (SIGTERM, (GSourceFunc)sigterm_cb, NULL);
405
406 config = g_key_file_new ();
407 g_key_file_load_from_file (config, CONFIG_FILE, G_KEY_FILE_NONE, &error);
408@@ -2692,6 +2750,13 @@
409 g_object_set (gtk_settings_get_default (), "gtk-xft-rgba", value, NULL);
410 g_free (value);
411
412+ #ifdef AT_SPI_COMMAND
413+ spawn_line_pid (AT_SPI_COMMAND, G_SPAWN_SEARCH_PATH, NULL);
414+ #endif
415+
416+ #ifdef INDICATOR_SERVICES_COMMAND
417+ spawn_line_pid (INDICATOR_SERVICES_COMMAND, G_SPAWN_SEARCH_PATH, NULL);
418+ #endif
419
420 builder = gtk_builder_new ();
421 if (!gtk_builder_add_from_string (builder, lightdm_gtk_greeter_ui,
422@@ -2865,30 +2930,16 @@
423 }
424
425 value = g_key_file_get_value (config, "greeter", "keyboard", NULL);
426- a11y_keyboard_command = menu_command_parse_extended (value, keyboard_menuitem, "onboard", "--xid");
427+ a11y_keyboard_command = menu_command_parse_extended ("keyboard", value, keyboard_menuitem, "onboard", "--xid");
428 g_free (value);
429
430 gtk_widget_set_visible (keyboard_menuitem, a11y_keyboard_command != NULL);
431
432 value = g_key_file_get_value (config, "greeter", "reader", NULL);
433- a11y_reader_command = menu_command_parse (value, reader_menuitem);
434+ a11y_reader_command = menu_command_parse ("reader", value, reader_menuitem);
435 gtk_widget_set_visible (reader_menuitem, a11y_reader_command != NULL);
436 g_free (value);
437
438- if (a11y_keyboard_command || a11y_reader_command)
439- {
440- gchar *AT_SPI_CMD[] = {"/usr/lib/at-spi2-core/at-spi-bus-launcher", "--launch-immediately", NULL};
441- GPid pid = 0;
442- if (g_spawn_async (NULL, AT_SPI_CMD, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &pid, &error))
443- {
444- g_debug ("[Greeter] AT-SPI launched");
445- pids_to_close = g_slist_prepend (pids_to_close, GINT_TO_POINTER (pid));
446- }
447- else
448- g_warning ("[Greeter] Failed to launch AT-SPI: %s", error->message);
449- g_clear_error (&error);
450- }
451-
452 /* Power menu */
453 if (gtk_widget_get_visible (power_menuitem))
454 {

Subscribers

People subscribed via source and target branches