1 /**
2  * @file gtkconv.h GTK+ Conversation API
3  * @ingroup pidgin
4  * @see @ref gtkconv-signals
5  */
6 
7 /* pidgin
8  *
9  * Pidgin is the legal property of its developers, whose names are too numerous
10  * to list here.  Please refer to the COPYRIGHT file distributed with this
11  * source distribution.
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 2 of the License, or
16  * (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software
25  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
26  */
27 #ifndef _PIDGIN_CONVERSATION_H_
28 #define _PIDGIN_CONVERSATION_H_
29 
30 typedef struct _PidginImPane       PidginImPane;
31 typedef struct _PidginChatPane     PidginChatPane;
32 typedef struct _PidginConversation PidginConversation;
33 
34 /**
35  * Unseen text states.
36  */
37 typedef enum
38 {
39 	PIDGIN_UNSEEN_NONE,   /**< No unseen text in the conversation. */
40 	PIDGIN_UNSEEN_EVENT,  /**< Unseen events in the conversation.  */
41 	PIDGIN_UNSEEN_NO_LOG, /**< Unseen text with NO_LOG flag.       */
42 	PIDGIN_UNSEEN_TEXT,   /**< Unseen text in the conversation.    */
43 	PIDGIN_UNSEEN_NICK    /**< Unseen text and the nick was said.  */
44 } PidginUnseenState;
45 
46 enum {
47 	CHAT_USERS_ICON_COLUMN,
48 	CHAT_USERS_ALIAS_COLUMN,
49 	CHAT_USERS_ALIAS_KEY_COLUMN,
50 	CHAT_USERS_NAME_COLUMN,
51 	CHAT_USERS_FLAGS_COLUMN,
52 	CHAT_USERS_COLOR_COLUMN,
53 	CHAT_USERS_WEIGHT_COLUMN,
54 	CHAT_USERS_ICON_STOCK_COLUMN,   /** @since 2.6.0 */
55 	CHAT_USERS_COLUMNS
56 };
57 
58 #define PIDGIN_CONVERSATION(conv) \
59 	((PidginConversation *)(conv)->ui_data)
60 
61 #define PIDGIN_IS_PIDGIN_CONVERSATION(conv) \
62 	(purple_conversation_get_ui_ops(conv) == \
63 	 pidgin_conversations_get_conv_ui_ops())
64 
65 #include "pidgin.h"
66 #include "conversation.h"
67 #include "gtkconvwin.h"
68 
69 /**************************************************************************
70  * @name Structures
71  **************************************************************************/
72 /*@{*/
73 
74 /**
75  * A GTK+ representation of a graphical window containing one or more
76  * conversations.
77  */
78 
79 /**
80  * A GTK+ Instant Message pane.
81  */
82 struct _PidginImPane
83 {
84 	GtkWidget *block;
85 	GtkWidget *send_file;
86 	GtkWidget *sep1;
87 	GtkWidget *sep2;
88 	GtkWidget *check;
89 	GtkWidget *progress;
90 	guint32 typing_timer;
91 
92 	/* Buddy icon stuff */
93 	GtkWidget *icon_container;
94 	GtkWidget *icon;
95 	gboolean show_icon;
96 	gboolean animate;
97 	GdkPixbufAnimation *anim;
98 	GdkPixbufAnimationIter *iter;
99 	guint32 icon_timer;
100 };
101 
102 /**
103  * GTK+ Chat panes.
104  */
105 struct _PidginChatPane
106 {
107 	GtkWidget *count;
108 	GtkWidget *list;
109 	GtkWidget *topic_text;
110 };
111 
112 /**
113  * A GTK+ conversation pane.
114  */
115 struct _PidginConversation
116 {
117 	PurpleConversation *active_conv;
118 	GList *convs;
119 	GList *send_history;
120 
121 	PidginWindow *win;
122 
123 	gboolean make_sound;
124 
125 	GtkTooltips *tooltips;
126 
127 	GtkWidget *tab_cont;
128 	GtkWidget *tabby;
129 	GtkWidget *menu_tabby;
130 
131 	GtkWidget *imhtml;
132 	GtkTextBuffer *entry_buffer;
133 	GtkWidget *entry;
134 	gboolean auto_resize;   /* this is set to TRUE if the conversation
135 		 	 	 * is being resized by a non-user-initiated
136 		 		 * event, such as the buddy icon appearing
137 				 */
138 	gboolean entry_growing; /* True if the size of the entry was set
139 				 * automatically by typing too much to fit
140 				 * in one line */
141 
142 	GtkWidget *close; /* "x" on the tab */
143 	GtkWidget *icon;
144 	GtkWidget *tab_label;
145 	GtkWidget *menu_icon;
146 	GtkWidget *menu_label;
147 #if !(defined PIDGIN_DISABLE_DEPRECATED) || (defined _PIDGIN_GTKCONV_C_)
148 	/** @deprecated */
149 	GtkSizeGroup *sg;
150 #else
151 	gpointer depr1;
152 #endif
153 
154 	GtkWidget *lower_hbox;
155 
156 	GtkWidget *toolbar;
157 
158 	PidginUnseenState unseen_state;
159 	guint unseen_count;
160 
161 	union
162 	{
163 		PidginImPane   *im;
164 		PidginChatPane *chat;
165 
166 	} u;
167 
168 	time_t newday;
169 	GtkWidget *infopane_hbox;
170 	GtkWidget *infopane;
171 	GtkListStore *infopane_model;
172 	GtkTreeIter infopane_iter;
173 
174 	/* Used when attaching a PidginConversation to a PurpleConversation
175 	 * with message history */
176 	struct {
177 		int timer;
178 		GList *current;
179 	} attach;
180 
181 	/**
182 	 * Quick Find.
183 	 *
184 	 * @since 2.7.0
185 	 */
186 	struct {
187 		GtkWidget *entry;
188 		GtkWidget *container;
189 	} quickfind;
190 };
191 
192 /*@}*/
193 
194 /**************************************************************************
195  * @name GTK+ Conversation API
196  **************************************************************************/
197 /*@{*/
198 
199 /**
200  * Returns the UI operations structure for GTK+ conversations.
201  *
202  * @return The GTK+ conversation operations structure.
203  */
204 PurpleConversationUiOps *pidgin_conversations_get_conv_ui_ops(void);
205 
206 /**
207  * Updates the buddy icon on a conversation.
208  *
209  * @param conv The conversation.
210  */
211 void pidgin_conv_update_buddy_icon(PurpleConversation *conv);
212 
213 /**
214  * Sets the active conversation within a GTK-conversation.
215  *
216  * @param conv The conversation
217  */
218 void pidgin_conv_switch_active_conversation(PurpleConversation *conv);
219 
220 /**
221  * Updates conversation buttons by protocol.
222  *
223  * @param conv The conversation.
224  */
225 void pidgin_conv_update_buttons_by_protocol(PurpleConversation *conv);
226 
227 /**
228  * Returns a list of conversations of the given type which have an unseen
229  * state greater than or equal to the specified minimum state. Using the
230  * hidden_only parameter, this search can be limited to hidden
231  * conversations. The max_count parameter will limit the total number of
232  * converations returned if greater than zero. The returned list should
233  * be freed by the caller.
234  *
235  * @param type         The type of conversation.
236  * @param min_state    The minimum unseen state.
237  * @param hidden_only  If TRUE, only consider hidden conversations.
238  * @param max_count    Maximum number of conversations to return, or 0 for
239  *                     no maximum.
240  * @return             List of PurpleConversation matching criteria, or NULL.
241  */
242 GList *
243 pidgin_conversations_find_unseen_list(PurpleConversationType type,
244 										PidginUnseenState min_state,
245 										gboolean hidden_only,
246 										guint max_count);
247 
248 /**
249  * Fill a menu with a list of conversations. Clicking the conversation
250  * menu item will present that conversation to the user.
251  *
252  * @param menu   Menu widget to add items to.
253  * @param convs  List of PurpleConversation to add to menu.
254  * @return       Number of conversations added to menu.
255  */
256 guint
257 pidgin_conversations_fill_menu(GtkWidget *menu, GList *convs);
258 
259 /**
260  * Presents a purple conversation to the user.
261  *
262  * @param conv The conversation.
263  */
264 void pidgin_conv_present_conversation(PurpleConversation *conv);
265 
266 /**
267  * Reattach Pidgin UI to a conversation.
268  *
269  * @param conv  The conversation.
270  *
271  * @return  Wheter Pidgin UI was successfully attached.
272  *
273  * @since 2.2.0
274  */
275 gboolean pidgin_conv_attach_to_conversation(PurpleConversation *conv);
276 
277 PidginWindow *pidgin_conv_get_window(PidginConversation *gtkconv);
278 GdkPixbuf *pidgin_conv_get_tab_icon(PurpleConversation *conv, gboolean small_icon);
279 void pidgin_conv_new(PurpleConversation *conv);
280 int pidgin_conv_get_tab_at_xy(PidginWindow *win, int x, int y, gboolean *to_right);
281 gboolean pidgin_conv_is_hidden(PidginConversation *gtkconv);
282 /*@}*/
283 
284 /**************************************************************************/
285 /** @name GTK+ Conversations Subsystem                                    */
286 /**************************************************************************/
287 /*@{*/
288 
289 /**
290  * Returns the gtk conversations subsystem handle.
291  *
292  * @return The conversations subsystem handle.
293  */
294 void *pidgin_conversations_get_handle(void);
295 
296 /**
297  * Initializes the GTK+ conversations subsystem.
298  */
299 void pidgin_conversations_init(void);
300 
301 /**
302  * Uninitialized the GTK+ conversation subsystem.
303  */
304 void pidgin_conversations_uninit(void);
305 
306 /*@}*/
307 
308 #endif /* _PIDGIN_CONVERSATION_H_ */
309