Change PurpleXferUiOps.add_xfer to PurpleXfer:visible property.

Sun, 22 Dec 2019 16:35:25 -0500

author
Elliott Sales de Andrade <qulogic@pidgin.im>
date
Sun, 22 Dec 2019 16:35:25 -0500
changeset 40260
663b8a40dad5
parent 40259
7ba119b0f75c
child 40261
d26ef8ea193f

Change PurpleXferUiOps.add_xfer to PurpleXfer:visible property.

ChangeLog.API file | annotate | diff | comparison | revisions
finch/gntxfer.c file | annotate | diff | comparison | revisions
libpurple/xfer.c file | annotate | diff | comparison | revisions
libpurple/xfer.h file | annotate | diff | comparison | revisions
pidgin/gtkxfer.c file | annotate | diff | comparison | revisions
--- a/ChangeLog.API	Sun Dec 22 15:40:59 2019 -0500
+++ b/ChangeLog.API	Sun Dec 22 16:35:25 2019 -0500
@@ -473,6 +473,7 @@
 		* purple_util_get_image_checksum.  Use
 		  g_compute_checksum_for_data(G_CHECKSUM_SHA1, ...), instead.
 		* purple_uts35_to_str
+		* purple_xfer_add
 		* purple_xfer_get_ui_data and purple_xfer_set_ui_data. Use
 		  GObject data functions instead.
 		* purple_xfer_update_progress
@@ -484,6 +485,8 @@
 		* PurpleValue, use GValue instead.
 		* PurpleXferUiOps.add_thumbnail. Use PurpleXfer::add-thumbnail
 		  instead.
+		* PurpleXferUiOps.add_xfer. Use notify::visible on #PurpleXfer
+		  objects instead.
 		* PurpleXferUiOps.cancel_local and
 		  PurpleXferUiOps.cancel_remote. Use notify::status on
 		  #PurpleXfer objects instead.
