--- a/libpurple/purplewhiteboardmanager.c Wed Nov 23 22:44:21 2022 -0600
+++ b/libpurple/purplewhiteboardmanager.c Wed Nov 23 23:03:30 2022 -0600
@@ -31,31 +31,68 @@
struct _PurpleWhiteboardManager {
+ GPtrArray *whiteboards; -G_DEFINE_TYPE(PurpleWhiteboardManager, purple_whiteboard_manager,
static PurpleWhiteboardManager *default_manager = NULL;
/******************************************************************************
+ * GListModel Implementation + *****************************************************************************/ +purple_whiteboard_manager_get_item_type(G_GNUC_UNUSED GListModel *list) { + return PURPLE_TYPE_WHITEBOARD; +purple_whiteboard_manager_get_n_items(GListModel *list) { + PurpleWhiteboardManager *manager = PURPLE_WHITEBOARD_MANAGER(list); + return manager->whiteboards->len; +purple_whiteboard_manager_get_item(GListModel *list, guint position) { + PurpleWhiteboardManager *manager = PURPLE_WHITEBOARD_MANAGER(list); + PurpleWhiteboard *whiteboard = NULL; + if(position < manager->whiteboards->len) { + whiteboard = g_ptr_array_index(manager->whiteboards, position); + g_object_ref(whiteboard); +purple_whiteboard_manager_list_model_init(GListModelInterface *iface) { + iface->get_item_type = purple_whiteboard_manager_get_item_type; + iface->get_n_items = purple_whiteboard_manager_get_n_items; + iface->get_item = purple_whiteboard_manager_get_item; +/****************************************************************************** *****************************************************************************/
+G_DEFINE_TYPE_EXTENDED(PurpleWhiteboardManager, purple_whiteboard_manager, + G_TYPE_OBJECT, G_TYPE_FLAG_FINAL, + G_IMPLEMENT_INTERFACE(G_TYPE_LIST_MODEL, purple_whiteboard_manager_list_model_init)); purple_whiteboard_manager_finalize(GObject *obj) {
PurpleWhiteboardManager *manager = NULL;
manager = PURPLE_WHITEBOARD_MANAGER(obj);
- g_clear_object(&manager->store);
+ g_ptr_array_free(manager->whiteboards, TRUE); + manager->whiteboards = NULL; G_OBJECT_CLASS(purple_whiteboard_manager_parent_class)->finalize(obj);
purple_whiteboard_manager_init(PurpleWhiteboardManager *manager) {
- manager->store = g_list_store_new(PURPLE_TYPE_WHITEBOARD);
+ manager->whiteboards = g_ptr_array_new_full(0, g_object_unref); @@ -114,6 +151,8 @@
purple_whiteboard_manager_startup(void) {
if(default_manager == NULL) {
default_manager = g_object_new(PURPLE_TYPE_WHITEBOARD_MANAGER, NULL);
+ g_object_add_weak_pointer(G_OBJECT(default_manager), + (gpointer *)&default_manager); @@ -130,6 +169,15 @@
+purple_whiteboard_manager_get_default_as_model(void) { + if(PURPLE_IS_WHITEBOARD_MANAGER(default_manager)) { + return G_LIST_MODEL(default_manager); purple_whiteboard_manager_register(PurpleWhiteboardManager *manager,
PurpleWhiteboard *whiteboard,
@@ -140,9 +188,9 @@
g_return_val_if_fail(PURPLE_IS_WHITEBOARD_MANAGER(manager), FALSE);
g_return_val_if_fail(PURPLE_IS_WHITEBOARD(whiteboard), FALSE);
- found = g_list_store_find_with_equal_func(manager->store, whiteboard,
- (GEqualFunc)purple_whiteboard_equal,
+ found = g_ptr_array_find_with_equal_func(manager->whiteboards, whiteboard, + (GEqualFunc)purple_whiteboard_equal, g_set_error(error, PURPLE_WHITEBOARD_MANAGER_DOMAIN, 0,
@@ -152,9 +200,9 @@
- g_list_store_insert(manager->store, 0, whiteboard);
+ g_ptr_array_add(manager->whiteboards, g_object_ref(whiteboard)); - g_signal_emit(G_OBJECT(manager), signals[SIG_REGISTERED], 0, whiteboard);
+ g_signal_emit(manager, signals[SIG_REGISTERED], 0, whiteboard); @@ -164,15 +212,15 @@
PurpleWhiteboard *whiteboard,
g_return_val_if_fail(PURPLE_IS_WHITEBOARD_MANAGER(manager), FALSE);
g_return_val_if_fail(PURPLE_IS_WHITEBOARD(whiteboard), FALSE);
- found = g_list_store_find_with_equal_func(manager->store, whiteboard,
- (GEqualFunc)purple_whiteboard_equal,
+ found = g_ptr_array_find_with_equal_func(manager->whiteboards, whiteboard, + (GEqualFunc)purple_whiteboard_equal, g_set_error(error, PURPLE_WHITEBOARD_MANAGER_DOMAIN, 0,
@@ -185,13 +233,13 @@
/* Temporarily ref whiteboard so we can pass it along to the signal
- g_object_ref(G_OBJECT(whiteboard));
+ g_object_ref(whiteboard); - g_list_store_remove(manager->store, position);
+ g_ptr_array_remove_index(manager->whiteboards, index); - g_signal_emit(G_OBJECT(manager), signals[SIG_UNREGISTERED], 0, whiteboard);
+ g_signal_emit(manager, signals[SIG_UNREGISTERED], 0, whiteboard); - g_object_unref(G_OBJECT(whiteboard));
+ g_object_unref(whiteboard); @@ -200,50 +248,24 @@
purple_whiteboard_manager_find(PurpleWhiteboardManager *manager,
+ PurpleWhiteboard *needle = NULL; + gboolean found = FALSE; g_return_val_if_fail(PURPLE_IS_WHITEBOARD_MANAGER(manager), NULL);
g_return_val_if_fail(id != NULL, NULL);
- n = g_list_model_get_n_items(G_LIST_MODEL(manager->store));
- for(idx = 0; idx < n; idx++) {
+ needle = g_object_new(PURPLE_TYPE_WHITEBOARD, "id", id, NULL); - obj = g_list_model_get_object(G_LIST_MODEL(manager->store), idx);
- if(PURPLE_IS_WHITEBOARD(obj)) {
- PurpleWhiteboard *whiteboard = PURPLE_WHITEBOARD(obj);
+ found = g_ptr_array_find_with_equal_func(manager->whiteboards, needle, + (GEqualFunc)purple_whiteboard_equal, - if(purple_strequal(id, purple_whiteboard_get_id(whiteboard))) {
+ g_clear_object(&needle); + return g_ptr_array_index(manager->whiteboards, index);
-purple_whiteboard_manager_foreach(PurpleWhiteboardManager *manager,
- PurpleWhiteboardManagerForeachFunc func,
- g_return_if_fail(PURPLE_IS_WHITEBOARD_MANAGER(manager));
- g_return_if_fail(func != NULL);
- n = g_list_model_get_n_items(G_LIST_MODEL(manager->store));
- for(idx = 0; idx < n; idx++) {
- gpointer item = g_list_model_get_item(G_LIST_MODEL(manager->store), idx);
-purple_whiteboard_manager_get_model(PurpleWhiteboardManager *manager) {
- g_return_val_if_fail(PURPLE_IS_WHITEBOARD_MANAGER(manager), NULL);
- return G_LIST_MODEL(manager->store);
--- a/libpurple/purplewhiteboardmanager.h Wed Nov 23 22:44:21 2022 -0600
+++ b/libpurple/purplewhiteboardmanager.h Wed Nov 23 23:03:30 2022 -0600
@@ -53,17 +53,6 @@
PURPLE, WHITEBOARD_MANAGER, GObject)
- * PurpleWhiteboardManagerForeachFunc:
- * @whiteboard: The #PurpleWhiteboard instance.
- * @data: User supplied data.
- * A function to be used as a callback with purple_whiteboard_manager_foreach().
-typedef void (*PurpleWhiteboardManagerForeachFunc)(PurpleWhiteboard *whiteboard, gpointer data);
* purple_whiteboard_manager_get_default:
* Gets the default #PurpleWhiteboardManager instance.
@@ -75,6 +64,18 @@
PurpleWhiteboardManager *purple_whiteboard_manager_get_default(void);
+ * purple_whiteboard_manager_get_default_as_model: + * Gets the default manager as a [iface@Gio.ListModel]. + * Returns: (transfer none): The default manager cast to a + * [iface@Gio.ListModel]. +GListModel *purple_whiteboard_manager_get_default_as_model(void); * purple_whiteboard_manager_register:
* @manager: The #PurpleWhiteboardManager instance.
* @whiteboard: The #PurpleWhiteboard to register.
@@ -111,37 +112,12 @@
* Gets the #PurpleWhiteboard identified by @id if found, otherwise %NULL.
- * Returns: (transfer full): The #PurpleWhiteboard identified by @id or %NULL.
+ * Returns: (transfer none): The #PurpleWhiteboard identified by @id or %NULL. PurpleWhiteboard *purple_whiteboard_manager_find(PurpleWhiteboardManager *manager, const gchar *id);
- * purple_whiteboard_manager_foreach:
- * @manager: The #PurpleWhiteboardManager instance.
- * @func: (scope call): The #PurpleWhiteboardManagerForeachFunc to call.
- * @data: User data to pass to @func.
- * Calls @func for each #PurpleWhiteboard that @manager knows about.
-void purple_whiteboard_manager_foreach(PurpleWhiteboardManager *manager, PurpleWhiteboardManagerForeachFunc func, gpointer data);
- * purple_whiteboard_manager_get_model:
- * @manager: The #PurpleWhiteboardManager instance.
- * Gets the backing model of @manager as a #GListModel.
- * Returns: (transfer none) (element-type PurpleWhiteboard): The #GListModel
- * containing all of the #PurpleWhiteboards registered with @manager.
-GListModel *purple_whiteboard_manager_get_model(PurpleWhiteboardManager *manager);
#endif /* PURPLE_WHITEBOARD_MANAGER_H */