--- 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_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
+ * PurpleXferUiOps.add_xfer. Use notify::visible on #PurpleXfer * 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 @@
gint64 last_updated_time;
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 (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 @@
data = g_object_get_data(G_OBJECT(xfer), UI_DATA);
finch_xfer_dialog_show();
@@ -329,20 +326,14 @@
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 (!purple_xfer_get_visible(xfer)) {
+ purple_xfer_set_visible(xfer, FALSE); gnt_tree_remove(GNT_TREE(xfer_dialog->tree), xfer);
@@ -369,8 +360,9 @@
+ if (!purple_xfer_get_visible(xfer)) { 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) { @@ -464,16 +456,6 @@
**************************************************************************/
-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);
finch_xfer_progress_notify(PurpleXfer *xfer, G_GNUC_UNUSED GParamSpec *pspec,
G_GNUC_UNUSED gpointer data)
@@ -494,25 +476,41 @@
-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)) { finch_xfer_dialog_add_xfer(xfer);
gnt_tree_set_selected(GNT_TREE(xfer_dialog->tree), xfer);
+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 =
/**************************************************************************
--- 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 PurpleXferUiOps *ui_ops; /* UI-specific operations. */
@@ -115,6 +117,7 @@
@@ -183,6 +186,19 @@
g_object_notify_by_pspec(G_OBJECT(xfer), properties[PROP_STATUS]);
+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]); purple_xfer_conversation_write_internal(PurpleXfer *xfer,
const char *message, gboolean is_error, gboolean print_thumbnail)
@@ -642,7 +658,7 @@
+ purple_xfer_set_visible(xfer, TRUE); @@ -744,6 +760,17 @@
+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); purple_xfer_is_cancelled(PurpleXfer *xfer)
g_return_val_if_fail(PURPLE_IS_XFER(xfer), TRUE);
@@ -1688,19 +1715,6 @@
-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);
purple_xfer_cancel_local(PurpleXfer *xfer)
PurpleXferClass *klass = NULL;
@@ -1974,6 +1988,9 @@
purple_xfer_set_status(xfer, g_value_get_enum(value));
+ purple_xfer_set_visible(xfer, g_value_get_boolean(value)); G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
@@ -2038,6 +2055,9 @@
g_value_set_double(value, purple_xfer_get_progress(xfer));
+ g_value_set_boolean(value, purple_xfer_get_visible(xfer)); G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
@@ -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( + "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);
--- 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 @@
* @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. +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. +void purple_xfer_set_visible(PurpleXfer *xfer, gboolean visible); * purple_xfer_set_message:
* @xfer: The file transfer.
@@ -597,15 +622,6 @@
void purple_xfer_end(PurpleXfer *xfer);
- * @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 @@
gint64 last_updated_time;
static PidginXferDialog *xfer_dialog = NULL;
@@ -692,7 +691,6 @@
data = g_object_get_data(G_OBJECT(xfer), UI_DATA);
pidgin_xfer_dialog_show(dialog);
@@ -743,10 +741,11 @@
+ if (!purple_xfer_get_visible(xfer)) {
+ purple_xfer_set_visible(xfer, FALSE); gtk_list_store_remove(GTK_LIST_STORE(dialog->model), &data->iter);
@@ -771,8 +770,9 @@
+ if (!purple_xfer_get_visible(xfer)) { 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)) { @@ -954,19 +954,6 @@
-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);
pidgin_xfer_progress_notify(PurpleXfer *xfer, G_GNUC_UNUSED GParamSpec *pspec,
G_GNUC_UNUSED gpointer data)
@@ -985,25 +972,43 @@
-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)) { if (xfer_dialog == NULL) {
xfer_dialog = pidgin_xfer_dialog_new();
pidgin_xfer_dialog_add_xfer(xfer_dialog, xfer);
+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 =
/**************************************************************************