pidgin/pidgindisplaywindow.c

Tue, 11 Jun 2024 14:25:00 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Tue, 11 Jun 2024 14:25:00 -0500
changeset 42795
fedfa85c0b40
parent 42774
4858aea578c4
child 42797
767b7685a4a4
permissions
-rw-r--r--

Implement presenting and selecting conversations

Implement Pidgin.DisplayWindow.select.

Display conversations when their present signal is emitted.

Call Purple.Conversation.present from Pidgin.ContactList when a contact is
activated.

Testing Done:
Opened conversations from the contact list and verified they were selected properly.

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

40577
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
1 /*
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
2 * Pidgin - Internet Messenger
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
3 * Copyright (C) Pidgin Developers <devel@pidgin.im>
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
4 *
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
5 * Pidgin is the legal property of its developers, whose names are too numerous
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
7 * source distribution.
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
8 *
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
9 * This program is free software; you can redistribute it and/or modify
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
10 * it under the terms of the GNU General Public License as published by
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
12 * (at your option) any later version.
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
13 *
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
14 * This program is distributed in the hope that it will be useful,
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
17 * GNU General Public License for more details.
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
18 *
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
20 * along with this program; if not, see <https://www.gnu.org/licenses/>.
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
21 */
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
22
41254
ef50e0dc74b0 Add a group for conversation in the PidginConversationWindow tree view
Gary Kramlich <grim@reaperworld.com>
parents: 41252
diff changeset
23 #include <glib/gi18n-lib.h>
ef50e0dc74b0 Add a group for conversation in the PidginConversationWindow tree view
Gary Kramlich <grim@reaperworld.com>
parents: 41252
diff changeset
24
41701
43f994f7f9f2 Replace GtkStack in PidginDisplayWindow with AdwViewStack
Gary Kramlich <grim@reaperworld.com>
parents: 41696
diff changeset
25 #include <adwaita.h>
43f994f7f9f2 Replace GtkStack in PidginDisplayWindow with AdwViewStack
Gary Kramlich <grim@reaperworld.com>
parents: 41696
diff changeset
26
42597
cc322d213d2e Add the Plugins list to the PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42575
diff changeset
27 #include <gplugin.h>
cc322d213d2e Add the Plugins list to the PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42575
diff changeset
28 #include <gplugin-gtk.h>
cc322d213d2e Add the Plugins list to the PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42575
diff changeset
29
41702
4289b30044ed Rename pidginconversationwindow.[ch] to pidgindisplaywindow.[ch]
Gary Kramlich <grim@reaperworld.com>
parents: 41701
diff changeset
30 #include "pidgindisplaywindow.h"
40577
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
31
41482
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
32 #include "gtkutils.h"
42301
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
33 #include "pidginconversation.h"
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
34 #include "pidgindisplayitem.h"
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
35
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
36 enum {
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
37 SIG_CONVERSATION_SWITCHED,
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
38 N_SIGNALS,
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
39 };
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
40 static guint signals[N_SIGNALS] = {0, };
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
41
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
42 struct _PidginDisplayWindow {
40577
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
43 GtkApplicationWindow parent;
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
44
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
45 GtkWidget *view;
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
46 GtkWidget *bin;
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
47
42597
cc322d213d2e Add the Plugins list to the PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42575
diff changeset
48 GtkWidget *plugin_list;
cc322d213d2e Add the Plugins list to the PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42575
diff changeset
49
42795
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
50 GListStore *base_model;
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
51 GListModel *selection_model;
41254
ef50e0dc74b0 Add a group for conversation in the PidginConversationWindow tree view
Gary Kramlich <grim@reaperworld.com>
parents: 41252
diff changeset
52
42795
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
53 PidginDisplayItem *conversations_item;
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
54
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
55 GListStore *conversation_model;
40577
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
56 };
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
57
42575
580339aa47cc Make sure all of the final types in pidgin are defined as such
Gary Kramlich <grim@reaperworld.com>
parents: 42559
diff changeset
58 G_DEFINE_FINAL_TYPE(PidginDisplayWindow, pidgin_display_window,
580339aa47cc Make sure all of the final types in pidgin are defined as such
Gary Kramlich <grim@reaperworld.com>
parents: 42559
diff changeset
59 GTK_TYPE_APPLICATION_WINDOW)
40577
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
60
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
61 static GtkWidget *default_window = NULL;
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
62
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
63 /******************************************************************************
41482
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
64 * Helpers
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
65 *****************************************************************************/
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
66 static void
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
67 pidgin_display_window_actions_set_enabled(GActionMap *map,
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
68 const gchar **actions,
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
69 gboolean enabled)
41482
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
70 {
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
71 for(int i = 0; actions[i] != NULL; i++) {
41482
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
72 GAction *action = NULL;
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
73 const gchar *name = actions[i];
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
74
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
75 action = g_action_map_lookup_action(map, name);
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
76 if(action != NULL) {
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
77 g_simple_action_set_enabled(G_SIMPLE_ACTION(action), enabled);
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
78 }
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
79 }
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
80 }
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
81
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
82 static GListModel *
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
83 pidgin_display_window_create_model(GObject *item,
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
84 G_GNUC_UNUSED gpointer data)
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
85 {
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
86 GListModel *model = NULL;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
87
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
88 model = pidgin_display_item_get_children(PIDGIN_DISPLAY_ITEM(item));
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
89 if(model != NULL) {
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
90 return g_object_ref(model);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
91 }
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
92
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
93 return NULL;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
94 }
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
95
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
96 static gboolean
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
97 pidgin_display_window_find_conversation(gconstpointer a, gconstpointer b) {
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
98 PidginDisplayItem *item_a = PIDGIN_DISPLAY_ITEM((gpointer)a);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
99 PidginDisplayItem *item_b = PIDGIN_DISPLAY_ITEM((gpointer)b);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
100 PurpleConversation *conversation_a = NULL;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
101 PurpleConversation *conversation_b = NULL;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
102
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
103 conversation_a = g_object_get_data(G_OBJECT(item_a), "conversation");
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
104 conversation_b = g_object_get_data(G_OBJECT(item_b), "conversation");
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
105
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
106 return (conversation_a == conversation_b);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
107 }
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
108
42625
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
109 static gboolean
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
110 pidgin_display_window_find_conversation_by_id(gconstpointer a,
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
111 G_GNUC_UNUSED gconstpointer b,
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
112 gpointer user_data)
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
113 {
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
114 PidginDisplayItem *item_a = PIDGIN_DISPLAY_ITEM((gpointer)a);
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
115 const char *a_id = pidgin_display_item_get_id(item_a);
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
116 const char *id = user_data;
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
117
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
118 return purple_strequal(a_id, id);
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
119 }
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
120
41482
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
121 /******************************************************************************
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
122 * Actions
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
123 *****************************************************************************/
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
124 static void
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
125 pidgin_display_window_close_conversation(G_GNUC_UNUSED GSimpleAction *simple,
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
126 G_GNUC_UNUSED GVariant *parameter,
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
127 gpointer data)
41482
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
128 {
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
129 PidginDisplayWindow *window = data;
41482
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
130 PurpleConversation *selected = NULL;
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
131
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
132 selected = pidgin_display_window_get_selected(window);
41482
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
133 if(PURPLE_IS_CONVERSATION(selected)) {
42301
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
134 GtkWidget *conversation = NULL;
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
135
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
136 conversation = pidgin_conversation_from_purple_conversation(selected);
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
137 if(PIDGIN_IS_CONVERSATION(conversation)) {
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
138 pidgin_conversation_close(PIDGIN_CONVERSATION(conversation));
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
139 g_clear_object(&conversation);
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
140 }
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
141
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
142 pidgin_display_window_remove(window, selected);
41482
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
143 }
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
144 }
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
145
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
146 static GActionEntry win_entries[] = {
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
147 {
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
148 .name = "close",
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
149 .activate = pidgin_display_window_close_conversation
41482
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
150 }
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
151 };
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
152
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
153 /*<private>
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
154 * pidgin_display_window_conversation_actions:
41482
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
155 *
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
156 * A list of action names that are only valid if a conversation is selected.
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
157 */
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
158 static const gchar *pidgin_display_window_conversation_actions[] = {
41482
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
159 "close",
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
160 NULL
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
161 };
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
162
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
163 /******************************************************************************
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
164 * Callbacks
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
165 *****************************************************************************/
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
166 static gboolean
41947
7b3312d0760c Bump C standard to C99 for Pidgin files and fix warnings
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41849
diff changeset
167 pidgin_display_window_key_pressed_cb(G_GNUC_UNUSED GtkEventControllerKey *controller,
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
168 guint keyval,
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
169 G_GNUC_UNUSED guint keycode,
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
170 GdkModifierType state,
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
171 gpointer data)
41186
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
172 {
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
173 PidginDisplayWindow *window = data;
41186
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
174
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
175 if (state & GDK_CONTROL_MASK) {
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
176 switch (keyval) {
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
177 case GDK_KEY_Page_Down:
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
178 case GDK_KEY_KP_Page_Down:
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
179 case ']':
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
180 pidgin_display_window_select_next(window);
41186
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
181 return TRUE;
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
182 break;
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
183 case GDK_KEY_Home:
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
184 pidgin_display_window_select_first(window);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
185 return TRUE;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
186 break;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
187 case GDK_KEY_End:
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
188 pidgin_display_window_select_last(window);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
189 return TRUE;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
190 break;
41186
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
191 case GDK_KEY_Page_Up:
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
192 case GDK_KEY_KP_Page_Up:
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
193 case '[':
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
194 pidgin_display_window_select_previous(window);
41186
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
195 return TRUE;
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
196 break;
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
197 }
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
198 } else if (state & GDK_ALT_MASK) {
41186
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
199 if ('1' <= keyval && keyval <= '9') {
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
200 guint switchto = keyval - '1';
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
201 pidgin_display_window_select_nth(window, switchto);
41186
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
202
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
203 return TRUE;
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
204 }
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
205 }
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
206
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
207 return FALSE;
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
208 }
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
209
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
210 static void
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
211 pidgin_display_window_selected_item_changed_cb(GObject *self,
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
212 G_GNUC_UNUSED GParamSpec *pspec,
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
213 gpointer data)
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
214 {
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
215 PidginDisplayItem *item = NULL;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
216 PidginDisplayWindow *window = data;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
217 PurpleConversation *conversation = NULL;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
218 GtkSingleSelection *selection = GTK_SINGLE_SELECTION(self);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
219 GtkTreeListRow *row = NULL;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
220 GtkWidget *widget = NULL;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
221 gboolean is_conversation = FALSE;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
222
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
223 row = gtk_single_selection_get_selected_item(selection);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
224
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
225 item = gtk_tree_list_row_get_item(row);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
226
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
227 /* Toggle whether actions should be enabled or disabled. */
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
228 conversation = g_object_get_data(G_OBJECT(item), "conversation");
42714
f555f11df057 Stop using PurpleIMConversation in Pidgin
Gary Kramlich <grim@reaperworld.com>
parents: 42711
diff changeset
229 is_conversation = PURPLE_IS_CONVERSATION(conversation);
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
230
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
231 pidgin_display_window_actions_set_enabled(G_ACTION_MAP(window),
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
232 pidgin_display_window_conversation_actions,
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
233 is_conversation);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
234
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
235 widget = pidgin_display_item_get_widget(item);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
236 if(GTK_IS_WIDGET(widget)) {
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
237 adw_bin_set_child(ADW_BIN(window->bin), widget);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
238 }
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
239 }
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
240
42559
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
241 static void
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
242 pidgin_display_window_conversation_registered_cb(G_GNUC_UNUSED PurpleConversationManager *manager,
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
243 PurpleConversation *conversation,
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
244 gpointer data)
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
245 {
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
246 PidginDisplayWindow *window = data;
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
247
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
248 pidgin_display_window_add(window, conversation);
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
249 }
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
250
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
251 static void
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
252 pidgin_display_window_conversation_unregistered_cb(G_GNUC_UNUSED PurpleConversationManager *manager,
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
253 PurpleConversation *conversation,
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
254 gpointer data)
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
255 {
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
256 PidginDisplayWindow *window = data;
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
257
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
258 pidgin_display_window_remove(window, conversation);
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
259 }
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
260
42795
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
261 static void
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
262 pidgin_display_window_conversation_present_cb(PurpleConversation *conversation,
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
263 gpointer data)
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
264 {
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
265 pidgin_display_window_select(data, conversation);
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
266 }
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
267
40577
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
268 /******************************************************************************
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
269 * GObject Implementation
40577
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
270 *****************************************************************************/
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
271 static void
42215
a0108bfcb108 Reference the selection_model in PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42202
diff changeset
272 pidgin_display_window_finalize(GObject *obj) {
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
273 PidginDisplayWindow *window = PIDGIN_DISPLAY_WINDOW(obj);
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
274
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
275 g_clear_object(&window->conversation_model);
42215
a0108bfcb108 Reference the selection_model in PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42202
diff changeset
276 g_clear_object(&window->selection_model);
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
277
42215
a0108bfcb108 Reference the selection_model in PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42202
diff changeset
278 G_OBJECT_CLASS(pidgin_display_window_parent_class)->finalize(obj);
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
279 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
280
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
281 static void
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
282 pidgin_display_window_init(PidginDisplayWindow *window) {
41560
2579a5138f0c A bunch of random fixes for the the gtk4 branch
Gary Kramlich <grim@reaperworld.com>
parents: 41527
diff changeset
283 GtkEventController *key = NULL;
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
284 GtkTreeListModel *tree_model = NULL;
42597
cc322d213d2e Add the Plugins list to the PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42575
diff changeset
285 GPluginManager *plugin_manager = NULL;
cc322d213d2e Add the Plugins list to the PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42575
diff changeset
286 gpointer settings_backend = NULL;
40627
3d6797191bf5 Create a new menu bar for PidginConversationWindow. This is just the menu itself and no behavior.
Gary Kramlich <grim@reaperworld.com>
parents: 40577
diff changeset
287
40577
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
288 gtk_widget_init_template(GTK_WIDGET(window));
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
289
42215
a0108bfcb108 Reference the selection_model in PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42202
diff changeset
290 /* Add a reference to the selection model as we use it internally and with
a0108bfcb108 Reference the selection_model in PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42202
diff changeset
291 * out it we get some weird call backs being called when it's nulled out
a0108bfcb108 Reference the selection_model in PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42202
diff changeset
292 * during destruction.
a0108bfcb108 Reference the selection_model in PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42202
diff changeset
293 */
a0108bfcb108 Reference the selection_model in PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42202
diff changeset
294 g_object_ref(window->selection_model);
a0108bfcb108 Reference the selection_model in PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42202
diff changeset
295
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
296 /* Setup the tree list model. */
42795
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
297 tree_model = gtk_tree_list_model_new(G_LIST_MODEL(window->base_model),
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
298 FALSE, TRUE,
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
299 (GtkTreeListModelCreateModelFunc)pidgin_display_window_create_model,
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
300 window, NULL);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
301
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
302 /* Set the model of the selection to the tree model. */
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
303 gtk_single_selection_set_model(GTK_SINGLE_SELECTION(window->selection_model),
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
304 G_LIST_MODEL(tree_model));
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
305 g_clear_object(&tree_model);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
306
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
307 /* Set the application and add all of our actions. */
40577
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
308 gtk_window_set_application(GTK_WINDOW(window),
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
309 GTK_APPLICATION(g_application_get_default()));
40627
3d6797191bf5 Create a new menu bar for PidginConversationWindow. This is just the menu itself and no behavior.
Gary Kramlich <grim@reaperworld.com>
parents: 40577
diff changeset
310
41482
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
311 g_action_map_add_action_entries(G_ACTION_MAP(window), win_entries,
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
312 G_N_ELEMENTS(win_entries), window);
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
313
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
314 /* Add a key controller. */
41560
2579a5138f0c A bunch of random fixes for the the gtk4 branch
Gary Kramlich <grim@reaperworld.com>
parents: 41527
diff changeset
315 key = gtk_event_controller_key_new();
41186
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
316 gtk_event_controller_set_propagation_phase(key, GTK_PHASE_CAPTURE);
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
317 g_signal_connect(G_OBJECT(key), "key-pressed",
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
318 G_CALLBACK(pidgin_display_window_key_pressed_cb),
41186
f8275d257afe Move conversation window key handling into its file
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41184
diff changeset
319 window);
41560
2579a5138f0c A bunch of random fixes for the the gtk4 branch
Gary Kramlich <grim@reaperworld.com>
parents: 41527
diff changeset
320 gtk_widget_add_controller(GTK_WIDGET(window), key);
42597
cc322d213d2e Add the Plugins list to the PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42575
diff changeset
321
cc322d213d2e Add the Plugins list to the PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42575
diff changeset
322 /* Set up the plugin list. */
cc322d213d2e Add the Plugins list to the PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42575
diff changeset
323 plugin_manager = gplugin_manager_get_default();
cc322d213d2e Add the Plugins list to the PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42575
diff changeset
324 gplugin_gtk_view_set_manager(GPLUGIN_GTK_VIEW(window->plugin_list),
cc322d213d2e Add the Plugins list to the PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42575
diff changeset
325 plugin_manager);
cc322d213d2e Add the Plugins list to the PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42575
diff changeset
326
cc322d213d2e Add the Plugins list to the PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42575
diff changeset
327 settings_backend = purple_core_get_settings_backend();
cc322d213d2e Add the Plugins list to the PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42575
diff changeset
328 gplugin_gtk_view_set_settings_backend(GPLUGIN_GTK_VIEW(window->plugin_list),
cc322d213d2e Add the Plugins list to the PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42575
diff changeset
329 settings_backend);
40577
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
330 }
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
331
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
332 static void
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
333 pidgin_display_window_class_init(PidginDisplayWindowClass *klass) {
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
334 GObjectClass *obj_class = G_OBJECT_CLASS(klass);
40577
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
335 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
336
42215
a0108bfcb108 Reference the selection_model in PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42202
diff changeset
337 obj_class->finalize = pidgin_display_window_finalize;
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
338
41479
3d2e114380f6 Add source files to GObject introspection
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41476
diff changeset
339 /**
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
340 * PidginDisplayWindow::conversation-switched:
41479
3d2e114380f6 Add source files to GObject introspection
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41476
diff changeset
341 * @window: The conversation window.
3d2e114380f6 Add source files to GObject introspection
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41476
diff changeset
342 * @new_conv: The now active conversation.
3d2e114380f6 Add source files to GObject introspection
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41476
diff changeset
343 *
3d2e114380f6 Add source files to GObject introspection
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41476
diff changeset
344 * Emitted when a window switched from one conversation to another.
3d2e114380f6 Add source files to GObject introspection
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 41476
diff changeset
345 */
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
346 signals[SIG_CONVERSATION_SWITCHED] = g_signal_new_class_handler(
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
347 "conversation-switched",
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
348 G_OBJECT_CLASS_TYPE(obj_class),
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
349 G_SIGNAL_RUN_LAST,
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
350 NULL,
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
351 NULL,
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
352 NULL,
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
353 NULL,
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
354 G_TYPE_NONE,
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
355 1,
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
356 PURPLE_TYPE_CONVERSATION
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
357 );
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
358
40577
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
359 gtk_widget_class_set_template_from_resource(
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
360 widget_class,
42762
17f602456139 Move Display/window.ui to display-window.ui
Gary Kramlich <grim@reaperworld.com>
parents: 42714
diff changeset
361 "/im/pidgin/Pidgin3/display-window.ui"
40577
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
362 );
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
363
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
364 gtk_widget_class_bind_template_child(widget_class, PidginDisplayWindow,
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
365 view);
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
366 gtk_widget_class_bind_template_child(widget_class, PidginDisplayWindow,
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
367 bin);
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
368 gtk_widget_class_bind_template_child(widget_class, PidginDisplayWindow,
42597
cc322d213d2e Add the Plugins list to the PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42575
diff changeset
369 plugin_list);
cc322d213d2e Add the Plugins list to the PidginDisplayWindow
Gary Kramlich <grim@reaperworld.com>
parents: 42575
diff changeset
370 gtk_widget_class_bind_template_child(widget_class, PidginDisplayWindow,
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
371 base_model);
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
372 gtk_widget_class_bind_template_child(widget_class, PidginDisplayWindow,
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
373 selection_model);
41849
413cde086275 Add a placeholder to PidginDisplayWindow for the ContactList
Gary Kramlich <grim@reaperworld.com>
parents: 41702
diff changeset
374 gtk_widget_class_bind_template_child(widget_class, PidginDisplayWindow,
42795
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
375 conversations_item);
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
376 gtk_widget_class_bind_template_child(widget_class, PidginDisplayWindow,
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
377 conversation_model);
41527
4dff8cd4e9ea Convert PidginConversationWindow to GTK4
Gary Kramlich <grim@reaperworld.com>
parents: 41484
diff changeset
378
4dff8cd4e9ea Convert PidginConversationWindow to GTK4
Gary Kramlich <grim@reaperworld.com>
parents: 41484
diff changeset
379 gtk_widget_class_bind_template_callback(widget_class,
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
380 pidgin_display_window_key_pressed_cb);
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
381 gtk_widget_class_bind_template_callback(widget_class,
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
382 pidgin_display_window_selected_item_changed_cb);
40577
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
383 }
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
384
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
385 /******************************************************************************
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
386 * API
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
387 *****************************************************************************/
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
388 GtkWidget *
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
389 pidgin_display_window_get_default(void) {
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
390 if(!GTK_IS_WIDGET(default_window)) {
42559
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
391 PurpleConversationManager *manager = NULL;
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
392
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
393 default_window = pidgin_display_window_new();
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
394 g_object_add_weak_pointer(G_OBJECT(default_window),
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
395 (gpointer)&default_window);
42559
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
396
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
397 manager = purple_conversation_manager_get_default();
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
398 g_signal_connect_object(manager, "registered",
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
399 G_CALLBACK(pidgin_display_window_conversation_registered_cb),
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
400 default_window, 0);
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
401 g_signal_connect_object(manager, "unregistered",
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
402 G_CALLBACK(pidgin_display_window_conversation_unregistered_cb),
7bde7363e0f3 Fix opening of conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42554
diff changeset
403 default_window, 0);
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
404 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
405
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
406 return default_window;
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
407 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
408
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
409 GtkWidget *
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
410 pidgin_display_window_new(void) {
41582
4ee4a8ddc190 Explicitly set show-menubar so our menubars are shown
Gary Kramlich <grim@reaperworld.com>
parents: 41560
diff changeset
411 return g_object_new(
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
412 PIDGIN_TYPE_DISPLAY_WINDOW,
41582
4ee4a8ddc190 Explicitly set show-menubar so our menubars are shown
Gary Kramlich <grim@reaperworld.com>
parents: 41560
diff changeset
413 "show-menubar", TRUE,
4ee4a8ddc190 Explicitly set show-menubar so our menubars are shown
Gary Kramlich <grim@reaperworld.com>
parents: 41560
diff changeset
414 NULL);
40577
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
415 }
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
416
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
417 void
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
418 pidgin_display_window_add(PidginDisplayWindow *window,
42301
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
419 PurpleConversation *purple_conversation)
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
420 {
42301
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
421 GtkWidget *pidgin_conversation = NULL;
42609
648a1b5dd96a use a globally unique id when creating new Pidgin::DisplayItem's
Markus Fischer <ivanhoe@fiscari.de>
parents: 42597
diff changeset
422 const char *conversation_id = NULL;
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
423
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
424 g_return_if_fail(PIDGIN_IS_DISPLAY_WINDOW(window));
42301
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
425 g_return_if_fail(PURPLE_IS_CONVERSATION(purple_conversation));
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
426
42609
648a1b5dd96a use a globally unique id when creating new Pidgin::DisplayItem's
Markus Fischer <ivanhoe@fiscari.de>
parents: 42597
diff changeset
427 conversation_id = purple_conversation_get_id(purple_conversation);
648a1b5dd96a use a globally unique id when creating new Pidgin::DisplayItem's
Markus Fischer <ivanhoe@fiscari.de>
parents: 42597
diff changeset
428 g_return_if_fail(conversation_id != NULL);
648a1b5dd96a use a globally unique id when creating new Pidgin::DisplayItem's
Markus Fischer <ivanhoe@fiscari.de>
parents: 42597
diff changeset
429
42301
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
430 pidgin_conversation = pidgin_conversation_from_purple_conversation(purple_conversation);
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
431
42301
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
432 if(!PIDGIN_IS_CONVERSATION(pidgin_conversation)) {
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
433 pidgin_conversation = pidgin_conversation_new(purple_conversation);
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
434 }
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
435
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
436 if(PIDGIN_IS_CONVERSATION(pidgin_conversation)) {
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
437 PidginDisplayItem *item = NULL;
42609
648a1b5dd96a use a globally unique id when creating new Pidgin::DisplayItem's
Markus Fischer <ivanhoe@fiscari.de>
parents: 42597
diff changeset
438 PurpleAccount *account = purple_conversation_get_account(purple_conversation);
648a1b5dd96a use a globally unique id when creating new Pidgin::DisplayItem's
Markus Fischer <ivanhoe@fiscari.de>
parents: 42597
diff changeset
439 PurpleContactInfo *info = PURPLE_CONTACT_INFO(account);
648a1b5dd96a use a globally unique id when creating new Pidgin::DisplayItem's
Markus Fischer <ivanhoe@fiscari.de>
parents: 42597
diff changeset
440 const char *account_id = NULL;
648a1b5dd96a use a globally unique id when creating new Pidgin::DisplayItem's
Markus Fischer <ivanhoe@fiscari.de>
parents: 42597
diff changeset
441 char *id = NULL;
42625
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
442 gboolean item_exists = FALSE;
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
443
42301
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
444 GtkWidget *parent = gtk_widget_get_parent(pidgin_conversation);
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
445
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
446 if(GTK_IS_WIDGET(parent)) {
42301
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
447 g_object_ref(pidgin_conversation);
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
448 gtk_widget_unparent(pidgin_conversation);
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
449 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
450
42609
648a1b5dd96a use a globally unique id when creating new Pidgin::DisplayItem's
Markus Fischer <ivanhoe@fiscari.de>
parents: 42597
diff changeset
451 account_id = purple_contact_info_get_id(info);
648a1b5dd96a use a globally unique id when creating new Pidgin::DisplayItem's
Markus Fischer <ivanhoe@fiscari.de>
parents: 42597
diff changeset
452 id = g_strdup_printf("%s-%s", account_id, conversation_id);
42625
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
453 item_exists =
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
454 g_list_store_find_with_equal_func_full(window->conversation_model,
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
455 NULL,
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
456 pidgin_display_window_find_conversation_by_id,
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
457 id,
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
458 NULL);
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
459 if (!item_exists) {
42766
d823c3372e97 Some cleanups for PidginDisplayItem
Gary Kramlich <grim@reaperworld.com>
parents: 42762
diff changeset
460 PurpleProtocol *protocol = NULL;
d823c3372e97 Some cleanups for PidginDisplayItem
Gary Kramlich <grim@reaperworld.com>
parents: 42762
diff changeset
461 const char *icon_name = NULL;
d823c3372e97 Some cleanups for PidginDisplayItem
Gary Kramlich <grim@reaperworld.com>
parents: 42762
diff changeset
462
42625
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
463 item = pidgin_display_item_new(pidgin_conversation, id);
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
464 g_object_set_data(G_OBJECT(item), "conversation", purple_conversation);
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
465
42766
d823c3372e97 Some cleanups for PidginDisplayItem
Gary Kramlich <grim@reaperworld.com>
parents: 42762
diff changeset
466 protocol = purple_account_get_protocol(account);
d823c3372e97 Some cleanups for PidginDisplayItem
Gary Kramlich <grim@reaperworld.com>
parents: 42762
diff changeset
467 icon_name = purple_protocol_get_icon_name(protocol);
d823c3372e97 Some cleanups for PidginDisplayItem
Gary Kramlich <grim@reaperworld.com>
parents: 42762
diff changeset
468 if(!purple_strempty(icon_name)) {
d823c3372e97 Some cleanups for PidginDisplayItem
Gary Kramlich <grim@reaperworld.com>
parents: 42762
diff changeset
469 pidgin_display_item_set_icon_name(item, icon_name);
d823c3372e97 Some cleanups for PidginDisplayItem
Gary Kramlich <grim@reaperworld.com>
parents: 42762
diff changeset
470 }
d823c3372e97 Some cleanups for PidginDisplayItem
Gary Kramlich <grim@reaperworld.com>
parents: 42762
diff changeset
471
42774
4858aea578c4 Bind the Pidgin.DisplayItem:title property to Purple.Conversation:title-for-display
Gary Kramlich <grim@reaperworld.com>
parents: 42766
diff changeset
472 g_object_bind_property(purple_conversation, "title-for-display",
42625
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
473 item, "title",
42774
4858aea578c4 Bind the Pidgin.DisplayItem:title property to Purple.Conversation:title-for-display
Gary Kramlich <grim@reaperworld.com>
parents: 42766
diff changeset
474 G_BINDING_SYNC_CREATE);
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
475
42795
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
476 g_signal_connect_object(purple_conversation, "present",
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
477 G_CALLBACK(pidgin_display_window_conversation_present_cb),
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
478 window, G_CONNECT_DEFAULT);
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
479
42625
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
480 g_list_store_append(window->conversation_model, item);
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
481 g_clear_object(&item);
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
482 }
36732747258f Only open new conversations if they are not already open
Markus Fischer <ivanhoe@fiscari.de>
parents: 42609
diff changeset
483 g_free(id);
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
484 if(GTK_IS_WIDGET(parent)) {
42301
d3930fe5505c The start of the new conversation window
Gary Kramlich <grim@reaperworld.com>
parents: 42295
diff changeset
485 g_object_unref(pidgin_conversation);
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
486 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
487 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
488 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
489
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
490 void
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
491 pidgin_display_window_remove(PidginDisplayWindow *window,
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
492 PurpleConversation *conversation)
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
493 {
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
494 PidginDisplayItem *item = NULL;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
495 guint position = 0;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
496 gboolean found = FALSE;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
497 gchar *id = NULL;
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
498
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
499 g_return_if_fail(PIDGIN_IS_DISPLAY_WINDOW(window));
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
500 g_return_if_fail(PURPLE_IS_CONVERSATION(conversation));
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
501
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
502 /* Create a wrapper item for our find function. */
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
503 id = g_uuid_string_random();
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
504 item = g_object_new(PIDGIN_TYPE_DISPLAY_ITEM, "id", id, NULL);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
505 g_free(id);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
506 g_object_set_data(G_OBJECT(item), "conversation", conversation);
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
507
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
508 found = g_list_store_find_with_equal_func(window->conversation_model,
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
509 item,
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
510 pidgin_display_window_find_conversation,
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
511 &position);
41482
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
512
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
513 g_clear_object(&item);
41482
c51a28d28a2d Start implementing the conversation window actions.
Gary Kramlich <grim@reaperworld.com>
parents: 41479
diff changeset
514
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
515 if(found) {
42795
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
516 g_signal_handlers_disconnect_by_func(conversation,
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
517 G_CALLBACK(pidgin_display_window_conversation_present_cb),
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
518 window);
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
519
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
520 g_list_store_remove(window->conversation_model, position);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
521 }
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
522 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
523
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
524 guint
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
525 pidgin_display_window_get_count(G_GNUC_UNUSED PidginDisplayWindow *window) {
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
526 /* TODO: This is only used by the gestures plugin and that will probably
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
527 * need some rewriting and different api for a mixed content window list
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
528 * this is now.
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
529 */
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
530
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
531 return 0;
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
532 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
533
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
534 PurpleConversation *
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
535 pidgin_display_window_get_selected(PidginDisplayWindow *window) {
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
536 GtkSingleSelection *selection = NULL;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
537 GtkTreeListRow *tree_row = NULL;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
538 GObject *selected = NULL;
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
539
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
540 g_return_val_if_fail(PIDGIN_IS_DISPLAY_WINDOW(window), NULL);
40577
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
541
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
542 selection = GTK_SINGLE_SELECTION(window->selection_model);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
543 tree_row = gtk_single_selection_get_selected_item(selection);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
544 selected = gtk_tree_list_row_get_item(tree_row);
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
545
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
546 if(PIDGIN_IS_DISPLAY_ITEM(selected)) {
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
547 return g_object_get_data(selected, "conversation");
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
548 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
549
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
550 return NULL;
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
551 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
552
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
553 void
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
554 pidgin_display_window_select(PidginDisplayWindow *window,
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
555 PurpleConversation *conversation)
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
556 {
42795
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
557 PidginDisplayItem *item = NULL;
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
558 guint position = 0;
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
559 gboolean found = FALSE;
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
560 gchar *id = NULL;
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
561
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
562 g_return_if_fail(PIDGIN_IS_DISPLAY_WINDOW(window));
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
563 g_return_if_fail(PURPLE_IS_CONVERSATION(conversation));
42795
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
564
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
565 /* Create a wrapper item for our find function. */
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
566 id = g_uuid_string_random();
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
567 item = g_object_new(PIDGIN_TYPE_DISPLAY_ITEM, "id", id, NULL);
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
568 g_free(id);
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
569 g_object_set_data(G_OBJECT(item), "conversation", conversation);
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
570
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
571 found = g_list_store_find_with_equal_func(window->conversation_model,
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
572 item,
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
573 pidgin_display_window_find_conversation,
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
574 &position);
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
575 g_clear_object(&item);
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
576
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
577 if(found) {
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
578 /* Figure out where the conversations_item is because we need to add to
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
579 * that position.
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
580 */
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
581 guint conversations_position = 0;
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
582 guint real_position = 0;
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
583
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
584 g_list_store_find(window->base_model, window->conversations_item,
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
585 &conversations_position);
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
586
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
587 /* Since this is a nested model, we need to increment by one to get to
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
588 * the correct item.
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
589 */
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
590 real_position = conversations_position + position + 1;
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
591
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
592 gtk_single_selection_set_selected(GTK_SINGLE_SELECTION(window->selection_model),
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
593 real_position);
fedfa85c0b40 Implement presenting and selecting conversations
Gary Kramlich <grim@reaperworld.com>
parents: 42774
diff changeset
594 }
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
595 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
596
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
597 void
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
598 pidgin_display_window_select_previous(PidginDisplayWindow *window) {
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
599 GtkSingleSelection *selection = NULL;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
600 guint position = 0;
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
601
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
602 g_return_if_fail(PIDGIN_IS_DISPLAY_WINDOW(window));
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
603
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
604 selection = GTK_SINGLE_SELECTION(window->selection_model);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
605 position = gtk_single_selection_get_selected(selection);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
606 if(position == 0) {
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
607 position = g_list_model_get_n_items(G_LIST_MODEL(selection)) - 1;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
608 } else {
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
609 position = position - 1;
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
610 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
611
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
612 gtk_single_selection_set_selected(selection, position);
40577
953d563429b8 Create a new PidginConversationWindow widget
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
613 }
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
614
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
615 void
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
616 pidgin_display_window_select_next(PidginDisplayWindow *window) {
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
617 GtkSingleSelection *selection = NULL;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
618 guint position = 0;
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
619
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
620 g_return_if_fail(PIDGIN_IS_DISPLAY_WINDOW(window));
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
621
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
622 selection = GTK_SINGLE_SELECTION(window->selection_model);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
623 position = gtk_single_selection_get_selected(selection);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
624 if(position + 1 >= g_list_model_get_n_items(G_LIST_MODEL(selection))) {
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
625 position = 0;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
626 } else {
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
627 position = position + 1;
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
628 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
629
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
630 gtk_single_selection_set_selected(selection, position);
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
631 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
632
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
633 void
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
634 pidgin_display_window_select_first(PidginDisplayWindow *window) {
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
635 GtkSingleSelection *selection = NULL;
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
636
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
637 g_return_if_fail(PIDGIN_IS_DISPLAY_WINDOW(window));
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
638
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
639 selection = GTK_SINGLE_SELECTION(window->selection_model);
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
640
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
641 /* The selection has autoselect set to true, which won't do anything if
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
642 * this is an invalid value.
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
643 */
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
644 gtk_single_selection_set_selected(selection, 0);
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
645 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
646
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
647 void
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
648 pidgin_display_window_select_last(PidginDisplayWindow *window) {
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
649 GtkSingleSelection *selection = NULL;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
650 guint n_items = 0;
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
651
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
652 g_return_if_fail(PIDGIN_IS_DISPLAY_WINDOW(window));
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
653
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
654 selection = GTK_SINGLE_SELECTION(window->selection_model);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
655 n_items = g_list_model_get_n_items(G_LIST_MODEL(selection));
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
656
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
657 /* The selection has autoselect set to true, which won't do anything if
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
658 * this is an invalid value.
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
659 */
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
660 gtk_single_selection_set_selected(selection, n_items - 1);
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
661 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
662
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
663 void
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
664 pidgin_display_window_select_nth(PidginDisplayWindow *window,
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
665 guint nth)
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
666 {
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
667 GtkSingleSelection *selection = NULL;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
668 guint n_items = 0;
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
669
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
670 g_return_if_fail(PIDGIN_IS_DISPLAY_WINDOW(window));
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
671
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
672 selection = GTK_SINGLE_SELECTION(window->selection_model);
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
673
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
674 /* The selection has autoselect set to true, but this isn't bound checking
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
675 * or something on the children models, so we verify before setting.
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
676 */
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
677 n_items = g_list_model_get_n_items(G_LIST_MODEL(selection));
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
678 if(nth < n_items) {
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
679 gtk_single_selection_set_selected(selection, nth);
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
680 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
681 }
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
682
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
683 gboolean
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
684 pidgin_display_window_conversation_is_selected(PidginDisplayWindow *window,
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
685 PurpleConversation *conversation)
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
686 {
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
687 GtkSingleSelection *selection = NULL;
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
688 GObject *selected = NULL;
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
689
41696
35f8ce475b21 Rename PidginConversationWindow to PidginDisplayWindow as it holds more than conversations now
Gary Kramlich <grim@reaperworld.com>
parents: 41582
diff changeset
690 g_return_val_if_fail(PIDGIN_IS_DISPLAY_WINDOW(window), FALSE);
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
691 g_return_val_if_fail(PURPLE_IS_CONVERSATION(conversation), FALSE);
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
692
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
693 selection = GTK_SINGLE_SELECTION(window->selection_model);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
694 selected = gtk_single_selection_get_selected_item(selection);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
695
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
696 if(PIDGIN_IS_DISPLAY_ITEM(selected)) {
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
697 PurpleConversation *selected_conversation = NULL;
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
698
42050
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
699 selected_conversation = g_object_get_data(G_OBJECT(selected),
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
700 "conversation");
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
701 if(selected_conversation != NULL) {
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
702 return (selected_conversation == conversation);
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
703 }
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
704 }
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
705
5ac6db2b8c2d Make the DisplayWindow use a GtkListView
Gary Kramlich <grim@reaperworld.com>
parents: 41947
diff changeset
706 return FALSE;
41184
05b5c210352b Move conversation management from gtkconv.c to PidginConversationWindow.
Gary Kramlich <grim@reaperworld.com>
parents: 41030
diff changeset
707 }

mercurial