| 138 * Callbacks |
138 * Callbacks |
| 139 **************************************************************************/ |
139 **************************************************************************/ |
| 140 static void |
140 static void |
| 141 do_save_convo(GtkWidget *wid) |
141 do_save_convo(GtkWidget *wid) |
| 142 { |
142 { |
| 143 GaimConversation *c = g_object_get_data(G_OBJECT(GTK_FILE_SELECTION(wid)->ok_button), |
143 GaimConversation *conv; |
| 144 "gaim_conversation"); |
|
| 145 const char *filename; |
144 const char *filename; |
| 146 FILE *fp; |
145 FILE *fp; |
| 147 |
146 |
| |
147 conv = g_object_get_data(G_OBJECT(GTK_FILE_SELECTION(wid)->ok_button), |
| |
148 "gaim_conversation"); |
| |
149 |
| 148 filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(wid)); |
150 filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(wid)); |
| 149 |
151 |
| 150 if (!((gaim_conversation_get_type(c) != GAIM_CONV_CHAT && |
152 if (!((gaim_conversation_get_type(conv) != GAIM_CONV_CHAT && |
| 151 g_list_find(gaim_get_ims(), c)) || |
153 g_list_find(gaim_get_ims(), conv)) || |
| 152 (gaim_conversation_get_type(c) == GAIM_CONV_CHAT && |
154 (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT && |
| 153 g_list_find(gaim_get_chats(), c)))) |
155 g_list_find(gaim_get_chats(), conv)))) |
| 154 filename = NULL; |
156 filename = NULL; |
| 155 |
157 |
| 156 gtk_widget_destroy(wid); |
158 gtk_widget_destroy(wid); |
| 157 |
159 |
| 158 if (filename == NULL) |
160 if (filename == NULL) |
| 159 return; |
161 return; |
| 160 |
162 |
| 161 if ((fp = fopen(filename, "w+")) == NULL) |
163 if ((fp = fopen(filename, "w+")) == NULL) |
| 162 return; |
164 return; |
| 163 |
165 |
| 164 fprintf(fp, "%s", c->history->str); |
166 fprintf(fp, "%s", conv->history->str); |
| 165 |
167 |
| 166 fclose(fp); |
168 fclose(fp); |
| 167 } |
169 } |
| 168 |
170 |
| 169 static void |
171 static void |
| 170 do_check_save_convo(GObject *obj, GtkWidget *wid) |
172 do_check_save_convo(GObject *obj, GtkWidget *wid) |
| 171 { |
173 { |
| 172 const char *filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(wid)); |
174 const char *filename; |
| |
175 |
| |
176 filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(wid)); |
| 173 |
177 |
| 174 if (gaim_gtk_check_if_dir(filename, GTK_FILE_SELECTION(wid))) |
178 if (gaim_gtk_check_if_dir(filename, GTK_FILE_SELECTION(wid))) |
| 175 return; |
179 return; |
| 176 |
180 |
| 177 if(g_file_test(filename, G_FILE_TEST_EXISTS)){ |
181 if (g_file_test(filename, G_FILE_TEST_EXISTS)) |
| |
182 { |
| 178 gaim_request_yes_no(NULL, NULL, _("That file already exists"), |
183 gaim_request_yes_no(NULL, NULL, _("That file already exists"), |
| 179 _("Would you like to overwrite it?"), 1, wid, |
184 _("Would you like to overwrite it?"), 1, wid, |
| 180 G_CALLBACK(do_save_convo), NULL); |
185 G_CALLBACK(do_save_convo), NULL); |
| 181 } |
186 } |
| 182 else |
187 else |
| 210 { |
215 { |
| 211 if (GTK_WIDGET_STATE(widget) == GTK_STATE_ACTIVE) |
216 if (GTK_WIDGET_STATE(widget) == GTK_STATE_ACTIVE) |
| 212 gtk_widget_set_state(widget, GTK_STATE_NORMAL); |
217 gtk_widget_set_state(widget, GTK_STATE_NORMAL); |
| 213 } |
218 } |
| 214 |
219 |
| 215 static void default_formatize(GaimConversation *conv) { |
220 static void |
| |
221 default_formatize(GaimConversation *conv) |
| |
222 { |
| 216 GaimGtkConversation *c = GAIM_GTK_CONVERSATION(conv); |
223 GaimGtkConversation *c = GAIM_GTK_CONVERSATION(conv); |
| 217 GaimConnection *gc = gaim_conversation_get_gc(conv); |
224 GaimConnection *gc = gaim_conversation_get_gc(conv); |
| 218 |
225 |
| 219 if (gc && gc->flags & GAIM_CONNECTION_HTML) { |
226 if (gc && gc->flags & GAIM_CONNECTION_HTML) |
| 220 if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_bold")) { |
227 { |
| |
228 if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_bold")) |
| 221 gtk_imhtml_toggle_bold(GTK_IMHTML(c->entry)); |
229 gtk_imhtml_toggle_bold(GTK_IMHTML(c->entry)); |
| 222 } |
230 |
| 223 |
231 if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_italic")) |
| 224 if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_italic")) { |
|
| 225 gtk_imhtml_toggle_italic(GTK_IMHTML(c->entry)); |
232 gtk_imhtml_toggle_italic(GTK_IMHTML(c->entry)); |
| 226 } |
233 |
| 227 |
234 if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_underline")) |
| 228 if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_underline")) { |
|
| 229 gtk_imhtml_toggle_underline(GTK_IMHTML(c->entry)); |
235 gtk_imhtml_toggle_underline(GTK_IMHTML(c->entry)); |
| 230 } |
236 |
| 231 |
237 if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_strikethrough")) |
| 232 if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_strikethrough")) { |
238 { |
| 233 /* Tell me noone uses <s> by default ... maybe I won't do |
239 /* Tell me noone uses <s> by default ... maybe I won't do |
| 234 _toggle_strikethrough and not let them */ |
240 _toggle_strikethrough and not let them */ |
| 235 /* g_snprintf(buf2, limit, "<STRIKE>%s</STRIKE>", buf); |
241 /* g_snprintf(buf2, limit, "<STRIKE>%s</STRIKE>", buf); |
| 236 strcpy(buf, buf2); */ |
242 strcpy(buf, buf2); */ |
| 237 } |
243 } |
| 238 |
244 |
| 239 if (gaim_prefs_get_bool("/gaim/gtk/conversations/use_custom_font") || c->has_font) { |
245 if (gaim_prefs_get_bool("/gaim/gtk/conversations/use_custom_font") || |
| |
246 c->has_font) |
| |
247 { |
| 240 gtk_imhtml_toggle_fontface(GTK_IMHTML(c->entry), c->fontface); |
248 gtk_imhtml_toggle_fontface(GTK_IMHTML(c->entry), c->fontface); |
| 241 } |
249 } |
| 242 |
250 |
| 243 if (gaim_prefs_get_bool("/gaim/gtk/conversations/use_custom_size")) { |
251 if (gaim_prefs_get_bool("/gaim/gtk/conversations/use_custom_size")) |
| 244 gtk_imhtml_font_set_size(GTK_IMHTML(c->entry), gaim_prefs_get_int("/gaim/gtk/conversations/font_size")); |
252 { |
| 245 } |
253 gtk_imhtml_font_set_size(GTK_IMHTML(c->entry), |
| 246 |
254 gaim_prefs_get_int("/gaim/gtk/conversations/font_size")); |
| 247 if (gaim_prefs_get_bool("/gaim/gtk/conversations/use_custom_fgcolor")) { |
255 } |
| 248 char *color = g_strdup_printf("#%02x%02x%02x", |
256 |
| 249 c->fg_color.red / 256, |
257 if (gaim_prefs_get_bool("/gaim/gtk/conversations/use_custom_fgcolor")) |
| 250 c->fg_color.green / 256, |
258 { |
| 251 c->fg_color.blue / 256); |
259 char *color = g_strdup_printf("#%02x%02x%02x", |
| |
260 c->fg_color.red / 256, |
| |
261 c->fg_color.green / 256, |
| |
262 c->fg_color.blue / 256); |
| 252 gtk_imhtml_toggle_forecolor(GTK_IMHTML(c->entry), color); |
263 gtk_imhtml_toggle_forecolor(GTK_IMHTML(c->entry), color); |
| 253 g_free(color); |
264 g_free(color); |
| 254 } |
265 } |
| 255 |
266 |
| 256 if (!(gc->flags & GAIM_CONNECTION_NO_BGCOLOR) && gaim_prefs_get_bool("/gaim/gtk/conversations/use_custom_bgcolor")) { |
267 if (!(gc->flags & GAIM_CONNECTION_NO_BGCOLOR) && |
| 257 char *color = g_strdup_printf("#%02x%02x%02x", |
268 gaim_prefs_get_bool("/gaim/gtk/conversations/use_custom_bgcolor")) |
| 258 c->bg_color.red / 256, |
269 { |
| 259 c->bg_color.green / 256, |
270 char *color = g_strdup_printf("#%02x%02x%02x", |
| 260 c->bg_color.blue / 256); |
271 c->bg_color.red / 256, |
| |
272 c->bg_color.green / 256, |
| |
273 c->bg_color.blue / 256); |
| 261 gtk_imhtml_toggle_backcolor(GTK_IMHTML(c->entry), color); |
274 gtk_imhtml_toggle_backcolor(GTK_IMHTML(c->entry), color); |
| 262 g_free(color); |
275 g_free(color); |
| 263 } |
276 } |
| 264 } |
277 } |
| 265 } |
278 } |
| 266 |
279 |
| 267 static void |
280 static void |
| 632 |
652 |
| 633 gtkconv->dialogs.search = gtk_dialog_new_with_buttons(_("Find"), |
653 gtkconv->dialogs.search = gtk_dialog_new_with_buttons(_("Find"), |
| 634 GTK_WINDOW(gtkwin->window), GTK_DIALOG_DESTROY_WITH_PARENT, |
654 GTK_WINDOW(gtkwin->window), GTK_DIALOG_DESTROY_WITH_PARENT, |
| 635 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, |
655 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, |
| 636 GTK_STOCK_FIND, GTK_RESPONSE_OK, NULL); |
656 GTK_STOCK_FIND, GTK_RESPONSE_OK, NULL); |
| 637 gtk_dialog_set_default_response(GTK_DIALOG(gtkconv->dialogs.search), GTK_RESPONSE_OK); |
657 gtk_dialog_set_default_response(GTK_DIALOG(gtkconv->dialogs.search), |
| |
658 GTK_RESPONSE_OK); |
| 638 g_signal_connect(G_OBJECT(gtkconv->dialogs.search), "response", |
659 g_signal_connect(G_OBJECT(gtkconv->dialogs.search), "response", |
| 639 G_CALLBACK(do_search_cb), s); |
660 G_CALLBACK(do_search_cb), s); |
| 640 |
661 |
| 641 gtk_container_set_border_width(GTK_CONTAINER(gtkconv->dialogs.search), 6); |
662 gtk_container_set_border_width(GTK_CONTAINER(gtkconv->dialogs.search), 6); |
| 642 gtk_window_set_resizable(GTK_WINDOW(gtkconv->dialogs.search), FALSE); |
663 gtk_window_set_resizable(GTK_WINDOW(gtkconv->dialogs.search), FALSE); |
| 643 gtk_dialog_set_has_separator(GTK_DIALOG(gtkconv->dialogs.search), FALSE); |
664 gtk_dialog_set_has_separator(GTK_DIALOG(gtkconv->dialogs.search), FALSE); |
| 644 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(gtkconv->dialogs.search)->vbox), 12); |
665 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(gtkconv->dialogs.search)->vbox), 12); |
| 645 gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(gtkconv->dialogs.search)->vbox), 6); |
666 gtk_container_set_border_width( |
| |
667 GTK_CONTAINER(GTK_DIALOG(gtkconv->dialogs.search)->vbox), 6); |
| 646 |
668 |
| 647 hbox = gtk_hbox_new(FALSE, 12); |
669 hbox = gtk_hbox_new(FALSE, 12); |
| 648 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(gtkconv->dialogs.search)->vbox), hbox); |
670 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(gtkconv->dialogs.search)->vbox), |
| |
671 hbox); |
| 649 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); |
672 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); |
| 650 |
673 |
| 651 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); |
674 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); |
| 652 gtk_dialog_set_response_sensitive(GTK_DIALOG(gtkconv->dialogs.search), GTK_RESPONSE_OK, FALSE); |
675 gtk_dialog_set_response_sensitive(GTK_DIALOG(gtkconv->dialogs.search), |
| 653 |
676 GTK_RESPONSE_OK, FALSE); |
| 654 label = gtk_label_new(NULL); |
677 |
| 655 gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), _("_Search for:")); |
678 label = gtk_label_new(NULL); |
| |
679 gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), _("_Search for:")); |
| 656 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
680 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
| 657 |
681 |
| 658 s->entry = gtk_entry_new(); |
682 s->entry = gtk_entry_new(); |
| 659 gtk_entry_set_activates_default(GTK_ENTRY(s->entry), TRUE); |
683 gtk_entry_set_activates_default(GTK_ENTRY(s->entry), TRUE); |
| 660 gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(s->entry)); |
684 gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(s->entry)); |
| 661 g_signal_connect(G_OBJECT(s->entry), "changed", |
685 g_signal_connect(G_OBJECT(s->entry), "changed", |
| 662 G_CALLBACK(gaim_gtk_set_sensitive_if_input), |
686 G_CALLBACK(gaim_gtk_set_sensitive_if_input), |
| 663 gtkconv->dialogs.search); |
687 gtkconv->dialogs.search); |
| 664 gtk_box_pack_start(GTK_BOX(hbox), s->entry, FALSE, FALSE, 0); |
688 gtk_box_pack_start(GTK_BOX(hbox), s->entry, FALSE, FALSE, 0); |
| 665 |
689 |
| 1104 if(!gtk_tree_selection_get_selected(sel, NULL, &iter)) |
1133 if(!gtk_tree_selection_get_selected(sel, NULL, &iter)) |
| 1105 return FALSE; |
1134 return FALSE; |
| 1106 |
1135 |
| 1107 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 1, &who, -1); |
1136 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 1, &who, -1); |
| 1108 menu = create_chat_menu (conv, who, prpl_info, gc); |
1137 menu = create_chat_menu (conv, who, prpl_info, gc); |
| 1109 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, gaim_gtk_treeview_popup_menu_position_func, widget, 0, GDK_CURRENT_TIME); |
1138 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, |
| |
1139 gaim_gtk_treeview_popup_menu_position_func, widget, |
| |
1140 0, GDK_CURRENT_TIME); |
| 1110 |
1141 |
| 1111 return TRUE; |
1142 return TRUE; |
| 1112 } |
1143 } |
| 1113 |
1144 |
| 1114 |
1145 |
| 1281 if (conv->send_history->prev && |
1319 if (conv->send_history->prev && |
| 1282 conv->send_history->prev->data) { |
1320 conv->send_history->prev->data) { |
| 1283 |
1321 |
| 1284 conv->send_history = conv->send_history->prev; |
1322 conv->send_history = conv->send_history->prev; |
| 1285 gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry)); |
1323 gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry)); |
| 1286 gtk_imhtml_append_text_with_images(GTK_IMHTML(gtkconv->entry), conv->send_history->data, 0, NULL); |
1324 gtk_imhtml_append_text_with_images( |
| |
1325 GTK_IMHTML(gtkconv->entry), conv->send_history->data, |
| |
1326 0, NULL); |
| 1287 } |
1327 } |
| 1288 |
1328 |
| 1289 return TRUE; |
1329 return TRUE; |
| 1290 break; |
1330 break; |
| 1291 |
1331 |
| 1292 case GDK_Page_Down: |
1332 case GDK_Page_Down: |
| 1293 case ']': |
1333 case ']': |
| 1294 gaim_conv_window_switch_conversation(win, (curconv + 1) % numconvs); |
1334 gaim_conv_window_switch_conversation(win, |
| |
1335 (curconv + 1) % numconvs); |
| 1295 |
1336 |
| 1296 return TRUE; |
1337 return TRUE; |
| 1297 break; |
1338 break; |
| 1298 |
1339 |
| 1299 case GDK_Page_Up: |
1340 case GDK_Page_Up: |
| 1300 case '[': |
1341 case '[': |
| 1301 gaim_conv_window_switch_conversation(win, (curconv + numconvs - 1) % numconvs); |
1342 gaim_conv_window_switch_conversation(win, |
| |
1343 (curconv + numconvs - 1) % numconvs); |
| 1302 |
1344 |
| 1303 return TRUE; |
1345 return TRUE; |
| 1304 break; |
1346 break; |
| 1305 |
1347 |
| 1306 case GDK_Tab: |
1348 case GDK_Tab: |
| 1323 return TRUE; |
1365 return TRUE; |
| 1324 break; |
1366 break; |
| 1325 |
1367 |
| 1326 } /* End of switch */ |
1368 } /* End of switch */ |
| 1327 |
1369 |
| 1328 /* if (gaim_prefs_get_bool("/gaim/gtk/conversations/html_shortcuts")) { |
1370 #if 0 |
| |
1371 if (gaim_prefs_get_bool("/gaim/gtk/conversations/html_shortcuts")) { |
| 1329 switch (event->keyval) { |
1372 switch (event->keyval) { |
| 1330 |
1373 |
| 1331 |
1374 |
| 1332 } |
1375 } |
| 1333 } */ /* End of switch */ |
1376 } /* End of switch */ |
| 1334 |
1377 |
| 1335 /* if (gaim_prefs_get_bool("/gaim/gtk/conversations/smiley_shortcuts")) { |
1378 if (gaim_prefs_get_bool("/gaim/gtk/conversations/smiley_shortcuts")) { |
| 1336 char buf[7]; |
1379 char buf[7]; |
| 1337 |
1380 |
| 1338 *buf = '\0'; |
1381 *buf = '\0'; |
| 1339 |
1382 |
| 1340 switch (event->keyval) { |
1383 switch (event->keyval) { |
| 1341 |
1384 |
| 1342 } |
1385 } |
| 1343 |
1386 |
| 1344 |
1387 |
| 1345 }*/ |
1388 } |
| 1346 |
1389 #endif |
| 1347 } else |
1390 |
| 1348 |
1391 } |
| 1349 /* If ALT (or whatever) was held down... */ |
1392 /* If ALT (or whatever) was held down... */ |
| 1350 if (event->state & GDK_MOD1_MASK) { |
1393 else if (event->state & GDK_MOD1_MASK) |
| |
1394 { |
| 1351 /* XXX - Make sure the conv exists befeore switching to it */ |
1395 /* XXX - Make sure the conv exists befeore switching to it */ |
| 1352 if (event->keyval > '0' && event->keyval <= '9') { |
1396 if (event->keyval > '0' && event->keyval <= '9') { |
| 1353 int switchto = event->keyval - '1'; |
1397 int switchto = event->keyval - '1'; |
| 1354 if (switchto < numconvs) |
1398 if (switchto < numconvs) |
| 1355 gaim_conv_window_switch_conversation(win, switchto); |
1399 gaim_conv_window_switch_conversation(win, switchto); |
| 1356 |
1400 |
| 1357 return TRUE; |
1401 return TRUE; |
| 1358 } |
1402 } |
| 1359 } else |
1403 } |
| 1360 |
|
| 1361 /* If neither CTRL nor ALT were held down... */ |
1404 /* If neither CTRL nor ALT were held down... */ |
| 1362 switch (event->keyval) { |
1405 else |
| 1363 case GDK_Return: |
1406 { |
| 1364 case GDK_KP_Enter: |
1407 switch (event->keyval) |
| 1365 if (!(event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) && |
1408 { |
| 1366 gaim_prefs_get_bool("/gaim/gtk/conversations/enter_sends")) { |
1409 case GDK_Return: |
| 1367 |
1410 case GDK_KP_Enter: |
| 1368 send_cb(NULL, conv); |
1411 if (!(event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) && |
| |
1412 gaim_prefs_get_bool("/gaim/gtk/conversations/enter_sends")) |
| |
1413 { |
| |
1414 send_cb(NULL, conv); |
| |
1415 return TRUE; |
| |
1416 } |
| |
1417 break; |
| |
1418 |
| |
1419 case GDK_Tab: |
| |
1420 if (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT && |
| |
1421 gaim_prefs_get_bool("/gaim/gtk/conversations/chat/tab_completion")) |
| |
1422 { |
| |
1423 tab_complete(conv); |
| |
1424 return TRUE; |
| |
1425 } |
| |
1426 break; |
| |
1427 |
| |
1428 case GDK_Page_Up: |
| |
1429 gtk_imhtml_page_up(GTK_IMHTML(gtkconv->imhtml)); |
| 1369 return TRUE; |
1430 return TRUE; |
| 1370 } |
1431 break; |
| 1371 break; |
1432 |
| 1372 |
1433 case GDK_Page_Down: |
| 1373 case GDK_Tab: |
1434 gtk_imhtml_page_down(GTK_IMHTML(gtkconv->imhtml)); |
| 1374 if (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT && |
|
| 1375 gaim_prefs_get_bool("/gaim/gtk/conversations/chat/tab_completion")) { |
|
| 1376 |
|
| 1377 tab_complete(conv); |
|
| 1378 return TRUE; |
1435 return TRUE; |
| 1379 } |
1436 break; |
| 1380 break; |
1437 |
| 1381 |
1438 case GDK_F2: |
| 1382 case GDK_Page_Up: |
1439 gaim_prefs_set_bool("/gaim/gtk/conversations/show_timestamps", |
| 1383 gtk_imhtml_page_up(GTK_IMHTML(gtkconv->imhtml)); |
1440 !gaim_prefs_get_bool("/gaim/gtk/conversations/show_timestamps")); |
| 1384 return TRUE; |
1441 return TRUE; |
| 1385 break; |
1442 break; |
| 1386 |
1443 |
| 1387 case GDK_Page_Down: |
1444 } |
| 1388 gtk_imhtml_page_down(GTK_IMHTML(gtkconv->imhtml)); |
1445 } |
| 1389 return TRUE; |
|
| 1390 break; |
|
| 1391 |
|
| 1392 case GDK_F2: |
|
| 1393 gaim_prefs_set_bool("/gaim/gtk/conversations/show_timestamps", |
|
| 1394 !gaim_prefs_get_bool("/gaim/gtk/conversations/show_timestamps")); |
|
| 1395 return TRUE; |
|
| 1396 break; |
|
| 1397 |
|
| 1398 } /* End of switch */ |
|
| 1399 |
1446 |
| 1400 return FALSE; |
1447 return FALSE; |
| 1401 } |
1448 } |
| 1402 |
1449 |
| 1403 /* |
1450 /* |
| 2173 if (gtkwin->menu.send_as != NULL) |
2222 if (gtkwin->menu.send_as != NULL) |
| 2174 g_timeout_add(0, (GSourceFunc)update_send_as_selection, win); |
2223 g_timeout_add(0, (GSourceFunc)update_send_as_selection, win); |
| 2175 |
2224 |
| 2176 /* |
2225 /* |
| 2177 * Handle hiding and showing stuff based on what type of conv this is. |
2226 * Handle hiding and showing stuff based on what type of conv this is. |
| 2178 * Stuff that Gaim IMs support in general should be shown for IM |
2227 * Stuff that Gaim IMs support in general should be shown for IM |
| 2179 * conversations. Stuff that Gaim chats support in gerneal should be |
2228 * conversations. Stuff that Gaim chats support in gerneal should be |
| 2180 * shown for chat conversations. It doesn't matter whether the PRPL |
2229 * shown for chat conversations. It doesn't matter whether the PRPL |
| 2181 * supports it or not--that only affects if the button or menu item |
2230 * supports it or not--that only affects if the button or menu item |
| 2182 * is sensitive or not. |
2231 * is sensitive or not. |
| 2183 */ |
2232 */ |
| 2184 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM) { |
2233 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM) { |
| 2185 /* Show stuff that applies to IMs, hide stuff that applies to chats */ |
2234 /* Show stuff that applies to IMs, hide stuff that applies to chats */ |
| 2186 |
2235 |
| 2260 /* Deal with buttons */ |
2309 /* Deal with buttons */ |
| 2261 gtk_widget_set_sensitive(gtkconv->add, TRUE); |
2310 gtk_widget_set_sensitive(gtkconv->add, TRUE); |
| 2262 gtk_widget_set_sensitive(gtkconv->remove, TRUE); |
2311 gtk_widget_set_sensitive(gtkconv->remove, TRUE); |
| 2263 gtk_widget_set_sensitive(gtkconv->info, (prpl_info->get_info != NULL)); |
2312 gtk_widget_set_sensitive(gtkconv->info, (prpl_info->get_info != NULL)); |
| 2264 |
2313 |
| 2265 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM) { |
2314 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM) |
| 2266 gtk_widget_set_sensitive(gtkconv->send, (prpl_info->send_im != NULL)); |
2315 { |
| |
2316 gtk_widget_set_sensitive(gtkconv->send, |
| |
2317 (prpl_info->send_im != NULL)); |
| 2267 gtk_widget_set_sensitive(gtkconv->u.im->warn, |
2318 gtk_widget_set_sensitive(gtkconv->u.im->warn, |
| 2268 (prpl_info->warn != NULL)); |
2319 (prpl_info->warn != NULL)); |
| 2269 gtk_widget_set_sensitive(gtkconv->u.im->block, |
2320 gtk_widget_set_sensitive(gtkconv->u.im->block, |
| 2270 (prpl_info->add_deny != NULL)); |
2321 (prpl_info->add_deny != NULL)); |
| 2271 } else if (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT) { |
2322 } |
| 2272 gtk_widget_set_sensitive(gtkconv->send, (prpl_info->chat_send != NULL)); |
2323 else if (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT) |
| |
2324 { |
| |
2325 gtk_widget_set_sensitive(gtkconv->send, |
| |
2326 (prpl_info->chat_send != NULL)); |
| 2273 gtk_widget_set_sensitive(gtkconv->u.chat->invite, |
2327 gtk_widget_set_sensitive(gtkconv->u.chat->invite, |
| 2274 (prpl_info->chat_invite != NULL)); |
2328 (prpl_info->chat_invite != NULL)); |
| 2275 } |
2329 } |
| 2276 |
2330 |
| 2277 /* Deal with the toolbar */ |
2331 /* Deal with the toolbar */ |
| 2303 gtk_widget_set_sensitive(gtkwin->menu.alias, FALSE); |
2357 gtk_widget_set_sensitive(gtkwin->menu.alias, FALSE); |
| 2304 else |
2358 else |
| 2305 gtk_widget_set_sensitive(gtkwin->menu.alias, TRUE); |
2359 gtk_widget_set_sensitive(gtkwin->menu.alias, TRUE); |
| 2306 } |
2360 } |
| 2307 |
2361 |
| 2308 gtk_widget_set_sensitive(gtkwin->menu.block, (prpl_info->add_deny != NULL)); |
2362 gtk_widget_set_sensitive(gtkwin->menu.block, |
| |
2363 (prpl_info->add_deny != NULL)); |
| 2309 gtk_widget_set_sensitive(gtkwin->menu.add, TRUE); |
2364 gtk_widget_set_sensitive(gtkwin->menu.add, TRUE); |
| 2310 gtk_widget_set_sensitive(gtkwin->menu.remove, TRUE); |
2365 gtk_widget_set_sensitive(gtkwin->menu.remove, TRUE); |
| 2311 gtk_widget_set_sensitive(gtkwin->menu.insert_link, TRUE); |
2366 gtk_widget_set_sensitive(gtkwin->menu.insert_link, TRUE); |
| 2312 gtk_widget_set_sensitive(gtkwin->menu.insert_image, |
2367 gtk_widget_set_sensitive(gtkwin->menu.insert_image, |
| 2313 (prpl_info->options & OPT_PROTO_IM_IMAGE)); |
2368 (prpl_info->options & OPT_PROTO_IM_IMAGE)); |
| 3034 { N_("/Conversation/New Instant _Message..."), "<CTL>M", menu_new_conv_cb, |
3092 { N_("/Conversation/New Instant _Message..."), "<CTL>M", menu_new_conv_cb, |
| 3035 0, "<StockItem>", GAIM_STOCK_IM }, |
3093 0, "<StockItem>", GAIM_STOCK_IM }, |
| 3036 |
3094 |
| 3037 { "/Conversation/sep0", NULL, NULL, 0, "<Separator>" }, |
3095 { "/Conversation/sep0", NULL, NULL, 0, "<Separator>" }, |
| 3038 |
3096 |
| 3039 { N_("/Conversation/_Find..."), NULL, menu_find_cb, 0, "<StockItem>", GTK_STOCK_FIND }, |
3097 { N_("/Conversation/_Find..."), NULL, menu_find_cb, 0, |
| |
3098 "<StockItem>", GTK_STOCK_FIND }, |
| 3040 { N_("/Conversation/View _Log"), NULL, menu_view_log_cb, 0, NULL }, |
3099 { N_("/Conversation/View _Log"), NULL, menu_view_log_cb, 0, NULL }, |
| 3041 { N_("/Conversation/_Save As..."), NULL, menu_save_as_cb, 0, |
3100 { N_("/Conversation/_Save As..."), NULL, menu_save_as_cb, 0, |
| 3042 "<StockItem>", GTK_STOCK_SAVE_AS }, |
3101 "<StockItem>", GTK_STOCK_SAVE_AS }, |
| 3043 |
3102 |
| 3044 { "/Conversation/sep1", NULL, NULL, 0, "<Separator>" }, |
3103 { "/Conversation/sep1", NULL, NULL, 0, "<Separator>" }, |
| 3599 GTK_SHADOW_IN); |
3658 GTK_SHADOW_IN); |
| 3600 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); |
3659 gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); |
| 3601 gtk_widget_show(sw); |
3660 gtk_widget_show(sw); |
| 3602 |
3661 |
| 3603 gtkconv->entry = gtk_imhtml_new(NULL, NULL); |
3662 gtkconv->entry = gtk_imhtml_new(NULL, NULL); |
| 3604 gtkconv->entry_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); |
3663 gtkconv->entry_buffer = |
| |
3664 gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); |
| 3605 gaim_setup_imhtml(gtkconv->entry); |
3665 gaim_setup_imhtml(gtkconv->entry); |
| 3606 gtk_imhtml_set_editable(GTK_IMHTML(gtkconv->entry), TRUE); |
3666 gtk_imhtml_set_editable(GTK_IMHTML(gtkconv->entry), TRUE); |
| 3607 default_formatize(conv); |
3667 default_formatize(conv); |
| 3608 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(gtkconv->entry), GTK_WRAP_WORD_CHAR); |
3668 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(gtkconv->entry), |
| |
3669 GTK_WRAP_WORD_CHAR); |
| 3609 gtk_widget_set_size_request(gtkconv->entry, -1, |
3670 gtk_widget_set_size_request(gtkconv->entry, -1, |
| 3610 gaim_prefs_get_int("/gaim/gtk/conversations/chat/entry_height")); |
3671 gaim_prefs_get_int("/gaim/gtk/conversations/chat/entry_height")); |
| 3611 g_object_set_data(G_OBJECT(gtkconv->entry_buffer), "user_data", conv); |
3672 g_object_set_data(G_OBJECT(gtkconv->entry_buffer), "user_data", conv); |
| 3612 |
3673 |
| 3613 g_signal_connect(G_OBJECT(gtkconv->entry), "key_press_event", |
3674 g_signal_connect(G_OBJECT(gtkconv->entry), "key_press_event", |
| 3615 g_signal_connect_after(G_OBJECT(gtkconv->entry), "button_press_event", |
3676 g_signal_connect_after(G_OBJECT(gtkconv->entry), "button_press_event", |
| 3616 G_CALLBACK(entry_stop_rclick_cb), NULL); |
3677 G_CALLBACK(entry_stop_rclick_cb), NULL); |
| 3617 |
3678 |
| 3618 if (gaim_prefs_get_bool("/gaim/gtk/conversations/spellcheck")) |
3679 if (gaim_prefs_get_bool("/gaim/gtk/conversations/spellcheck")) |
| 3619 gaim_gtk_setup_gtkspell(GTK_TEXT_VIEW(gtkconv->entry)); |
3680 gaim_gtk_setup_gtkspell(GTK_TEXT_VIEW(gtkconv->entry)); |
| 3620 gtk_imhtmltoolbar_attach(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), gtkconv->entry); |
3681 gtk_imhtmltoolbar_attach(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), |
| |
3682 gtkconv->entry); |
| 3621 |
3683 |
| 3622 gtk_container_add(GTK_CONTAINER(sw), GTK_WIDGET(gtkconv->entry)); |
3684 gtk_container_add(GTK_CONTAINER(sw), GTK_WIDGET(gtkconv->entry)); |
| 3623 gtk_widget_show(gtkconv->entry); |
3685 gtk_widget_show(gtkconv->entry); |
| 3624 |
3686 |
| 3625 /* Setup the bottom button box. */ |
3687 /* Setup the bottom button box. */ |
| 3694 gtkconv->toolbar = gtk_imhtmltoolbar_new(); |
3756 gtkconv->toolbar = gtk_imhtmltoolbar_new(); |
| 3695 gtk_box_pack_start(GTK_BOX(vbox2), gtkconv->toolbar, FALSE, FALSE, 0); |
3757 gtk_box_pack_start(GTK_BOX(vbox2), gtkconv->toolbar, FALSE, FALSE, 0); |
| 3696 |
3758 |
| 3697 /* Setup the entry widget. |
3759 /* Setup the entry widget. |
| 3698 * We never show the horizontal scrollbar because it was causing weird |
3760 * We never show the horizontal scrollbar because it was causing weird |
| 3699 * lockups when typing text just as you type the character that would |
3761 * lockups when typing text just as you type the character that would |
| 3700 * cause both scrollbars to appear. Definitely seems like a gtk bug. |
3762 * cause both scrollbars to appear. Definitely seems like a gtk bug. |
| 3701 */ |
3763 */ |
| 3702 sw = gtk_scrolled_window_new(NULL, NULL); |
3764 sw = gtk_scrolled_window_new(NULL, NULL); |
| 3703 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), |
3765 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), |
| 3704 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); |
3766 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); |
| 3706 GTK_SHADOW_IN); |
3768 GTK_SHADOW_IN); |
| 3707 gtk_box_pack_start(GTK_BOX(vbox2), sw, TRUE, TRUE, 0); |
3769 gtk_box_pack_start(GTK_BOX(vbox2), sw, TRUE, TRUE, 0); |
| 3708 gtk_widget_show(sw); |
3770 gtk_widget_show(sw); |
| 3709 |
3771 |
| 3710 gtkconv->entry = gtk_imhtml_new(NULL, NULL); |
3772 gtkconv->entry = gtk_imhtml_new(NULL, NULL); |
| 3711 gtkconv->entry_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); |
3773 gtkconv->entry_buffer = |
| |
3774 gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); |
| 3712 gaim_setup_imhtml(gtkconv->entry); |
3775 gaim_setup_imhtml(gtkconv->entry); |
| 3713 gtk_imhtml_set_editable(GTK_IMHTML(gtkconv->entry), TRUE); |
3776 gtk_imhtml_set_editable(GTK_IMHTML(gtkconv->entry), TRUE); |
| 3714 default_formatize(conv); |
3777 default_formatize(conv); |
| 3715 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(gtkconv->entry), GTK_WRAP_WORD_CHAR); |
3778 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(gtkconv->entry), |
| |
3779 GTK_WRAP_WORD_CHAR); |
| 3716 gtk_widget_set_size_request(gtkconv->entry, -1, |
3780 gtk_widget_set_size_request(gtkconv->entry, -1, |
| 3717 gaim_prefs_get_int("/gaim/gtk/conversations/im/entry_height")); |
3781 gaim_prefs_get_int("/gaim/gtk/conversations/im/entry_height")); |
| 3718 g_object_set_data(G_OBJECT(gtkconv->entry_buffer), "user_data", conv); |
3782 g_object_set_data(G_OBJECT(gtkconv->entry_buffer), "user_data", conv); |
| 3719 |
3783 |
| 3720 g_signal_connect(G_OBJECT(gtkconv->entry), "key_press_event", |
3784 g_signal_connect(G_OBJECT(gtkconv->entry), "key_press_event", |
| 4024 GDK_ACTION_COPY); |
4088 GDK_ACTION_COPY); |
| 4025 gtk_drag_dest_set(gtkconv->imhtml, |
4089 gtk_drag_dest_set(gtkconv->imhtml, |
| 4026 GTK_DEST_DEFAULT_MOTION | |
4090 GTK_DEST_DEFAULT_MOTION | |
| 4027 GTK_DEST_DEFAULT_DROP, |
4091 GTK_DEST_DEFAULT_DROP, |
| 4028 te, sizeof(te) / sizeof(GtkTargetEntry), |
4092 te, sizeof(te) / sizeof(GtkTargetEntry), |
| 4029 GDK_ACTION_DEFAULT | GDK_ACTION_COPY | GDK_ACTION_MOVE); |
4093 GDK_ACTION_DEFAULT | GDK_ACTION_COPY | |
| |
4094 GDK_ACTION_MOVE); |
| 4030 gtk_drag_dest_set(gtkconv->entry, |
4095 gtk_drag_dest_set(gtkconv->entry, |
| 4031 GTK_DEST_DEFAULT_MOTION | |
4096 GTK_DEST_DEFAULT_MOTION | |
| 4032 GTK_DEST_DEFAULT_DROP, |
4097 GTK_DEST_DEFAULT_DROP, |
| 4033 te, sizeof(te) / sizeof(GtkTargetEntry), |
4098 te, sizeof(te) / sizeof(GtkTargetEntry), |
| 4034 GDK_ACTION_COPY); |
4099 GDK_ACTION_COPY); |
| 4100 #endif |
4165 #endif |
| 4101 |
4166 |
| 4102 |
4167 |
| 4103 /* Pack it all together. */ |
4168 /* Pack it all together. */ |
| 4104 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->icon, FALSE, FALSE, 0); |
4169 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->icon, FALSE, FALSE, 0); |
| 4105 gtk_box_pack_start(GTK_BOX(menu_tabby), gtkconv->menu_icon, FALSE, FALSE, 0); |
4170 gtk_box_pack_start(GTK_BOX(menu_tabby), gtkconv->menu_icon, |
| 4106 if (gaim_prefs_get_bool("/gaim/gtk/conversations/icons_on_tabs")) { |
4171 FALSE, FALSE, 0); |
| |
4172 |
| |
4173 if (gaim_prefs_get_bool("/gaim/gtk/conversations/icons_on_tabs")) |
| |
4174 { |
| 4107 gtk_widget_show_all(gtkconv->icon); |
4175 gtk_widget_show_all(gtkconv->icon); |
| 4108 gtk_widget_show_all(gtkconv->menu_icon); |
4176 gtk_widget_show_all(gtkconv->menu_icon); |
| 4109 } |
4177 } |
| 4110 |
4178 |
| 4111 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->tab_label, TRUE, TRUE, 0); |
4179 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->tab_label, TRUE, TRUE, 0); |
| 4124 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM) |
4192 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM) |
| 4125 gaim_gtkconv_update_buddy_icon(conv); |
4193 gaim_gtkconv_update_buddy_icon(conv); |
| 4126 |
4194 |
| 4127 /* Add this pane to the conversations notebook. */ |
4195 /* Add this pane to the conversations notebook. */ |
| 4128 gtk_notebook_append_page(GTK_NOTEBOOK(gtkwin->notebook), tab_cont, tabby); |
4196 gtk_notebook_append_page(GTK_NOTEBOOK(gtkwin->notebook), tab_cont, tabby); |
| 4129 gtk_notebook_set_menu_label(GTK_NOTEBOOK(gtkwin->notebook), tab_cont, menu_tabby); |
4197 gtk_notebook_set_menu_label(GTK_NOTEBOOK(gtkwin->notebook), |
| |
4198 tab_cont, menu_tabby); |
| 4130 |
4199 |
| 4131 gtk_widget_show(tab_cont); |
4200 gtk_widget_show(tab_cont); |
| 4132 |
4201 |
| 4133 if (gaim_conv_window_get_conversation_count(win) == 1) { |
4202 if (gaim_conv_window_get_conversation_count(win) == 1) { |
| 4134 /* Er, bug in notebooks? Switch to the page manually. */ |
4203 /* Er, bug in notebooks? Switch to the page manually. */ |
| 4420 |
4489 |
| 4421 g_snprintf(buf2, sizeof(buf2), |
4490 g_snprintf(buf2, sizeof(buf2), |
| 4422 "<FONT %s><FONT SIZE=\2\"><!--(%s) --></FONT><B>%s</B></FONT><BR>", |
4491 "<FONT %s><FONT SIZE=\2\"><!--(%s) --></FONT><B>%s</B></FONT><BR>", |
| 4423 sml_attrib, mdate, message); |
4492 sml_attrib, mdate, message); |
| 4424 |
4493 |
| 4425 gtk_imhtml_append_text_with_images(GTK_IMHTML(gtkconv->imhtml), buf2, 0, images); |
4494 gtk_imhtml_append_text_with_images(GTK_IMHTML(gtkconv->imhtml), |
| |
4495 buf2, 0, images); |
| 4426 |
4496 |
| 4427 /* Add the message to a conversations scrollback buffer */ |
4497 /* Add the message to a conversations scrollback buffer */ |
| 4428 conv->history = g_string_append(conv->history, buf); |
4498 conv->history = g_string_append(conv->history, buf); |
| 4429 conv->history = g_string_append(conv->history, "<BR>\n"); |
4499 conv->history = g_string_append(conv->history, "<BR>\n"); |
| 4430 |
4500 |
| 4431 } else if (flags & GAIM_MESSAGE_NO_LOG) { |
4501 } else if (flags & GAIM_MESSAGE_NO_LOG) { |
| 4432 g_snprintf(buf, BUF_LONG, |
4502 g_snprintf(buf, BUF_LONG, |
| 4433 "<B><FONT %s COLOR=\"#777777\">%s</FONT></B><BR>", |
4503 "<B><FONT %s COLOR=\"#777777\">%s</FONT></B><BR>", |
| 4434 sml_attrib, message); |
4504 sml_attrib, message); |
| 4435 |
4505 |
| 4436 gtk_imhtml_append_text_with_images(GTK_IMHTML(gtkconv->imhtml), buf, 0, images); |
4506 gtk_imhtml_append_text_with_images(GTK_IMHTML(gtkconv->imhtml), |
| |
4507 buf, 0, images); |
| 4437 } |
4508 } |
| 4438 else { |
4509 else { |
| 4439 char *new_message = g_memdup(message, length); |
4510 char *new_message = g_memdup(message, length); |
| 4440 |
4511 |
| 4441 if (flags & GAIM_MESSAGE_WHISPER) { |
4512 if (flags & GAIM_MESSAGE_WHISPER) { |
| 4998 gtkconv->u.im->animate = gaim_prefs_get_bool("/gaim/gtk/conversations/im/animate_buddy_icons"); |
5070 gtkconv->u.im->animate = gaim_prefs_get_bool("/gaim/gtk/conversations/im/animate_buddy_icons"); |
| 4999 |
5071 |
| 5000 if((buddy = gaim_find_buddy(gaim_conversation_get_account(conv), |
5072 if((buddy = gaim_find_buddy(gaim_conversation_get_account(conv), |
| 5001 gaim_conversation_get_name(conv))) != NULL) { |
5073 gaim_conversation_get_name(conv))) != NULL) { |
| 5002 const char *iconfile; |
5074 const char *iconfile; |
| 5003 if((iconfile = gaim_blist_node_get_string((GaimBlistNode*)buddy, "buddy_icon"))) { |
5075 if((iconfile = gaim_blist_node_get_string((GaimBlistNode*)buddy, |
| |
5076 "buddy_icon"))) { |
| 5004 GaimBuddyIcon *icon = gaim_conv_im_get_icon(GAIM_CONV_IM(conv)); |
5077 GaimBuddyIcon *icon = gaim_conv_im_get_icon(GAIM_CONV_IM(conv)); |
| 5005 struct stat st; |
5078 struct stat st; |
| 5006 if ((icon == NULL) && (!stat(iconfile, &st))) { |
5079 if ((icon == NULL) && (!stat(iconfile, &st))) { |
| 5007 FILE *file = fopen(iconfile, "rb"); |
5080 FILE *file = fopen(iconfile, "rb"); |
| 5008 if (file) { |
5081 if (file) { |