finch/gntblist.c

changeset 39693
86f5c1fef140
parent 39692
6e8ebbefba1e
child 39694
4aed5fad4da9
--- 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 *

mercurial