Sat, 02 Jan 2021 21:58:08 -0600
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/
--- 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
--- 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"