summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew P. <pan.pav.7c5@gmail.com>2015-01-26 17:41:10 +0300
committerAndrew P. <pan.pav.7c5@gmail.com>2015-01-26 17:41:10 +0300
commit65509c733ba65a9cb61a39b9885799e4255cdd7e (patch)
tree05c58e7a2791f0cf16800387dccb4711241f85e5
parent2c02d86d4af91bc0c8b33b04fd8271c712a98df7 (diff)
downloadlightdm-gtk-greeter-git-65509c733ba65a9cb61a39b9885799e4255cdd7e.tar.gz
New configure options: "--enable-at-spi-command" and "--enable-indicator-services-command" (replaces "--enable-indicator-services"); using "upstart" instead of "init" (lp1398619)
-rw-r--r--configure.ac53
-rw-r--r--src/lightdm-gtk-greeter.c95
2 files changed, 104 insertions, 44 deletions
diff --git a/configure.ac b/configure.ac
index 74165a0..652d021 100644
--- a/configure.ac
+++ b/configure.ac
@@ -36,6 +36,8 @@ INDICATOR_REQUIRED_VERSION=0.3.92
INDICATOR_PKG=indicator3-0.4
IDO_PKG=libido3-0.1
+dnl ###########################################################################
+
AC_ARG_ENABLE([libindicator],
AC_HELP_STRING([--enable-libindicator], [Enable libindicator support])
AC_HELP_STRING([--disable-libindicator], [Disable libindicator support]),
@@ -67,6 +69,8 @@ AS_IF([test "x$enable_libindicator" = "xyes"], [
AC_MSG_RESULT([disabled])
])
+dnl ###########################################################################
+
AC_ARG_ENABLE([libido],
AC_HELP_STRING([--enable-libido], [Enable libido support])
AC_HELP_STRING([--disable-libido], [Disable libido support]),
@@ -86,23 +90,46 @@ AS_IF([test "x$enable_libido" = "xyes" && test "x$have_libindicator" = "xyes"],
AC_MSG_RESULT([disabled])
])
-AC_ARG_ENABLE([indicator-services],
- AC_HELP_STRING([--enable-indicator-services], [Try to start indicator services])
- AC_HELP_STRING([--disable-indicator-services], [Do not start indicator services]),
- [], [enable_indicator_services=no])
-
-AS_IF([test "x$enable_indicator_services" != "xno" && test "x$have_libindicator" = "xyes"], [
- AC_DEFINE([START_INDICATOR_SERVICES], [], [Try to start indicator-services])
-])
+dnl ###########################################################################
AC_ARG_WITH([libxklavier], AS_HELP_STRING([--with-libxklavier], [Use libxklavier to manage layouts (instead of LightDM API)]))
AS_IF([test "x$with_libxklavier" = "xyes"],
- [
- PKG_CHECK_MODULES([LIBXKLAVIER], [libxklavier], [have_xklavier=yes])
- AC_DEFINE([HAVE_LIBXKLAVIER], [1], [Define if "libxklavier" is present])
- ],
- [])
+[
+ PKG_CHECK_MODULES([LIBXKLAVIER], [libxklavier], [have_xklavier=yes])
+ AC_DEFINE([HAVE_LIBXKLAVIER], [1], [Define if "libxklavier" is present])
+],
+[])
+
+dnl ###########################################################################
+
+AC_ARG_ENABLE([at-spi-command],
+ AC_HELP_STRING([--enable-at-spi-command[=command]], [Try to start at-spi service]])
+ AC_HELP_STRING([--disable-at-spi-command], [Do not start at-spi service]),
+ [], [])
+
+AS_IF([test "x$enable_at_spi_command" != "xno"],
+[
+ if test "x$enable_at_spi_command" = "xyes" || test "x$enable_at_spi_command" = "x"; then
+ enable_at_spi_command="/usr/lib/at-spi2-core/at-spi-bus-launcher --launch-immediately"
+ fi
+ AC_DEFINE_UNQUOTED([AT_SPI_COMMAND], ["$enable_at_spi_command"], [Command to start at-spi service])
+])
+
+dnl ###########################################################################
+
+AC_ARG_ENABLE([indicator-services-command],
+ AC_HELP_STRING([--enable-indicator-services-command[=command]], [Try to start indicators service]])
+ AC_HELP_STRING([--disable-indicator-services-command], [Do not start indicators service]),
+ [], [])
+
+AS_IF([test "x$enable_indicator_services_command" != "xno"],
+[
+ if test "x$enable_indicator_services_command" = "xyes" || test "x$enable_indicator_services_command" = "x"; then
+ enable_indicator_services_command="upstart --user --startup-event indicator-services-start"
+ fi
+ AC_DEFINE_UNQUOTED([INDICATOR_SERVICES_COMMAND], ["$enable_indicator_services_command"], [Command to start indicators service])
+])
dnl ###########################################################################
dnl Internationalization
diff --git a/src/lightdm-gtk-greeter.c b/src/lightdm-gtk-greeter.c
index 72e24df..69627ab 100644
--- a/src/lightdm-gtk-greeter.c
+++ b/src/lightdm-gtk-greeter.c
@@ -53,7 +53,6 @@
#include "src/lightdm-gtk-greeter-css-fallback.h"
#include "src/lightdm-gtk-greeter-css-application.h"
-
static LightDMGreeter *greeter;
/* State file */
@@ -63,7 +62,10 @@ static void save_state_file (void);
/* List of spawned processes */
static GSList *pids_to_close = NULL;
-static GPid spawn_pid (gchar **argv, GSpawnFlags flags, gint *pfd, GError **perror);
+static GPid spawn_argv_pid (gchar **argv, GSpawnFlags flags, gint *pfd, GError **perror);
+#if defined(AT_SPI_COMMAND) || defined(INDICATOR_SERVICES_COMMAND)
+static GPid spawn_line_pid (const gchar *line, GSpawnFlags flags, GError **perror);
+#endif
static void close_pid (GPid pid, gboolean remove);
static void sigterm_cb (gpointer user_data);
@@ -149,6 +151,8 @@ static void set_user_image (const gchar *username);
/* External command (keyboard, reader) */
typedef struct
{
+ const gchar *name;
+
gchar **argv;
gint argc;
@@ -157,8 +161,9 @@ typedef struct
GtkWidget *widget;
} MenuCommand;
-static MenuCommand *menu_command_parse (const gchar *value, GtkWidget *menu_item);
-static MenuCommand *menu_command_parse_extended (const gchar *value, GtkWidget *menu_item,
+static MenuCommand *menu_command_parse (const gchar *name, const gchar *value, GtkWidget *menu_item);
+static MenuCommand *menu_command_parse_extended (const gchar *name,
+ const gchar *value, GtkWidget *menu_item,
const gchar *xid_app, const gchar *xid_arg);
static gboolean menu_command_run (MenuCommand *command);
static gboolean menu_command_stop (MenuCommand *command);
@@ -351,7 +356,7 @@ save_state_file (void)
/* Terminating */
static GPid
-spawn_pid (gchar **argv, GSpawnFlags flags, gint *pfd, GError **perror)
+spawn_argv_pid (gchar **argv, GSpawnFlags flags, gint *pfd, GError **perror)
{
GPid pid = 0;
GError *error = NULL;
@@ -365,7 +370,7 @@ spawn_pid (gchar **argv, GSpawnFlags flags, gint *pfd, GError **perror)
if (spawned)
{
pids_to_close = g_slist_prepend (pids_to_close, GINT_TO_POINTER (pid));
- g_debug ("[Greeter] Command executed (#%d): %s", pid, argv[0]);
+ g_debug ("[PIDs] Command executed (#%d): %s", pid, argv[0]);
}
else if (perror)
{
@@ -373,13 +378,39 @@ spawn_pid (gchar **argv, GSpawnFlags flags, gint *pfd, GError **perror)
}
else
{
- g_warning ("[Greeter] Failed to execute command: %s", argv[0]);
+ g_warning ("[PIDs] Failed to execute command: %s", argv[0]);
g_clear_error (&error);
}
return pid;
}
+#if defined(AT_SPI_COMMAND) || defined(INDICATOR_SERVICES_COMMAND)
+static GPid
+spawn_line_pid (const gchar *line, GSpawnFlags flags, GError **perror)
+{
+ gint argc = 0;
+ gchar **argv = NULL;
+ GError *error = NULL;
+
+ if (g_shell_parse_argv (line, &argc, &argv, &error))
+ {
+ GPid pid = spawn_argv_pid (argv, flags, NULL, perror);
+ g_strfreev (argv);
+ return pid;
+ }
+ else if (!perror && error)
+ {
+ g_warning ("[PIDs] Failed to parse command line: %s, %s", error->message, line);
+ g_clear_error (&error);
+ }
+ else if (error)
+ *perror = error;
+
+ return 0;
+}
+#endif
+
static void
close_pid (GPid pid, gboolean remove)
{
@@ -390,9 +421,9 @@ close_pid (GPid pid, gboolean remove)
pids_to_close = g_slist_remove (pids_to_close, GINT_TO_POINTER (pid));
if (kill (pid, SIGTERM) == 0)
- g_debug ("[Greeter] Process terminated: #%d", pid);
+ g_debug ("[PIDs] Process terminated: #%d", pid);
else
- g_warning ("[Greeter] Failed to terminate process #%d: %s", pid, g_strerror (errno));
+ g_warning ("[PIDs] Failed to terminate process #%d: %s", pid, g_strerror (errno));
waitpid (pid, NULL, 0);
}
@@ -716,13 +747,14 @@ set_user_image (const gchar *username)
/* MenuCommand */
static MenuCommand*
-menu_command_parse (const gchar *value, GtkWidget *menu_item)
+menu_command_parse (const gchar *name, const gchar *value, GtkWidget *menu_item)
{
- return menu_command_parse_extended (value, menu_item, NULL, NULL);
+ return menu_command_parse_extended (name, value, menu_item, NULL, NULL);
}
static MenuCommand*
-menu_command_parse_extended (const gchar *value, /* String to parse */
+menu_command_parse_extended (const gchar *name,
+ const gchar *value, /* String to parse */
GtkWidget *menu_item, /* Menu item to connect */
const gchar *xid_app, /* Program that have "xembed" mode support */
const gchar *xid_arg) /* Argument that must be added to command line */
@@ -737,7 +769,7 @@ menu_command_parse_extended (const gchar *value, /* String to parse */
if (!g_shell_parse_argv (value, &argc, &argv, &error))
{
if (error)
- g_warning ("Failed to parse command line: %s", error->message);
+ g_warning ("[Command/%s] Failed to parse command line: %s", name, error->message);
g_clear_error (&error);
return NULL;
}
@@ -771,7 +803,7 @@ menu_command_parse_extended (const gchar *value, /* String to parse */
else
{
if (error)
- g_warning ("Failed to parse command line: %s", error->message);
+ g_warning ("[Command/%s] Failed to parse command line: %s", name, error->message);
g_clear_error (&error);
}
g_free (new_value);
@@ -783,6 +815,7 @@ menu_command_parse_extended (const gchar *value, /* String to parse */
gtk_overlay_add_overlay (screen_overlay, command->widget);
}
}
+ command->name = name;
return command;
}
@@ -794,11 +827,13 @@ menu_command_run (MenuCommand *command)
GError *error = NULL;
command->pid = 0;
+ g_debug ("[Command/%s] Running command", command->name);
+
if (command->widget)
{
GtkSocket* socket = NULL;
gint out_fd = 0;
- GPid pid = spawn_pid (command->argv, G_SPAWN_SEARCH_PATH, &out_fd, &error);
+ GPid pid = spawn_argv_pid (command->argv, G_SPAWN_SEARCH_PATH, &out_fd, &error);
if (pid && out_fd)
{
@@ -821,7 +856,8 @@ menu_command_run (MenuCommand *command)
command->pid = pid;
}
else
- g_warning ("Failed to get '%s' socket: unrecognized output", command->argv[0]);
+ g_warning ("[Command/%s] Failed to get '%s' socket for: unrecognized output",
+ command->name, command->argv[0]);
g_free (text);
}
@@ -832,7 +868,7 @@ menu_command_run (MenuCommand *command)
}
else
{
- command->pid = spawn_pid (command->argv, G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, NULL, &error);
+ command->pid = spawn_argv_pid (command->argv, G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, NULL, &error);
if (command->pid)
g_child_watch_add (command->pid, (GChildWatchFunc)menu_command_terminated_cb, command);
}
@@ -840,7 +876,7 @@ menu_command_run (MenuCommand *command)
if (!command->pid)
{
if (error)
- g_warning ("Command spawning error: %s", error->message);
+ g_warning ("[Command/%s] Failed to run: %s", command->name, error->message);
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (command->menu_item), FALSE);
}
g_clear_error (&error);
@@ -855,6 +891,7 @@ menu_command_stop (MenuCommand *command)
if (command->pid)
{
+ g_debug ("[Command/%s] Stopping command", command->name);
close_pid (command->pid, TRUE);
command->pid = 0;
if (command->menu_item)
@@ -1467,11 +1504,6 @@ init_indicators (GKeyFile* config)
/* Don't allow virtual file systems? */
greeter_set_env ("GIO_USE_VFS", "local");
greeter_set_env ("GVFS_DISABLE_FUSE", "1");
-
- #ifdef START_INDICATOR_SERVICES
- gchar *INDICATORS_CMD[] = {"init", "--user", "--startup-event", "indicator-services-start", NULL};
- spawn_pid (INDICATORS_CMD, G_SPAWN_SEARCH_PATH, NULL, NULL);
- #endif
inited = TRUE;
}
@@ -2718,6 +2750,13 @@ main (int argc, char **argv)
g_object_set (gtk_settings_get_default (), "gtk-xft-rgba", value, NULL);
g_free (value);
+ #ifdef AT_SPI_COMMAND
+ spawn_line_pid (AT_SPI_COMMAND, G_SPAWN_SEARCH_PATH, NULL);
+ #endif
+
+ #ifdef INDICATOR_SERVICES_COMMAND
+ spawn_line_pid (INDICATOR_SERVICES_COMMAND, G_SPAWN_SEARCH_PATH, NULL);
+ #endif
builder = gtk_builder_new ();
if (!gtk_builder_add_from_string (builder, lightdm_gtk_greeter_ui,
@@ -2891,22 +2930,16 @@ main (int argc, char **argv)
}
value = g_key_file_get_value (config, "greeter", "keyboard", NULL);
- a11y_keyboard_command = menu_command_parse_extended (value, keyboard_menuitem, "onboard", "--xid");
+ a11y_keyboard_command = menu_command_parse_extended ("keyboard", value, keyboard_menuitem, "onboard", "--xid");
g_free (value);
gtk_widget_set_visible (keyboard_menuitem, a11y_keyboard_command != NULL);
value = g_key_file_get_value (config, "greeter", "reader", NULL);
- a11y_reader_command = menu_command_parse (value, reader_menuitem);
+ a11y_reader_command = menu_command_parse ("reader", value, reader_menuitem);
gtk_widget_set_visible (reader_menuitem, a11y_reader_command != NULL);
g_free (value);
- if (a11y_keyboard_command || a11y_reader_command)
- {
- gchar *AT_SPI_CMD[] = {"/usr/lib/at-spi2-core/at-spi-bus-launcher", "--launch-immediately", NULL};
- spawn_pid (AT_SPI_CMD, G_SPAWN_SEARCH_PATH, NULL, NULL);
- }
-
/* Power menu */
if (gtk_widget_get_visible (power_menuitem))
{