libpurple/purpleconversationmembers.c

Mon, 12 May 2025 20:25:16 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Mon, 12 May 2025 20:25:16 -0500
changeset 43246
0e9bbe9b4da8
parent 43207
5f232d909647
permissions
-rw-r--r--

Handle formatting in server messages

Testing Done:
Used the default motd on my local ergo server to verify that formatting was working.

Reviewed at https://reviews.imfreedom.org/r/3991/

42890
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
1 /*
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
2 * Purple - Internet Messaging Library
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
3 * Copyright (C) Pidgin Developers <devel@pidgin.im>
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
4 *
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
5 * Purple is the legal property of its developers, whose names are too numerous
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
7 * source distribution.
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
8 *
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
9 * This library is free software; you can redistribute it and/or modify it
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
10 * under the terms of the GNU General Public License as published by the Free
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
11 * Software Foundation; either version 2 of the License, or (at your option)
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
12 * any later version.
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
13 *
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
14 * This library is distributed in the hope that it will be useful, but WITHOUT
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
17 * more details.
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
18 *
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License along with
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
20 * this library; if not, see <https://www.gnu.org/licenses/>.
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
21 */
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
22
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
23 #include "purpleconversationmembers.h"
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
24
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
25 struct _PurpleConversationMembers {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
26 GObject parent;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
27
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
28 GPtrArray *members;
42935
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
29
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
30 GListStore *active_typers;
42890
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
31 };
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
32
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
33 enum {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
34 PROP_0,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
35 PROP_ITEM_TYPE,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
36 PROP_N_ITEMS,
42935
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
37 PROP_ACTIVE_TYPERS,
42890
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
38 N_PROPERTIES,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
39 };
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
40 static GParamSpec *properties[N_PROPERTIES] = {NULL, };
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
41
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
42 enum {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
43 SIG_MEMBER_ADDED,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
44 SIG_MEMBER_REMOVED,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
45 N_SIGNALS,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
46 };
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
47 static guint signals[N_SIGNALS] = {0, };
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
48
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
49 /******************************************************************************
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
50 * Callbacks
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
51 *****************************************************************************/
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
52 static gboolean
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
53 purple_conversation_members_check_member_equal(gconstpointer a, gconstpointer b)
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
54 {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
55 PurpleConversationMember *member_a = (PurpleConversationMember *)a;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
56 PurpleConversationMember *member_b = (PurpleConversationMember *)b;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
57 PurpleContactInfo *info_a = NULL;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
58 PurpleContactInfo *info_b = NULL;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
59
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
60 info_a = purple_conversation_member_get_contact_info(member_a);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
61 info_b = purple_conversation_member_get_contact_info(member_b);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
62
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
63 return (purple_contact_info_compare(info_a, info_b) == 0);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
64 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
65
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
66 /******************************************************************************
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
67 * Callbacks
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
68 *****************************************************************************/
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
69 static void
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
70 purple_conversation_members_member_changed_cb(GObject *self,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
71 G_GNUC_UNUSED GParamSpec *pspec,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
72 gpointer data)
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
73 {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
74 PurpleConversationMember *member = PURPLE_CONVERSATION_MEMBER(self);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
75 PurpleConversationMembers *members = data;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
76 gboolean found = FALSE;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
77 guint position = 0;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
78
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
79 found = g_ptr_array_find_with_equal_func(members->members, member,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
80 purple_conversation_members_check_member_equal,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
81 &position);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
82
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
83 if(found) {
43202
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
84 g_list_model_items_changed(G_LIST_MODEL(members), position, 1, 1);
42890
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
85 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
86 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
87
42935
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
88 static void
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
89 purple_conversation_members_typing_changed_cb(GObject *self,
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
90 G_GNUC_UNUSED GParamSpec *pspec,
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
91 gpointer data)
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
92 {
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
93 PurpleConversationMember *member = PURPLE_CONVERSATION_MEMBER(self);
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
94 PurpleConversationMembers *members = data;
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
95 PurpleTypingState state = PURPLE_TYPING_STATE_NONE;
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
96 gboolean found = FALSE;
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
97 guint position = 0;
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
98
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
99 state = purple_conversation_member_get_typing_state(member);
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
100
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
101 found = g_list_store_find(members->active_typers, member, &position);
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
102 if(found && state != PURPLE_TYPING_STATE_TYPING) {
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
103 g_list_store_remove(members->active_typers, position);
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
104 }
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
105
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
106 if(!found && state == PURPLE_TYPING_STATE_TYPING) {
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
107 g_list_store_append(members->active_typers, member);
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
108 }
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
109 }
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
110
43202
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
111 static void
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
112 purple_conversation_members_member_badges_changed_cb(PurpleConversationMember *member,
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
113 gpointer data)
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
114 {
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
115 PurpleConversationMembers *members = data;
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
116 gboolean found = FALSE;
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
117 guint position = 0;
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
118
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
119 found = g_ptr_array_find_with_equal_func(members->members, member,
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
120 purple_conversation_members_check_member_equal,
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
121 &position);
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
122
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
123 if(found) {
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
124 g_list_model_items_changed(G_LIST_MODEL(members), position, 1, 1);
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
125 }
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
126 }
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
127
42890
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
128 /******************************************************************************
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
129 * GListModel Implementation
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
130 *****************************************************************************/
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
131 static GType
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
132 purple_conversation_members_get_item_type(G_GNUC_UNUSED GListModel *list) {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
133 return PURPLE_TYPE_CONVERSATION_MEMBER;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
134 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
135
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
136 static guint
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
137 purple_conversation_members_get_n_items(GListModel *list) {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
138 PurpleConversationMembers *members = PURPLE_CONVERSATION_MEMBERS(list);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
139
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
140 return members->members->len;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
141 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
142
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
143 static gpointer
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
144 purple_conversation_members_get_item(GListModel *list, guint position) {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
145 PurpleConversationMembers *members = PURPLE_CONVERSATION_MEMBERS(list);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
146 PurpleConversationMember *member = NULL;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
147
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
148 if(position < members->members->len) {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
149 member = g_ptr_array_index(members->members, position);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
150 g_object_ref(member);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
151 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
152
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
153 return member;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
154 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
155
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
156 static void
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
157 purple_conversation_members_list_model_init(GListModelInterface *iface) {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
158 iface->get_item_type = purple_conversation_members_get_item_type;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
159 iface->get_n_items = purple_conversation_members_get_n_items;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
160 iface->get_item = purple_conversation_members_get_item;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
161 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
162
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
163 /******************************************************************************
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
164 * GObject Implementation
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
165 *****************************************************************************/
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
166 G_DEFINE_FINAL_TYPE_WITH_CODE(
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
167 PurpleConversationMembers,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
168 purple_conversation_members,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
169 G_TYPE_OBJECT,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
170 G_IMPLEMENT_INTERFACE(G_TYPE_LIST_MODEL,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
171 purple_conversation_members_list_model_init))
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
172
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
173 static void
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
174 purple_conversation_members_finalize(GObject *obj) {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
175 PurpleConversationMembers *members = PURPLE_CONVERSATION_MEMBERS(obj);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
176
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
177 g_clear_pointer(&members->members, g_ptr_array_unref);
42935
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
178 g_clear_object(&members->active_typers);
42890
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
179
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
180 G_OBJECT_CLASS(purple_conversation_members_parent_class)->finalize(obj);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
181 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
182
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
183 static void
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
184 purple_conversation_members_get_property(GObject *obj, guint param_id,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
185 GValue *value, GParamSpec *pspec)
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
186 {
42935
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
187 PurpleConversationMembers *members = PURPLE_CONVERSATION_MEMBERS(obj);
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
188
42890
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
189 switch(param_id) {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
190 case PROP_ITEM_TYPE:
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
191 g_value_set_gtype(value,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
192 g_list_model_get_item_type(G_LIST_MODEL(obj)));
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
193 break;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
194 case PROP_N_ITEMS:
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
195 g_value_set_uint(value, g_list_model_get_n_items(G_LIST_MODEL(obj)));
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
196 break;
42935
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
197 case PROP_ACTIVE_TYPERS:
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
198 g_value_set_object(value,
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
199 purple_conversation_members_get_active_typers(members));
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
200 break;
42890
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
201 default:
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
202 G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
203 break;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
204 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
205 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
206
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
207 static void
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
208 purple_conversation_members_init(PurpleConversationMembers *members) {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
209 /* We allocate 2 as dms have at least 2 members. */
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
210 members->members = g_ptr_array_new_full(2, g_object_unref);
42935
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
211
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
212 members->active_typers = g_list_store_new(PURPLE_TYPE_CONVERSATION_MEMBER);
42890
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
213 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
214
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
215 static void
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
216 purple_conversation_members_class_init(PurpleConversationMembersClass *klass) {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
217 GObjectClass *obj_class = G_OBJECT_CLASS(klass);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
218
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
219 obj_class->finalize = purple_conversation_members_finalize;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
220 obj_class->get_property = purple_conversation_members_get_property;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
221
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
222 /**
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
223 * PurpleConversationMembers:item-type:
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
224 *
42984
818220289e67 Update the gi-docgen subproject and fix some new issues it found
Gary Kramlich <grim@reaperworld.com>
parents: 42935
diff changeset
225 * The type of items. See [vfunc@Gio.ListModel.get_item_type].
42890
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
226 *
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
227 * Since: 3.0
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
228 */
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
229 properties[PROP_ITEM_TYPE] = g_param_spec_gtype(
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
230 "item-type", NULL, NULL,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
231 G_TYPE_OBJECT,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
232 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
233
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
234 /**
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
235 * PurpleConversationMembers:n-items:
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
236 *
42984
818220289e67 Update the gi-docgen subproject and fix some new issues it found
Gary Kramlich <grim@reaperworld.com>
parents: 42935
diff changeset
237 * The number of items. See [vfunc@Gio.ListModel.get_n_items].
42890
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
238 *
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
239 * Since: 3.0
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
240 */
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
241 properties[PROP_N_ITEMS] = g_param_spec_uint(
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
242 "n-items", NULL, NULL,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
243 0, G_MAXUINT, 0,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
244 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
245
42935
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
246 /**
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
247 * PurpleConversationMembers:active-typers:
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
248 *
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
249 * The list of [class@ConversationMember]s that are actively typing.
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
250 *
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
251 * Since: 3.0
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
252 */
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
253 properties[PROP_ACTIVE_TYPERS] = g_param_spec_object(
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
254 "active-typers", NULL, NULL,
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
255 G_TYPE_LIST_MODEL,
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
256 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
257
42890
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
258 g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
259
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
260 /**
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
261 * PurpleConversationMembers::member-added:
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
262 * @members: The instance.
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
263 * @member: The [class@Purple.ConversationMember] instance.
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
264 * @announce: Whether or not this addition should be announced.
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
265 * @message: (nullable): An optional message to use in the announcement.
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
266 *
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
267 * Emitted when a new member is added to this collection.
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
268 *
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
269 * Since: 3.0
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
270 */
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
271 signals[SIG_MEMBER_ADDED] = g_signal_new_class_handler(
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
272 "member-added",
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
273 G_OBJECT_CLASS_TYPE(klass),
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
274 G_SIGNAL_RUN_LAST,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
275 NULL,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
276 NULL,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
277 NULL,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
278 NULL,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
279 G_TYPE_NONE,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
280 3,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
281 PURPLE_TYPE_CONVERSATION_MEMBER,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
282 G_TYPE_BOOLEAN,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
283 G_TYPE_STRING);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
284
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
285 /**
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
286 * PurpleConversationMembers::member-removed:
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
287 * @members: The instance.
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
288 * @member: The [class@Purple.ConversationMember] instance.
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
289 * @announce: Whether or not this removal should be announced.
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
290 * @message: (nullable): An optional message to use in the announcement.
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
291 *
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
292 * Emitted when member is removed from this collection.
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
293 *
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
294 * Since: 3.0
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
295 */
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
296 signals[SIG_MEMBER_REMOVED] = g_signal_new_class_handler(
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
297 "member-removed",
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
298 G_OBJECT_CLASS_TYPE(klass),
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
299 G_SIGNAL_RUN_LAST,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
300 NULL,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
301 NULL,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
302 NULL,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
303 NULL,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
304 G_TYPE_NONE,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
305 3,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
306 PURPLE_TYPE_CONVERSATION_MEMBER,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
307 G_TYPE_BOOLEAN,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
308 G_TYPE_STRING);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
309 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
310
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
311 /******************************************************************************
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
312 * Public API
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
313 *****************************************************************************/
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
314 PurpleConversationMember *
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
315 purple_conversation_members_add_member(PurpleConversationMembers *members,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
316 PurpleContactInfo *info,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
317 gboolean announce,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
318 const char *message)
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
319 {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
320 PurpleConversationMember *member = NULL;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
321
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
322 g_return_val_if_fail(PURPLE_IS_CONVERSATION_MEMBERS(members), NULL);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
323 g_return_val_if_fail(PURPLE_IS_CONTACT_INFO(info), NULL);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
324
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
325 member = purple_conversation_members_find_member(members, info);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
326 if(PURPLE_IS_CONVERSATION_MEMBER(member)) {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
327 return member;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
328 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
329
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
330 member = purple_conversation_member_new(info);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
331 g_ptr_array_add(members->members, member);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
332
43202
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
333 /* Add callbacks for the member. */
42890
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
334 g_signal_connect_object(member, "notify::name-for-display",
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
335 G_CALLBACK(purple_conversation_members_member_changed_cb),
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
336 members, G_CONNECT_DEFAULT);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
337 g_signal_connect_object(member, "notify::typing-state",
42935
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
338 G_CALLBACK(purple_conversation_members_typing_changed_cb),
42890
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
339 members, G_CONNECT_DEFAULT);
43202
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
340 g_signal_connect_object(member, "badges-changed",
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
341 G_CALLBACK(purple_conversation_members_member_badges_changed_cb),
1c2e548285f3 Add a badges-changed signal to Purple.ConversationMember and fix the items changed emissions
Gary Kramlich <grim@reaperworld.com>
parents: 43128
diff changeset
342 members, G_CONNECT_DEFAULT);
42890
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
343
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
344 g_signal_emit(members, signals[SIG_MEMBER_ADDED], 0, member, announce,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
345 message);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
346 g_list_model_items_changed(G_LIST_MODEL(members),
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
347 members->members->len - 1, 0, 1);
43128
1ce3ad90614c Make sure we notify on the n-items property for all objects that have it
Gary Kramlich <grim@reaperworld.com>
parents: 42984
diff changeset
348 g_object_notify_by_pspec(G_OBJECT(members), properties[PROP_N_ITEMS]);
42890
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
349
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
350 return member;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
351 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
352
43204
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
353 void
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
354 purple_conversation_members_extend(PurpleConversationMembers *members1,
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
355 PurpleConversationMembers *members2)
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
356 {
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
357 guint position = 0;
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
358 guint moving = 0;
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
359
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
360 g_return_if_fail(PURPLE_IS_CONVERSATION_MEMBERS(members1));
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
361 g_return_if_fail(PURPLE_IS_CONVERSATION_MEMBERS(members2));
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
362
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
363 position = members1->members->len;
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
364 moving = members2->members->len;
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
365
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
366 /* ref the old ptr array so we can emit the items changed and clean up the
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
367 * other members properly.
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
368 */
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
369 g_ptr_array_ref(members2->members);
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
370
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
371 g_ptr_array_extend_and_steal(members1->members, members2->members);
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
372
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
373 g_list_model_items_changed(G_LIST_MODEL(members1), position, 0, moving);
43207
5f232d909647 Notify that the n-items property changed when extend Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 43204
diff changeset
374 g_object_notify_by_pspec(G_OBJECT(members1), properties[PROP_N_ITEMS]);
5f232d909647 Notify that the n-items property changed when extend Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 43204
diff changeset
375
43204
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
376 g_list_model_items_changed(G_LIST_MODEL(members2), 0, moving, 0);
43207
5f232d909647 Notify that the n-items property changed when extend Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 43204
diff changeset
377 g_object_notify_by_pspec(G_OBJECT(members2), properties[PROP_N_ITEMS]);
43204
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
378
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
379 g_object_unref(G_OBJECT(members2));
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
380 }
aaf1706aa25b Implement Purple.ConversationMembers.extend
Gary Kramlich <grim@reaperworld.com>
parents: 43202
diff changeset
381
42890
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
382 PurpleConversationMember *
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
383 purple_conversation_members_find_member(PurpleConversationMembers *members,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
384 PurpleContactInfo *info)
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
385 {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
386 PurpleConversationMember *member = NULL;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
387 guint position = 0;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
388
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
389 g_return_val_if_fail(PURPLE_IS_CONVERSATION_MEMBERS(members), NULL);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
390 g_return_val_if_fail(PURPLE_IS_CONTACT_INFO(info), NULL);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
391
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
392 if(purple_conversation_members_has_member(members, info, &position)) {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
393 member = g_ptr_array_index(members->members, position);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
394 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
395
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
396 return member;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
397 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
398
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
399 gboolean
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
400 purple_conversation_members_has_member(PurpleConversationMembers *members,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
401 PurpleContactInfo *info,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
402 guint *position)
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
403 {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
404 PurpleConversationMember *needle = NULL;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
405 gboolean found = FALSE;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
406
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
407 g_return_val_if_fail(PURPLE_IS_CONVERSATION_MEMBERS(members), FALSE);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
408 g_return_val_if_fail(PURPLE_IS_CONTACT_INFO(info), FALSE);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
409
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
410 needle = purple_conversation_member_new(info);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
411 found = g_ptr_array_find_with_equal_func(members->members,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
412 needle,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
413 purple_conversation_members_check_member_equal,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
414 position);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
415
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
416 g_clear_object(&needle);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
417
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
418 return found;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
419 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
420
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
421 PurpleConversationMembers *
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
422 purple_conversation_members_new(void) {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
423 return g_object_new(PURPLE_TYPE_CONVERSATION_MEMBERS, NULL);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
424 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
425
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
426 gboolean
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
427 purple_conversation_members_remove_member(PurpleConversationMembers *members,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
428 PurpleContactInfo *info,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
429 gboolean announce,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
430 const char *message)
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
431 {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
432 PurpleConversationMember *member = NULL;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
433 guint position = 0;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
434
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
435 g_return_val_if_fail(PURPLE_IS_CONVERSATION_MEMBERS(members), FALSE);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
436 g_return_val_if_fail(PURPLE_IS_CONTACT_INFO(info), FALSE);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
437
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
438 if(!purple_conversation_members_has_member(members, info, &position)) {
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
439 return FALSE;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
440 }
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
441
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
442 member = g_ptr_array_steal_index(members->members, position);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
443
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
444 /* Remove our signal handlers for the member. */
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
445 g_signal_handlers_disconnect_by_func(member,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
446 purple_conversation_members_member_changed_cb,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
447 members);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
448
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
449
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
450 g_signal_emit(members, signals[SIG_MEMBER_REMOVED], 0, member,
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
451 announce, message);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
452 g_list_model_items_changed(G_LIST_MODEL(members), position, 1, 0);
43128
1ce3ad90614c Make sure we notify on the n-items property for all objects that have it
Gary Kramlich <grim@reaperworld.com>
parents: 42984
diff changeset
453 g_object_notify_by_pspec(G_OBJECT(members), properties[PROP_N_ITEMS]);
42890
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
454
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
455 g_clear_object(&member);
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
456
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
457 return TRUE;
c2b7b3b9c351 Break out Purple.Conversation:members to its own class
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
458 }
42935
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
459
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
460 GListModel *
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
461 purple_conversation_members_get_active_typers(PurpleConversationMembers *members)
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
462 {
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
463 g_return_val_if_fail(PURPLE_IS_CONVERSATION_MEMBERS(members), NULL);
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
464
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
465 return G_LIST_MODEL(members->active_typers);
0253971eeb18 Add an `active-typers` property to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42890
diff changeset
466 }

mercurial