gchar *path;
gboolean can_graphical;
gboolean can_multi_session;
+ gchar *active_session;
} Login1Seat;
static GList *login1_seats = NULL;
static void ready (void);
static void quit (int status);
+static gboolean status_timeout_cb (gpointer data);
static void check_status (const gchar *status);
static AccountsUser *get_accounts_user_by_uid (guint uid);
static AccountsUser *get_accounts_user_by_name (const gchar *username);
static void accounts_user_set_hidden (AccountsUser *user, gboolean hidden, gboolean emit_signal);
+static Login1Session *find_login1_session (const gchar *id);
static gboolean
kill_timeout_cb (gpointer data)
}
else if (strcmp (name, "WAIT") == 0)
{
+ const gchar *v;
+ int duration;
+
+ /* Stop status timeout */
+ if (status_timeout)
+ g_source_remove (status_timeout);
+ status_timeout = 0;
+
/* Use a main loop so that our DBus functions are still responsive */
GMainLoop *loop = g_main_loop_new (NULL, FALSE);
- g_timeout_add_seconds (1, stop_loop, loop);
+ v = g_hash_table_lookup (params, "DURATION");
+ duration = v ? atoi (v) : 1;
+ if (duration < 1)
+ duration = 1;
+ g_timeout_add_seconds (duration, stop_loop, loop);
g_main_loop_run (loop);
g_main_loop_unref (loop);
+
+ /* Restart status timeout */
+ status_timeout = g_timeout_add (status_timeout_ms, status_timeout_cb, NULL);
}
else if (strcmp (name, "ADD-SEAT") == 0)
{
if (v)
seat->can_multi_session = strcmp (v, "TRUE") == 0;
}
+ else if (strcmp (name, "ADD-LOCAL-X-SEAT") == 0)
+ {
+ GVariant *result;
+ const gchar *v;
+
+ v = g_hash_table_lookup (params, "DISPLAY");
+ result = g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
+ "org.freedesktop.DisplayManager",
+ "/org/freedesktop/DisplayManager",
+ "org.freedesktop.DisplayManager",
+ "AddLocalXSeat",
+ g_variant_new ("(i)", v ? atoi (v) : -1),
+ G_VARIANT_TYPE ("(o)"),
+ G_DBUS_CALL_FLAGS_NONE,
+ G_MAXINT,
+ NULL,
+ NULL);
+ g_variant_unref (result);
+ }
else if (strcmp (name, "UPDATE-SEAT") == 0)
{
Login1Seat *seat;
seat->can_multi_session = strcmp (v, "TRUE") == 0;
g_variant_builder_add (&invalidated_properties, "s", "CanMultiSession");
}
+ v = g_hash_table_lookup (params, "ACTIVE-SESSION");
+ if (v)
+ {
+ g_free (seat->active_session);
+ seat->active_session = g_strdup (v);
+ g_variant_builder_add (&invalidated_properties, "s", "ActiveSession");
+ }
g_dbus_connection_emit_signal (g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL),
NULL,
GString *status_text;
gchar *username;
AccountsUser *user;
+ GError *error = NULL;
status_text = g_string_new ("RUNNER UPDATE-USER USERNAME=");
user = get_accounts_user_by_name (username);
if (user)
{
- GVariantBuilder invalidated_properties;
- GError *error = NULL;
-
- g_variant_builder_init (&invalidated_properties, G_VARIANT_TYPE_ARRAY);
-
if (g_hash_table_lookup (params, "NAME"))
{
user->user_name = g_strdup (g_hash_table_lookup (params, "NAME"));
g_string_append_printf (status_text, " NAME=%s", user->user_name);
- g_variant_builder_add (&invalidated_properties, "s", "UserName");
}
if (g_hash_table_lookup (params, "REAL-NAME"))
{
user->real_name = g_strdup (g_hash_table_lookup (params, "REAL-NAME"));
g_string_append_printf (status_text, " REAL-NAME=%s", user->real_name);
- g_variant_builder_add (&invalidated_properties, "s", "RealName");
}
if (g_hash_table_lookup (params, "HOME-DIRECTORY"))
{
user->home_directory = g_strdup (g_hash_table_lookup (params, "HOME-DIRECTORY"));
g_string_append_printf (status_text, " HOME-DIRECTORY=%s", user->home_directory);
- g_variant_builder_add (&invalidated_properties, "s", "HomeDirectory");
}
if (g_hash_table_lookup (params, "IMAGE"))
{
user->image = g_strdup (g_hash_table_lookup (params, "IMAGE"));
g_string_append_printf (status_text, " IMAGE=%s", user->image);
- g_variant_builder_add (&invalidated_properties, "s", "IconFile");
}
if (g_hash_table_lookup (params, "BACKGROUND"))
{
user->background = g_strdup (g_hash_table_lookup (params, "BACKGROUND"));
g_string_append_printf (status_text, " BACKGROUND=%s", user->background);
- g_variant_builder_add (&invalidated_properties, "s", "BackgroundFile");
}
if (g_hash_table_lookup (params, "LANGUAGE"))
{
user->language = g_strdup (g_hash_table_lookup (params, "LANGUAGE"));
g_string_append_printf (status_text, " LANGUAGE=%s", user->language);
- g_variant_builder_add (&invalidated_properties, "s", "Language");
}
if (g_hash_table_lookup (params, "LAYOUTS"))
{
const gchar *value = g_hash_table_lookup (params, "LAYOUTS");
user->layouts = g_strsplit (value, ";", -1);
g_string_append_printf (status_text, " LAYOUTS=%s", value);
- g_variant_builder_add (&invalidated_properties, "s", "XKeyboardLayouts");
}
if (g_hash_table_lookup (params, "HAS-MESSAGES"))
{
user->has_messages = g_strcmp0 (g_hash_table_lookup (params, "HAS-MESSAGES"), "TRUE") == 0;
g_string_append_printf (status_text, " HAS-MESSAGES=%s", user->has_messages ? "TRUE" : "FALSE");
- g_variant_builder_add (&invalidated_properties, "s", "XHasMessages");
}
if (g_hash_table_lookup (params, "SESSION"))
{
user->xsession = g_strdup (g_hash_table_lookup (params, "SESSION"));
g_string_append_printf (status_text, " SESSION=%s", user->xsession);
- g_variant_builder_add (&invalidated_properties, "s", "XSession");
}
g_dbus_connection_emit_signal (accounts_connection,
NULL,
user->path,
- "org.freedesktop.DBus.Properties",
- "PropertiesChanged",
- g_variant_new ("(sa{sv}as)", "org.freedesktop.Accounts.User", NULL, &invalidated_properties),
+ "org.freedesktop.Accounts.User",
+ "Changed",
+ g_variant_new ("()"),
&error);
- if (error)
- g_warning ("Failed to emit PropertiesChanged: %s", error->message);
- g_clear_error (&error);
}
else
g_warning ("Unknown user %s", username);
+ if (error)
+ g_warning ("Failed to emit Changed: %s", error->message);
+ g_clear_error (&error);
+
check_status (status_text->str);
g_string_free (status_text, TRUE);
}
check_status (status_text);
g_free (status_text);
}
+ else if (strcmp (name, "UNLOCK-SESSION") == 0)
+ {
+ gchar *status_text, *id;
+ Login1Session *session;
+
+ id = g_hash_table_lookup (params, "SESSION");
+ session = find_login1_session (id);
+ if (session)
+ {
+ if (!session->locked)
+ g_warning ("Session %s is not locked", id);
+ session->locked = FALSE;
+ }
+ else
+ g_warning ("Unknown session %s", id);
+
+ status_text = g_strdup_printf ("RUNNER UNLOCK-SESSION SESSION=%s", id);
+ check_status (status_text);
+ g_free (status_text);
+ }
/* Forward to external processes */
else if (g_str_has_prefix (name, "SESSION-") ||
g_str_has_prefix (name, "GREETER-") ||
g_str_has_prefix (name, "XSERVER-") ||
+ g_str_has_prefix (name, "XMIR-") ||
+ g_str_has_prefix (name, "XVNC-") ||
strcmp (name, "UNITY-SYSTEM-COMPOSITOR") == 0)
{
GList *link;
{
ScriptLine *line;
+ status_timeout = 0;
+
line = get_script_line (NULL);
fail ("(timeout)", line ? line->text : NULL);
- return FALSE;
+ return G_SOURCE_REMOVE;
}
static void
if (n_read > 0)
n_read = g_socket_receive (socket, buffer, length, NULL, &error);
if (error)
- g_warning ("Error reading from socket: %s", error->message);
+ {
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CONNECTION_CLOSED))
+ n_read = 0;
+ else
+ g_warning ("Error reading from socket: %s", error->message);
+ }
g_clear_error (&error);
if (n_read == 0)
{
{
CKSession *session = user_data;
- if (strcmp (method_name, "Lock") == 0)
+ if (strcmp (method_name, "GetXDGRuntimeDir") == 0 && !g_key_file_get_boolean (config, "test-runner-config", "ck-no-xdg-runtime", NULL))
+ {
+ g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", "/run/console-kit"));
+ }
+ else if (strcmp (method_name, "Lock") == 0)
{
if (!session->locked)
check_status ("CONSOLE-KIT LOCK-SESSION");
{
handle_ck_call,
};
+ const gchar *ck_session_interface_old =
+ "<node>"
+ " <interface name='org.freedesktop.ConsoleKit.Session'>"
+ " <method name='Lock'/>"
+ " <method name='Unlock'/>"
+ " <method name='Activate'/>"
+ " </interface>"
+ "</node>";
const gchar *ck_session_interface =
"<node>"
" <interface name='org.freedesktop.ConsoleKit.Session'>"
+ " <method name='GetXDGRuntimeDir'>"
+ " <arg name='dir' direction='out' type='s'/>"
+ " </method>"
" <method name='Lock'/>"
" <method name='Unlock'/>"
" <method name='Activate'/>"
g_clear_error (&error);
if (!ck_info)
return;
- ck_session_info = g_dbus_node_info_new_for_xml (ck_session_interface, &error);
+ if (g_key_file_get_boolean (config, "test-runner-config", "ck-no-xdg-runtime", NULL))
+ ck_session_info = g_dbus_node_info_new_for_xml (ck_session_interface_old, &error);
+ else
+ ck_session_info = g_dbus_node_info_new_for_xml (ck_session_interface, &error);
if (error)
g_warning ("Failed to parse D-Bus interface: %s", error->message);
g_clear_error (&error);
return g_variant_new_boolean (seat->can_multi_session);
else if (strcmp (property_name, "Id") == 0)
return g_variant_new_string (seat->id);
+ else if (strcmp (property_name, "ActiveSession") == 0)
+ {
+ if (seat->active_session)
+ {
+ gchar *path;
+ GVariant *ret;
+
+ path = g_strdup_printf ("/org/freedesktop/login1/session/%s", seat->active_session);
+ ret = g_variant_new ("(so)", seat->active_session, path);
+ g_free (path);
+
+ return ret;
+ }
+ else
+ return NULL;
+ }
else
return NULL;
}
" <interface name='org.freedesktop.login1.Seat'>"
" <property name='CanGraphical' type='b' access='read'/>"
" <property name='CanMultiSession' type='b' access='read'/>"
+ " <property name='ActiveSession' type='(so)' access='read'/>"
" <property name='Id' type='s' access='read'/>"
" </interface>"
"</node>";
seat->path = g_strdup_printf ("/org/freedesktop/login1/seat/%s", seat->id);
seat->can_graphical = TRUE;
seat->can_multi_session = TRUE;
+ seat->active_session = NULL;
login1_seat_info = g_dbus_node_info_new_for_xml (login1_seat_interface, &error);
if (error)
login1_seats = g_list_remove (login1_seats, seat);
g_free (seat->id);
g_free (seat->path);
+ g_free (seat->active_session);
g_free (seat);
}
if (strcmp (method_name, "SetXSession") == 0)
{
gchar *xsession;
- GVariantBuilder invalidated_properties;
g_variant_get (parameters, "(&s)", &xsession);
g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
/* And notify others that it took */
- g_variant_builder_init (&invalidated_properties, G_VARIANT_TYPE_ARRAY);
- g_variant_builder_add (&invalidated_properties, "s", "XSession");
g_dbus_connection_emit_signal (accounts_connection,
NULL,
user->path,
- "org.freedesktop.DBus.Properties",
- "PropertiesChanged",
- g_variant_new ("(sa{sv}as)", "org.freedesktop.Accounts.User", NULL, &invalidated_properties),
+ "org.freedesktop.Accounts.User",
+ "Changed",
+ g_variant_new ("()"),
NULL);
}
else
" <property name='XSession' type='s' access='read'/>"
" <property name='XKeyboardLayouts' type='as' access='read'/>"
" <property name='XHasMessages' type='b' access='read'/>"
+ " <signal name='Changed' />"
" </interface>"
"</node>";
GError *error = NULL;
/* Set up a skeleton file system */
g_mkdir_with_parents (g_strdup_printf ("%s/etc", temp_dir), 0755);
+ g_mkdir_with_parents (g_strdup_printf ("%s/run", temp_dir), 0755);
g_mkdir_with_parents (g_strdup_printf ("%s/usr/share", temp_dir), 0755);
g_mkdir_with_parents (g_strdup_printf ("%s/usr/share/lightdm/sessions", temp_dir), 0755);
g_mkdir_with_parents (g_strdup_printf ("%s/usr/share/lightdm/remote-sessions", temp_dir), 0755);
if (!g_key_file_has_key (config, "test-runner-config", "have-config", NULL) || g_key_file_get_boolean (config, "test-runner-config", "have-config", NULL))
if (system (g_strdup_printf ("cp %s %s/etc/lightdm/lightdm.conf", config_path, temp_dir)))
perror ("Failed to copy configuration");
+ if (system (g_strdup_printf ("cp %s/tests/data/keys.conf %s/etc/lightdm/", SRCDIR, temp_dir)))
+ perror ("Failed to copy key configuration");
additional_system_config = g_key_file_get_string (config, "test-runner-config", "additional-system-config", NULL);
if (additional_system_config)