[Spice-devel] [PATCH spice-gtk 4/7] SpiceDisplay: Add a constructor and construction properties

Marc-André Lureau marcandre.lureau at gmail.com
Thu Oct 6 11:52:31 PDT 2011


ack

On Thu, Oct 6, 2011 at 8:07 PM, Hans de Goede <hdegoede at redhat.com> wrote:
> With SpiceDisplay now passing through auto-clipboard settings to
> SpiceGtkSession, it needs to have its SpiceSession and SpiceGtkSession
> private members initalized at construction time, as
> spice_display_set_property() gets called at construction time.
>
> Currently its SpiceSession and SpiceGtkSession are NULL when that
> happens leading to the g_object_set() calls in spice_display_set_property()
> triggering g_return_if_fail statements inside glib and rightly complaining
> loudly.
>
> This patch fixes this by making the SpiceSession and channel ID construction
> properties and passing them to the g_object_new call in spice_display_new.
>
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
>  gtk/spice-widget.c |  107 ++++++++++++++++++++++++++++++++++++++++-----------
>  1 files changed, 84 insertions(+), 23 deletions(-)
>
> diff --git a/gtk/spice-widget.c b/gtk/spice-widget.c
> index 8b1c9ad..2ee9855 100644
> --- a/gtk/spice-widget.c
> +++ b/gtk/spice-widget.c
> @@ -83,6 +83,8 @@ G_DEFINE_TYPE(SpiceDisplay, spice_display, GTK_TYPE_DRAWING_AREA)
>  /* Properties */
>  enum {
>     PROP_0,
> +    PROP_SESSION,
> +    PROP_CHANNEL_ID,
>     PROP_KEYBOARD_GRAB,
>     PROP_MOUSE_GRAB,
>     PROP_RESIZE_GUEST,
> @@ -130,6 +132,12 @@ static void spice_display_get_property(GObject    *object,
>     gboolean boolean;
>
>     switch (prop_id) {
> +    case PROP_SESSION:
> +        g_value_set_object(value, d->session);
> +        break;
> +    case PROP_CHANNEL_ID:
> +        g_value_set_int(value, d->channel_id);
> +        break;
>     case PROP_KEYBOARD_GRAB:
>         g_value_set_boolean(value, d->keyboard_grab_enable);
>         break;
> @@ -164,6 +172,13 @@ static void spice_display_set_property(GObject      *object,
>     SpiceDisplayPrivate *d = SPICE_DISPLAY_GET_PRIVATE(display);
>
>     switch (prop_id) {
> +    case PROP_SESSION:
> +        d->session = g_object_ref(g_value_get_object(value));
> +        d->gtk_session = spice_gtk_session_get(d->session);
> +        break;
> +    case PROP_CHANNEL_ID:
> +        d->channel_id = g_value_get_int(value);
> +        break;
>     case PROP_KEYBOARD_GRAB:
>         d->keyboard_grab_enable = g_value_get_boolean(value);
>         if (d->keyboard_grab_enable) {
> @@ -256,7 +271,6 @@ static void spice_display_init(SpiceDisplay *display)
>     SpiceDisplayPrivate *d;
>
>     d = display->priv = SPICE_DISPLAY_GET_PRIVATE(display);
> -    memset(d, 0, sizeof(*d));
>
>     gtk_widget_add_events(widget,
>                           GDK_STRUCTURE_MASK |
> @@ -281,6 +295,42 @@ static void spice_display_init(SpiceDisplay *display)
>     d->have_mitshm = true;
>  }
>
> +static GObject *
> +spice_display_constructor(GType                  gtype,
> +                          guint                  n_properties,
> +                          GObjectConstructParam *properties)
> +{
> +    GObject *obj;
> +    SpiceDisplay *display;
> +    SpiceDisplayPrivate *d;
> +    GList *list;
> +    GList *it;
> +
> +    {
> +        /* Always chain up to the parent constructor */
> +        GObjectClass *parent_class;
> +        parent_class = G_OBJECT_CLASS(spice_display_parent_class);
> +        obj = parent_class->constructor(gtype, n_properties, properties);
> +    }
> +
> +    display = SPICE_DISPLAY(obj);
> +    d = SPICE_DISPLAY_GET_PRIVATE(display);
> +
> +    if (!d->session)
> +        g_error("SpiceDisplay constructed without a session");
> +
> +    g_signal_connect(d->session, "channel-new",
> +                     G_CALLBACK(channel_new), display);
> +    g_signal_connect(d->session, "channel-destroy",
> +                     G_CALLBACK(channel_destroy), display);
> +    list = spice_session_get_channels(d->session);
> +    for (it = g_list_first(list); it != NULL; it = g_list_next(it)) {
> +        channel_new(d->session, it->data, (gpointer*)display);
> +    }
> +    g_list_free(list);
> +
> +    return obj;
> +}
>
>  /**
>  * spice_display_set_grab_keys:
> @@ -1088,11 +1138,42 @@ static void spice_display_class_init(SpiceDisplayClass *klass)
>     gtkwidget_class->configure_event = configure_event;
>     gtkwidget_class->scroll_event = scroll_event;
>
> +    gobject_class->constructor = spice_display_constructor;
>     gobject_class->dispose = spice_display_dispose;
>     gobject_class->finalize = spice_display_finalize;
>     gobject_class->get_property = spice_display_get_property;
>     gobject_class->set_property = spice_display_set_property;
>
> +    /**
> +     * SpiceDisplay:session:
> +     *
> +     * #SpiceSession for this #SpiceDisplay
> +     *
> +     **/
> +    g_object_class_install_property
> +        (gobject_class, PROP_SESSION,
> +         g_param_spec_object("session",
> +                             "Session",
> +                             "SpiceSession",
> +                             SPICE_TYPE_SESSION,
> +                             G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE |
> +                             G_PARAM_STATIC_STRINGS));
> +
> +    /**
> +     * SpiceDisplay:channel-id:
> +     *
> +     * channel-id for this #SpiceDisplay
> +     *
> +     **/
> +    g_object_class_install_property
> +        (gobject_class, PROP_CHANNEL_ID,
> +         g_param_spec_int("channel-id",
> +                          "Channel ID",
> +                          "Channel ID for this display",
> +                          0, 255, 0,
> +                          G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE |
> +                          G_PARAM_STATIC_STRINGS));
> +
>     g_object_class_install_property
>         (gobject_class, PROP_KEYBOARD_GRAB,
>          g_param_spec_boolean("grab-keyboard",
> @@ -1589,28 +1670,8 @@ static void channel_destroy(SpiceSession *s, SpiceChannel *channel, gpointer dat
>  **/
>  SpiceDisplay *spice_display_new(SpiceSession *session, int id)
>  {
> -    SpiceDisplay *display;
> -    SpiceDisplayPrivate *d;
> -    GList *list;
> -    GList *it;
> -
> -    display = g_object_new(SPICE_TYPE_DISPLAY, NULL);
> -    d = SPICE_DISPLAY_GET_PRIVATE(display);
> -    d->session = g_object_ref(session);
> -    d->gtk_session = spice_gtk_session_get(d->session);
> -    d->channel_id = id;
> -
> -    g_signal_connect(session, "channel-new",
> -                     G_CALLBACK(channel_new), display);
> -    g_signal_connect(session, "channel-destroy",
> -                     G_CALLBACK(channel_destroy), display);
> -    list = spice_session_get_channels(session);
> -    for (it = g_list_first(list); it != NULL; it = g_list_next(it)) {
> -        channel_new(session, it->data, (gpointer*)display);
> -    }
> -    g_list_free(list);
> -
> -    return display;
> +    return g_object_new(SPICE_TYPE_DISPLAY, "session", session,
> +                        "channel-id", id, NULL);
>  }
>
>  /**
> --
> 1.7.6.4
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>



-- 
Marc-André Lureau


More information about the Spice-devel mailing list