| 189 } |
181 } |
| 190 else |
182 else |
| 191 do_save_convo(wid); |
183 do_save_convo(wid); |
| 192 } |
184 } |
| 193 |
185 |
| 194 static void |
|
| 195 do_insert_image_cb(GtkWidget *widget, int resp, gpointer data) |
|
| 196 { |
|
| 197 GaimConversation *conv = data; |
|
| 198 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); |
|
| 199 GaimConvIm *im = GAIM_CONV_IM(conv); |
|
| 200 char *name, *filename; |
|
| 201 char *buf, *filedata; |
|
| 202 size_t size; |
|
| 203 GError *error = NULL; |
|
| 204 int id; |
|
| 205 |
|
| 206 if (resp != GTK_RESPONSE_OK) { |
|
| 207 set_toggle(gtkconv->toolbar.image, FALSE); |
|
| 208 return; |
|
| 209 } |
|
| 210 |
|
| 211 name = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(widget))); |
|
| 212 |
|
| 213 if (!name) { |
|
| 214 set_toggle(gtkconv->toolbar.image, FALSE); |
|
| 215 return; |
|
| 216 } |
|
| 217 |
|
| 218 if (gaim_gtk_check_if_dir(name, GTK_FILE_SELECTION(widget))) { |
|
| 219 g_free(name); |
|
| 220 set_toggle(gtkconv->toolbar.image, FALSE); |
|
| 221 return; |
|
| 222 } |
|
| 223 |
|
| 224 set_toggle(gtkconv->toolbar.image, FALSE); |
|
| 225 |
|
| 226 if (!g_file_get_contents(name, &filedata, &size, &error)) { |
|
| 227 gaim_notify_error(NULL, NULL, error->message, NULL); |
|
| 228 |
|
| 229 g_error_free(error); |
|
| 230 g_free(name); |
|
| 231 |
|
| 232 return; |
|
| 233 } |
|
| 234 |
|
| 235 filename = name; |
|
| 236 while (strchr(filename, '/')) |
|
| 237 filename = strchr(filename, '/') + 1; |
|
| 238 |
|
| 239 id = gaim_imgstore_add(filedata, size, filename); |
|
| 240 g_free(filedata); |
|
| 241 |
|
| 242 if (!id) { |
|
| 243 buf = g_strdup_printf(_("Failed to store image: %s\n"), name); |
|
| 244 gaim_notify_error(NULL, NULL, buf, NULL); |
|
| 245 |
|
| 246 g_free(buf); |
|
| 247 g_free(name); |
|
| 248 |
|
| 249 return; |
|
| 250 } |
|
| 251 |
|
| 252 im->images = g_slist_append(im->images, GINT_TO_POINTER(id)); |
|
| 253 |
|
| 254 buf = g_strdup_printf("<IMG ID=\"%d\" SRC=\"file://%s\">", id, filename); |
|
| 255 gtk_text_buffer_insert_at_cursor(GTK_TEXT_BUFFER(gtkconv->entry_buffer), buf, -1); |
|
| 256 g_free(buf); |
|
| 257 |
|
| 258 g_free(name); |
|
| 259 } |
|
| 260 |
186 |
| 261 static gint |
187 static gint |
| 262 close_win_cb(GtkWidget *w, GdkEventAny *e, gpointer d) |
188 close_win_cb(GtkWidget *w, GdkEventAny *e, gpointer d) |
| 263 { |
189 { |
| 264 GaimConvWindow *win = (GaimConvWindow *)d; |
190 GaimConvWindow *win = (GaimConvWindow *)d; |
| 282 static void |
208 static void |
| 283 tab_close_button_state_changed_cb(GtkWidget *widget, GtkStateType prev_state) |
209 tab_close_button_state_changed_cb(GtkWidget *widget, GtkStateType prev_state) |
| 284 { |
210 { |
| 285 if (GTK_WIDGET_STATE(widget) == GTK_STATE_ACTIVE) |
211 if (GTK_WIDGET_STATE(widget) == GTK_STATE_ACTIVE) |
| 286 gtk_widget_set_state(widget, GTK_STATE_NORMAL); |
212 gtk_widget_set_state(widget, GTK_STATE_NORMAL); |
| 287 } |
|
| 288 |
|
| 289 static void |
|
| 290 insert_image_cb(GtkWidget *save, GaimConversation *conv) |
|
| 291 { |
|
| 292 GaimGtkConversation *gtkconv; |
|
| 293 char buf[BUF_LONG]; |
|
| 294 GtkWidget *window; |
|
| 295 |
|
| 296 gtkconv = GAIM_GTK_CONVERSATION(conv); |
|
| 297 |
|
| 298 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtkconv->toolbar.image))) { |
|
| 299 window = gtk_file_selection_new(_("Insert Image")); |
|
| 300 g_snprintf(buf, sizeof(buf), "%s" G_DIR_SEPARATOR_S, gaim_home_dir()); |
|
| 301 gtk_file_selection_set_filename(GTK_FILE_SELECTION(window), buf); |
|
| 302 |
|
| 303 gtk_dialog_set_default_response(GTK_DIALOG(window), GTK_RESPONSE_OK); |
|
| 304 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(window)), |
|
| 305 "response", G_CALLBACK(do_insert_image_cb), conv); |
|
| 306 |
|
| 307 gtk_widget_show(window); |
|
| 308 gtkconv->dialogs.image = window; |
|
| 309 } else { |
|
| 310 gtk_widget_destroy(gtkconv->dialogs.image); |
|
| 311 gtkconv->dialogs.image = NULL; |
|
| 312 } |
|
| 313 } |
|
| 314 |
|
| 315 static void |
|
| 316 do_insert_link_cb(GaimConversation *conv, GaimRequestFields *fields) |
|
| 317 { |
|
| 318 GaimGtkConversation *gtkconv; |
|
| 319 const char *url, *description; |
|
| 320 |
|
| 321 gtkconv = GAIM_GTK_CONVERSATION(conv); |
|
| 322 |
|
| 323 url = gaim_request_fields_get_string(fields, "url"); |
|
| 324 description = gaim_request_fields_get_string(fields, "description"); |
|
| 325 |
|
| 326 if (description == NULL) |
|
| 327 description = url; |
|
| 328 |
|
| 329 gtk_imhtml_insert_link(GTK_IMHTML(gtkconv->entry), url, description); |
|
| 330 gaim_gtk_advance_past(gtkconv, "<A HREF>", "</A>"); |
|
| 331 |
|
| 332 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtkconv->toolbar.link), |
|
| 333 FALSE); |
|
| 334 |
|
| 335 gtkconv->dialogs.link = NULL; |
|
| 336 } |
|
| 337 |
|
| 338 static void |
|
| 339 cancel_link_cb(GaimConversation *conv, GaimRequestFields *fields) |
|
| 340 { |
|
| 341 GAIM_GTK_CONVERSATION(conv)->dialogs.link = NULL; |
|
| 342 } |
|
| 343 |
|
| 344 static void |
|
| 345 show_link_dialog(GaimConversation *conv) |
|
| 346 { |
|
| 347 GaimGtkConversation *gtkconv; |
|
| 348 GaimRequestFields *fields; |
|
| 349 GaimRequestFieldGroup *group; |
|
| 350 GaimRequestField *field; |
|
| 351 |
|
| 352 gtkconv = GAIM_GTK_CONVERSATION(conv); |
|
| 353 |
|
| 354 fields = gaim_request_fields_new(); |
|
| 355 |
|
| 356 group = gaim_request_field_group_new(NULL); |
|
| 357 gaim_request_fields_add_group(fields, group); |
|
| 358 |
|
| 359 field = gaim_request_field_string_new("url", _("_URL"), NULL, FALSE); |
|
| 360 gaim_request_field_set_required(field, TRUE); |
|
| 361 gaim_request_field_group_add_field(group, field); |
|
| 362 |
|
| 363 field = gaim_request_field_string_new("description", _("_Description"), |
|
| 364 NULL, FALSE); |
|
| 365 gaim_request_field_group_add_field(group, field); |
|
| 366 |
|
| 367 gtkconv->dialogs.link = |
|
| 368 gaim_request_fields(conv, _("Insert Link"), |
|
| 369 NULL, |
|
| 370 _("Please enter the URL and description of the " |
|
| 371 "link that you want to insert. The description " |
|
| 372 "is optional."), |
|
| 373 fields, |
|
| 374 _("_Insert"), G_CALLBACK(do_insert_link_cb), |
|
| 375 _("Cancel"), G_CALLBACK(cancel_link_cb), |
|
| 376 conv); |
|
| 377 } |
|
| 378 |
|
| 379 static void |
|
| 380 close_link_dialog(GaimConversation *conv) |
|
| 381 { |
|
| 382 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); |
|
| 383 |
|
| 384 if (gtkconv->dialogs.link != NULL) |
|
| 385 { |
|
| 386 gaim_request_close(GAIM_REQUEST_FIELDS, gtkconv->dialogs.link); |
|
| 387 |
|
| 388 gtkconv->dialogs.link = NULL; |
|
| 389 } |
|
| 390 } |
|
| 391 |
|
| 392 static void |
|
| 393 insert_link_cb(GtkWidget *w, GaimConversation *conv) |
|
| 394 { |
|
| 395 GaimGtkConversation *gtkconv; |
|
| 396 |
|
| 397 gtkconv = GAIM_GTK_CONVERSATION(conv); |
|
| 398 |
|
| 399 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtkconv->toolbar.link))) |
|
| 400 show_link_dialog(conv); |
|
| 401 else |
|
| 402 close_link_dialog(conv); |
|
| 403 |
|
| 404 gtk_widget_grab_focus(gtkconv->entry); |
|
| 405 } |
|
| 406 |
|
| 407 static void |
|
| 408 insert_smiley_cb(GtkWidget *smiley, GaimConversation *conv) |
|
| 409 { |
|
| 410 GaimGtkConversation *gtkconv; |
|
| 411 |
|
| 412 gtkconv = GAIM_GTK_CONVERSATION(conv); |
|
| 413 |
|
| 414 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(smiley))) |
|
| 415 show_smiley_dialog(conv, smiley); |
|
| 416 else if (gtkconv->dialogs.smiley) |
|
| 417 close_smiley_dialog(smiley, conv); |
|
| 418 |
|
| 419 gtk_widget_grab_focus(gtkconv->entry); |
|
| 420 } |
213 } |
| 421 |
214 |
| 422 static void default_formatize(GaimConversation *conv) { |
215 static void default_formatize(GaimConversation *conv) { |
| 423 GaimGtkConversation *c = GAIM_GTK_CONVERSATION(conv); |
216 GaimGtkConversation *c = GAIM_GTK_CONVERSATION(conv); |
| 424 GaimConnection *gc = gaim_conversation_get_gc(conv); |
217 GaimConnection *gc = gaim_conversation_get_gc(conv); |
| 1530 return TRUE; |
1323 return TRUE; |
| 1531 break; |
1324 break; |
| 1532 |
1325 |
| 1533 } /* End of switch */ |
1326 } /* End of switch */ |
| 1534 |
1327 |
| 1535 if (gaim_prefs_get_bool("/gaim/gtk/conversations/html_shortcuts")) { |
1328 /* if (gaim_prefs_get_bool("/gaim/gtk/conversations/html_shortcuts")) { |
| 1536 switch (event->keyval) { |
1329 switch (event->keyval) { |
| 1537 case 'b': /* ctrl-b is GDK_Left, which moves backwards. */ |
1330 |
| 1538 case 'B': |
1331 |
| 1539 set_toggle(gtkconv->toolbar.bold, |
|
| 1540 !gtk_toggle_button_get_active( |
|
| 1541 GTK_TOGGLE_BUTTON(gtkconv->toolbar.bold))); |
|
| 1542 |
|
| 1543 return TRUE; |
|
| 1544 break; |
|
| 1545 |
|
| 1546 case 'f': |
|
| 1547 case 'F': |
|
| 1548 set_toggle(gtkconv->toolbar.font, |
|
| 1549 !gtk_toggle_button_get_active( |
|
| 1550 GTK_TOGGLE_BUTTON(gtkconv->toolbar.font))); |
|
| 1551 |
|
| 1552 return TRUE; |
|
| 1553 break; |
|
| 1554 |
|
| 1555 case 'i': |
|
| 1556 case 'I': |
|
| 1557 set_toggle(gtkconv->toolbar.italic, |
|
| 1558 !gtk_toggle_button_get_active( |
|
| 1559 GTK_TOGGLE_BUTTON(gtkconv->toolbar.italic))); |
|
| 1560 |
|
| 1561 return TRUE; |
|
| 1562 break; |
|
| 1563 |
|
| 1564 case 'u': /* ctrl-u is GDK_Clear, which clears the line. */ |
|
| 1565 case 'U': |
|
| 1566 set_toggle(gtkconv->toolbar.underline, |
|
| 1567 !gtk_toggle_button_get_active( |
|
| 1568 GTK_TOGGLE_BUTTON(gtkconv->toolbar.underline))); |
|
| 1569 |
|
| 1570 return TRUE; |
|
| 1571 break; |
|
| 1572 |
|
| 1573 case '-': |
|
| 1574 set_toggle(gtkconv->toolbar.smaller_size, |
|
| 1575 !gtk_toggle_button_get_active( |
|
| 1576 GTK_TOGGLE_BUTTON(gtkconv->toolbar.smaller_size))); |
|
| 1577 |
|
| 1578 return TRUE; |
|
| 1579 break; |
|
| 1580 |
|
| 1581 case '=': |
|
| 1582 case '+': |
|
| 1583 set_toggle(gtkconv->toolbar.larger_size, |
|
| 1584 !gtk_toggle_button_get_active( |
|
| 1585 GTK_TOGGLE_BUTTON(gtkconv->toolbar.larger_size))); |
|
| 1586 |
|
| 1587 return TRUE; |
|
| 1588 break; |
|
| 1589 |
|
| 1590 #if 0 |
|
| 1591 case '0': |
|
| 1592 set_toggle(gtkconv->toolbar.normal_size, |
|
| 1593 !gtk_toggle_button_get_active( |
|
| 1594 GTK_TOGGLE_BUTTON(gtkconv->toolbar.normal_size))); |
|
| 1595 |
|
| 1596 return TRUE; |
|
| 1597 break; |
|
| 1598 #endif |
|
| 1599 } |
1332 } |
| 1600 } /* End of switch */ |
1333 } */ /* End of switch */ |
| 1601 |
1334 |
| 1602 if (gaim_prefs_get_bool("/gaim/gtk/conversations/smiley_shortcuts")) { |
1335 /* if (gaim_prefs_get_bool("/gaim/gtk/conversations/smiley_shortcuts")) { |
| 1603 char buf[7]; |
1336 char buf[7]; |
| 1604 |
1337 |
| 1605 *buf = '\0'; |
1338 *buf = '\0'; |
| 1606 |
1339 |
| 1607 switch (event->keyval) { |
1340 switch (event->keyval) { |
| 1608 case '1': strcpy(buf, ":-)"); break; |
1341 |
| 1609 case '2': strcpy(buf, ":-("); break; |
|
| 1610 case '3': strcpy(buf, ";-)"); break; |
|
| 1611 case '4': strcpy(buf, ":-P"); break; |
|
| 1612 case '5': strcpy(buf, "=-O"); break; |
|
| 1613 case '6': strcpy(buf, ":-*"); break; |
|
| 1614 case '7': strcpy(buf, ">:o"); break; |
|
| 1615 case '8': strcpy(buf, "8-)"); break; |
|
| 1616 case '!': strcpy(buf, ":-$"); break; |
|
| 1617 case '@': strcpy(buf, ":-!"); break; |
|
| 1618 case '#': strcpy(buf, ":-["); break; |
|
| 1619 case '$': strcpy(buf, "O:-)"); break; |
|
| 1620 case '%': strcpy(buf, ":-/"); break; |
|
| 1621 case '^': strcpy(buf, ":'("); break; |
|
| 1622 case '&': strcpy(buf, ":-X"); break; |
|
| 1623 case '*': strcpy(buf, ":-D"); break; |
|
| 1624 } |
1342 } |
| 1625 |
1343 |
| 1626 if (*buf) { |
1344 |
| 1627 gtk_imhtml_insert_smiley(GTK_IMHTML(gtkconv->entry), conv->account->protocol_id, buf); |
1345 }*/ |
| 1628 return TRUE; |
|
| 1629 } |
|
| 1630 } |
|
| 1631 |
1346 |
| 1632 } else |
1347 } else |
| 1633 |
1348 |
| 1634 /* If ALT (or whatever) was held down... */ |
1349 /* If ALT (or whatever) was held down... */ |
| 1635 if (event->state & GDK_MOD1_MASK) { |
1350 if (event->state & GDK_MOD1_MASK) { |
| 2564 gtk_widget_set_sensitive(gtkconv->u.chat->invite, |
2279 gtk_widget_set_sensitive(gtkconv->u.chat->invite, |
| 2565 (prpl_info->chat_invite != NULL)); |
2280 (prpl_info->chat_invite != NULL)); |
| 2566 } |
2281 } |
| 2567 |
2282 |
| 2568 /* Deal with the toolbar */ |
2283 /* Deal with the toolbar */ |
| 2569 gtk_widget_set_sensitive(gtkconv->toolbar.link, TRUE); |
2284 /*gtk_widget_set_sensitive(gtkconv->toolbar.link, TRUE); |
| 2570 gtk_widget_set_sensitive(gtkconv->toolbar.image, |
2285 gtk_widget_set_sensitive(gtkconv->toolbar.image, |
| 2571 (prpl_info->options & OPT_PROTO_IM_IMAGE)); |
2286 (prpl_info->options & OPT_PROTO_IM_IMAGE)); |
| 2572 gtk_widget_set_sensitive(gtkconv->toolbar.bgcolor, |
2287 gtk_widget_set_sensitive(gtkconv->toolbar.bgcolor, |
| 2573 !(gc->flags & GAIM_CONNECTION_NO_BGCOLOR)); |
2288 !(gc->flags & GAIM_CONNECTION_NO_BGCOLOR)); |
| 2574 |
2289 |
| 2575 /* Deal with menu items */ |
2290 /* Deal with menu items |
| 2576 gtk_widget_set_sensitive(gtkwin->menu.view_log, TRUE); |
2291 gtk_widget_set_sensitive(gtkwin->menu.view_log, TRUE); |
| 2577 gtk_widget_set_sensitive(gtkwin->menu.add_pounce, TRUE); |
2292 gtk_widget_set_sensitive(gtkwin->menu.add_pounce, TRUE); |
| 2578 gtk_widget_set_sensitive(gtkwin->menu.get_info, (prpl_info->get_info != NULL)); |
2293 gtk_widget_set_sensitive(gtkwin->menu.get_info, (prpl_info->get_info != NULL)); |
| 2579 gtk_widget_set_sensitive(gtkwin->menu.warn, (prpl_info->warn != NULL)); |
2294 gtk_widget_set_sensitive(gtkwin->menu.warn, (prpl_info->warn != NULL)); |
| 2580 gtk_widget_set_sensitive(gtkwin->menu.invite, |
2295 gtk_widget_set_sensitive(gtkwin->menu.invite, |
| 2581 (prpl_info->chat_invite != NULL)); |
2296 (prpl_info->chat_invite != NULL)); |
| 2582 |
2297 */ |
| 2583 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM) { |
2298 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM) { |
| 2584 if (gaim_find_buddy(gaim_conversation_get_account(conv), |
2299 if (gaim_find_buddy(gaim_conversation_get_account(conv), |
| 2585 gaim_conversation_get_name(conv)) == NULL) |
2300 gaim_conversation_get_name(conv)) == NULL) |
| 2586 gtk_widget_set_sensitive(gtkwin->menu.alias, FALSE); |
2301 gtk_widget_set_sensitive(gtkwin->menu.alias, FALSE); |
| 2587 else |
2302 else |
| 2717 } |
2432 } |
| 2718 |
2433 |
| 2719 /************************************************************************** |
2434 /************************************************************************** |
| 2720 * Utility functions |
2435 * Utility functions |
| 2721 **************************************************************************/ |
2436 **************************************************************************/ |
| 2722 static void |
|
| 2723 do_bold(GtkWidget *bold, GaimGtkConversation *gtkconv) |
|
| 2724 { |
|
| 2725 gtk_imhtml_toggle_bold(GTK_IMHTML(gtkconv->entry)); |
|
| 2726 gtk_widget_grab_focus(gtkconv->entry); |
|
| 2727 } |
|
| 2728 |
|
| 2729 static void |
|
| 2730 do_italic(GtkWidget *italic, GaimGtkConversation *gtkconv) |
|
| 2731 { |
|
| 2732 gtk_imhtml_toggle_italic(GTK_IMHTML(gtkconv->entry)); |
|
| 2733 gtk_widget_grab_focus(gtkconv->entry); |
|
| 2734 } |
|
| 2735 |
|
| 2736 static void |
|
| 2737 do_underline(GtkWidget *underline, GaimGtkConversation *gtkconv) |
|
| 2738 { |
|
| 2739 gtk_imhtml_toggle_underline(GTK_IMHTML(gtkconv->entry)); |
|
| 2740 gtk_widget_grab_focus(gtkconv->entry); |
|
| 2741 } |
|
| 2742 |
|
| 2743 static void |
|
| 2744 do_small(GtkWidget *smalltb, GaimGtkConversation *gtkconv) |
|
| 2745 { |
|
| 2746 gtk_imhtml_font_shrink(GTK_IMHTML(gtkconv->entry)); |
|
| 2747 gtk_widget_grab_focus(gtkconv->entry); |
|
| 2748 } |
|
| 2749 |
|
| 2750 static void |
|
| 2751 do_big(GtkWidget *large, GaimGtkConversation *gtkconv) |
|
| 2752 { |
|
| 2753 gtk_imhtml_font_grow(GTK_IMHTML(gtkconv->entry)); |
|
| 2754 gtk_widget_grab_focus(gtkconv->entry); |
|
| 2755 } |
|
| 2756 |
|
| 2757 static void |
|
| 2758 toggle_font(GtkWidget *font, GaimConversation *conv) |
|
| 2759 { |
|
| 2760 GaimGtkConversation *gtkconv; |
|
| 2761 |
|
| 2762 gtkconv = GAIM_GTK_CONVERSATION(conv); |
|
| 2763 |
|
| 2764 show_font_dialog(conv, font); |
|
| 2765 } |
|
| 2766 |
|
| 2767 static void |
|
| 2768 toggle_fg_color(GtkWidget *color, GaimConversation *conv) |
|
| 2769 { |
|
| 2770 GaimGtkConversation *gtkconv; |
|
| 2771 |
|
| 2772 gtkconv = GAIM_GTK_CONVERSATION(conv); |
|
| 2773 |
|
| 2774 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(color))) |
|
| 2775 show_fgcolor_dialog(conv, color); |
|
| 2776 else if (gtkconv->dialogs.fg_color != NULL) |
|
| 2777 cancel_fgcolor(color, conv); |
|
| 2778 else |
|
| 2779 gaim_gtk_advance_past(gtkconv, "<FONT COLOR>", "</FONT>"); |
|
| 2780 } |
|
| 2781 |
|
| 2782 static void |
|
| 2783 toggle_bg_color(GtkWidget *color, GaimConversation *conv) |
|
| 2784 { |
|
| 2785 GaimGtkConversation *gtkconv; |
|
| 2786 |
|
| 2787 gtkconv = GAIM_GTK_CONVERSATION(conv); |
|
| 2788 |
|
| 2789 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(color))) |
|
| 2790 show_bgcolor_dialog(conv, color); |
|
| 2791 else if (gtkconv->dialogs.bg_color != NULL) |
|
| 2792 cancel_bgcolor(color, conv); |
|
| 2793 else |
|
| 2794 gaim_gtk_advance_past(gtkconv, "<BODY BGCOLOR>", "</BODY>"); |
|
| 2795 } |
|
| 2796 |
|
| 2797 static void |
|
| 2798 set_toggle(GtkWidget *tb, gboolean active) |
|
| 2799 { |
|
| 2800 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tb), active); |
|
| 2801 } |
|
| 2802 |
2437 |
| 2803 static void |
2438 static void |
| 2804 got_typing_keypress(GaimConversation *conv, gboolean first) |
2439 got_typing_keypress(GaimConversation *conv, gboolean first) |
| 2805 { |
2440 { |
| 2806 GaimConvIm *im; |
2441 GaimConvIm *im; |
| 3436 { N_("/Conversation/_Remove..."), NULL, menu_add_remove_cb, 0, |
3071 { N_("/Conversation/_Remove..."), NULL, menu_add_remove_cb, 0, |
| 3437 "<StockItem>", GTK_STOCK_REMOVE }, |
3072 "<StockItem>", GTK_STOCK_REMOVE }, |
| 3438 |
3073 |
| 3439 { "/Conversation/sep3", NULL, NULL, 0, "<Separator>" }, |
3074 { "/Conversation/sep3", NULL, NULL, 0, "<Separator>" }, |
| 3440 |
3075 |
| 3441 { N_("/Conversation/Insert Lin_k..."), NULL, menu_insert_link_cb, 0, |
3076 { N_("/Conversation/Insert Lin_k..."), NULL, NULL, 0, //menu_insert_link_cb, 0, |
| 3442 "<StockItem>", GAIM_STOCK_LINK }, |
3077 "<StockItem>", GAIM_STOCK_LINK }, |
| 3443 { N_("/Conversation/Insert Imag_e..."), NULL, menu_insert_image_cb, 0, |
3078 { N_("/Conversation/Insert Imag_e..."), NULL, NULL, 0, //menu_insert_image_cb, 0, |
| 3444 "<StockItem>", GAIM_STOCK_IMAGE }, |
3079 "<StockItem>", GAIM_STOCK_IMAGE }, |
| 3445 |
3080 |
| 3446 { "/Conversation/sep4", NULL, NULL, 0, "<Separator>" }, |
3081 { "/Conversation/sep4", NULL, NULL, 0, "<Separator>" }, |
| 3447 |
3082 |
| 3448 { N_("/Conversation/_Close"), NULL, menu_close_conv_cb, 0, |
3083 { N_("/Conversation/_Close"), NULL, menu_close_conv_cb, 0, |
| 3736 G_CALLBACK(add_remove_cb), conv); |
3371 G_CALLBACK(add_remove_cb), conv); |
| 3737 g_signal_connect(G_OBJECT(gtkconv->send), "clicked", |
3372 g_signal_connect(G_OBJECT(gtkconv->send), "clicked", |
| 3738 G_CALLBACK(send_cb), conv); |
3373 G_CALLBACK(send_cb), conv); |
| 3739 } |
3374 } |
| 3740 |
3375 |
| 3741 static GtkWidget * |
|
| 3742 build_conv_toolbar(GaimConversation *conv) |
|
| 3743 { |
|
| 3744 GaimGtkConversation *gtkconv; |
|
| 3745 GtkWidget *vbox; |
|
| 3746 GtkWidget *hbox; |
|
| 3747 GtkWidget *button; |
|
| 3748 GtkWidget *sep; |
|
| 3749 GtkSizeGroup *sg; |
|
| 3750 |
|
| 3751 gtkconv = GAIM_GTK_CONVERSATION(conv); |
|
| 3752 |
|
| 3753 sg = gtk_size_group_new(GTK_SIZE_GROUP_BOTH); |
|
| 3754 |
|
| 3755 vbox = gtk_vbox_new(FALSE, 0); |
|
| 3756 sep = gtk_hseparator_new(); |
|
| 3757 gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); |
|
| 3758 |
|
| 3759 hbox = gtk_hbox_new(FALSE, 6); |
|
| 3760 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); |
|
| 3761 |
|
| 3762 /* Bold */ |
|
| 3763 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_BOLD); |
|
| 3764 gtk_size_group_add_widget(sg, button); |
|
| 3765 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
|
| 3766 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("Bold"), NULL); |
|
| 3767 |
|
| 3768 g_signal_connect(G_OBJECT(button), "clicked", |
|
| 3769 G_CALLBACK(do_bold), gtkconv); |
|
| 3770 |
|
| 3771 gtkconv->toolbar.bold = button; |
|
| 3772 |
|
| 3773 /* Italic */ |
|
| 3774 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_ITALIC); |
|
| 3775 gtk_size_group_add_widget(sg, button); |
|
| 3776 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
|
| 3777 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("Italic"), NULL); |
|
| 3778 |
|
| 3779 g_signal_connect(G_OBJECT(button), "clicked", |
|
| 3780 G_CALLBACK(do_italic), gtkconv); |
|
| 3781 |
|
| 3782 gtkconv->toolbar.italic = button; |
|
| 3783 |
|
| 3784 /* Underline */ |
|
| 3785 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_UNDERLINE); |
|
| 3786 gtk_size_group_add_widget(sg, button); |
|
| 3787 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
|
| 3788 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("Underline"), NULL); |
|
| 3789 |
|
| 3790 g_signal_connect(G_OBJECT(button), "clicked", |
|
| 3791 G_CALLBACK(do_underline), gtkconv); |
|
| 3792 |
|
| 3793 gtkconv->toolbar.underline = button; |
|
| 3794 |
|
| 3795 /* Sep */ |
|
| 3796 sep = gtk_vseparator_new(); |
|
| 3797 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); |
|
| 3798 |
|
| 3799 /* Increase font size */ |
|
| 3800 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_TEXT_BIGGER); |
|
| 3801 gtk_size_group_add_widget(sg, button); |
|
| 3802 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
|
| 3803 gtk_tooltips_set_tip(gtkconv->tooltips, button, |
|
| 3804 _("Larger font size"), NULL); |
|
| 3805 |
|
| 3806 g_signal_connect(G_OBJECT(button), "clicked", |
|
| 3807 G_CALLBACK(do_big), gtkconv); |
|
| 3808 |
|
| 3809 gtkconv->toolbar.larger_size = button; |
|
| 3810 |
|
| 3811 /* Normal font size |
|
| 3812 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_TEXT_NORMAL); |
|
| 3813 gtk_size_group_add_widget(sg, button); |
|
| 3814 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
|
| 3815 gtk_tooltips_set_tip(gtkconv->tooltips, button, |
|
| 3816 _("Normal font size"), NULL); |
|
| 3817 |
|
| 3818 g_signal_connect(G_OBJECT(button), "clicked", |
|
| 3819 G_CALLBACK(do_normal), gtkconv); |
|
| 3820 |
|
| 3821 gtkconv->toolbar.normal_size = button; |
|
| 3822 */ |
|
| 3823 |
|
| 3824 /* Decrease font size */ |
|
| 3825 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_TEXT_SMALLER); |
|
| 3826 gtk_size_group_add_widget(sg, button); |
|
| 3827 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
|
| 3828 gtk_tooltips_set_tip(gtkconv->tooltips, button, |
|
| 3829 _("Smaller font size"), NULL); |
|
| 3830 |
|
| 3831 g_signal_connect(G_OBJECT(button), "clicked", |
|
| 3832 G_CALLBACK(do_small), gtkconv); |
|
| 3833 |
|
| 3834 gtkconv->toolbar.smaller_size = button; |
|
| 3835 |
|
| 3836 /* Sep */ |
|
| 3837 sep = gtk_vseparator_new(); |
|
| 3838 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); |
|
| 3839 |
|
| 3840 /* Font Face */ |
|
| 3841 |
|
| 3842 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_SELECT_FONT); |
|
| 3843 gtk_size_group_add_widget(sg, button); |
|
| 3844 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
|
| 3845 gtk_tooltips_set_tip(gtkconv->tooltips, button, |
|
| 3846 _("Font Face"), NULL); |
|
| 3847 |
|
| 3848 g_signal_connect(G_OBJECT(button), "clicked", |
|
| 3849 G_CALLBACK(toggle_font), conv); |
|
| 3850 |
|
| 3851 gtkconv->toolbar.font = button; |
|
| 3852 |
|
| 3853 /* Foreground Color */ |
|
| 3854 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_FGCOLOR); |
|
| 3855 gtk_size_group_add_widget(sg, button); |
|
| 3856 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
|
| 3857 gtk_tooltips_set_tip(gtkconv->tooltips, button, |
|
| 3858 _("Foreground font color"), NULL); |
|
| 3859 |
|
| 3860 g_signal_connect(G_OBJECT(button), "clicked", |
|
| 3861 G_CALLBACK(toggle_fg_color), conv); |
|
| 3862 |
|
| 3863 gtkconv->toolbar.fgcolor = button; |
|
| 3864 |
|
| 3865 /* Background Color */ |
|
| 3866 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_BGCOLOR); |
|
| 3867 gtk_size_group_add_widget(sg, button); |
|
| 3868 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
|
| 3869 gtk_tooltips_set_tip(gtkconv->tooltips, button, |
|
| 3870 _("Background color"), NULL); |
|
| 3871 |
|
| 3872 g_signal_connect(G_OBJECT(button), "clicked", |
|
| 3873 G_CALLBACK(toggle_bg_color), conv); |
|
| 3874 |
|
| 3875 gtkconv->toolbar.bgcolor = button; |
|
| 3876 |
|
| 3877 /* Sep */ |
|
| 3878 sep = gtk_vseparator_new(); |
|
| 3879 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); |
|
| 3880 |
|
| 3881 /* Insert Link */ |
|
| 3882 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_LINK); |
|
| 3883 gtk_size_group_add_widget(sg, button); |
|
| 3884 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
|
| 3885 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("Insert link"), NULL); |
|
| 3886 |
|
| 3887 g_signal_connect(G_OBJECT(button), "clicked", |
|
| 3888 G_CALLBACK(insert_link_cb), conv); |
|
| 3889 |
|
| 3890 gtkconv->toolbar.link = button; |
|
| 3891 |
|
| 3892 /* Insert IM Image */ |
|
| 3893 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_IMAGE); |
|
| 3894 gtk_size_group_add_widget(sg, button); |
|
| 3895 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
|
| 3896 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("Insert image"), NULL); |
|
| 3897 |
|
| 3898 g_signal_connect(G_OBJECT(button), "clicked", |
|
| 3899 G_CALLBACK(insert_image_cb), conv); |
|
| 3900 |
|
| 3901 gtkconv->toolbar.image = button; |
|
| 3902 |
|
| 3903 /* Insert Smiley */ |
|
| 3904 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_SMILEY); |
|
| 3905 gtk_size_group_add_widget(sg, button); |
|
| 3906 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
|
| 3907 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("Insert smiley"), NULL); |
|
| 3908 |
|
| 3909 g_signal_connect(G_OBJECT(button), "clicked", |
|
| 3910 G_CALLBACK(insert_smiley_cb), conv); |
|
| 3911 |
|
| 3912 gtkconv->toolbar.smiley = button; |
|
| 3913 |
|
| 3914 |
|
| 3915 sep = gtk_hseparator_new(); |
|
| 3916 gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); |
|
| 3917 |
|
| 3918 gtk_widget_show_all(vbox); |
|
| 3919 |
|
| 3920 if (!gaim_prefs_get_bool("/gaim/gtk/conversations/show_formatting_toolbar")) |
|
| 3921 gtk_widget_hide(vbox); |
|
| 3922 |
|
| 3923 return vbox; |
|
| 3924 } |
|
| 3925 |
3376 |
| 3926 static void topic_callback(GtkWidget *w, GaimConversation *conv) |
3377 static void topic_callback(GtkWidget *w, GaimConversation *conv) |
| 3927 { |
3378 { |
| 3928 GaimPluginProtocolInfo *prpl_info = NULL; |
3379 GaimPluginProtocolInfo *prpl_info = NULL; |
| 3929 GaimConnection *gc; |
3380 GaimConnection *gc; |