Пример #1
0
gboolean
login1_service_connect (Login1Service *service)
{
    GVariant *result;
    GVariantIter *seat_iter;
    const gchar *id, *path;
    GError *error = NULL;

    g_return_val_if_fail (service != NULL, FALSE);

    if (service->priv->connected)
        return TRUE;

    service->priv->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
    if (error)
        g_warning ("Failed to get system bus: %s", error->message);
    g_clear_error (&error);
    if (!service->priv->connection)
        return FALSE;

    service->priv->signal_id = g_dbus_connection_signal_subscribe (service->priv->connection,
                                                                   LOGIN1_SERVICE_NAME,
                                                                   LOGIN1_MANAGER_INTERFACE_NAME,
                                                                   NULL,
                                                                   LOGIN1_OBJECT_NAME,
                                                                   NULL,
                                                                   G_DBUS_SIGNAL_FLAGS_NONE,
                                                                   signal_cb,
                                                                   g_object_ref (service),
                                                                   g_object_unref);

    result = g_dbus_connection_call_sync (service->priv->connection,
                                          LOGIN1_SERVICE_NAME,
                                          LOGIN1_OBJECT_NAME,
                                          LOGIN1_MANAGER_INTERFACE_NAME,
                                          "ListSeats",
                                          g_variant_new ("()"),
                                          G_VARIANT_TYPE ("(a(so))"),
                                          G_DBUS_CALL_FLAGS_NONE,
                                          -1,
                                          NULL,
                                          &error);
    if (error)
        g_warning ("Failed to get list of logind seats: %s", error->message);
    g_clear_error (&error);
    if (!result)
        return FALSE;

    g_variant_get (result, "(a(so))", &seat_iter);
    while (g_variant_iter_loop (seat_iter, "(&s&o)", &id, &path))
        add_seat (service, id, path);
    g_variant_iter_free (seat_iter);
    g_variant_unref (result);

    service->priv->connected = TRUE;

    return TRUE;
}
Пример #2
0
static void
handle_global(void *data, struct wl_registry *registry,
	      uint32_t name, const char *interface, uint32_t version)
{
	struct touch *touch = data;

	if (strcmp(interface, "wl_compositor") == 0) {
		touch->compositor =
			wl_registry_bind(registry, name,
					 &wl_compositor_interface, 1);
	} else if (strcmp(interface, "wl_shell") == 0) {
		touch->shell =
			wl_registry_bind(registry, name,
					 &wl_shell_interface, 1);
	} else if (strcmp(interface, "wl_shm") == 0) {
		touch->shm = wl_registry_bind(registry, name,
					      &wl_shm_interface, 1);
		wl_shm_add_listener(touch->shm, &shm_listener, touch);
	} else if (strcmp(interface, "wl_seat") == 0) {
		add_seat(touch, name, version);
	}
}
Пример #3
0
static void
signal_cb (GDBusConnection *connection,
           const gchar *sender_name,
           const gchar *object_path,
           const gchar *interface_name,
           const gchar *signal_name,
           GVariant *parameters,
           gpointer user_data)
{
    Login1Service *service = user_data;

    if (strcmp (signal_name, "SeatNew") == 0)
    {
        const gchar *id, *path;
        Login1Seat *seat;

        g_variant_get (parameters, "(&s&o)", &id, &path);
        seat = login1_service_get_seat (service, id);
        if (!seat)
        {
            seat = add_seat (service, id, path);
            g_signal_emit (service, service_signals[SEAT_ADDED], 0, seat);
        }
    }
    else if (strcmp (signal_name, "SeatRemoved") == 0)
    {
        const gchar *id, *path;
        Login1Seat *seat;

        g_variant_get (parameters, "(&s&o)", &id, &path);
        seat = login1_service_get_seat (service, id);
        if (seat)
        {
            service->priv->seats = g_list_remove (service->priv->seats, seat);
            g_signal_emit (service, service_signals[SEAT_REMOVED], 0, seat);
            g_object_unref (seat);
        }
    }
}