pidgin/pidgin

edbc992e77be
Parents 675b8605dca2
Children dcc53af7a4fb
Some initial cleanups to PidginStatusBox

* Removed the connecting animation
* Removed the typing animation
* Internally track network connectivity status
* Moved object declaration to G_DEFINE_*_TYPE
* Removed the timer that would set a status message after you stop typing.

Testing Done:
Compiled and ran locally.

Reviewed at https://reviews.imfreedom.org/r/320/
  • +5 -0
    ChangeLog.API
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working0.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working1.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working10.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working11.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working12.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working13.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working14.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working15.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working16.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working17.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working18.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working19.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working2.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working20.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working21.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working22.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working23.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working24.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working25.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working26.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working27.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working28.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working29.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working3.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working30.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working4.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working5.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working6.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working7.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working8.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/process-working9.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/typing0.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/typing1.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/typing2.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/typing3.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/typing4.png
  • +0 -0
    pidgin/data/icons/hicolor/16x16/animations/typing5.png
  • +0 -9
    pidgin/gtkconn.c
  • +99 -189
    pidgin/gtkstatusbox.c
  • +15 -139
    pidgin/gtkstatusbox.h
  • +0 -39
    pidgin/pidginstock.c
  • +0 -39
    pidgin/pidginstock.h
  • --- a/ChangeLog.API Sat Jan 02 19:24:01 2021 -0600
    +++ b/ChangeLog.API Sat Jan 02 21:58:08 2021 -0600
    @@ -675,7 +675,12 @@
    * pidgin_sound_get_handle
    * pidgin_sound_get_ui_ops
    * pidgin_sound_is_customized
    + * PidginStatusBoxItemType
    + * pidgin_status_box_add
    + * pidgin_status_box_add_separator
    + * pidgin_status_box_pulse_connecting
    * pidgin_status_box_set_buddy_icon
    + * pidgin_status_box_set_network_available
    * pidgin_stock_id_from_presence
    * pidgin_text_combo_box_entry_set_text
    * pidgin_toggle_sensitive, pidgin_toggle_sensitive_array, and
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working0.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working1.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working10.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working11.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working12.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working13.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working14.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working15.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working16.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working17.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working18.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working19.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working2.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working20.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working21.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working22.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working23.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working24.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working25.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working26.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working27.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working28.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working29.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working3.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working30.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working4.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working5.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working6.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working7.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working8.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/process-working9.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/typing0.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/typing1.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/typing2.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/typing3.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/typing4.png has changed
    Binary file pidgin/data/icons/hicolor/16x16/animations/typing5.png has changed
    --- a/pidgin/gtkconn.c Sat Jan 02 19:24:01 2021 -0600
    +++ b/pidgin/gtkconn.c Sat Jan 02 21:58:08 2021 -0600
    @@ -56,7 +56,6 @@
    return;
    pidgin_status_box_set_connecting(PIDGIN_STATUS_BOX(gtkblist->statusbox),
    (purple_connections_get_connecting() != NULL));
    - pidgin_status_box_pulse_connecting(PIDGIN_STATUS_BOX(gtkblist->statusbox));
    }
    static void
    @@ -159,10 +158,6 @@
    static void pidgin_connection_network_connected (void)
    {
    GList *list, *l;
    - PidginBuddyList *gtkblist = pidgin_blist_get_default_gtk_blist();
    -
    - if(gtkblist)
    - pidgin_status_box_set_network_available(PIDGIN_STATUS_BOX(gtkblist->statusbox), TRUE);
    l = list = purple_accounts_get_all_active();
    while (l) {
    @@ -178,10 +173,6 @@
    static void pidgin_connection_network_disconnected (void)
    {
    GList *list, *l;
    - PidginBuddyList *gtkblist = pidgin_blist_get_default_gtk_blist();
    -
    - if(gtkblist)
    - pidgin_status_box_set_network_available(PIDGIN_STATUS_BOX(gtkblist->statusbox), FALSE);
    l = list = purple_accounts_get_all_active();
    while (l) {
    --- a/pidgin/gtkstatusbox.c Sat Jan 02 19:24:01 2021 -0600
    +++ b/pidgin/gtkstatusbox.c Sat Jan 02 21:58:08 2021 -0600
    @@ -1,4 +1,6 @@
    -/* pidgin
    +/*
    + * Pidgin - Internet Messenger
    + * Copyright (C) Pidgin Developers <devel@pidgin.im>
    *
    * Pidgin is the legal property of its developers, whose names are too numerous
    * to list here. Please refer to the COPYRIGHT file distributed with this
    @@ -15,8 +17,7 @@
    * GNU General Public License for more details.
    *
    * You should have received a copy of the GNU General Public License
    - * along with this program; if not, write to the Free Software
    - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
    + * along with this program; if not, see <https://www.gnu.org/licenses/>.
    */
    /*
    @@ -53,12 +54,81 @@
    /* Timeout for typing notifications in seconds */
    #define TYPING_TIMEOUT 4
    -static void remove_typing_cb(PidginStatusBox *box);
    +typedef enum {
    + PIDGIN_STATUS_BOX_TYPE_SEPARATOR,
    + PIDGIN_STATUS_BOX_TYPE_PRIMITIVE,
    + PIDGIN_STATUS_BOX_TYPE_POPULAR,
    + PIDGIN_STATUS_BOX_TYPE_SAVED_POPULAR,
    + PIDGIN_STATUS_BOX_TYPE_CUSTOM,
    + PIDGIN_STATUS_BOX_TYPE_SAVED,
    + PIDGIN_STATUS_BOX_NUM_TYPES
    +} PidginStatusBoxItemType;
    +
    +struct _PidginStatusBox {
    + GtkContainer parent_instance;
    +
    + /*< public >*/
    + GtkListStore *store;
    + GtkListStore *dropdown_store;
    +
    + PurpleAccount *account;
    +
    + PurpleAccount *token_status_account;
    +
    + GtkWidget *vbox;
    + gboolean editor_visible;
    + GtkWidget *editor;
    + GtkWidget *input;
    + GtkTextBuffer *buffer;
    +
    + GdkCursor *hand_cursor;
    + GdkCursor *arrow_cursor;
    + int icon_size;
    + gboolean icon_opaque;
    +
    +
    + GtkWidget *cell_view;
    + GtkCellRenderer *icon_rend;
    + GtkCellRenderer *text_rend;
    +
    + GdkPixbuf *error_pixbuf;
    +
    + gboolean network_available;
    + gboolean connecting;
    +
    + GtkTreeIter iter;
    + char *error;
    +
    + /*
    + * These widgets are made for renderin'
    + * That's just what they'll do
    + * One of these days these widgets
    + * Are gonna render all over you
    + */
    + GtkWidget *hbox;
    + GtkWidget *toggle_button;
    + GtkWidget *vsep;
    + GtkWidget *arrow;
    +
    + GtkWidget *popup_window;
    + GtkWidget *popup_frame;
    + GtkWidget *scrolled_window;
    + GtkWidget *cell_view_frame;
    + GtkTreeViewColumn *column;
    + GtkWidget *tree_view;
    + gboolean popup_in_progress;
    + GtkTreeRowReference *active_row;
    +};
    +
    +static void pidgin_status_box_add(PidginStatusBox *status_box, PidginStatusBoxItemType type, GdkPixbuf *pixbuf, const char *text, const char *sec_text, gpointer data);
    +static void pidgin_status_box_add_separator(PidginStatusBox *status_box);
    +static void pidgin_status_box_set_network_available(PidginStatusBox *status_box, gboolean available);
    +static void activate_currently_selected_status(PidginStatusBox *status_box);
    +
    static void update_size (PidginStatusBox *box);
    static gint get_statusbox_index(PidginStatusBox *box, PurpleSavedStatus *saved_status);
    static PurpleAccount* check_active_accounts_for_identical_statuses(void);
    -static void pidgin_status_box_pulse_typing(PidginStatusBox *status_box);
    static void pidgin_status_box_refresh(PidginStatusBox *status_box);
    static void status_menu_refresh_iter(PidginStatusBox *status_box, gboolean status_changed);
    static void pidgin_status_box_regenerate(PidginStatusBox *status_box, gboolean status_changed);
    @@ -121,50 +191,6 @@
    PROP_ACCOUNT,
    };
    -static char *typing_stock_ids[7] = {
    - PIDGIN_STOCK_ANIMATION_TYPING0,
    - PIDGIN_STOCK_ANIMATION_TYPING1,
    - PIDGIN_STOCK_ANIMATION_TYPING2,
    - PIDGIN_STOCK_ANIMATION_TYPING3,
    - PIDGIN_STOCK_ANIMATION_TYPING4,
    - NULL
    -};
    -
    -static char *connecting_stock_ids[] = {
    - PIDGIN_STOCK_ANIMATION_CONNECT0,
    - PIDGIN_STOCK_ANIMATION_CONNECT1,
    - PIDGIN_STOCK_ANIMATION_CONNECT2,
    - PIDGIN_STOCK_ANIMATION_CONNECT3,
    - PIDGIN_STOCK_ANIMATION_CONNECT4,
    - PIDGIN_STOCK_ANIMATION_CONNECT5,
    - PIDGIN_STOCK_ANIMATION_CONNECT6,
    - PIDGIN_STOCK_ANIMATION_CONNECT7,
    - PIDGIN_STOCK_ANIMATION_CONNECT8,
    - PIDGIN_STOCK_ANIMATION_CONNECT9,
    - PIDGIN_STOCK_ANIMATION_CONNECT10,
    - PIDGIN_STOCK_ANIMATION_CONNECT11,
    - PIDGIN_STOCK_ANIMATION_CONNECT12,
    - PIDGIN_STOCK_ANIMATION_CONNECT13,
    - PIDGIN_STOCK_ANIMATION_CONNECT14,
    - PIDGIN_STOCK_ANIMATION_CONNECT15,
    - PIDGIN_STOCK_ANIMATION_CONNECT16,
    - PIDGIN_STOCK_ANIMATION_CONNECT17,
    - PIDGIN_STOCK_ANIMATION_CONNECT18,
    - PIDGIN_STOCK_ANIMATION_CONNECT19,
    - PIDGIN_STOCK_ANIMATION_CONNECT20,
    - PIDGIN_STOCK_ANIMATION_CONNECT21,
    - PIDGIN_STOCK_ANIMATION_CONNECT22,
    - PIDGIN_STOCK_ANIMATION_CONNECT23,
    - PIDGIN_STOCK_ANIMATION_CONNECT24,
    - PIDGIN_STOCK_ANIMATION_CONNECT25,
    - PIDGIN_STOCK_ANIMATION_CONNECT26,
    - PIDGIN_STOCK_ANIMATION_CONNECT27,
    - PIDGIN_STOCK_ANIMATION_CONNECT28,
    - PIDGIN_STOCK_ANIMATION_CONNECT29,
    - PIDGIN_STOCK_ANIMATION_CONNECT30,
    - NULL
    -};
    -
    static GtkContainerClass *parent_class = NULL;
    static void pidgin_status_box_class_init (PidginStatusBoxClass *klass);
    @@ -308,7 +334,6 @@
    pidgin_status_box_finalize(GObject *obj)
    {
    PidginStatusBox *statusbox = PIDGIN_STATUS_BOX(obj);
    - gsize i;
    purple_signals_disconnect_by_handle(statusbox);
    purple_prefs_disconnect_by_handle(statusbox);
    @@ -316,16 +341,6 @@
    if (statusbox->active_row)
    gtk_tree_row_reference_free(statusbox->active_row);
    - for (i = 0; i < G_N_ELEMENTS(statusbox->connecting_pixbufs); i++) {
    - if (statusbox->connecting_pixbufs[i] != NULL)
    - g_object_unref(G_OBJECT(statusbox->connecting_pixbufs[i]));
    - }
    -
    - for (i = 0; i < G_N_ELEMENTS(statusbox->typing_pixbufs); i++) {
    - if (statusbox->typing_pixbufs[i] != NULL)
    - g_object_unref(G_OBJECT(statusbox->typing_pixbufs[i]));
    - }
    -
    g_object_unref(G_OBJECT(statusbox->store));
    g_object_unref(G_OBJECT(statusbox->dropdown_store));
    G_OBJECT_CLASS(parent_class)->finalize(obj);
    @@ -396,29 +411,7 @@
    account_status = TRUE;
    /* Primary */
    - if (status_box->typing != 0)
    - {
    - GtkTreeIter iter;
    - PidginStatusBoxItemType type;
    - gpointer data;
    -
    - /* Primary (get the status selected in the dropdown) */
    - path = gtk_tree_row_reference_get_path(status_box->active_row);
    - if (!gtk_tree_model_get_iter (GTK_TREE_MODEL(status_box->dropdown_store), &iter, path))
    - return;
    - gtk_tree_path_free(path);
    -
    - gtk_tree_model_get(GTK_TREE_MODEL(status_box->dropdown_store), &iter,
    - TYPE_COLUMN, &type,
    - DATA_COLUMN, &data,
    - -1);
    - if (type == PIDGIN_STATUS_BOX_TYPE_PRIMITIVE)
    - primary = g_strdup(purple_primitive_get_name_from_type(GPOINTER_TO_INT(data)));
    - else
    - /* This should never happen, but just in case... */
    - primary = g_strdup("New status");
    - }
    - else if (account_status)
    + if (account_status)
    primary = g_strdup(purple_status_get_name(purple_account_get_active_status(acct)));
    else if (purple_savedstatus_is_transient(saved_status))
    primary = g_strdup(purple_primitive_get_name_from_type(purple_savedstatus_get_primitive_type(saved_status)));
    @@ -426,9 +419,7 @@
    primary = g_markup_escape_text(purple_savedstatus_get_title(saved_status), -1);
    /* Secondary */
    - if (status_box->typing != 0)
    - secondary = g_strdup(_("Typing"));
    - else if (status_box->connecting)
    + if (status_box->connecting)
    secondary = g_strdup(_("Connecting"));
    else if (!status_box->network_available)
    secondary = g_strdup(_("Waiting for network connection"));
    @@ -451,12 +442,7 @@
    }
    /* Pixbuf */
    - if (status_box->typing != 0)
    - stock = typing_stock_ids[status_box->typing_index];
    - else if (status_box->connecting)
    - stock = connecting_stock_ids[status_box->connecting_index];
    - else
    - {
    + {
    PurpleStatusType *status_type;
    PurpleStatusPrimitive prim;
    if (account_status) {
    @@ -845,7 +831,9 @@
    editor_remove_focus(GtkWidget *w, GdkEventKey *event, PidginStatusBox *status_box)
    {
    if (event->keyval == GDK_KEY_Return || event->keyval == GDK_KEY_KP_Enter) {
    - remove_typing_cb(status_box);
    + activate_currently_selected_status(status_box);
    + pidgin_status_box_refresh(status_box);
    +
    return TRUE;
    }
    else if (event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_KP_Tab || event->keyval == GDK_KEY_ISO_Left_Tab)
    @@ -857,15 +845,10 @@
    GTK_DIR_TAB_BACKWARD: GTK_DIR_TAB_FORWARD);
    return TRUE;
    }
    - if (status_box->typing == 0)
    - return FALSE;
    /* Reset the status if Escape was pressed */
    if (event->keyval == GDK_KEY_Escape)
    {
    - g_source_remove(status_box->typing);
    - status_box->typing = 0;
    -
    if (status_box->account != NULL)
    update_to_reflect_account_status(status_box, status_box->account,
    purple_account_get_active_status(status_box->account));
    @@ -876,10 +859,6 @@
    return TRUE;
    }
    - pidgin_status_box_pulse_typing(status_box);
    - g_source_remove(status_box->typing);
    - status_box->typing = g_timeout_add_seconds(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, status_box);
    -
    return FALSE;
    }
    @@ -897,39 +876,6 @@
    return FALSE;
    }
    -static void
    -cache_pixbufs(PidginStatusBox *status_box)
    -{
    - GtkIconSize icon_size;
    - gsize i;
    -
    - g_object_set(G_OBJECT(status_box->icon_rend), "xpad", 3, NULL);
    - icon_size = gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL);
    -
    - for (i = 0; i < G_N_ELEMENTS(status_box->connecting_pixbufs); i++) {
    - if (status_box->connecting_pixbufs[i] != NULL)
    - g_object_unref(G_OBJECT(status_box->connecting_pixbufs[i]));
    - if (connecting_stock_ids[i])
    - status_box->connecting_pixbufs[i] = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox),
    - connecting_stock_ids[i], icon_size, "PidginStatusBox");
    - else
    - status_box->connecting_pixbufs[i] = NULL;
    - }
    - status_box->connecting_index = 0;
    -
    -
    - for (i = 0; i < G_N_ELEMENTS(status_box->typing_pixbufs); i++) {
    - if (status_box->typing_pixbufs[i] != NULL)
    - g_object_unref(G_OBJECT(status_box->typing_pixbufs[i]));
    - if (typing_stock_ids[i])
    - status_box->typing_pixbufs[i] = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox),
    - typing_stock_ids[i], icon_size, "PidginStatusBox");
    - else
    - status_box->typing_pixbufs[i] = NULL;
    - }
    - status_box->typing_index = 0;
    -}
    -
    static void account_enabled_cb(PurpleAccount *acct, PidginStatusBox *status_box)
    {
    PurpleAccount *initial_token_acct = status_box->token_status_account;
    @@ -1291,31 +1237,33 @@
    static void
    pidgin_status_box_buffer_changed_cb(GtkTextBuffer *buffer, gpointer data) {
    PidginStatusBox *status_box = (PidginStatusBox*)data;
    - if (gtk_widget_get_sensitive(GTK_WIDGET(status_box)))
    - {
    - if (status_box->typing != 0) {
    - pidgin_status_box_pulse_typing(status_box);
    - g_source_remove(status_box->typing);
    - }
    - status_box->typing = g_timeout_add_seconds(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, status_box);
    - }
    +
    + pidgin_status_box_refresh(status_box);
    +}
    +
    +static void
    +pidgin_status_box_save_message_cb(TalkatuInput *input, gpointer data) {
    + PidginStatusBox *status_box = PIDGIN_STATUS_BOX(data);
    +
    + activate_currently_selected_status(status_box);
    pidgin_status_box_refresh(status_box);
    }
    static void
    pidgin_status_box_init (PidginStatusBox *status_box)
    {
    + GNetworkMonitor *monitor = NULL;
    GtkCellRenderer *text_rend;
    GtkCellRenderer *icon_rend;
    GtkCellRenderer *emblem_rend;
    GtkWidget *toplevel;
    GtkTreeSelection *sel;
    + gboolean network_available = FALSE;
    gtk_widget_set_has_window(GTK_WIDGET(status_box), FALSE);
    status_box->editor_visible = FALSE;
    status_box->network_available = purple_network_is_available();
    status_box->connecting = FALSE;
    - status_box->typing = 0;
    status_box->toggle_button = gtk_toggle_button_new();
    status_box->hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
    status_box->cell_view = gtk_cell_view_new();
    @@ -1407,6 +1355,7 @@
    status_box->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, FALSE);
    status_box->editor = talkatu_editor_new();
    status_box->input = talkatu_editor_get_input(TALKATU_EDITOR(status_box->editor));
    +
    status_box->buffer = talkatu_html_buffer_new();
    gtk_text_view_set_buffer(GTK_TEXT_VIEW(status_box->input), status_box->buffer);
    @@ -1438,7 +1387,6 @@
    status_box->token_status_account = check_active_accounts_for_identical_statuses();
    - cache_pixbufs(status_box);
    pidgin_status_box_regenerate(status_box, TRUE);
    purple_signal_connect(purple_savedstatuses_get_handle(), "savedstatus-changed",
    @@ -1464,10 +1412,12 @@
    PURPLE_CALLBACK(account_status_changed_cb),
    status_box);
    - g_signal_connect(G_OBJECT(g_network_monitor_get_default()),
    - "network-changed",
    + monitor = g_network_monitor_get_default();
    + g_signal_connect(G_OBJECT(monitor), "network-changed",
    G_CALLBACK(pidgin_status_box_network_changed_cb),
    status_box);
    + network_available = g_network_monitor_get_network_available(monitor);
    + pidgin_status_box_set_network_available(status_box, network_available);
    }
    static void
    @@ -1559,15 +1509,13 @@
    GtkWidget *
    pidgin_status_box_new()
    {
    - return g_object_new(PIDGIN_TYPE_STATUS_BOX, "account", NULL,
    - "iconsel", TRUE, NULL);
    + return g_object_new(PIDGIN_TYPE_STATUS_BOX, "account", NULL, NULL);
    }
    GtkWidget *
    pidgin_status_box_new_with_account(PurpleAccount *account)
    {
    - return g_object_new(PIDGIN_TYPE_STATUS_BOX, "account", account,
    - "iconsel", TRUE, NULL);
    + return g_object_new(PIDGIN_TYPE_STATUS_BOX, "account", account, NULL);
    }
    /*
    @@ -1680,24 +1628,6 @@
    pidgin_status_box_refresh(status_box);
    }
    -void
    -pidgin_status_box_pulse_connecting(PidginStatusBox *status_box)
    -{
    - if (!status_box)
    - return;
    - if (!connecting_stock_ids[++status_box->connecting_index])
    - status_box->connecting_index = 0;
    - pidgin_status_box_refresh(status_box);
    -}
    -
    -static void
    -pidgin_status_box_pulse_typing(PidginStatusBox *status_box)
    -{
    - if (!typing_stock_ids[++status_box->typing_index])
    - status_box->typing_index = 0;
    - pidgin_status_box_refresh(status_box);
    -}
    -
    static void
    activate_currently_selected_status(PidginStatusBox *status_box)
    {
    @@ -1904,22 +1834,6 @@
    gtk_widget_set_size_request(status_box->vbox, -1, -1);
    }
    -static void remove_typing_cb(PidginStatusBox *status_box)
    -{
    - if (status_box->typing == 0)
    - {
    - /* Nothing has changed, so we don't need to do anything */
    - status_menu_refresh_iter(status_box, FALSE);
    - return;
    - }
    -
    - g_source_remove(status_box->typing);
    - status_box->typing = 0;
    -
    - activate_currently_selected_status(status_box);
    - pidgin_status_box_refresh(status_box);
    -}
    -
    static void pidgin_status_box_changed(PidginStatusBox *status_box)
    {
    GtkTreePath *path = gtk_tree_row_reference_get_path(status_box->active_row);
    @@ -1941,9 +1855,6 @@
    TYPE_COLUMN, &type,
    DATA_COLUMN, &data,
    -1);
    - if ((wastyping = (status_box->typing != 0)))
    - g_source_remove(status_box->typing);
    - status_box->typing = 0;
    if (gtk_widget_get_sensitive(GTK_WIDGET(status_box)))
    {
    @@ -2014,7 +1925,6 @@
    GtkTextIter start, end;
    gtk_widget_show_all(status_box->vbox);
    - status_box->typing = g_timeout_add_seconds(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, status_box);
    gtk_widget_grab_focus(status_box->input);
    gtk_text_buffer_get_start_iter(status_box->buffer, &start);
    --- a/pidgin/gtkstatusbox.h Sat Jan 02 19:24:01 2021 -0600
    +++ b/pidgin/gtkstatusbox.h Sat Jan 02 21:58:08 2021 -0600
    @@ -1,4 +1,6 @@
    -/* pidgin
    +/*
    + * Pidgin - Internet Messenger
    + * Copyright (C) Pidgin Developers <devel@pidgin.im>
    *
    * Pidgin is the legal property of its developers, whose names are too numerous
    * to list here. Please refer to the COPYRIGHT file distributed with this
    @@ -15,16 +17,16 @@
    * GNU General Public License for more details.
    *
    * You should have received a copy of the GNU General Public License
    - * along with this program; if not, write to the Free Software
    - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
    + * along with this program; if not, see <https://www.gnu.org/licenses/>.
    */
    #if !defined(PIDGIN_GLOBAL_HEADER_INSIDE) && !defined(PIDGIN_COMPILATION)
    # error "only <pidgin.h> may be included directly"
    #endif
    -#ifndef __PIDGIN_STATUS_BOX_H__
    -#define __PIDGIN_STATUS_BOX_H__
    +#ifndef PIDGIN_STATUS_BOX_H
    +#define PIDGIN_STATUS_BOX_H
    +
    /**
    * SECTION:gtkstatusbox
    * @section_id: pidgin-gtkstatusbox
    @@ -40,143 +42,17 @@
    G_BEGIN_DECLS
    -#define PIDGIN_TYPE_STATUS_BOX (pidgin_status_box_get_type ())
    -#define PIDGIN_STATUS_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PIDGIN_TYPE_STATUS_BOX, PidginStatusBox))
    -#define PIDGIN_STATUS_BOX_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), PIDGIN_TYPE_STATUS_BOX, PidginStatusBoxClass))
    -#define PIDGIN_IS_STATUS_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PIDGIN_TYPE_STATUS_BOX))
    -#define PIDGIN_IS_STATUS_BOX_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), PIDGIN_TYPE_STATUS_BOX))
    -#define PIDGIN_STATUS_BOX_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), PIDGIN_TYPE_STATUS_BOX, PidginStatusBoxClass))
    -
    -/**
    - * PidginStatusBoxItemType:
    - *
    - * This is a hidden field in the GtkStatusBox that identifies the
    - * item in the list store. The item could be a normal
    - * PurpleStatusPrimitive, or it could be something special like the
    - * "Custom..." item, or "Saved..." or a GtkSeparator.
    - */
    -typedef enum
    -{
    - PIDGIN_STATUS_BOX_TYPE_SEPARATOR,
    - PIDGIN_STATUS_BOX_TYPE_PRIMITIVE,
    - PIDGIN_STATUS_BOX_TYPE_POPULAR,
    - PIDGIN_STATUS_BOX_TYPE_SAVED_POPULAR,
    - PIDGIN_STATUS_BOX_TYPE_CUSTOM,
    - PIDGIN_STATUS_BOX_TYPE_SAVED,
    - PIDGIN_STATUS_BOX_NUM_TYPES
    -} PidginStatusBoxItemType;
    -
    -typedef struct _PidginStatusBox PidginStatusBox;
    -typedef struct _PidginStatusBoxClass PidginStatusBoxClass;
    -
    -/**
    - * PidginStatusBox:
    - * @store: This GtkListStore contains only one row--the currently
    - * selected status.
    - * @dropdown_store: This is the dropdown GtkListStore that contains the
    - * available statuses, plus some recently used statuses, plus
    - * the "Custom..." and "Saved..." options.
    - * @token_status_account: This will be non-NULL and contain a sample account
    - * when all enabled accounts use the same statuses
    - */
    -struct _PidginStatusBox
    -{
    - GtkContainer parent_instance;
    -
    - /*< public >*/
    - GtkListStore *store;
    - GtkListStore *dropdown_store;
    -
    - PurpleAccount *account;
    -
    - PurpleAccount *token_status_account;
    -
    - GtkWidget *vbox;
    - gboolean editor_visible;
    - GtkWidget *editor;
    - GtkWidget *input;
    - GtkTextBuffer *buffer;
    -
    - GdkCursor *hand_cursor;
    - GdkCursor *arrow_cursor;
    - int icon_size;
    - gboolean icon_opaque;
    -
    -
    - GtkWidget *cell_view;
    - GtkCellRenderer *icon_rend;
    - GtkCellRenderer *text_rend;
    +#define PIDGIN_TYPE_STATUS_BOX (pidgin_status_box_get_type ())
    +G_DECLARE_FINAL_TYPE(PidginStatusBox, pidgin_status_box, PIDGIN, STATUS_BOX,
    + GtkContainer);
    - GdkPixbuf *error_pixbuf;
    - int connecting_index;
    - GdkPixbuf *connecting_pixbufs[9];
    - int typing_index;
    - GdkPixbuf *typing_pixbufs[6];
    -
    - gboolean network_available;
    - gboolean connecting;
    - guint typing;
    -
    - GtkTreeIter iter;
    - char *error;
    -
    - /*
    - * These widgets are made for renderin'
    - * That's just what they'll do
    - * One of these days these widgets
    - * Are gonna render all over you
    - */
    - GtkWidget *hbox;
    - GtkWidget *toggle_button;
    - GtkWidget *vsep;
    - GtkWidget *arrow;
    -
    - GtkWidget *popup_window;
    - GtkWidget *popup_frame;
    - GtkWidget *scrolled_window;
    - GtkWidget *cell_view_frame;
    - GtkTreeViewColumn *column;
    - GtkWidget *tree_view;
    - gboolean popup_in_progress;
    - GtkTreeRowReference *active_row;
    -};
    +GtkWidget *pidgin_status_box_new(void);
    +GtkWidget *pidgin_status_box_new_with_account(PurpleAccount *account);
    -struct _PidginStatusBoxClass
    -{
    - GtkContainerClass parent_class;
    -
    - /* signals */
    - void (* changed) (GtkComboBox *combo_box);
    -
    - /*< private >*/
    - void (*_gtk_reserved0) (void);
    - void (*_gtk_reserved1) (void);
    - void (*_gtk_reserved2) (void);
    - void (*_gtk_reserved3) (void);
    -};
    -
    +void pidgin_status_box_set_connecting(PidginStatusBox *status_box, gboolean connecting);
    -GType pidgin_status_box_get_type (void) G_GNUC_CONST;
    -GtkWidget *pidgin_status_box_new (void);
    -GtkWidget *pidgin_status_box_new_with_account (PurpleAccount *account);
    -
    -void
    -pidgin_status_box_add(PidginStatusBox *status_box, PidginStatusBoxItemType type, GdkPixbuf *pixbuf, const char *text, const char *sec_text, gpointer data);
    -
    -void
    -pidgin_status_box_add_separator(PidginStatusBox *status_box);
    -
    -void
    -pidgin_status_box_set_network_available(PidginStatusBox *status_box, gboolean available);
    -
    -void
    -pidgin_status_box_set_connecting(PidginStatusBox *status_box, gboolean connecting);
    -
    -void
    -pidgin_status_box_pulse_connecting(PidginStatusBox *status_box);
    -
    -char *pidgin_status_box_get_message(PidginStatusBox *status_box);
    +gchar *pidgin_status_box_get_message(PidginStatusBox *status_box);
    G_END_DECLS
    -#endif /* __GTK_PIDGIN_STATUS_COMBO_BOX_H__ */
    +#endif /* PIDGIN_STATUS_BOX_H */
    --- a/pidgin/pidginstock.c Sat Jan 02 19:24:01 2021 -0600
    +++ b/pidgin/pidginstock.c Sat Jan 02 21:58:08 2021 -0600
    @@ -121,45 +121,6 @@
    { PIDGIN_STOCK_STATUS_HALFOP, "emblems", "emblem-half-operator.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    { PIDGIN_STOCK_STATUS_VOICE, "emblems", "emblem-voice.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT0, "animations", "process-working0.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT1, "animations", "process-working1.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT2, "animations", "process-working2.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT3, "animations", "process-working3.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT4, "animations", "process-working4.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT5, "animations", "process-working5.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT6, "animations", "process-working6.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT7, "animations", "process-working7.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT8, "animations", "process-working8.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT9, "animations", "process-working9.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT10, "animations", "process-working10.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT11, "animations", "process-working11.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT12, "animations", "process-working12.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT13, "animations", "process-working13.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT14, "animations", "process-working14.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT15, "animations", "process-working15.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT16, "animations", "process-working16.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT17, "animations", "process-working17.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT18, "animations", "process-working18.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT19, "animations", "process-working19.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT20, "animations", "process-working20.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT21, "animations", "process-working21.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT22, "animations", "process-working22.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT23, "animations", "process-working23.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT24, "animations", "process-working24.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT25, "animations", "process-working25.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT26, "animations", "process-working26.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT27, "animations", "process-working27.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT28, "animations", "process-working28.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT29, "animations", "process-working29.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_CONNECT30, "animations", "process-working30.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    -
    - { PIDGIN_STOCK_ANIMATION_TYPING0, "animations", "typing0.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_TYPING1, "animations", "typing1.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_TYPING2, "animations", "typing2.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_TYPING3, "animations", "typing3.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_TYPING4, "animations", "typing4.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    - { PIDGIN_STOCK_ANIMATION_TYPING5, "animations", "typing5.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    -
    { PIDGIN_STOCK_TOOLBAR_BGCOLOR, "actions", "change-bgcolor.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    { PIDGIN_STOCK_TOOLBAR_BLOCK, "emblems", "emblem-blocked.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    { PIDGIN_STOCK_TOOLBAR_FGCOLOR, "actions", "change-fgcolor.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
    --- a/pidgin/pidginstock.h Sat Jan 02 19:24:01 2021 -0600
    +++ b/pidgin/pidginstock.h Sat Jan 02 21:58:08 2021 -0600
    @@ -94,45 +94,6 @@
    #define PIDGIN_STOCK_STATUS_HALFOP "pidgin-status-halfop"
    #define PIDGIN_STOCK_STATUS_VOICE "pidgin-status-voice"
    -/* StatusBox Animations */
    -#define PIDGIN_STOCK_ANIMATION_CONNECT0 "pidgin-anim-connect0"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT1 "pidgin-anim-connect1"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT2 "pidgin-anim-connect2"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT3 "pidgin-anim-connect3"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT4 "pidgin-anim-connect4"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT5 "pidgin-anim-connect5"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT6 "pidgin-anim-connect6"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT7 "pidgin-anim-connect7"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT8 "pidgin-anim-connect8"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT9 "pidgin-anim-connect9"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT10 "pidgin-anim-connect10"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT11 "pidgin-anim-connect11"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT12 "pidgin-anim-connect12"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT13 "pidgin-anim-connect13"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT14 "pidgin-anim-connect14"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT15 "pidgin-anim-connect15"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT16 "pidgin-anim-connect16"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT17 "pidgin-anim-connect17"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT18 "pidgin-anim-connect18"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT19 "pidgin-anim-connect19"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT20 "pidgin-anim-connect20"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT21 "pidgin-anim-connect21"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT22 "pidgin-anim-connect22"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT23 "pidgin-anim-connect23"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT24 "pidgin-anim-connect24"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT25 "pidgin-anim-connect25"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT26 "pidgin-anim-connect26"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT27 "pidgin-anim-connect27"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT28 "pidgin-anim-connect28"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT29 "pidgin-anim-connect29"
    -#define PIDGIN_STOCK_ANIMATION_CONNECT30 "pidgin-anim-connect30"
    -#define PIDGIN_STOCK_ANIMATION_TYPING0 "pidgin-anim-typing0"
    -#define PIDGIN_STOCK_ANIMATION_TYPING1 "pidgin-anim-typing1"
    -#define PIDGIN_STOCK_ANIMATION_TYPING2 "pidgin-anim-typing2"
    -#define PIDGIN_STOCK_ANIMATION_TYPING3 "pidgin-anim-typing3"
    -#define PIDGIN_STOCK_ANIMATION_TYPING4 "pidgin-anim-typing4"
    -#define PIDGIN_STOCK_ANIMATION_TYPING5 "pidgin-anim-typing5"
    -
    /* Toolbar (and menu) icons */
    #define PIDGIN_STOCK_TOOLBAR_ACCOUNTS "pidgin-accounts"
    #define PIDGIN_STOCK_TOOLBAR_BGCOLOR "pidgin-bgcolor"