> > From: Marc-André Lureau <marcandre.lureau@xxxxxxxxxx> > > This will allow easier lifecycle management, > and usage of gtk_clipboard_set_with_owner() > > Signed-off-by: Marc-André Lureau <marcandre.lureau@xxxxxxxxxx> > --- > src/vdagent/clipboard.c | 67 +++++++++++++++++++++++++++-------------- > src/vdagent/clipboard.h | 12 +++++--- > src/vdagent/vdagent.c | 7 +++-- > 3 files changed, 56 insertions(+), 30 deletions(-) > > diff --git a/src/vdagent/clipboard.c b/src/vdagent/clipboard.c > index 1e49248..cf6e344 100644 > --- a/src/vdagent/clipboard.c > +++ b/src/vdagent/clipboard.c > @@ -76,15 +76,25 @@ typedef struct { > } Selection; > #endif > > -struct VDAgentClipboards { > -#ifdef WITH_GTK > +struct _VDAgentClipboards { Can we use C99 complaints identifiers? > + GObject parent; > + > struct udscs_connection *conn; > - Selection selections[SELECTION_COUNT]; > + > +#ifdef WITH_GTK > + Selection selections[SELECTION_COUNT]; > #else > struct vdagent_x11 *x11; > #endif > }; > > +struct _VDAgentClipboardsClass > +{ 2 structure style declaration in one patch > + GObjectClass parent; > +}; > + > +G_DEFINE_TYPE(VDAgentClipboards, vdagent_clipboards, G_TYPE_OBJECT) > + > #ifdef WITH_GTK > static const struct { > guint type; > @@ -453,43 +463,56 @@ err: > #endif > } > > -VDAgentClipboards *vdagent_clipboards_init(struct vdagent_x11 *x11, > - struct udscs_connection *conn) > +static void > +vdagent_clipboards_init(VDAgentClipboards *self) > { > -#ifdef WITH_GTK > - guint sel_id; > -#endif > +} > + > +VDAgentClipboards *vdagent_clipboards_new(struct vdagent_x11 *x11) > +{ > + VDAgentClipboards *self = g_object_new(VDAGENT_TYPE_CLIPBOARDS, NULL); > > - VDAgentClipboards *c; > - c = g_new0(VDAgentClipboards, 1); > #ifndef WITH_GTK > - c->x11 = x11; > + self->x11 = x11; > #else > - c->conn = conn; > + guint sel_id; > > for (sel_id = 0; sel_id < SELECTION_COUNT; sel_id++) { > GtkClipboard *clipboard = gtk_clipboard_get(sel_atom[sel_id]); > - c->selections[sel_id].clipboard = clipboard; > + self->selections[sel_id].clipboard = clipboard; > g_signal_connect(G_OBJECT(clipboard), "owner-change", > - G_CALLBACK(clipboard_owner_change_cb), c); > + G_CALLBACK(clipboard_owner_change_cb), self); > } > #endif > > - return c; > + return self; > } > > -void vdagent_clipboards_finalize(VDAgentClipboards *c, gboolean conn_alive) > +void > +vdagent_clipboards_set_conn(VDAgentClipboards *self, struct udscs_connection > *conn) > +{ > + self->conn = conn; > +} > + > +static void vdagent_clipboards_dispose(GObject *obj) > { > #ifdef WITH_GTK > + VDAgentClipboards *self = VDAGENT_CLIPBOARDS(obj); > guint sel_id; > + > for (sel_id = 0; sel_id < SELECTION_COUNT; sel_id++) > - > g_signal_handlers_disconnect_by_func(c->selections[sel_id].clipboard, > - G_CALLBACK(clipboard_owner_change_cb), c); > + > g_signal_handlers_disconnect_by_func(self->selections[sel_id].clipboard, > + G_CALLBACK(clipboard_owner_change_cb), self); > > - if (conn_alive == FALSE) > - c->conn = NULL; > - vdagent_clipboards_release_all(c); > + if (self->conn) > + vdagent_clipboards_release_all(self); > #endif > +} > + > +static void > +vdagent_clipboards_class_init(VDAgentClipboardsClass *klass) > +{ > + GObjectClass *oclass = G_OBJECT_CLASS(klass); > > - g_free(c); > + oclass->dispose = vdagent_clipboards_dispose; > } > diff --git a/src/vdagent/clipboard.h b/src/vdagent/clipboard.h > index f819b49..cd8eacb 100644 > --- a/src/vdagent/clipboard.h > +++ b/src/vdagent/clipboard.h > @@ -19,16 +19,18 @@ > #ifndef __VDAGENT_CLIPBOARD_H > #define __VDAGENT_CLIPBOARD_H > > -#include <glib.h> > +#include <glib-object.h> > > #include "x11.h" > #include "udscs.h" > > -typedef struct VDAgentClipboards VDAgentClipboards; > +#define VDAGENT_TYPE_CLIPBOARDS vdagent_clipboards_get_type() > +G_DECLARE_FINAL_TYPE(VDAgentClipboards, vdagent_clipboards, VDAGENT, > CLIPBOARDS, GObject) > > -VDAgentClipboards *vdagent_clipboards_init(struct vdagent_x11 *x11, > - struct udscs_connection *conn); > -void vdagent_clipboards_finalize(VDAgentClipboards *c, gboolean conn_alive); > +VDAgentClipboards *vdagent_clipboards_new(struct vdagent_x11 *x11); > + > +void vdagent_clipboards_set_conn(VDAgentClipboards *self, > + struct udscs_connection *conn); > > void vdagent_clipboard_request(VDAgentClipboards *c, guint sel_id, guint > type); > > diff --git a/src/vdagent/vdagent.c b/src/vdagent/vdagent.c > index 61aeac7..bfc0d5f 100644 > --- a/src/vdagent/vdagent.c > +++ b/src/vdagent/vdagent.c > @@ -165,8 +165,8 @@ static void vdagent_quit_loop(VDAgent *agent) > { > /* other GMainLoop(s) might be running, quit them before agent->loop */ > if (agent->clipboards) { > - vdagent_clipboards_finalize(agent->clipboards, agent->conn != NULL); > - agent->clipboards = NULL; > + vdagent_clipboards_set_conn(agent->clipboards, agent->conn); > + g_clear_object(&agent->clipboards); > } > if (agent->loop) > g_main_loop_quit(agent->loop); > @@ -400,7 +400,8 @@ static gboolean vdagent_init_async_cb(gpointer user_data) > if (!vdagent_init_file_xfer(agent)) > syslog(LOG_WARNING, "File transfer is disabled"); > > - agent->clipboards = vdagent_clipboards_init(agent->x11, agent->conn); > + agent->clipboards = vdagent_clipboards_new(agent->x11); > + vdagent_clipboards_set_conn(agent->clipboards, agent->conn); Why not using a constructor property to pass agent->conn? > > if (parent_socket != -1) { > if (write(parent_socket, "OK", 2) != 2) Beside style I didn't have a look at other stuff Frediano _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel