Compare commits
	
		
			1 Commits
		
	
	
		
			wip/smcv/i
			...
			benzea/sys
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					b92afe6a63 | 
@@ -1044,10 +1044,10 @@ var WindowManager = class {
 | 
			
		||||
 | 
			
		||||
        global.display.connect('x11-display-opened', () => {
 | 
			
		||||
            IBusManager.getIBusManager().restartDaemon(['--xim']);
 | 
			
		||||
            Shell.util_start_systemd_unit('gnome-session-x11-services.target', 'fail');
 | 
			
		||||
            Shell.util_start_systemd_unit('gnome-session-x11-services.target', 'fail', null, () => {});
 | 
			
		||||
        });
 | 
			
		||||
        global.display.connect('x11-display-closing', () => {
 | 
			
		||||
            Shell.util_stop_systemd_unit('gnome-session-x11-services.target', 'fail');
 | 
			
		||||
            Shell.util_stop_systemd_unit('gnome-session-x11-services.target', 'fail', null, () => {});
 | 
			
		||||
            IBusManager.getIBusManager().restartDaemon();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										195
									
								
								src/shell-util.c
									
									
									
									
									
								
							
							
						
						
									
										195
									
								
								src/shell-util.c
									
									
									
									
									
								
							@@ -573,6 +573,53 @@ shell_util_check_cloexec_fds (void)
 | 
			
		||||
  g_info ("Open fd CLOEXEC check complete");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
  GDBusConnection *connection;
 | 
			
		||||
  gchar           *command;
 | 
			
		||||
 | 
			
		||||
  GCancellable *cancellable;
 | 
			
		||||
  gulong        cancel_id;
 | 
			
		||||
 | 
			
		||||
  guint    job_watch;
 | 
			
		||||
  gchar   *job;
 | 
			
		||||
} SystemdCall;
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
shell_util_systemd_call_data_free (SystemdCall *data)
 | 
			
		||||
{
 | 
			
		||||
  if (data->job_watch)
 | 
			
		||||
    {
 | 
			
		||||
      g_dbus_connection_signal_unsubscribe (data->connection, data->job_watch);
 | 
			
		||||
      data->job_watch = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (data->cancellable)
 | 
			
		||||
    {
 | 
			
		||||
      g_cancellable_disconnect (data->cancellable, data->cancel_id);
 | 
			
		||||
      g_clear_object (&data->cancellable);
 | 
			
		||||
      data->cancel_id = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_clear_object (&data->connection);
 | 
			
		||||
  g_clear_pointer (&data->job, g_free);
 | 
			
		||||
  g_clear_pointer (&data->command, g_free);
 | 
			
		||||
  g_free (data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
shell_util_systemd_call_cancelled_cb (GCancellable *cancellable,
 | 
			
		||||
                                      GTask        *task)
 | 
			
		||||
{
 | 
			
		||||
  SystemdCall *data = g_task_get_task_data (task);
 | 
			
		||||
 | 
			
		||||
  /* We are still in the DBus call; it will return the error. */
 | 
			
		||||
  if (data->job == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  /* Return the cancellation error now. */
 | 
			
		||||
  g_assert (g_task_return_error_if_cancelled (task));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_systemd_call_cb (GObject      *source,
 | 
			
		||||
                    GAsyncResult *res,
 | 
			
		||||
@@ -580,26 +627,103 @@ on_systemd_call_cb (GObject      *source,
 | 
			
		||||
{
 | 
			
		||||
  g_autoptr (GVariant) reply = NULL;
 | 
			
		||||
  g_autoptr (GError) error = NULL;
 | 
			
		||||
  const gchar *command = user_data;
 | 
			
		||||
  GTask *task = G_TASK (user_data);
 | 
			
		||||
  SystemdCall *data;
 | 
			
		||||
 | 
			
		||||
  reply = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source),
 | 
			
		||||
                                         res, &error);
 | 
			
		||||
  if (error)
 | 
			
		||||
    g_warning ("Could not issue '%s' systemd call", command);
 | 
			
		||||
 | 
			
		||||
  data = g_task_get_task_data (task);
 | 
			
		||||
 | 
			
		||||
  if (error) {
 | 
			
		||||
    g_warning ("Could not issue '%s' systemd call", data->command);
 | 
			
		||||
    g_task_return_error (task, g_steal_pointer (&error));
 | 
			
		||||
    g_object_unref (task);
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  g_assert (data->job == NULL);
 | 
			
		||||
  g_variant_get (reply, 0, "(o)", &data->job);
 | 
			
		||||
 | 
			
		||||
  /* And we wait for the JobRemoved notification. */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
shell_util_systemd_call (const char  *command,
 | 
			
		||||
                         const char  *unit,
 | 
			
		||||
                         const char  *mode,
 | 
			
		||||
                         GError     **error)
 | 
			
		||||
static void
 | 
			
		||||
on_systemd_job_removed_cb (GDBusConnection *connection,
 | 
			
		||||
                           const gchar *sender_name,
 | 
			
		||||
                           const gchar *object_path,
 | 
			
		||||
                           const gchar *interface_name,
 | 
			
		||||
                           const gchar *signal_name,
 | 
			
		||||
                           GVariant *parameters,
 | 
			
		||||
                           gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
  GTask *task = G_TASK (user_data);
 | 
			
		||||
  SystemdCall *data;
 | 
			
		||||
  guint32 id;
 | 
			
		||||
  const char *path, *unit, *result;
 | 
			
		||||
 | 
			
		||||
  data = g_task_get_task_data (task);
 | 
			
		||||
 | 
			
		||||
  /* No job information yet, ignore. */
 | 
			
		||||
  if (data->job == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  g_variant_get (parameters, "(u&o&s&s)", &id, &path, &unit, &result);
 | 
			
		||||
 | 
			
		||||
  /* Is it the job we are waiting for? */
 | 
			
		||||
  if (g_strcmp0 (path, data->job) != 0)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  /* Task has completed; return the result of the job */
 | 
			
		||||
  g_task_return_pointer (task, g_strdup (result), g_free);
 | 
			
		||||
  g_object_unref (task);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
shell_util_systemd_call (const char           *command,
 | 
			
		||||
                         const char           *unit,
 | 
			
		||||
                         const char           *mode,
 | 
			
		||||
                         GCancellable         *cancellable,
 | 
			
		||||
                         GAsyncReadyCallback   callback,
 | 
			
		||||
                         gpointer              user_data)
 | 
			
		||||
{
 | 
			
		||||
  g_autoptr (GDBusConnection) connection = NULL;
 | 
			
		||||
  g_autoptr (GTask) task = NULL;
 | 
			
		||||
  GError *error = NULL;
 | 
			
		||||
  SystemdCall *data;
 | 
			
		||||
 | 
			
		||||
  connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, error);
 | 
			
		||||
  task = g_task_new (NULL, cancellable, callback, user_data);
 | 
			
		||||
 | 
			
		||||
  if (connection == NULL)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
  connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
 | 
			
		||||
 | 
			
		||||
  if (connection == NULL) {
 | 
			
		||||
    g_task_return_error (task, error);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  data = g_new0 (SystemdCall, 1);
 | 
			
		||||
  data->command = g_strdup (command);
 | 
			
		||||
  data->connection = g_object_ref (connection);
 | 
			
		||||
  data->job_watch = g_dbus_connection_signal_subscribe (connection,
 | 
			
		||||
                                                        "org.freedesktop.systemd1",
 | 
			
		||||
                                                        "org.freedesktop.systemd1.Manager",
 | 
			
		||||
                                                        "JobRemoved",
 | 
			
		||||
                                                        "/org/freedesktop/systemd1",
 | 
			
		||||
                                                        NULL,
 | 
			
		||||
                                                        G_DBUS_SIGNAL_FLAGS_NONE,
 | 
			
		||||
                                                        on_systemd_job_removed_cb,
 | 
			
		||||
                                                        g_object_ref (task),
 | 
			
		||||
                                                        g_object_unref);
 | 
			
		||||
  g_task_set_task_data (task,
 | 
			
		||||
                        data,
 | 
			
		||||
                        (GDestroyNotify) shell_util_systemd_call_data_free);
 | 
			
		||||
 | 
			
		||||
  if (cancellable)
 | 
			
		||||
    data->cancel_id = g_cancellable_connect (cancellable,
 | 
			
		||||
                                             G_CALLBACK (shell_util_systemd_call_cancelled_cb),
 | 
			
		||||
                                             task,
 | 
			
		||||
                                             NULL);
 | 
			
		||||
 | 
			
		||||
  g_dbus_connection_call (connection,
 | 
			
		||||
                          "org.freedesktop.systemd1",
 | 
			
		||||
@@ -608,28 +732,49 @@ shell_util_systemd_call (const char  *command,
 | 
			
		||||
                          command,
 | 
			
		||||
                          g_variant_new ("(ss)",
 | 
			
		||||
                                         unit, mode),
 | 
			
		||||
                          NULL,
 | 
			
		||||
                          G_VARIANT_TYPE ("(o)"),
 | 
			
		||||
                          G_DBUS_CALL_FLAGS_NONE,
 | 
			
		||||
                          -1, NULL,
 | 
			
		||||
                          -1, cancellable,
 | 
			
		||||
                          on_systemd_call_cb,
 | 
			
		||||
                          (gpointer) command);
 | 
			
		||||
  return TRUE;
 | 
			
		||||
                          g_steal_pointer (&task));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
shell_util_start_systemd_unit (const char  *unit,
 | 
			
		||||
                               const char  *mode,
 | 
			
		||||
                               GError     **error)
 | 
			
		||||
void
 | 
			
		||||
shell_util_start_systemd_unit (const char           *unit,
 | 
			
		||||
                               const char           *mode,
 | 
			
		||||
                               GCancellable         *cancellable,
 | 
			
		||||
                               GAsyncReadyCallback   callback,
 | 
			
		||||
                               gpointer              user_data)
 | 
			
		||||
{
 | 
			
		||||
  return shell_util_systemd_call ("StartUnit", unit, mode, error);
 | 
			
		||||
  shell_util_systemd_call ("StartUnit", unit, mode,
 | 
			
		||||
                           cancellable, callback, user_data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
shell_util_stop_systemd_unit (const char  *unit,
 | 
			
		||||
                              const char  *mode,
 | 
			
		||||
                              GError     **error)
 | 
			
		||||
gchar*
 | 
			
		||||
shell_util_start_systemd_unit_finish (GObject       *obj,
 | 
			
		||||
                                      GAsyncResult  *res,
 | 
			
		||||
                                      GError       **error)
 | 
			
		||||
{
 | 
			
		||||
  return shell_util_systemd_call ("StopUnit", unit, mode, error);
 | 
			
		||||
  return g_task_propagate_pointer (G_TASK (res), error);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
shell_util_stop_systemd_unit (const char           *unit,
 | 
			
		||||
                              const char           *mode,
 | 
			
		||||
                              GCancellable         *cancellable,
 | 
			
		||||
                              GAsyncReadyCallback   callback,
 | 
			
		||||
                              gpointer              user_data)
 | 
			
		||||
{
 | 
			
		||||
  shell_util_systemd_call ("StopUnit", unit, mode,
 | 
			
		||||
                           cancellable, callback, user_data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gchar*
 | 
			
		||||
shell_util_stop_systemd_unit_finish (GObject       *obj,
 | 
			
		||||
                                     GAsyncResult  *res,
 | 
			
		||||
                                     GError       **error)
 | 
			
		||||
{
 | 
			
		||||
  return g_task_propagate_pointer (G_TASK (res), error);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
 
 | 
			
		||||
@@ -57,12 +57,23 @@ cairo_surface_t * shell_util_composite_capture_images (ClutterCapture  *captures
 | 
			
		||||
 | 
			
		||||
void shell_util_check_cloexec_fds (void);
 | 
			
		||||
 | 
			
		||||
gboolean shell_util_start_systemd_unit (const char  *unit,
 | 
			
		||||
                                        const char  *mode,
 | 
			
		||||
                                        GError     **error);
 | 
			
		||||
gboolean shell_util_stop_systemd_unit  (const char  *unit,
 | 
			
		||||
                                        const char  *mode,
 | 
			
		||||
                                        GError     **error);
 | 
			
		||||
void   shell_util_start_systemd_unit        (const char           *unit,
 | 
			
		||||
                                             const char           *mode,
 | 
			
		||||
                                             GCancellable         *cancellable,
 | 
			
		||||
                                             GAsyncReadyCallback   callback,
 | 
			
		||||
                                             gpointer              user_data);
 | 
			
		||||
gchar* shell_util_start_systemd_unit_finish (GObject              *obj,
 | 
			
		||||
                                             GAsyncResult         *res,
 | 
			
		||||
                                             GError              **error);
 | 
			
		||||
 | 
			
		||||
void  shell_util_stop_systemd_unit         (const char           *unit,
 | 
			
		||||
                                            const char           *mode,
 | 
			
		||||
                                            GCancellable         *cancellable,
 | 
			
		||||
                                            GAsyncReadyCallback   callback,
 | 
			
		||||
                                            gpointer              user_data);
 | 
			
		||||
gchar* shell_util_stop_systemd_unit_finish (GObject              *obj,
 | 
			
		||||
                                            GAsyncResult         *res,
 | 
			
		||||
                                            GError              **error);
 | 
			
		||||
 | 
			
		||||
void shell_util_sd_notify (void);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user