--- a/finch/gntxfer.c	Sun Dec 22 15:40:59 2019 -0500
+++ b/finch/gntxfer.c	Sun Dec 22 16:35:25 2019 -0500
@@ -59,7 +59,6 @@
 typedef struct
 {
 	gint64 last_updated_time;
-	gboolean in_list;
 
 	gboolean notified;   /* Has the completion of the transfer been notified? */
 
@@ -256,8 +255,7 @@
 
 	for (iter = purple_xfers_get_all(); iter; iter = iter->next) {
 		PurpleXfer *xfer = (PurpleXfer *)iter->data;
-		PurpleGntXferUiData *data = g_object_get_data(G_OBJECT(xfer), UI_DATA);
-		if (data->in_list) {
+		if (purple_xfer_get_visible(xfer)) {
 			finch_xfer_dialog_add_xfer(xfer);
 			finch_xfer_dialog_update_xfer(xfer);
 			gnt_tree_set_selected(GNT_TREE(tree), xfer);
@@ -297,7 +295,6 @@
 	g_object_ref(xfer);
 
 	data = g_object_get_data(G_OBJECT(xfer), UI_DATA);
-	data->in_list = TRUE;
 
 	finch_xfer_dialog_show();
 
@@ -329,20 +326,14 @@
 void
 finch_xfer_dialog_remove_xfer(PurpleXfer *xfer)
 {
-	PurpleGntXferUiData *data;
-
 	g_return_if_fail(xfer_dialog != NULL);
 	g_return_if_fail(xfer != NULL);
 
-	data = g_object_get_data(G_OBJECT(xfer), UI_DATA);
-
-	if (data == NULL)
+	if (!purple_xfer_get_visible(xfer)) {
 		return;
+	}
 
-	if (!data->in_list)
-		return;
-
-	data->in_list = FALSE;
+	purple_xfer_set_visible(xfer, FALSE);
 
 	gnt_tree_remove(GNT_TREE(xfer_dialog->tree), xfer);
 
@@ -369,8 +360,9 @@
 	if (data == NULL)
 		return;
 
-	if (!data->in_list)
+	if (!purple_xfer_get_visible(xfer)) {
 		return;
+	}
 
 	if ((purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL) && (xfer_dialog->auto_clear)) {
 		finch_xfer_dialog_remove_xfer(xfer);
@@ -415,7 +407,7 @@
 	g_return_if_fail(xfer != NULL);
 
 	data = g_object_get_data(G_OBJECT(xfer), UI_DATA);
-	if (data == NULL || !data->in_list || data->notified) {
+	if (data == NULL || !purple_xfer_get_visible(xfer) || data->notified) {
 		return;
 	}
 
@@ -464,16 +456,6 @@
  * File Transfer UI Ops
  **************************************************************************/
 static void
-finch_xfer_new_xfer(PurpleXfer *xfer)
-{
-	PurpleGntXferUiData *data;
-
-	/* This is where we're setting xfer's "ui_data" for the first time. */
-	data = g_new0(PurpleGntXferUiData, 1);
-	g_object_set_data_full(G_OBJECT(xfer), UI_DATA, data, g_free);
-}
-
-static void
 finch_xfer_progress_notify(PurpleXfer *xfer, G_GNUC_UNUSED GParamSpec *pspec,
                            G_GNUC_UNUSED gpointer data)
 {
@@ -494,25 +476,41 @@
 }
 
 static void
-finch_xfer_add_xfer(PurpleXfer *xfer)
+finch_xfer_visible_notify(PurpleXfer *xfer, G_GNUC_UNUSED GParamSpec *pspec,
+                          G_GNUC_UNUSED gpointer data)
 {
+	if (!purple_xfer_get_visible(xfer)) {
+		return;
+	}
+
 	if (!xfer_dialog)
 		finch_xfer_dialog_new();
 
 	finch_xfer_dialog_add_xfer(xfer);
 	gnt_tree_set_selected(GNT_TREE(xfer_dialog->tree), xfer);
+}
+
+static void
+finch_xfer_new_xfer(PurpleXfer *xfer)
+{
+	PurpleGntXferUiData *data;
+
+	/* This is where we're setting xfer's "ui_data" for the first time. */
+	data = g_new0(PurpleGntXferUiData, 1);
+	g_object_set_data_full(G_OBJECT(xfer), UI_DATA, data, g_free);
 
 	g_signal_connect(xfer, "notify::progress",
 	                 G_CALLBACK(finch_xfer_progress_notify), NULL);
 	g_signal_connect(xfer, "notify::status",
 	                 G_CALLBACK(finch_xfer_status_notify), NULL);
+	g_signal_connect(xfer, "notify::visible",
+	                 G_CALLBACK(finch_xfer_visible_notify), NULL);
 }
 
 static PurpleXferUiOps ops =
 {
 	finch_xfer_new_xfer,
-	NULL,
-	finch_xfer_add_xfer
+	NULL
 };
 
 /**************************************************************************
--- a/libpurple/xfer.c	Sun Dec 22 15:40:59 2019 -0500
+++ b/libpurple/xfer.c	Sun Dec 22 16:35:25 2019 -0500
@@ -73,6 +73,8 @@
 
 	PurpleXferStatus status;     /* File Transfer's status.             */
 
+	gboolean visible;            /* Hint the UI that the transfer should
+	                                be visible or not. */
 	PurpleXferUiOps *ui_ops;     /* UI-specific operations.             */
 
 	/*
@@ -115,6 +117,7 @@
 	PROP_END_TIME,
 	PROP_STATUS,
 	PROP_PROGRESS,
+	PROP_VISIBLE,
 	PROP_LAST
 };
 
@@ -183,6 +186,19 @@
 	g_object_notify_by_pspec(G_OBJECT(xfer), properties[PROP_STATUS]);
 }
 
+void
+purple_xfer_set_visible(PurpleXfer *xfer, gboolean visible)
+{
+	PurpleXferPrivate *priv = NULL;
+
+	g_return_if_fail(PURPLE_IS_XFER(xfer));
+
+	priv = purple_xfer_get_instance_private(xfer);
+	priv->visible = visible;
+
+	g_object_notify_by_pspec(G_OBJECT(xfer), properties[PROP_VISIBLE]);
+}
+
 static void
 purple_xfer_conversation_write_internal(PurpleXfer *xfer,
 	const char *message, gboolean is_error, gboolean print_thumbnail)
@@ -642,7 +658,7 @@
 		g_free(msg);
 	}
 
-	purple_xfer_add(xfer);
+	purple_xfer_set_visible(xfer, TRUE);
 
 	klass->init(xfer);
 }
@@ -744,6 +760,17 @@
 }
 
 gboolean
+purple_xfer_get_visible(PurpleXfer *xfer)
+{
+	PurpleXferPrivate *priv = NULL;
+
+	g_return_val_if_fail(PURPLE_IS_XFER(xfer), FALSE);
+
+	priv = purple_xfer_get_instance_private(xfer);
+	return priv->visible;
+}
+
+gboolean
 purple_xfer_is_cancelled(PurpleXfer *xfer)
 {
 	g_return_val_if_fail(PURPLE_IS_XFER(xfer), TRUE);
@@ -1688,19 +1715,6 @@
 }
 
 void
-purple_xfer_add(PurpleXfer *xfer)
-{
-	PurpleXferUiOps *ui_ops;
-
-	g_return_if_fail(PURPLE_IS_XFER(xfer));
-
-	ui_ops = purple_xfer_get_ui_ops(xfer);
-
-	if (ui_ops != NULL && ui_ops->add_xfer != NULL)
-		ui_ops->add_xfer(xfer);
-}
-
-void
 purple_xfer_cancel_local(PurpleXfer *xfer)
 {
 	PurpleXferClass *klass = NULL;
@@ -1974,6 +1988,9 @@
 		case PROP_STATUS:
 			purple_xfer_set_status(xfer, g_value_get_enum(value));
 			break;
+		case PROP_VISIBLE:
+			purple_xfer_set_visible(xfer, g_value_get_boolean(value));
+			break;
 		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
 			break;
@@ -2038,6 +2055,9 @@
 		case PROP_PROGRESS:
 			g_value_set_double(value, purple_xfer_get_progress(xfer));
 			break;
+		case PROP_VISIBLE:
+			g_value_set_boolean(value, purple_xfer_get_visible(xfer));
+			break;
 		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
 			break;
@@ -2217,6 +2237,11 @@
 	        "The current progress of the file transfer.", -1.0, 1.0, -1.0,
 	        G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
 
+	properties[PROP_VISIBLE] = g_param_spec_boolean(
+	        "visible", "Visible",
+	        "Hint for UIs whether this transfer should be visible.", FALSE,
+	        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
 	g_object_class_install_properties(obj_class, PROP_LAST, properties);
 
 	/* Signals */
--- a/libpurple/xfer.h	Sun Dec 22 15:40:59 2019 -0500
+++ b/libpurple/xfer.h	Sun Dec 22 16:35:25 2019 -0500
@@ -92,7 +92,6 @@
  * PurpleXferUiOps:
  * @new_xfer: UI op that's called after a new transfer is created.
  * @destroy: UI op that's called when a transfer is being destroyed.
- * @add_xfer: UI op that's called when a transfer should be added to the UI.
  *
  * File transfer UI operations.
  *
@@ -103,7 +102,6 @@
 {
 	void (*new_xfer)(PurpleXfer *xfer);
 	void (*destroy)(PurpleXfer *xfer);
-	void (*add_xfer)(PurpleXfer *xfer);
 };
 
 /**
@@ -268,6 +266,20 @@
 PurpleXferStatus purple_xfer_get_status(PurpleXfer *xfer);
 
 /**
+ * purple_xfer_get_visible:
+ * @xfer: The file transfer.
+ *
+ * Returns whether the UI should show the file transfer in its listing.
+ *
+ * Note, this is just a hint for UIs and has no effect internally.
+ *
+ * Returns: The visibility.
+ *
+ * Since: 3.0.0
+ */
+gboolean purple_xfer_get_visible(PurpleXfer *xfer);
+
+/**
  * purple_xfer_is_cancelled:
  * @xfer: The file transfer.
  *
@@ -436,6 +448,19 @@
 void purple_xfer_set_status(PurpleXfer *xfer, PurpleXferStatus status);
 
 /**
+ * purple_xfer_set_visible:
+ * @xfer: The file transfer.
+ * @visible: The visibility.
+ *
+ * Sets whether the UI should show the file transfer in its listing.
+ *
+ * Note, this is just a hint for UIs and has no effect internally.
+ *
+ * Since: 3.0.0
+ */
+void purple_xfer_set_visible(PurpleXfer *xfer, gboolean visible);
+
+/**
  * purple_xfer_set_message:
  * @xfer:     The file transfer.
  * @message: The message.
@@ -597,15 +622,6 @@
 void purple_xfer_end(PurpleXfer *xfer);
 
 /**
- * purple_xfer_add:
- * @xfer: The file transfer.
- *
- * Adds a new file transfer to the list of file transfers. Call this only
- * if you are not using purple_xfer_start.
- */
-void purple_xfer_add(PurpleXfer *xfer);
-
-/**
  * purple_xfer_cancel_local:
  * @xfer: The file transfer.
  *
--- a/pidgin/gtkxfer.c	Sun Dec 22 15:40:59 2019 -0500
+++ b/pidgin/gtkxfer.c	Sun Dec 22 16:35:25 2019 -0500
@@ -81,7 +81,6 @@
 {
 	GtkTreeIter iter;
 	gint64 last_updated_time;
-	gboolean in_list;
 } PidginXferUiData;
 
 static PidginXferDialog *xfer_dialog = NULL;
@@ -692,7 +691,6 @@
 	g_object_ref(xfer);
 
 	data = g_object_get_data(G_OBJECT(xfer), UI_DATA);
-	data->in_list = TRUE;
 
 	pidgin_xfer_dialog_show(dialog);
 
@@ -743,10 +741,11 @@
 	if (data == NULL)
 		return;
 
-	if (!data->in_list)
+	if (!purple_xfer_get_visible(xfer)) {
 		return;
+	}
 
-	data->in_list = FALSE;
+	purple_xfer_set_visible(xfer, FALSE);
 
 	gtk_list_store_remove(GTK_LIST_STORE(dialog->model), &data->iter);
 
@@ -771,8 +770,9 @@
 	if (data == NULL)
 		return;
 
-	if (!data->in_list)
+	if (!purple_xfer_get_visible(xfer)) {
 		return;
+	}
 
 	if (purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL &&
 	    gtk_toggle_button_get_active(
@@ -813,7 +813,7 @@
 	g_return_if_fail(xfer != NULL);
 
 	data = g_object_get_data(G_OBJECT(xfer), UI_DATA);
-	if (data == NULL || data->in_list == FALSE) {
+	if (data == NULL || !purple_xfer_get_visible(xfer)) {
 		return;
 	}
 
@@ -954,19 +954,6 @@
 }
 
 static void
-pidgin_xfer_new_xfer(PurpleXfer *xfer)
-{
-	PidginXferUiData *data;
-
-	/* This is where we're setting xfer's "ui_data" for the first time. */
-	data = g_new0(PidginXferUiData, 1);
-	g_object_set_data_full(G_OBJECT(xfer), UI_DATA, data, g_free);
-
-	g_signal_connect(xfer, "add-thumbnail",
-	                 G_CALLBACK(pidgin_xfer_add_thumbnail), NULL);
-}
-
-static void
 pidgin_xfer_progress_notify(PurpleXfer *xfer, G_GNUC_UNUSED GParamSpec *pspec,
                             G_GNUC_UNUSED gpointer data)
 {
@@ -985,25 +972,43 @@
 }
 
 static void
-pidgin_xfer_add_xfer(PurpleXfer *xfer)
+pidgin_xfer_visible_notify(PurpleXfer *xfer, G_GNUC_UNUSED GParamSpec *pspec,
+                           G_GNUC_UNUSED gpointer data)
 {
+	if (!purple_xfer_get_visible(xfer)) {
+		return;
+	}
+
 	if (xfer_dialog == NULL) {
 		xfer_dialog = pidgin_xfer_dialog_new();
 	}
 
 	pidgin_xfer_dialog_add_xfer(xfer_dialog, xfer);
+}
 
+static void
+pidgin_xfer_new_xfer(PurpleXfer *xfer)
+{
+	PidginXferUiData *data;
+
+	/* This is where we're setting xfer's "ui_data" for the first time. */
+	data = g_new0(PidginXferUiData, 1);
+	g_object_set_data_full(G_OBJECT(xfer), UI_DATA, data, g_free);
+
+	g_signal_connect(xfer, "add-thumbnail",
+	                 G_CALLBACK(pidgin_xfer_add_thumbnail), NULL);
 	g_signal_connect(xfer, "notify::progress",
 	                 G_CALLBACK(pidgin_xfer_progress_notify), NULL);
 	g_signal_connect(xfer, "notify::status",
 	                 G_CALLBACK(pidgin_xfer_status_notify), NULL);
+	g_signal_connect(xfer, "notify::visible",
+	                 G_CALLBACK(pidgin_xfer_visible_notify), NULL);
 }
 
 static PurpleXferUiOps ops =
 {
 	pidgin_xfer_new_xfer,
-	NULL,
-	pidgin_xfer_add_xfer
+	NULL
 };
 
 /**************************************************************************

mercurial