Mercurial > pidgin
annotate finch/gntconv.c @ 18739:f29794be0163
applied changes from bbcc1925d9e449bb9599d378da2764bf47da2a7a
through c2cc31f23a71f23062555721f8101fc9c997bae2
I commited this yesterday, but it includes some other changes that I
didn't mean to commit, so I reverted it and now I'm just committing
this file.
Here's the original commit message:
When we get a presence of type="error" from the server that
corresponds to a Jabber chat, only destroy/free/close/leave
the chat room if the error happened while joining (and we
were therefore never in the room).
This fixes the following bug:
1. Join a room
2. Try to change your nickname to something that's being
used by someone else
3. The server gives you an error message, but you're not
actually kicked out of the room
4. Pidgin thinks you've been kicked out and won't let you
send messages to the room, etc.
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sun, 29 Jul 2007 21:32:36 +0000 |
parents | 3597903cf8ff |
children | 39d3a81a5850 |
rev | line source |
---|---|
15817 | 1 /** |
2 * @file gntconv.c GNT Conversation API | |
16194
0f0832c13fcb
Rename the Doxygen group from gntui to finch and define the finch group
Richard Laager <rlaager@wiktel.com>
parents:
16128
diff
changeset
|
3 * @ingroup finch |
15817 | 4 * |
15870
66dff3dfdea6
Re-sed the copyright notices so they don't all talk about Purple.
Richard Laager <rlaager@wiktel.com>
parents:
15822
diff
changeset
|
5 * finch |
15817 | 6 * |
15870
66dff3dfdea6
Re-sed the copyright notices so they don't all talk about Purple.
Richard Laager <rlaager@wiktel.com>
parents:
15822
diff
changeset
|
7 * Finch is the legal property of its developers, whose names are too numerous |
15817 | 8 * to list here. Please refer to the COPYRIGHT file distributed with this |
9 * source distribution. | |
10 * | |
11 * This program is free software; you can redistribute it and/or modify | |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
24 */ | |
25 #include <string.h> | |
26 | |
18210
b8572b937c09
#include reorganizations to allow compiling with glib < 2.8 using the
Stu Tomlinson <stu@nosnilmot.com>
parents:
18100
diff
changeset
|
27 #include "finch.h" |
b8572b937c09
#include reorganizations to allow compiling with glib < 2.8 using the
Stu Tomlinson <stu@nosnilmot.com>
parents:
18100
diff
changeset
|
28 |
15817 | 29 #include <cmds.h> |
30 #include <idle.h> | |
31 #include <prefs.h> | |
32 #include <util.h> | |
33 | |
34 #include "gntaccount.h" | |
35 #include "gntblist.h" | |
36 #include "gntconv.h" | |
37 #include "gntdebug.h" | |
38 #include "gntplugin.h" | |
39 #include "gntprefs.h" | |
40 #include "gntstatus.h" | |
16892 | 41 #include "gntpounce.h" |
15817 | 42 |
43 #include "gnt.h" | |
44 #include "gntbox.h" | |
45 #include "gntentry.h" | |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
46 #include "gntlabel.h" |
16892 | 47 #include "gntmenu.h" |
48 #include "gntmenuitem.h" | |
49 #include "gntmenuitemcheck.h" | |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
50 #include "gnttextview.h" |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
51 #include "gnttree.h" |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
52 #include "gntutils.h" |
16892 | 53 #include "gntwindow.h" |
15817 | 54 |
16424
4999bbc52881
Works for me! Renames prefs: /core to /purple, /gaim/gtk to /pidgin, /gaim/gnt to /finch
Sean Egan <seanegan@gmail.com>
parents:
16194
diff
changeset
|
55 #define PREF_ROOT "/finch/conversations" |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
56 #define PREF_CHAT PREF_ROOT "/chats" |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
57 #define PREF_USERLIST PREF_CHAT "/userlist" |
15817 | 58 |
59 #include "config.h" | |
60 | |
17021
d6e855aedc30
Notify when you leave a chat, after /part or /kick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16978
diff
changeset
|
61 static void finch_write_common(PurpleConversation *conv, const char *who, |
d6e855aedc30
Notify when you leave a chat, after /part or /kick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16978
diff
changeset
|
62 const char *message, PurpleMessageFlags flags, time_t mtime); |
d6e855aedc30
Notify when you leave a chat, after /part or /kick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16978
diff
changeset
|
63 |
15817 | 64 static void |
65 send_typing_notification(GntWidget *w, FinchConv *ggconv) | |
66 { | |
67 const char *text = gnt_entry_get_text(GNT_ENTRY(ggconv->entry)); | |
17813
289ac53f753f
Do not send typing notification if you are typing a /-command.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17750
diff
changeset
|
68 gboolean empty = (!text || !*text || (*text == '/')); |
16424
4999bbc52881
Works for me! Renames prefs: /core to /purple, /gaim/gtk to /pidgin, /gaim/gnt to /finch
Sean Egan <seanegan@gmail.com>
parents:
16194
diff
changeset
|
69 if (purple_prefs_get_bool("/finch/conversations/notify_typing")) { |
15822 | 70 PurpleConversation *conv = ggconv->active_conv; |
71 PurpleConvIm *im = PURPLE_CONV_IM(conv); | |
15817 | 72 if (!empty) { |
15822 | 73 gboolean send = (purple_conv_im_get_send_typed_timeout(im) == 0); |
15817 | 74 |
15822 | 75 purple_conv_im_stop_send_typed_timeout(im); |
76 purple_conv_im_start_send_typed_timeout(im); | |
77 if (send || (purple_conv_im_get_type_again(im) != 0 && | |
78 time(NULL) > purple_conv_im_get_type_again(im))) { | |
15817 | 79 unsigned int timeout; |
15822 | 80 timeout = serv_send_typing(purple_conversation_get_gc(conv), |
81 purple_conversation_get_name(conv), | |
82 PURPLE_TYPING); | |
83 purple_conv_im_set_type_again(im, timeout); | |
15817 | 84 } |
85 } else { | |
15822 | 86 purple_conv_im_stop_send_typed_timeout(im); |
15817 | 87 |
15822 | 88 serv_send_typing(purple_conversation_get_gc(conv), |
89 purple_conversation_get_name(conv), | |
90 PURPLE_NOT_TYPING); | |
15817 | 91 } |
92 } | |
93 } | |
94 | |
95 static gboolean | |
96 entry_key_pressed(GntWidget *w, const char *key, FinchConv *ggconv) | |
97 { | |
98 if (key[0] == '\r' && key[1] == 0) | |
99 { | |
100 const char *text = gnt_entry_get_text(GNT_ENTRY(ggconv->entry)); | |
101 if (*text == '/') | |
102 { | |
15822 | 103 PurpleConversation *conv = ggconv->active_conv; |
104 PurpleCmdStatus status; | |
15817 | 105 const char *cmdline = text + 1; |
106 char *error = NULL, *escape; | |
107 | |
108 escape = g_markup_escape_text(cmdline, -1); | |
15822 | 109 status = purple_cmd_do_command(conv, cmdline, escape, &error); |
15817 | 110 g_free(escape); |
111 | |
112 switch (status) | |
113 { | |
15822 | 114 case PURPLE_CMD_STATUS_OK: |
15817 | 115 break; |
15822 | 116 case PURPLE_CMD_STATUS_NOT_FOUND: |
117 purple_conversation_write(conv, "", _("No such command."), | |
118 PURPLE_MESSAGE_NO_LOG, time(NULL)); | |
15817 | 119 break; |
15822 | 120 case PURPLE_CMD_STATUS_WRONG_ARGS: |
121 purple_conversation_write(conv, "", _("Syntax Error: You typed the wrong number of arguments " | |
15817 | 122 "to that command."), |
15822 | 123 PURPLE_MESSAGE_NO_LOG, time(NULL)); |
15817 | 124 break; |
15822 | 125 case PURPLE_CMD_STATUS_FAILED: |
126 purple_conversation_write(conv, "", error ? error : _("Your command failed for an unknown reason."), | |
127 PURPLE_MESSAGE_NO_LOG, time(NULL)); | |
15817 | 128 break; |
15822 | 129 case PURPLE_CMD_STATUS_WRONG_TYPE: |
130 if(purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) | |
131 purple_conversation_write(conv, "", _("That command only works in chats, not IMs."), | |
132 PURPLE_MESSAGE_NO_LOG, time(NULL)); | |
15817 | 133 else |
15822 | 134 purple_conversation_write(conv, "", _("That command only works in IMs, not chats."), |
135 PURPLE_MESSAGE_NO_LOG, time(NULL)); | |
15817 | 136 break; |
15822 | 137 case PURPLE_CMD_STATUS_WRONG_PRPL: |
138 purple_conversation_write(conv, "", _("That command doesn't work on this protocol."), | |
139 PURPLE_MESSAGE_NO_LOG, time(NULL)); | |
15817 | 140 break; |
141 } | |
142 g_free(error); | |
143 } | |
144 else | |
145 { | |
146 char *escape = g_markup_escape_text(text, -1); | |
15822 | 147 char *apos = purple_strreplace(escape, "'", "'"); |
15817 | 148 g_free(escape); |
149 escape = apos; | |
15822 | 150 switch (purple_conversation_get_type(ggconv->active_conv)) |
15817 | 151 { |
15822 | 152 case PURPLE_CONV_TYPE_IM: |
153 purple_conv_im_send_with_flags(PURPLE_CONV_IM(ggconv->active_conv), escape, PURPLE_MESSAGE_SEND); | |
15817 | 154 break; |
15822 | 155 case PURPLE_CONV_TYPE_CHAT: |
156 purple_conv_chat_send(PURPLE_CONV_CHAT(ggconv->active_conv), escape); | |
15817 | 157 break; |
158 default: | |
159 g_free(escape); | |
160 g_return_val_if_reached(FALSE); | |
161 } | |
162 g_free(escape); | |
15822 | 163 purple_idle_touch(); |
15817 | 164 } |
165 gnt_entry_add_to_history(GNT_ENTRY(ggconv->entry), text); | |
166 gnt_entry_clear(GNT_ENTRY(ggconv->entry)); | |
167 return TRUE; | |
168 } | |
169 | |
170 return FALSE; | |
171 } | |
172 | |
173 static void | |
174 closing_window(GntWidget *window, FinchConv *ggconv) | |
175 { | |
176 GList *list = ggconv->list; | |
177 ggconv->window = NULL; | |
178 while (list) { | |
15822 | 179 PurpleConversation *conv = list->data; |
15817 | 180 list = list->next; |
15822 | 181 purple_conversation_destroy(conv); |
15817 | 182 } |
183 } | |
184 | |
185 static void | |
186 size_changed_cb(GntWidget *widget, int width, int height) | |
187 { | |
188 int w, h; | |
189 gnt_widget_get_size(widget, &w, &h); | |
15822 | 190 purple_prefs_set_int(PREF_ROOT "/size/width", w); |
191 purple_prefs_set_int(PREF_ROOT "/size/height", h); | |
15817 | 192 } |
193 | |
194 static void | |
195 save_position_cb(GntWidget *w, int x, int y) | |
196 { | |
15822 | 197 purple_prefs_set_int(PREF_ROOT "/position/x", x); |
198 purple_prefs_set_int(PREF_ROOT "/position/y", y); | |
15817 | 199 } |
200 | |
15822 | 201 static PurpleConversation * |
202 find_conv_with_contact(PurpleConversation *conv) | |
15817 | 203 { |
15822 | 204 PurpleBlistNode *node; |
205 PurpleBuddy *buddy = purple_find_buddy(conv->account, conv->name); | |
206 PurpleConversation *ret = NULL; | |
15817 | 207 |
208 if (!buddy) | |
209 return NULL; | |
210 | |
15822 | 211 for (node = ((PurpleBlistNode*)buddy)->parent->child; node; node = node->next) { |
212 if (node == (PurpleBlistNode*)buddy) | |
15817 | 213 continue; |
15822 | 214 if ((ret = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, |
215 ((PurpleBuddy*)node)->name, ((PurpleBuddy*)node)->account)) != NULL) | |
15817 | 216 break; |
217 } | |
218 return ret; | |
219 } | |
220 | |
221 static char * | |
15822 | 222 get_conversation_title(PurpleConversation *conv, PurpleAccount *account) |
15817 | 223 { |
15822 | 224 return g_strdup_printf(_("%s (%s -- %s)"), purple_conversation_get_title(conv), |
225 purple_account_get_username(account), purple_account_get_protocol_name(account)); | |
15817 | 226 } |
227 | |
228 static void | |
15822 | 229 update_buddy_typing(PurpleAccount *account, const char *who, gpointer null) |
15817 | 230 { |
15822 | 231 PurpleConversation *conv; |
15817 | 232 FinchConv *ggc; |
15822 | 233 PurpleConvIm *im = NULL; |
15817 | 234 char *title, *str; |
235 | |
15822 | 236 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, who, account); |
15817 | 237 |
238 if (!conv) | |
239 return; | |
240 | |
15822 | 241 im = PURPLE_CONV_IM(conv); |
15817 | 242 ggc = conv->ui_data; |
243 | |
15822 | 244 if (purple_conv_im_get_typing_state(im) == PURPLE_TYPING) { |
15817 | 245 int scroll; |
246 str = get_conversation_title(conv, account); | |
247 title = g_strdup_printf(_("%s [%s]"), str, | |
248 gnt_ascii_only() ? "T" : "\342\243\277"); | |
249 g_free(str); | |
250 | |
251 scroll = gnt_text_view_get_lines_below(GNT_TEXT_VIEW(ggc->tv)); | |
15822 | 252 str = g_strdup_printf(_("\n%s is typing..."), purple_conversation_get_name(conv)); |
15817 | 253 /* Updating is a little buggy. So just remove and add a new one */ |
254 gnt_text_view_tag_change(GNT_TEXT_VIEW(ggc->tv), "typing", NULL, TRUE); | |
255 gnt_text_view_append_text_with_tag(GNT_TEXT_VIEW(ggc->tv), | |
256 str, GNT_TEXT_FLAG_DIM, "typing"); | |
257 g_free(str); | |
258 if (scroll <= 1) | |
259 gnt_text_view_scroll(GNT_TEXT_VIEW(ggc->tv), 0); | |
260 } else { | |
261 title = get_conversation_title(conv, account); | |
18637
3597903cf8ff
Just show an empty line, instead of bouncing the text down when the user
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18427
diff
changeset
|
262 gnt_text_view_tag_change(GNT_TEXT_VIEW(ggc->tv), "typing", " ", TRUE); |
15817 | 263 } |
264 gnt_screen_rename_widget(ggc->window, title); | |
265 g_free(title); | |
266 } | |
267 | |
17021
d6e855aedc30
Notify when you leave a chat, after /part or /kick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16978
diff
changeset
|
268 static void |
d6e855aedc30
Notify when you leave a chat, after /part or /kick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16978
diff
changeset
|
269 chat_left_cb(PurpleConversation *conv, gpointer null) |
d6e855aedc30
Notify when you leave a chat, after /part or /kick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16978
diff
changeset
|
270 { |
d6e855aedc30
Notify when you leave a chat, after /part or /kick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16978
diff
changeset
|
271 finch_write_common(conv, NULL, _("You have left this chat."), |
d6e855aedc30
Notify when you leave a chat, after /part or /kick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16978
diff
changeset
|
272 PURPLE_MESSAGE_SYSTEM, time(NULL)); |
d6e855aedc30
Notify when you leave a chat, after /part or /kick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16978
diff
changeset
|
273 } |
d6e855aedc30
Notify when you leave a chat, after /part or /kick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16978
diff
changeset
|
274 |
15817 | 275 static gpointer |
276 finch_conv_get_handle() | |
277 { | |
278 static int handle; | |
279 return &handle; | |
280 } | |
281 | |
282 static void | |
16892 | 283 clear_scrollback_cb(GntMenuItem *item, gpointer ggconv) |
284 { | |
285 FinchConv *ggc = ggconv; | |
286 gnt_text_view_clear(GNT_TEXT_VIEW(ggc->tv)); | |
287 } | |
288 | |
289 static void | |
290 send_file_cb(GntMenuItem *item, gpointer ggconv) | |
291 { | |
292 FinchConv *ggc = ggconv; | |
293 serv_send_file(purple_conversation_get_gc(ggc->active_conv), | |
294 purple_conversation_get_name(ggc->active_conv), NULL); | |
295 } | |
296 | |
297 static void | |
298 add_pounce_cb(GntMenuItem *item, gpointer ggconv) | |
299 { | |
300 FinchConv *ggc = ggconv; | |
301 finch_pounce_editor_show( | |
302 purple_conversation_get_account(ggc->active_conv), | |
303 purple_conversation_get_name(ggc->active_conv), NULL); | |
304 } | |
305 | |
306 static void | |
307 get_info_cb(GntMenuItem *item, gpointer ggconv) | |
308 { | |
309 FinchConv *ggc = ggconv; | |
17750
319bcb73eb4e
Use utility functions to get user info. Closes #964.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17091
diff
changeset
|
310 finch_retrieve_user_info(purple_conversation_get_gc(ggc->active_conv), |
16892 | 311 purple_conversation_get_name(ggc->active_conv)); |
312 } | |
313 | |
314 static void | |
315 toggle_timestamps_cb(GntMenuItem *item, gpointer ggconv) | |
316 { | |
317 purple_prefs_set_bool(PREF_ROOT "/timestamps", | |
318 !purple_prefs_get_bool(PREF_ROOT "/timestamps")); | |
319 } | |
320 | |
321 static void | |
322 send_to_cb(GntMenuItem *m, gpointer n) | |
323 { | |
324 PurpleAccount *account = g_object_get_data(G_OBJECT(m), "purple_account"); | |
325 gchar *buddy = g_object_get_data(G_OBJECT(m), "purple_buddy_name"); | |
326 PurpleConversation *conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, buddy); | |
327 finch_conversation_set_active(conv); | |
328 } | |
329 | |
330 static void | |
331 generate_send_to_menu(FinchConv *ggc) | |
332 { | |
333 GntWidget *sub, *menu = ggc->menu; | |
334 GntMenuItem *item; | |
335 GSList *buds; | |
336 GList *list = NULL; | |
337 | |
338 buds = purple_find_buddies(ggc->active_conv->account, ggc->active_conv->name); | |
339 if (!buds) | |
340 return; | |
341 | |
342 item = gnt_menuitem_new(_("Send To")); | |
343 gnt_menu_add_item(GNT_MENU(menu), item); | |
344 sub = gnt_menu_new(GNT_MENU_POPUP); | |
345 gnt_menuitem_set_submenu(item, GNT_MENU(sub)); | |
346 | |
347 for (; buds; buds = buds->next) { | |
348 PurpleBlistNode *node = (PurpleBlistNode *)purple_buddy_get_contact((PurpleBuddy *)buds->data); | |
349 for (node = node->child; node != NULL; node = node->next) { | |
350 PurpleBuddy *buddy = (PurpleBuddy *)node; | |
351 PurpleAccount *account = purple_buddy_get_account(buddy); | |
352 if (purple_account_is_connected(account)) { | |
353 /* Use the PurplePresence to get unique buddies. */ | |
354 PurplePresence *presence = purple_buddy_get_presence(buddy); | |
355 if (!g_list_find(list, presence)) | |
356 list = g_list_prepend(list, presence); | |
357 } | |
358 } | |
359 } | |
360 for (list = g_list_last(list); list != NULL; list = list->prev) { | |
361 PurplePresence *pre = list->data; | |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
362 PurpleBuddy *buddy = purple_presence_get_buddy(pre); |
16892 | 363 PurpleAccount *account = purple_buddy_get_account(buddy); |
364 gchar *name = g_strdup(purple_buddy_get_name(buddy)); | |
365 gchar *text = g_strdup_printf("%s (%s)", purple_buddy_get_name(buddy), purple_account_get_username(account)); | |
366 item = gnt_menuitem_new(text); | |
367 g_free(text); | |
368 gnt_menu_add_item(GNT_MENU(sub), item); | |
369 gnt_menuitem_set_callback(item, send_to_cb, NULL); | |
370 g_object_set_data(G_OBJECT(item), "purple_account", account); | |
371 g_object_set_data_full(G_OBJECT(item), "purple_buddy_name", name, g_free); | |
372 } | |
373 g_list_free(list); | |
374 g_slist_free(buds); | |
375 } | |
376 | |
377 static void | |
378 gg_create_menu(FinchConv *ggc) | |
379 { | |
380 GntWidget *menu, *sub; | |
381 GntMenuItem *item; | |
382 | |
383 ggc->menu = menu = gnt_menu_new(GNT_MENU_TOPLEVEL); | |
384 gnt_window_set_menu(GNT_WINDOW(ggc->window), GNT_MENU(menu)); | |
385 | |
386 item = gnt_menuitem_new(_("Conversation")); | |
387 gnt_menu_add_item(GNT_MENU(menu), item); | |
388 | |
389 sub = gnt_menu_new(GNT_MENU_POPUP); | |
390 gnt_menuitem_set_submenu(item, GNT_MENU(sub)); | |
391 | |
392 item = gnt_menuitem_new(_("Clear Scrollback")); | |
393 gnt_menu_add_item(GNT_MENU(sub), item); | |
394 gnt_menuitem_set_callback(item, clear_scrollback_cb, ggc); | |
395 | |
396 item = gnt_menuitem_check_new(_("Show Timestamps")); | |
397 gnt_menuitem_check_set_checked(GNT_MENU_ITEM_CHECK(item), | |
398 purple_prefs_get_bool(PREF_ROOT "/timestamps")); | |
399 gnt_menu_add_item(GNT_MENU(sub), item); | |
400 gnt_menuitem_set_callback(item, toggle_timestamps_cb, ggc); | |
401 | |
402 if (purple_conversation_get_type(ggc->active_conv) == PURPLE_CONV_TYPE_IM) { | |
16958
1a336cfc410e
Change a string, and make sure non-functional items are not added in the conversation window menu.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16930
diff
changeset
|
403 PurpleAccount *account = purple_conversation_get_account(ggc->active_conv); |
1a336cfc410e
Change a string, and make sure non-functional items are not added in the conversation window menu.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16930
diff
changeset
|
404 PurplePluginProtocolInfo *pinfo = account->gc ? PURPLE_PLUGIN_PROTOCOL_INFO(account->gc->prpl) : NULL; |
1a336cfc410e
Change a string, and make sure non-functional items are not added in the conversation window menu.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16930
diff
changeset
|
405 |
1a336cfc410e
Change a string, and make sure non-functional items are not added in the conversation window menu.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16930
diff
changeset
|
406 if (pinfo && pinfo->get_info) { |
1a336cfc410e
Change a string, and make sure non-functional items are not added in the conversation window menu.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16930
diff
changeset
|
407 item = gnt_menuitem_new(_("Get Info")); |
1a336cfc410e
Change a string, and make sure non-functional items are not added in the conversation window menu.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16930
diff
changeset
|
408 gnt_menu_add_item(GNT_MENU(sub), item); |
1a336cfc410e
Change a string, and make sure non-functional items are not added in the conversation window menu.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16930
diff
changeset
|
409 gnt_menuitem_set_callback(item, get_info_cb, ggc); |
1a336cfc410e
Change a string, and make sure non-functional items are not added in the conversation window menu.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16930
diff
changeset
|
410 } |
16892 | 411 |
412 item = gnt_menuitem_new(_("Add Buddy Pounce...")); | |
413 gnt_menu_add_item(GNT_MENU(sub), item); | |
414 gnt_menuitem_set_callback(item, add_pounce_cb, ggc); | |
415 | |
16958
1a336cfc410e
Change a string, and make sure non-functional items are not added in the conversation window menu.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16930
diff
changeset
|
416 if (pinfo && pinfo->send_file && |
1a336cfc410e
Change a string, and make sure non-functional items are not added in the conversation window menu.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16930
diff
changeset
|
417 (!pinfo->can_receive_file || |
1a336cfc410e
Change a string, and make sure non-functional items are not added in the conversation window menu.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16930
diff
changeset
|
418 pinfo->can_receive_file(account->gc, purple_conversation_get_name(ggc->active_conv)))) { |
1a336cfc410e
Change a string, and make sure non-functional items are not added in the conversation window menu.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16930
diff
changeset
|
419 item = gnt_menuitem_new(_("Send File")); |
1a336cfc410e
Change a string, and make sure non-functional items are not added in the conversation window menu.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16930
diff
changeset
|
420 gnt_menu_add_item(GNT_MENU(sub), item); |
1a336cfc410e
Change a string, and make sure non-functional items are not added in the conversation window menu.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16930
diff
changeset
|
421 gnt_menuitem_set_callback(item, send_file_cb, ggc); |
1a336cfc410e
Change a string, and make sure non-functional items are not added in the conversation window menu.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16930
diff
changeset
|
422 } |
16892 | 423 |
424 generate_send_to_menu(ggc); | |
425 } | |
426 } | |
427 | |
428 static void | |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
429 create_conv_from_userlist(GntWidget *widget, FinchConv *fc) |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
430 { |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
431 PurpleAccount *account = purple_conversation_get_account(fc->active_conv); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
432 char *name = gnt_tree_get_selection_data(GNT_TREE(widget)); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
433 purple_conversation_new(PURPLE_CONV_TYPE_IM, account, name); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
434 } |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
435 |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
436 static void |
18100
f63b3a23280d
Provide a 'unseen-count' data for the conversations so the dbus-docklet can use that information.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17813
diff
changeset
|
437 gained_focus_cb(GntWindow *window, FinchConv *fc) |
f63b3a23280d
Provide a 'unseen-count' data for the conversations so the dbus-docklet can use that information.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17813
diff
changeset
|
438 { |
f63b3a23280d
Provide a 'unseen-count' data for the conversations so the dbus-docklet can use that information.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17813
diff
changeset
|
439 GList *iter; |
f63b3a23280d
Provide a 'unseen-count' data for the conversations so the dbus-docklet can use that information.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17813
diff
changeset
|
440 for (iter = fc->list; iter; iter = iter->next) { |
f63b3a23280d
Provide a 'unseen-count' data for the conversations so the dbus-docklet can use that information.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17813
diff
changeset
|
441 purple_conversation_set_data(iter->data, "unseen-count", 0); |
f63b3a23280d
Provide a 'unseen-count' data for the conversations so the dbus-docklet can use that information.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17813
diff
changeset
|
442 purple_conversation_update(iter->data, PURPLE_CONV_UPDATE_UNSEEN); |
f63b3a23280d
Provide a 'unseen-count' data for the conversations so the dbus-docklet can use that information.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17813
diff
changeset
|
443 } |
f63b3a23280d
Provide a 'unseen-count' data for the conversations so the dbus-docklet can use that information.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17813
diff
changeset
|
444 } |
f63b3a23280d
Provide a 'unseen-count' data for the conversations so the dbus-docklet can use that information.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17813
diff
changeset
|
445 |
f63b3a23280d
Provide a 'unseen-count' data for the conversations so the dbus-docklet can use that information.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17813
diff
changeset
|
446 static void |
18383
9eb2f4d27990
Use the completion-signal to append a ': ' after a tab-completed nick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18232
diff
changeset
|
447 completion_cb(GntEntry *entry, const char *start, const char *end) |
9eb2f4d27990
Use the completion-signal to append a ': ' after a tab-completed nick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18232
diff
changeset
|
448 { |
9eb2f4d27990
Use the completion-signal to append a ': ' after a tab-completed nick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18232
diff
changeset
|
449 if (start == entry->start) |
9eb2f4d27990
Use the completion-signal to append a ': ' after a tab-completed nick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18232
diff
changeset
|
450 gnt_widget_key_pressed(GNT_WIDGET(entry), ": "); |
9eb2f4d27990
Use the completion-signal to append a ': ' after a tab-completed nick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18232
diff
changeset
|
451 } |
9eb2f4d27990
Use the completion-signal to append a ': ' after a tab-completed nick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18232
diff
changeset
|
452 |
9eb2f4d27990
Use the completion-signal to append a ': ' after a tab-completed nick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18232
diff
changeset
|
453 static void |
15822 | 454 finch_create_conversation(PurpleConversation *conv) |
15817 | 455 { |
456 FinchConv *ggc = conv->ui_data; | |
457 char *title; | |
15822 | 458 PurpleConversationType type; |
459 PurpleConversation *cc; | |
460 PurpleAccount *account; | |
15817 | 461 |
462 if (ggc) | |
463 return; | |
464 | |
465 cc = find_conv_with_contact(conv); | |
466 if (cc && cc->ui_data) | |
467 ggc = cc->ui_data; | |
468 else | |
469 ggc = g_new0(FinchConv, 1); | |
470 | |
471 ggc->list = g_list_prepend(ggc->list, conv); | |
472 ggc->active_conv = conv; | |
473 conv->ui_data = ggc; | |
474 | |
475 if (cc && cc->ui_data) { | |
476 finch_conversation_set_active(conv); | |
477 return; | |
478 } | |
479 | |
15822 | 480 account = purple_conversation_get_account(conv); |
481 type = purple_conversation_get_type(conv); | |
15817 | 482 title = get_conversation_title(conv, account); |
483 | |
16892 | 484 ggc->window = gnt_vwindow_new(FALSE); |
15817 | 485 gnt_box_set_title(GNT_BOX(ggc->window), title); |
486 gnt_box_set_toplevel(GNT_BOX(ggc->window), TRUE); | |
487 gnt_box_set_pad(GNT_BOX(ggc->window), 0); | |
18232
2b1af79e768f
Plucked revision from finchfeat to give different names to windows for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18222
diff
changeset
|
488 |
2b1af79e768f
Plucked revision from finchfeat to give different names to windows for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18222
diff
changeset
|
489 switch(conv->type){ |
2b1af79e768f
Plucked revision from finchfeat to give different names to windows for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18222
diff
changeset
|
490 case PURPLE_CONV_TYPE_UNKNOWN: |
2b1af79e768f
Plucked revision from finchfeat to give different names to windows for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18222
diff
changeset
|
491 gnt_widget_set_name(ggc->window, "conversation-window-unknown" ); |
2b1af79e768f
Plucked revision from finchfeat to give different names to windows for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18222
diff
changeset
|
492 break; |
2b1af79e768f
Plucked revision from finchfeat to give different names to windows for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18222
diff
changeset
|
493 case PURPLE_CONV_TYPE_IM: |
2b1af79e768f
Plucked revision from finchfeat to give different names to windows for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18222
diff
changeset
|
494 gnt_widget_set_name(ggc->window, "conversation-window-im" ); |
2b1af79e768f
Plucked revision from finchfeat to give different names to windows for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18222
diff
changeset
|
495 break; |
2b1af79e768f
Plucked revision from finchfeat to give different names to windows for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18222
diff
changeset
|
496 case PURPLE_CONV_TYPE_CHAT: |
2b1af79e768f
Plucked revision from finchfeat to give different names to windows for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18222
diff
changeset
|
497 gnt_widget_set_name(ggc->window, "conversation-window-chat" ); |
2b1af79e768f
Plucked revision from finchfeat to give different names to windows for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18222
diff
changeset
|
498 break; |
2b1af79e768f
Plucked revision from finchfeat to give different names to windows for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18222
diff
changeset
|
499 case PURPLE_CONV_TYPE_MISC: |
2b1af79e768f
Plucked revision from finchfeat to give different names to windows for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18222
diff
changeset
|
500 gnt_widget_set_name(ggc->window, "conversation-window-misc" ); |
2b1af79e768f
Plucked revision from finchfeat to give different names to windows for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18222
diff
changeset
|
501 break; |
2b1af79e768f
Plucked revision from finchfeat to give different names to windows for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18222
diff
changeset
|
502 case PURPLE_CONV_TYPE_ANY: |
2b1af79e768f
Plucked revision from finchfeat to give different names to windows for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18222
diff
changeset
|
503 gnt_widget_set_name(ggc->window, "conversation-window-any" ); |
2b1af79e768f
Plucked revision from finchfeat to give different names to windows for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18222
diff
changeset
|
504 break; |
2b1af79e768f
Plucked revision from finchfeat to give different names to windows for
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18222
diff
changeset
|
505 } |
15817 | 506 |
16892 | 507 gg_create_menu(ggc); |
508 | |
15817 | 509 ggc->tv = gnt_text_view_new(); |
510 gnt_widget_set_name(ggc->tv, "conversation-window-textview"); | |
15822 | 511 gnt_widget_set_size(ggc->tv, purple_prefs_get_int(PREF_ROOT "/size/width"), |
512 purple_prefs_get_int(PREF_ROOT "/size/height")); | |
15817 | 513 |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
514 if (type == PURPLE_CONV_TYPE_CHAT) { |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
515 GntWidget *hbox, *tree; |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
516 FinchConvChat *fc = ggc->u.chat = g_new0(FinchConvChat, 1); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
517 hbox = gnt_hbox_new(FALSE); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
518 gnt_box_set_pad(GNT_BOX(hbox), 0); |
17070
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
519 tree = fc->userlist = gnt_tree_new_with_columns(2); |
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
520 gnt_tree_set_col_width(GNT_TREE(tree), 0, 1); /* The flag column */ |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
521 gnt_tree_set_compare_func(GNT_TREE(tree), (GCompareFunc)g_utf8_collate); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
522 gnt_tree_set_hash_fns(GNT_TREE(tree), g_str_hash, g_str_equal, g_free); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
523 GNT_WIDGET_SET_FLAGS(tree, GNT_WIDGET_NO_BORDER); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
524 gnt_box_add_widget(GNT_BOX(hbox), ggc->tv); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
525 gnt_box_add_widget(GNT_BOX(hbox), tree); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
526 gnt_box_add_widget(GNT_BOX(ggc->window), hbox); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
527 g_signal_connect(G_OBJECT(tree), "activate", G_CALLBACK(create_conv_from_userlist), ggc); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
528 gnt_widget_set_visible(tree, purple_prefs_get_bool(PREF_USERLIST)); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
529 } else { |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
530 gnt_box_add_widget(GNT_BOX(ggc->window), ggc->tv); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
531 } |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
532 |
16128
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
533 ggc->info = gnt_vbox_new(FALSE); |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
534 gnt_box_add_widget(GNT_BOX(ggc->window), ggc->info); |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
535 |
15817 | 536 ggc->entry = gnt_entry_new(NULL); |
537 gnt_box_add_widget(GNT_BOX(ggc->window), ggc->entry); | |
538 gnt_widget_set_name(ggc->entry, "conversation-window-entry"); | |
539 gnt_entry_set_history_length(GNT_ENTRY(ggc->entry), -1); | |
540 gnt_entry_set_word_suggest(GNT_ENTRY(ggc->entry), TRUE); | |
541 gnt_entry_set_always_suggest(GNT_ENTRY(ggc->entry), FALSE); | |
542 | |
16124
ab3f93232a2d
Add a utility function to assist scrolling in a textview.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15870
diff
changeset
|
543 gnt_text_view_attach_scroll_widget(GNT_TEXT_VIEW(ggc->tv), ggc->entry); |
18427
be8c4eba38f6
Use the utility function for the conversation and debug windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18383
diff
changeset
|
544 gnt_text_view_attach_pager_widget(GNT_TEXT_VIEW(ggc->tv), ggc->entry); |
be8c4eba38f6
Use the utility function for the conversation and debug windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18383
diff
changeset
|
545 |
15817 | 546 g_signal_connect_after(G_OBJECT(ggc->entry), "key_pressed", G_CALLBACK(entry_key_pressed), ggc); |
18383
9eb2f4d27990
Use the completion-signal to append a ': ' after a tab-completed nick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18232
diff
changeset
|
547 g_signal_connect(G_OBJECT(ggc->entry), "completion", G_CALLBACK(completion_cb), NULL); |
15817 | 548 g_signal_connect(G_OBJECT(ggc->window), "destroy", G_CALLBACK(closing_window), ggc); |
549 | |
15822 | 550 gnt_widget_set_position(ggc->window, purple_prefs_get_int(PREF_ROOT "/position/x"), |
551 purple_prefs_get_int(PREF_ROOT "/position/y")); | |
15817 | 552 gnt_widget_show(ggc->window); |
553 | |
554 g_signal_connect(G_OBJECT(ggc->tv), "size_changed", G_CALLBACK(size_changed_cb), NULL); | |
555 g_signal_connect(G_OBJECT(ggc->window), "position_set", G_CALLBACK(save_position_cb), NULL); | |
556 | |
15822 | 557 if (type == PURPLE_CONV_TYPE_IM) { |
15817 | 558 g_signal_connect(G_OBJECT(ggc->entry), "text_changed", G_CALLBACK(send_typing_notification), ggc); |
559 } | |
560 | |
561 g_free(title); | |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
562 gnt_box_give_focus_to_child(GNT_BOX(ggc->window), ggc->entry); |
18100
f63b3a23280d
Provide a 'unseen-count' data for the conversations so the dbus-docklet can use that information.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17813
diff
changeset
|
563 g_signal_connect(G_OBJECT(ggc->window), "gained-focus", G_CALLBACK(gained_focus_cb), ggc); |
15817 | 564 } |
565 | |
566 static void | |
15822 | 567 finch_destroy_conversation(PurpleConversation *conv) |
15817 | 568 { |
569 /* do stuff here */ | |
570 FinchConv *ggc = conv->ui_data; | |
571 ggc->list = g_list_remove(ggc->list, conv); | |
572 if (ggc->list && conv == ggc->active_conv) | |
573 ggc->active_conv = ggc->list->data; | |
574 | |
575 if (ggc->list == NULL) { | |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
576 g_free(ggc->u.chat); |
18222
ef65d43190e5
Fix a few runtime warnings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18210
diff
changeset
|
577 if (ggc->window) |
ef65d43190e5
Fix a few runtime warnings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18210
diff
changeset
|
578 gnt_widget_destroy(ggc->window); |
15817 | 579 g_free(ggc); |
580 } | |
581 } | |
582 | |
583 static void | |
15822 | 584 finch_write_common(PurpleConversation *conv, const char *who, const char *message, |
585 PurpleMessageFlags flags, time_t mtime) | |
15817 | 586 { |
587 FinchConv *ggconv = conv->ui_data; | |
588 char *strip, *newline; | |
589 GntTextFormatFlags fl = 0; | |
590 int pos; | |
591 | |
592 g_return_if_fail(ggconv != NULL); | |
593 | |
594 if (ggconv->active_conv != conv) { | |
15822 | 595 if (flags & (PURPLE_MESSAGE_SEND | PURPLE_MESSAGE_RECV)) |
15817 | 596 finch_conversation_set_active(conv); |
597 else | |
598 return; | |
599 } | |
600 | |
601 pos = gnt_text_view_get_lines_below(GNT_TEXT_VIEW(ggconv->tv)); | |
602 | |
18637
3597903cf8ff
Just show an empty line, instead of bouncing the text down when the user
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18427
diff
changeset
|
603 gnt_text_view_tag_change(GNT_TEXT_VIEW(ggconv->tv), "typing", NULL, TRUE); |
15817 | 604 gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), "\n", GNT_TEXT_FLAG_NORMAL); |
605 | |
606 /* Unnecessary to print the timestamp for delayed message */ | |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
607 if (purple_prefs_get_bool("/finch/conversations/timestamps")) |
15817 | 608 gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), |
15822 | 609 purple_utf8_strftime("(%H:%M:%S) ", localtime(&mtime)), GNT_TEXT_FLAG_DIM); |
15817 | 610 |
15822 | 611 if (flags & PURPLE_MESSAGE_AUTO_RESP) |
15817 | 612 gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), |
613 _("<AUTO-REPLY> "), GNT_TEXT_FLAG_BOLD); | |
614 | |
15822 | 615 if (who && *who && (flags & (PURPLE_MESSAGE_SEND | PURPLE_MESSAGE_RECV))) |
15817 | 616 { |
617 char * name = NULL; | |
618 | |
15822 | 619 if (purple_message_meify((char*)message, -1)) |
15817 | 620 name = g_strdup_printf("*** %s ", who); |
621 else | |
622 name = g_strdup_printf("%s: ", who); | |
623 | |
624 gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), | |
625 name, GNT_TEXT_FLAG_BOLD); | |
626 g_free(name); | |
627 } | |
628 else | |
629 fl = GNT_TEXT_FLAG_DIM; | |
630 | |
15822 | 631 if (flags & PURPLE_MESSAGE_ERROR) |
15817 | 632 fl |= GNT_TEXT_FLAG_BOLD; |
15822 | 633 if (flags & PURPLE_MESSAGE_NICK) |
15817 | 634 fl |= GNT_TEXT_FLAG_UNDERLINE; |
635 | |
636 /* XXX: Remove this workaround when textview can parse messages. */ | |
15822 | 637 newline = purple_strdup_withhtml(message); |
638 strip = purple_markup_strip_html(newline); | |
15817 | 639 gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(ggconv->tv), |
640 strip, fl); | |
641 | |
642 g_free(newline); | |
643 g_free(strip); | |
644 | |
18637
3597903cf8ff
Just show an empty line, instead of bouncing the text down when the user
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18427
diff
changeset
|
645 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM && |
3597903cf8ff
Just show an empty line, instead of bouncing the text down when the user
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18427
diff
changeset
|
646 purple_conv_im_get_typing_state(PURPLE_CONV_IM(conv)) == PURPLE_TYPING) { |
15822 | 647 strip = g_strdup_printf(_("\n%s is typing..."), purple_conversation_get_name(conv)); |
15817 | 648 gnt_text_view_append_text_with_tag(GNT_TEXT_VIEW(ggconv->tv), |
649 strip, GNT_TEXT_FLAG_DIM, "typing"); | |
650 g_free(strip); | |
651 } | |
652 | |
653 if (pos <= 1) | |
654 gnt_text_view_scroll(GNT_TEXT_VIEW(ggconv->tv), 0); | |
655 | |
15822 | 656 if (flags & (PURPLE_MESSAGE_RECV | PURPLE_MESSAGE_NICK | PURPLE_MESSAGE_ERROR)) |
15817 | 657 gnt_widget_set_urgent(ggconv->tv); |
18100
f63b3a23280d
Provide a 'unseen-count' data for the conversations so the dbus-docklet can use that information.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17813
diff
changeset
|
658 if (flags & PURPLE_MESSAGE_RECV && !gnt_widget_has_focus(ggconv->window)) { |
f63b3a23280d
Provide a 'unseen-count' data for the conversations so the dbus-docklet can use that information.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17813
diff
changeset
|
659 int count = GPOINTER_TO_INT(purple_conversation_get_data(conv, "unseen-count")); |
f63b3a23280d
Provide a 'unseen-count' data for the conversations so the dbus-docklet can use that information.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17813
diff
changeset
|
660 purple_conversation_set_data(conv, "unseen-count", GINT_TO_POINTER(count + 1)); |
f63b3a23280d
Provide a 'unseen-count' data for the conversations so the dbus-docklet can use that information.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17813
diff
changeset
|
661 purple_conversation_update(conv, PURPLE_CONV_UPDATE_UNSEEN); |
f63b3a23280d
Provide a 'unseen-count' data for the conversations so the dbus-docklet can use that information.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17813
diff
changeset
|
662 } |
15817 | 663 } |
664 | |
665 static void | |
15822 | 666 finch_write_chat(PurpleConversation *conv, const char *who, const char *message, |
667 PurpleMessageFlags flags, time_t mtime) | |
15817 | 668 { |
15822 | 669 purple_conversation_write(conv, who, message, flags, mtime); |
15817 | 670 } |
671 | |
672 static void | |
15822 | 673 finch_write_im(PurpleConversation *conv, const char *who, const char *message, |
674 PurpleMessageFlags flags, time_t mtime) | |
15817 | 675 { |
15822 | 676 PurpleAccount *account = purple_conversation_get_account(conv); |
677 if (flags & PURPLE_MESSAGE_SEND) | |
15817 | 678 { |
15822 | 679 who = purple_connection_get_display_name(purple_account_get_connection(account)); |
15817 | 680 if (!who) |
15822 | 681 who = purple_account_get_alias(account); |
15817 | 682 if (!who) |
15822 | 683 who = purple_account_get_username(account); |
15817 | 684 } |
15822 | 685 else if (flags & PURPLE_MESSAGE_RECV) |
15817 | 686 { |
15822 | 687 PurpleBuddy *buddy; |
688 who = purple_conversation_get_name(conv); | |
689 buddy = purple_find_buddy(account, who); | |
15817 | 690 if (buddy) |
15822 | 691 who = purple_buddy_get_contact_alias(buddy); |
15817 | 692 } |
693 | |
15822 | 694 purple_conversation_write(conv, who, message, flags, mtime); |
15817 | 695 } |
696 | |
697 static void | |
15822 | 698 finch_write_conv(PurpleConversation *conv, const char *who, const char *alias, |
699 const char *message, PurpleMessageFlags flags, time_t mtime) | |
15817 | 700 { |
701 const char *name; | |
702 if (alias && *alias) | |
703 name = alias; | |
704 else if (who && *who) | |
705 name = who; | |
706 else | |
707 name = NULL; | |
708 | |
709 finch_write_common(conv, name, message, flags, mtime); | |
710 } | |
711 | |
17070
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
712 static const char * |
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
713 chat_flag_text(PurpleConvChatBuddyFlags flags) |
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
714 { |
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
715 if (flags & PURPLE_CBFLAGS_FOUNDER) |
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
716 return "~"; |
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
717 if (flags & PURPLE_CBFLAGS_OP) |
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
718 return "@"; |
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
719 if (flags & PURPLE_CBFLAGS_HALFOP) |
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
720 return "%"; |
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
721 if (flags & PURPLE_CBFLAGS_VOICE) |
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
722 return "+"; |
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
723 return " "; |
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
724 } |
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
725 |
15817 | 726 static void |
15822 | 727 finch_chat_add_users(PurpleConversation *conv, GList *users, gboolean new_arrivals) |
15817 | 728 { |
729 FinchConv *ggc = conv->ui_data; | |
730 GntEntry *entry = GNT_ENTRY(ggc->entry); | |
731 | |
732 if (!new_arrivals) | |
733 { | |
734 /* Print the list of users in the room */ | |
735 GString *string = g_string_new(_("List of users:\n")); | |
736 GList *iter; | |
737 | |
738 for (iter = users; iter; iter = iter->next) | |
739 { | |
15822 | 740 PurpleConvChatBuddy *cbuddy = iter->data; |
15817 | 741 char *str; |
742 | |
743 if ((str = cbuddy->alias) == NULL) | |
744 str = cbuddy->name; | |
745 g_string_append_printf(string, "[ %s ]", str); | |
746 } | |
747 | |
15822 | 748 purple_conversation_write(conv, NULL, string->str, |
749 PURPLE_MESSAGE_SYSTEM, time(NULL)); | |
15817 | 750 g_string_free(string, TRUE); |
751 } | |
752 | |
753 for (; users; users = users->next) | |
754 { | |
15822 | 755 PurpleConvChatBuddy *cbuddy = users->data; |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
756 GntTree *tree = GNT_TREE(ggc->u.chat->userlist); |
15817 | 757 gnt_entry_add_suggest(entry, cbuddy->name); |
758 gnt_entry_add_suggest(entry, cbuddy->alias); | |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
759 gnt_tree_add_row_after(tree, g_strdup(cbuddy->name), |
17070
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
760 gnt_tree_create_row(tree, chat_flag_text(cbuddy->flags), cbuddy->alias), NULL, NULL); |
15817 | 761 } |
762 } | |
763 | |
764 static void | |
15822 | 765 finch_chat_rename_user(PurpleConversation *conv, const char *old, const char *new_n, const char *new_a) |
15817 | 766 { |
767 /* Update the name for string completion */ | |
768 FinchConv *ggc = conv->ui_data; | |
769 GntEntry *entry = GNT_ENTRY(ggc->entry); | |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
770 GntTree *tree = GNT_TREE(ggc->u.chat->userlist); |
17070
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
771 PurpleConvChatBuddy *cb = purple_conv_chat_cb_find(PURPLE_CONV_CHAT(conv), new_n); |
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
772 |
15817 | 773 gnt_entry_remove_suggest(entry, old); |
17070
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
774 gnt_tree_remove(tree, (gpointer)old); |
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
775 |
15817 | 776 gnt_entry_add_suggest(entry, new_n); |
777 gnt_entry_add_suggest(entry, new_a); | |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
778 gnt_tree_add_row_after(tree, g_strdup(new_n), |
17070
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
779 gnt_tree_create_row(tree, chat_flag_text(cb->flags), new_a), NULL, NULL); |
15817 | 780 } |
781 | |
782 static void | |
17091
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
783 finch_chat_remove_users(PurpleConversation *conv, GList *list) |
15817 | 784 { |
785 /* Remove the name from string completion */ | |
786 FinchConv *ggc = conv->ui_data; | |
787 GntEntry *entry = GNT_ENTRY(ggc->entry); | |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
788 for (; list; list = list->next) { |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
789 GntTree *tree = GNT_TREE(ggc->u.chat->userlist); |
15817 | 790 gnt_entry_remove_suggest(entry, list->data); |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
791 gnt_tree_remove(tree, list->data); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
792 } |
15817 | 793 } |
794 | |
795 static void | |
15822 | 796 finch_chat_update_user(PurpleConversation *conv, const char *user) |
15817 | 797 { |
17070
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
798 PurpleConvChatBuddy *cb = purple_conv_chat_cb_find(PURPLE_CONV_CHAT(conv), user); |
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
799 FinchConv *ggc = conv->ui_data; |
f2137f75fd10
Show user flags in chat userlist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17021
diff
changeset
|
800 gnt_tree_change_text(GNT_TREE(ggc->u.chat->userlist), (gpointer)user, 0, chat_flag_text(cb->flags)); |
15817 | 801 } |
802 | |
15822 | 803 static PurpleConversationUiOps conv_ui_ops = |
15817 | 804 { |
17091
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
805 finch_create_conversation, |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
806 finch_destroy_conversation, |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
807 finch_write_chat, |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
808 finch_write_im, |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
809 finch_write_conv, |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
810 finch_chat_add_users, |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
811 finch_chat_rename_user, |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
812 finch_chat_remove_users, |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
813 finch_chat_update_user, |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
814 NULL, /* present */ |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
815 NULL, /* has_focus */ |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
816 NULL, /* custom_smiley_add */ |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
817 NULL, /* custom_smiley_write */ |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
818 NULL, /* custom_smiley_close */ |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
819 NULL, /* send_confirm */ |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
820 NULL, |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
821 NULL, |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
822 NULL, |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
17070
diff
changeset
|
823 NULL |
15817 | 824 }; |
825 | |
15822 | 826 PurpleConversationUiOps *finch_conv_get_ui_ops() |
15817 | 827 { |
828 return &conv_ui_ops; | |
829 } | |
830 | |
831 /* Xerox */ | |
15822 | 832 static PurpleCmdRet |
833 say_command_cb(PurpleConversation *conv, | |
15817 | 834 const char *cmd, char **args, char **error, void *data) |
835 { | |
15822 | 836 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) |
837 purple_conv_im_send(PURPLE_CONV_IM(conv), args[0]); | |
838 else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) | |
839 purple_conv_chat_send(PURPLE_CONV_CHAT(conv), args[0]); | |
15817 | 840 |
15822 | 841 return PURPLE_CMD_RET_OK; |
15817 | 842 } |
843 | |
844 /* Xerox */ | |
15822 | 845 static PurpleCmdRet |
846 me_command_cb(PurpleConversation *conv, | |
15817 | 847 const char *cmd, char **args, char **error, void *data) |
848 { | |
849 char *tmp; | |
850 | |
851 tmp = g_strdup_printf("/me %s", args[0]); | |
852 | |
15822 | 853 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) |
854 purple_conv_im_send(PURPLE_CONV_IM(conv), tmp); | |
855 else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) | |
856 purple_conv_chat_send(PURPLE_CONV_CHAT(conv), tmp); | |
15817 | 857 |
858 g_free(tmp); | |
15822 | 859 return PURPLE_CMD_RET_OK; |
15817 | 860 } |
861 | |
862 /* Xerox */ | |
15822 | 863 static PurpleCmdRet |
864 debug_command_cb(PurpleConversation *conv, | |
15817 | 865 const char *cmd, char **args, char **error, void *data) |
866 { | |
867 char *tmp, *markup; | |
15822 | 868 PurpleCmdStatus status; |
15817 | 869 |
870 if (!g_ascii_strcasecmp(args[0], "version")) { | |
16930
00c24829e243
Patch #751 from 'Dustin Howett' to change the output string from /debug version.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16893
diff
changeset
|
871 tmp = g_strdup_printf("me is using Finch v%s.", VERSION); |
15817 | 872 markup = g_markup_escape_text(tmp, -1); |
873 | |
15822 | 874 status = purple_cmd_do_command(conv, tmp, markup, error); |
15817 | 875 |
876 g_free(tmp); | |
877 g_free(markup); | |
878 return status; | |
879 } else { | |
15822 | 880 purple_conversation_write(conv, NULL, _("Supported debug options are: version"), |
881 PURPLE_MESSAGE_NO_LOG|PURPLE_MESSAGE_ERROR, time(NULL)); | |
882 return PURPLE_CMD_STATUS_OK; | |
15817 | 883 } |
884 } | |
885 | |
886 /* Xerox */ | |
15822 | 887 static PurpleCmdRet |
888 clear_command_cb(PurpleConversation *conv, | |
15817 | 889 const char *cmd, char **args, char **error, void *data) |
890 { | |
891 FinchConv *ggconv = conv->ui_data; | |
892 gnt_text_view_clear(GNT_TEXT_VIEW(ggconv->tv)); | |
15822 | 893 return PURPLE_CMD_STATUS_OK; |
15817 | 894 } |
895 | |
896 /* Xerox */ | |
15822 | 897 static PurpleCmdRet |
898 help_command_cb(PurpleConversation *conv, | |
15817 | 899 const char *cmd, char **args, char **error, void *data) |
900 { | |
901 GList *l, *text; | |
902 GString *s; | |
903 | |
904 if (args[0] != NULL) { | |
905 s = g_string_new(""); | |
15822 | 906 text = purple_cmd_help(conv, args[0]); |
15817 | 907 |
908 if (text) { | |
909 for (l = text; l; l = l->next) | |
910 if (l->next) | |
911 g_string_append_printf(s, "%s\n", (char *)l->data); | |
912 else | |
913 g_string_append_printf(s, "%s", (char *)l->data); | |
914 } else { | |
915 g_string_append(s, _("No such command (in this context).")); | |
916 } | |
917 } else { | |
918 s = g_string_new(_("Use \"/help <command>\" for help on a specific command.\n" | |
919 "The following commands are available in this context:\n")); | |
920 | |
15822 | 921 text = purple_cmd_list(conv); |
15817 | 922 for (l = text; l; l = l->next) |
923 if (l->next) | |
924 g_string_append_printf(s, "%s, ", (char *)l->data); | |
925 else | |
926 g_string_append_printf(s, "%s.", (char *)l->data); | |
927 g_list_free(text); | |
928 } | |
929 | |
15822 | 930 purple_conversation_write(conv, NULL, s->str, PURPLE_MESSAGE_NO_LOG, time(NULL)); |
15817 | 931 g_string_free(s, TRUE); |
932 | |
15822 | 933 return PURPLE_CMD_STATUS_OK; |
15817 | 934 } |
935 | |
15822 | 936 static PurpleCmdRet |
937 cmd_show_window(PurpleConversation *conv, const char *cmd, char **args, char **error, gpointer data) | |
15817 | 938 { |
939 void (*callback)() = data; | |
940 callback(); | |
15822 | 941 return PURPLE_CMD_STATUS_OK; |
15817 | 942 } |
943 | |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
944 static PurpleCmdRet |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
945 users_command_cb(PurpleConversation *conv, const char *cmd, char **args, char **error, gpointer data) |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
946 { |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
947 FinchConv *fc = conv->ui_data; |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
948 FinchConvChat *ch; |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
949 if (!fc) |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
950 return PURPLE_CMD_STATUS_FAILED; |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
951 |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
952 ch = fc->u.chat; |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
953 gnt_widget_set_visible(ch->userlist, |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
954 (GNT_WIDGET_IS_FLAG_SET(ch->userlist, GNT_WIDGET_INVISIBLE))); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
955 gnt_box_readjust(GNT_BOX(fc->window)); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
956 gnt_box_give_focus_to_child(GNT_BOX(fc->window), fc->entry); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
957 purple_prefs_set_bool(PREF_USERLIST, !(GNT_WIDGET_IS_FLAG_SET(ch->userlist, GNT_WIDGET_INVISIBLE))); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
958 return PURPLE_CMD_STATUS_OK; |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
959 } |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
960 |
15817 | 961 void finch_conversation_init() |
962 { | |
15822 | 963 purple_prefs_add_none(PREF_ROOT); |
964 purple_prefs_add_none(PREF_ROOT "/size"); | |
965 purple_prefs_add_int(PREF_ROOT "/size/width", 70); | |
966 purple_prefs_add_int(PREF_ROOT "/size/height", 20); | |
967 purple_prefs_add_none(PREF_ROOT "/position"); | |
968 purple_prefs_add_int(PREF_ROOT "/position/x", 0); | |
969 purple_prefs_add_int(PREF_ROOT "/position/y", 0); | |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
970 purple_prefs_add_none(PREF_CHAT); |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
971 purple_prefs_add_bool(PREF_USERLIST, FALSE); |
15817 | 972 |
973 /* Xerox the commands */ | |
15822 | 974 purple_cmd_register("say", "S", PURPLE_CMD_P_DEFAULT, |
975 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM, NULL, | |
15817 | 976 say_command_cb, _("say <message>: Send a message normally as if you weren't using a command."), NULL); |
15822 | 977 purple_cmd_register("me", "S", PURPLE_CMD_P_DEFAULT, |
978 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM, NULL, | |
15817 | 979 me_command_cb, _("me <action>: Send an IRC style action to a buddy or chat."), NULL); |
15822 | 980 purple_cmd_register("debug", "w", PURPLE_CMD_P_DEFAULT, |
981 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM, NULL, | |
15817 | 982 debug_command_cb, _("debug <option>: Send various debug information to the current conversation."), NULL); |
15822 | 983 purple_cmd_register("clear", "", PURPLE_CMD_P_DEFAULT, |
984 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM, NULL, | |
15817 | 985 clear_command_cb, _("clear: Clears the conversation scrollback."), NULL); |
15822 | 986 purple_cmd_register("help", "w", PURPLE_CMD_P_DEFAULT, |
987 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, NULL, | |
15817 | 988 help_command_cb, _("help <command>: Help on a specific command."), NULL); |
16893
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
989 purple_cmd_register("users", "", PURPLE_CMD_P_DEFAULT, |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
990 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, NULL, |
b799918b6cdc
Add a /users command to toggle the userlist in chat windows.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16892
diff
changeset
|
991 users_command_cb, _("users: Show the list of users in the chat."), NULL); |
15817 | 992 |
993 /* Now some commands to bring up some other windows */ | |
15822 | 994 purple_cmd_register("plugins", "", PURPLE_CMD_P_DEFAULT, |
995 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM, NULL, | |
15817 | 996 cmd_show_window, _("plugins: Show the plugins window."), finch_plugins_show_all); |
15822 | 997 purple_cmd_register("buddylist", "", PURPLE_CMD_P_DEFAULT, |
998 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM, NULL, | |
15817 | 999 cmd_show_window, _("buddylist: Show the buddylist."), finch_blist_show); |
15822 | 1000 purple_cmd_register("accounts", "", PURPLE_CMD_P_DEFAULT, |
1001 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM, NULL, | |
15817 | 1002 cmd_show_window, _("accounts: Show the accounts window."), finch_accounts_show_all); |
15822 | 1003 purple_cmd_register("debugwin", "", PURPLE_CMD_P_DEFAULT, |
1004 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM, NULL, | |
15817 | 1005 cmd_show_window, _("debugwin: Show the debug window."), finch_debug_window_show); |
15822 | 1006 purple_cmd_register("prefs", "", PURPLE_CMD_P_DEFAULT, |
1007 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM, NULL, | |
15817 | 1008 cmd_show_window, _("prefs: Show the preference window."), finch_prefs_show_all); |
15822 | 1009 purple_cmd_register("status", "", PURPLE_CMD_P_DEFAULT, |
1010 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM, NULL, | |
15817 | 1011 cmd_show_window, _("statuses: Show the savedstatuses window."), finch_savedstatus_show_all); |
17021
d6e855aedc30
Notify when you leave a chat, after /part or /kick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16978
diff
changeset
|
1012 |
d6e855aedc30
Notify when you leave a chat, after /part or /kick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16978
diff
changeset
|
1013 purple_signal_connect(purple_conversations_get_handle(), "buddy-typing", finch_conv_get_handle(), |
d6e855aedc30
Notify when you leave a chat, after /part or /kick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16978
diff
changeset
|
1014 PURPLE_CALLBACK(update_buddy_typing), NULL); |
d6e855aedc30
Notify when you leave a chat, after /part or /kick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16978
diff
changeset
|
1015 purple_signal_connect(purple_conversations_get_handle(), "buddy-typing-stopped", finch_conv_get_handle(), |
d6e855aedc30
Notify when you leave a chat, after /part or /kick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16978
diff
changeset
|
1016 PURPLE_CALLBACK(update_buddy_typing), NULL); |
d6e855aedc30
Notify when you leave a chat, after /part or /kick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16978
diff
changeset
|
1017 purple_signal_connect(purple_conversations_get_handle(), "chat-left", finch_conv_get_handle(), |
d6e855aedc30
Notify when you leave a chat, after /part or /kick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16978
diff
changeset
|
1018 PURPLE_CALLBACK(chat_left_cb), NULL); |
15817 | 1019 } |
1020 | |
1021 void finch_conversation_uninit() | |
1022 { | |
17021
d6e855aedc30
Notify when you leave a chat, after /part or /kick.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16978
diff
changeset
|
1023 purple_signals_disconnect_by_handle(finch_conv_get_handle()); |
15817 | 1024 } |
1025 | |
15822 | 1026 void finch_conversation_set_active(PurpleConversation *conv) |
15817 | 1027 { |
1028 FinchConv *ggconv = conv->ui_data; | |
15822 | 1029 PurpleAccount *account; |
15817 | 1030 char *title; |
1031 | |
1032 g_return_if_fail(ggconv); | |
1033 g_return_if_fail(g_list_find(ggconv->list, conv)); | |
1034 | |
1035 ggconv->active_conv = conv; | |
15822 | 1036 account = purple_conversation_get_account(conv); |
15817 | 1037 title = get_conversation_title(conv, account); |
1038 gnt_screen_rename_widget(ggconv->window, title); | |
1039 g_free(title); | |
1040 } | |
1041 | |
16128
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
1042 void finch_conversation_set_info_widget(PurpleConversation *conv, GntWidget *widget) |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
1043 { |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
1044 FinchConv *fc = conv->ui_data; |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
1045 int height, width; |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
1046 |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
1047 gnt_box_remove_all(GNT_BOX(fc->info)); |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
1048 |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
1049 if (widget) { |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
1050 gnt_box_add_widget(GNT_BOX(fc->info), widget); |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
1051 gnt_box_readjust(GNT_BOX(fc->info)); |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
1052 } |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
1053 |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
1054 gnt_widget_get_size(fc->window, &width, &height); |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
1055 gnt_box_readjust(GNT_BOX(fc->window)); |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
1056 gnt_screen_resize_widget(fc->window, width, height); |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
1057 gnt_box_give_focus_to_child(GNT_BOX(fc->window), fc->entry); |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
1058 } |
7a2ffa981c1a
Allow adding information widgets in the conversation window.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16124
diff
changeset
|
1059 |