--- a/finch/gntblist.c Wed Jul 03 04:02:46 2019 -0400 +++ b/finch/gntblist.c Wed Jul 03 20:09:04 2019 -0400 @@ -65,8 +65,9 @@ #define SHOW_EMPTY_GROUP_TIMEOUT 60 -typedef struct -{ +struct _FinchBuddyList { + PurpleBuddyList parent; + GntWidget *window; GntWidget *tree; @@ -96,7 +97,7 @@ guint new_group_timeout; FinchBlistManager *manager; -} FinchBlist; +}; typedef struct { @@ -122,23 +123,24 @@ } u; } StatusBoxItem; -static FinchBlist *ggblist; - -static void add_buddy(PurpleBuddy *buddy, FinchBlist *ggblist); -static void add_contact(PurpleContact *contact, FinchBlist *ggblist); -static void add_group(PurpleGroup *group, FinchBlist *ggblist); -static void add_chat(PurpleChat *chat, FinchBlist *ggblist); -static void add_node(PurpleBlistNode *node, FinchBlist *ggblist); +static FinchBuddyList *ggblist; + +static void add_buddy(PurpleBuddy *buddy, FinchBuddyList *ggblist); +static void add_contact(PurpleContact *contact, FinchBuddyList *ggblist); +static void add_group(PurpleGroup *group, FinchBuddyList *ggblist); +static void add_chat(PurpleChat *chat, FinchBuddyList *ggblist); +static void add_node(PurpleBlistNode *node, FinchBuddyList *ggblist); static void node_update(PurpleBuddyList *list, PurpleBlistNode *node); -static void draw_tooltip(FinchBlist *ggblist); +static void draw_tooltip(FinchBuddyList *ggblist); static void tooltip_for_buddy(PurpleBuddy *buddy, GString *str, gboolean full); static gboolean remove_typing_cb(gpointer null); -static void remove_peripherals(FinchBlist *ggblist); +static void remove_peripherals(FinchBuddyList *ggblist); static const char * get_display_name(PurpleBlistNode *node); static void savedstatus_changed(PurpleSavedStatus *now, PurpleSavedStatus *old); static void blist_show(PurpleBuddyList *list); -static void update_node_display(PurpleBlistNode *buddy, FinchBlist *ggblist); -static void update_buddy_display(PurpleBuddy *buddy, FinchBlist *ggblist); +static void update_node_display(PurpleBlistNode *buddy, + FinchBuddyList *ggblist); +static void update_buddy_display(PurpleBuddy *buddy, FinchBuddyList *ggblist); static gboolean account_autojoin_cb(PurpleConnection *pc, gpointer null); static void finch_request_add_buddy(PurpleBuddyList *list, PurpleAccount *account, @@ -405,7 +407,7 @@ } static void -add_node(PurpleBlistNode *node, FinchBlist *ggblist) +add_node(PurpleBlistNode *node, FinchBuddyList *ggblist) { if (purple_blist_node_get_ui_data(node)) return; @@ -431,7 +433,7 @@ } static void -remove_tooltip(FinchBlist *ggblist) +remove_tooltip(FinchBuddyList *ggblist) { gnt_widget_destroy(ggblist->tooltip); ggblist->tooltip = NULL; @@ -441,7 +443,7 @@ static void node_remove(PurpleBuddyList *list, PurpleBlistNode *node) { - FinchBlist *ggblist = purple_blist_get_ui_data(); + FinchBuddyList *ggblist = purple_blist_get_ui_data(); PurpleBlistNode *parent; if (ggblist == NULL || purple_blist_node_get_ui_data(node) == NULL) @@ -525,7 +527,7 @@ if (ggblist) return; - ggblist = g_new0(FinchBlist, 1); + ggblist = FINCH_BUDDY_LIST(list); purple_blist_set_ui_data(ggblist); ggblist->manager = finch_blist_manager_find(purple_prefs_get_string(PREF_ROOT "/grouping")); if (!ggblist->manager) @@ -538,7 +540,6 @@ return; gnt_widget_destroy(ggblist->window); - g_free(ggblist); ggblist = NULL; } @@ -793,24 +794,6 @@ NULL, NULL); } -static PurpleBlistUiOps blist_ui_ops = -{ - new_list, - new_node, - blist_show, - node_update, - node_remove, - destroy_list, - NULL, - finch_request_add_buddy, - finch_request_add_chat, - finch_request_add_group, - NULL, - NULL, - NULL, - NULL, NULL, NULL, NULL -}; - static gpointer finch_blist_get_handle(void) { @@ -820,7 +803,7 @@ } static void -add_group(PurpleGroup *group, FinchBlist *ggblist) +add_group(PurpleGroup *group, FinchBuddyList *ggblist) { gpointer parent; PurpleBlistNode *node = (PurpleBlistNode *)group; @@ -893,7 +876,7 @@ } static void -add_chat(PurpleChat *chat, FinchBlist *ggblist) +add_chat(PurpleChat *chat, FinchBuddyList *ggblist) { gpointer parent; PurpleBlistNode *node = (PurpleBlistNode *)chat; @@ -910,7 +893,7 @@ } static void -add_contact(PurpleContact *contact, FinchBlist *ggblist) +add_contact(PurpleContact *contact, FinchBuddyList *ggblist) { gpointer parent; PurpleBlistNode *node = (PurpleBlistNode*)contact; @@ -933,7 +916,7 @@ } static void -add_buddy(PurpleBuddy *buddy, FinchBlist *ggblist) +add_buddy(PurpleBuddy *buddy, FinchBuddyList *ggblist) { gpointer parent; PurpleBlistNode *node = (PurpleBlistNode *)buddy; @@ -954,13 +937,8 @@ blist_update_row_flags((PurpleBlistNode*)contact); } -PurpleBlistUiOps *finch_blist_get_ui_ops() -{ - return &blist_ui_ops; -} - static void -selection_activate(GntWidget *widget, FinchBlist *ggblist) +selection_activate(GntWidget *widget, FinchBuddyList *ggblist) { GntTree *tree = GNT_TREE(ggblist->tree); PurpleBlistNode *node = gnt_tree_get_selection_data(tree); @@ -1560,13 +1538,13 @@ } static void -context_menu_destroyed(GntWidget *widget, FinchBlist *ggblist) +context_menu_destroyed(GntWidget *widget, FinchBuddyList *ggblist) { ggblist->context = NULL; } static void -draw_context_menu(FinchBlist *ggblist) +draw_context_menu(FinchBuddyList *ggblist) { PurpleBlistNode *node = NULL; GntWidget *context = NULL; @@ -1721,7 +1699,7 @@ } static gboolean -draw_tooltip_real(FinchBlist *ggblist) +draw_tooltip_real(FinchBuddyList *ggblist) { PurpleBlistNode *node; int x, y, top, width, w, h; @@ -1791,7 +1769,7 @@ } static void -draw_tooltip(FinchBlist *ggblist) +draw_tooltip(FinchBuddyList *ggblist) { /* When an account has signed off, it removes one buddy at a time. * Drawing the tooltip after removing each buddy is expensive. On @@ -1804,21 +1782,22 @@ } static void -selection_changed(GntWidget *widget, gpointer old, gpointer current, FinchBlist *ggblist) +selection_changed(GntWidget *widget, gpointer old, gpointer current, + FinchBuddyList *ggblist) { remove_peripherals(ggblist); draw_tooltip(ggblist); } static gboolean -context_menu(GntWidget *widget, FinchBlist *ggblist) +context_menu(GntWidget *widget, FinchBuddyList *ggblist) { draw_context_menu(ggblist); return TRUE; } static gboolean -key_pressed(GntWidget *widget, const char *text, FinchBlist *ggblist) +key_pressed(GntWidget *widget, const char *text, FinchBuddyList *ggblist) { if (text[0] == 27 && text[1] == 0) { /* Escape was pressed */ @@ -1845,14 +1824,14 @@ } static void -update_node_display(PurpleBlistNode *node, FinchBlist *ggblist) +update_node_display(PurpleBlistNode *node, FinchBuddyList *ggblist) { GntTextFormatFlags flag = get_blist_node_flag(node); gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), node, flag); } static void -update_buddy_display(PurpleBuddy *buddy, FinchBlist *ggblist) +update_buddy_display(PurpleBuddy *buddy, FinchBuddyList *ggblist) { PurpleContact *contact; @@ -1870,19 +1849,21 @@ } static void -buddy_status_changed(PurpleBuddy *buddy, PurpleStatus *old, PurpleStatus *now, FinchBlist *ggblist) +buddy_status_changed(PurpleBuddy *buddy, PurpleStatus *old, PurpleStatus *now, + FinchBuddyList *ggblist) { update_buddy_display(buddy, ggblist); } static void -buddy_idle_changed(PurpleBuddy *buddy, int old, int new, FinchBlist *ggblist) +buddy_idle_changed(PurpleBuddy *buddy, int old, int new, + FinchBuddyList *ggblist) { update_buddy_display(buddy, ggblist); } static void -remove_peripherals(FinchBlist *ggblist) +remove_peripherals(FinchBuddyList *ggblist) { if (ggblist->tooltip) remove_tooltip(ggblist); @@ -1930,7 +1911,6 @@ if (ggblist->new_group) g_list_free(ggblist->new_group); - g_free(ggblist); ggblist = NULL; } @@ -3165,6 +3145,33 @@ } /************************************************************************** + * GObject code + **************************************************************************/ +G_DEFINE_TYPE(FinchBuddyList, finch_buddy_list, PURPLE_TYPE_BUDDY_LIST) + +static void +finch_buddy_list_init(FinchBuddyList *self) +{ +} + +static void +finch_buddy_list_class_init(FinchBuddyListClass *klass) +{ + PurpleBuddyListClass *purple_blist_class; + + purple_blist_class = PURPLE_BUDDY_LIST_CLASS(klass); + purple_blist_class->new_list = new_list; + purple_blist_class->new_node = new_node; + purple_blist_class->show = blist_show; + purple_blist_class->update = node_update; + purple_blist_class->remove = node_remove; + purple_blist_class->destroy = destroy_list; + purple_blist_class->request_add_buddy = finch_request_add_buddy; + purple_blist_class->request_add_chat = finch_request_add_chat; + purple_blist_class->request_add_group = finch_request_add_group; +} + +/************************************************************************** * GBoxed code **************************************************************************/ static FinchBlistManager *