static void spice_gtk_session_dispose(GObject *gobject) { SpiceGtkSession *self = SPICE_GTK_SESSION(gobject); SpiceGtkSessionPrivate *s = self->priv; /* release stuff */ if (s->clipboard) { g_signal_handlers_disconnect_by_func(s->clipboard, G_CALLBACK(clipboard_owner_change), self); s->clipboard = NULL; } if (s->clipboard_primary) { g_signal_handlers_disconnect_by_func(s->clipboard_primary, G_CALLBACK(clipboard_owner_change), self); s->clipboard_primary = NULL; } if (s->session) { g_signal_handlers_disconnect_by_func(s->session, G_CALLBACK(channel_new), self); g_signal_handlers_disconnect_by_func(s->session, G_CALLBACK(channel_destroy), self); s->session = NULL; } /* Chain up to the parent class */ if (G_OBJECT_CLASS(spice_gtk_session_parent_class)->dispose) G_OBJECT_CLASS(spice_gtk_session_parent_class)->dispose(gobject); }
static GObject * spice_gtk_session_constructor(GType gtype, guint n_properties, GObjectConstructParam *properties) { GObject *obj; SpiceGtkSession *self; SpiceGtkSessionPrivate *s; GList *list; GList *it; { /* Always chain up to the parent constructor */ GObjectClass *parent_class; parent_class = G_OBJECT_CLASS(spice_gtk_session_parent_class); obj = parent_class->constructor(gtype, n_properties, properties); } self = SPICE_GTK_SESSION(obj); s = self->priv; if (!s->session) g_error("SpiceGtKSession constructed without a session"); g_signal_connect(s->session, "channel-new", G_CALLBACK(channel_new), self); g_signal_connect(s->session, "channel-destroy", G_CALLBACK(channel_destroy), self); list = spice_session_get_channels(s->session); for (it = g_list_first(list); it != NULL; it = g_list_next(it)) { channel_new(s->session, it->data, (gpointer*)self); } g_list_free(list); return obj; }
static void spice_gtk_session_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *pspec) { SpiceGtkSession *self = SPICE_GTK_SESSION(gobject); SpiceGtkSessionPrivate *s = self->priv; switch (prop_id) { case PROP_SESSION: g_value_set_object(value, s->session); break; case PROP_AUTO_CLIPBOARD: g_value_set_boolean(value, s->auto_clipboard_enable); break; case PROP_AUTO_USBREDIR: g_value_set_boolean(value, s->auto_usbredir_enable); break; case PROP_POINTER_GRABBED: g_value_set_boolean(value, s->pointer_grabbed); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec); break; } }
static void spice_gtk_session_finalize(GObject *gobject) { SpiceGtkSession *self = SPICE_GTK_SESSION(gobject); SpiceGtkSessionPrivate *s = self->priv; int i; /* release stuff */ for (i = 0; i < CLIPBOARD_LAST; ++i) { g_free(s->clip_targets[i]); s->clip_targets[i] = NULL; } /* Chain up to the parent class */ if (G_OBJECT_CLASS(spice_gtk_session_parent_class)->finalize) G_OBJECT_CLASS(spice_gtk_session_parent_class)->finalize(gobject); }
/** * spice_gtk_session_get: * @session: #SpiceSession for which to get the #SpiceGtkSession * * Gets the #SpiceGtkSession associated with the passed in #SpiceSession. * A new #SpiceGtkSession instance will be created the first time this * function is called for a certain #SpiceSession. * * Note that this function returns a weak reference, which should not be used * after the #SpiceSession itself has been unref-ed by the caller. * * Returns: (transfer none): a weak reference to the #SpiceGtkSession associated with the passed in #SpiceSession * * Since 0.8 **/ SpiceGtkSession *spice_gtk_session_get(SpiceSession *session) { g_return_val_if_fail(SPICE_IS_SESSION(session), NULL); SpiceGtkSession *self; static GStaticMutex mutex = G_STATIC_MUTEX_INIT; g_static_mutex_lock(&mutex); self = session->priv->gtk_session; if (self == NULL) { self = g_object_new(SPICE_TYPE_GTK_SESSION, "session", session, NULL); session->priv->gtk_session = self; } g_static_mutex_unlock(&mutex); return SPICE_GTK_SESSION(self); }
static void spice_gtk_session_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *pspec) { SpiceGtkSession *self = SPICE_GTK_SESSION(gobject); SpiceGtkSessionPrivate *s = self->priv; switch (prop_id) { case PROP_SESSION: s->session = g_value_get_object(value); break; case PROP_AUTO_CLIPBOARD: s->auto_clipboard_enable = g_value_get_boolean(value); break; case PROP_AUTO_USBREDIR: { SpiceDesktopIntegration *desktop_int; gboolean orig_value = s->auto_usbredir_enable; s->auto_usbredir_enable = g_value_get_boolean(value); if (s->auto_usbredir_enable == orig_value) break; if (s->auto_usbredir_reqs) { SpiceUsbDeviceManager *manager = spice_usb_device_manager_get(s->session, NULL); if (!manager) break; g_object_set(manager, "auto-connect", s->auto_usbredir_enable, NULL); desktop_int = spice_desktop_integration_get(s->session); if (s->auto_usbredir_enable) spice_desktop_integration_inhibit_automount(desktop_int); else spice_desktop_integration_uninhibit_automount(desktop_int); } break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec); break; } }