Sun, 22 Dec 2019 16:35:25 -0500
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 }; /**************************************************************************