| 45 #include "pixmaps/speaker.xpm" |
45 #include "pixmaps/speaker.xpm" |
| 46 #include "pixmaps/smile_icon.xpm" |
46 #include "pixmaps/smile_icon.xpm" |
| 47 #include "pixmaps/wood.xpm" |
47 #include "pixmaps/wood.xpm" |
| 48 #include "pixmaps/link.xpm" |
48 #include "pixmaps/link.xpm" |
| 49 #include "pixmaps/strike.xpm" |
49 #include "pixmaps/strike.xpm" |
| |
50 #include "pixmaps/fgcolor.xpm" |
| |
51 #include "pixmaps/bgcolor.xpm" |
| 50 |
52 |
| 51 #include "pixmaps/angel.xpm" |
53 #include "pixmaps/angel.xpm" |
| 52 #include "pixmaps/bigsmile.xpm" |
54 #include "pixmaps/bigsmile.xpm" |
| 53 #include "pixmaps/burp.xpm" |
55 #include "pixmaps/burp.xpm" |
| 54 #include "pixmaps/crossedlips.xpm" |
56 #include "pixmaps/crossedlips.xpm" |
| 346 if (c->is_chat && (widget == c->close)) { |
350 if (c->is_chat && (widget == c->close)) { |
| 347 GtkWidget *tmp = c->window; |
351 GtkWidget *tmp = c->window; |
| 348 debug_print("chat clicked close button\n"); |
352 debug_print("chat clicked close button\n"); |
| 349 c->window = NULL; |
353 c->window = NULL; |
| 350 gtk_widget_destroy(tmp); |
354 gtk_widget_destroy(tmp); |
| 351 return; |
355 return FALSE; |
| 352 } |
356 } |
| 353 |
357 |
| 354 debug_print("conversation close callback\n"); |
358 debug_print("conversation close callback\n"); |
| 355 |
359 |
| 356 if (c->window) |
360 if (c->window) |
| 378 |
382 |
| 379 if (c->is_chat) { |
383 if (c->is_chat) { |
| 380 serv_chat_leave(c->id); |
384 serv_chat_leave(c->id); |
| 381 } else { |
385 } else { |
| 382 if (c->is_direct) { |
386 if (c->is_direct) { |
| 383 if (!USE_OSCAR) { |
387 if (c->gc->protocol == PROTO_OSCAR) { |
| 384 /* Direct IM TOC FIXME */ |
|
| 385 } else { |
|
| 386 gdk_input_remove(c->watcher); |
388 gdk_input_remove(c->watcher); |
| 387 sprintf(debug_buff, "Closing DirectIM conversation (%p)\n", c->conn); |
389 sprintf(debug_buff, "Closing DirectIM conversation (%p)\n", c->conn); |
| 388 debug_print(debug_buff); |
390 debug_print(debug_buff); |
| 389 aim_conn_kill(gaim_sess, &c->conn); |
391 aim_conn_kill(c->gc->oscar_sess, &c->conn); |
| |
392 } else { |
| |
393 /* Direct IM TOC FIXME */ |
| 390 } |
394 } |
| 391 } |
395 } |
| 392 delete_conversation(c); |
396 delete_conversation(c); |
| 393 } |
397 } |
| 394 |
398 |
| 598 void send_callback(GtkWidget *widget, struct conversation *c) |
602 void send_callback(GtkWidget *widget, struct conversation *c) |
| 599 { |
603 { |
| 600 char *buf, *buf2, *buf3; |
604 char *buf, *buf2, *buf3; |
| 601 int hdrlen, limit; |
605 int hdrlen, limit; |
| 602 |
606 |
| |
607 if (!c->gc) return; |
| 603 if (c->is_direct) limit = 0x8000; /* 32 k */ |
608 if (c->is_direct) limit = 0x8000; /* 32 k */ |
| 604 else if (c->is_chat && USE_OSCAR) limit = MAXCHATMSGLEN; |
609 else if (c->is_chat && c->gc->protocol == PROTO_OSCAR) limit = MAXCHATMSGLEN; |
| 605 else if (USE_OSCAR) limit = MAXMSGLEN; |
610 else if (c->gc->protocol == PROTO_OSCAR) limit = MAXMSGLEN; |
| 606 else limit = MSG_LEN; |
611 else limit = MSG_LEN; |
| 607 limit <<= 2; |
612 limit <<= 2; |
| 608 |
613 |
| 609 buf = g_malloc(limit); |
614 buf = g_malloc(limit); |
| 610 |
615 |
| 624 |
629 |
| 625 /* Let us determine how long the message CAN be. |
630 /* Let us determine how long the message CAN be. |
| 626 * toc_send_im is 11 chars long + 2 quotes. |
631 * toc_send_im is 11 chars long + 2 quotes. |
| 627 * + 2 spaces + 6 for the header + 2 for good |
632 * + 2 spaces + 6 for the header + 2 for good |
| 628 * measure = 23 bytes + the length of normalize c->name */ |
633 * measure = 23 bytes + the length of normalize c->name */ |
| 629 if (!USE_OSCAR) |
634 if (c->gc->protocol == PROTO_TOC) |
| 630 hdrlen = 23 + strlen(normalize(c->name)); |
635 hdrlen = 23 + strlen(normalize(c->name)); |
| 631 else |
636 else |
| 632 hdrlen = 0; |
637 hdrlen = 0; |
| 633 |
638 |
| 634 if (font_options & OPT_FONT_BOLD) { |
639 if (font_options & OPT_FONT_BOLD) { |
| 681 |
686 |
| 682 if (!c->is_chat) { |
687 if (!c->is_chat) { |
| 683 buf3 = g_strdup(buf); |
688 buf3 = g_strdup(buf); |
| 684 write_to_conv(c, buf3, WFLAG_SEND, NULL); |
689 write_to_conv(c, buf3, WFLAG_SEND, NULL); |
| 685 g_free(buf3); |
690 g_free(buf3); |
| 686 escape_text(buf); |
|
| 687 if (escape_message(buf) > limit/4 - hdrlen) |
|
| 688 do_error_dialog(_("Message too long, some data truncated."), _("Error")); |
|
| 689 |
691 |
| 690 serv_send_im(c->name, buf, 0); |
692 serv_send_im(c->name, buf, 0); |
| 691 |
693 |
| 692 if (c->makesound && (sound_options & OPT_SOUND_SEND)) |
694 if (c->makesound && (sound_options & OPT_SOUND_SEND)) |
| 693 play_sound(SEND); |
695 play_sound(SEND); |
| 694 } else { |
696 } else { |
| 695 serv_chat_send(c->id, buf); /* this does escape_text for us */ |
697 serv_chat_send(c->id, buf); |
| 696 |
698 |
| 697 /* no sound because we do that when we receive our message */ |
699 /* no sound because we do that when we receive our message */ |
| 698 } |
700 } |
| 699 |
701 |
| 700 quiet_set(c->bold, FALSE); |
702 quiet_set(c->bold, FALSE); |
| 1613 gtk_widget_set_sensitive(c->strike, ((font_options & OPT_FONT_STRIKE)) ? FALSE : TRUE); |
1615 gtk_widget_set_sensitive(c->strike, ((font_options & OPT_FONT_STRIKE)) ? FALSE : TRUE); |
| 1614 |
1616 |
| 1615 return toolbar; |
1617 return toolbar; |
| 1616 } |
1618 } |
| 1617 |
1619 |
| |
1620 static void convo_sel_send(GtkObject *m, struct gaim_connection *c) |
| |
1621 { |
| |
1622 struct conversation *cnv = gtk_object_get_user_data(m); |
| |
1623 cnv->gc = c; |
| |
1624 } |
| |
1625 |
| |
1626 static void create_convo_menu(struct conversation *cnv) |
| |
1627 { |
| |
1628 GtkWidget *menu, *opt; |
| |
1629 GSList *g = connections; |
| |
1630 struct gaim_connection *c; |
| |
1631 |
| |
1632 if (g_slist_length(g) < 2) |
| |
1633 gtk_widget_hide(cnv->menu->parent); |
| |
1634 else { |
| |
1635 menu = gtk_menu_new(); |
| |
1636 |
| |
1637 while (g) { |
| |
1638 c = (struct gaim_connection *)g->data; |
| |
1639 opt = gtk_menu_item_new_with_label(c->username); |
| |
1640 gtk_object_set_user_data(GTK_OBJECT(opt), cnv); |
| |
1641 gtk_signal_connect(GTK_OBJECT(opt), "activate", |
| |
1642 GTK_SIGNAL_FUNC(convo_sel_send), c); |
| |
1643 gtk_widget_show(opt); |
| |
1644 gtk_menu_append(GTK_MENU(menu), opt); |
| |
1645 g = g->next; |
| |
1646 } |
| |
1647 |
| |
1648 gtk_option_menu_remove_menu(GTK_OPTION_MENU(cnv->menu)); |
| |
1649 gtk_option_menu_set_menu(GTK_OPTION_MENU(cnv->menu), menu); |
| |
1650 gtk_option_menu_set_history(GTK_OPTION_MENU(cnv->menu), 0); |
| |
1651 |
| |
1652 gtk_widget_show(cnv->menu); |
| |
1653 gtk_widget_show(cnv->menu->parent); |
| |
1654 } |
| |
1655 } |
| |
1656 |
| |
1657 void redo_convo_menus() |
| |
1658 { |
| |
1659 GList *c = conversations; |
| |
1660 struct conversation *C; |
| |
1661 |
| |
1662 while (c) { |
| |
1663 C = (struct conversation *)c->data; |
| |
1664 create_convo_menu(C); |
| |
1665 c = c->next; |
| |
1666 } |
| |
1667 } |
| 1618 |
1668 |
| 1619 void show_conv(struct conversation *c) |
1669 void show_conv(struct conversation *c) |
| 1620 { |
1670 { |
| 1621 GtkWidget *win; |
1671 GtkWidget *win; |
| 1622 char buf[256]; |
1672 char buf[256]; |
| 1632 GtkWidget *vbox; |
1682 GtkWidget *vbox; |
| 1633 GtkWidget *vbox2; |
1683 GtkWidget *vbox2; |
| 1634 GtkWidget *paned; |
1684 GtkWidget *paned; |
| 1635 GtkWidget *add; |
1685 GtkWidget *add; |
| 1636 GtkWidget *toolbar; |
1686 GtkWidget *toolbar; |
| 1637 GtkWidget *sep; |
1687 GtkWidget *hbox; |
| |
1688 GtkWidget *label; |
| 1638 int dispstyle; |
1689 int dispstyle; |
| 1639 |
1690 |
| 1640 win = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
1691 win = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
| 1641 gtk_window_set_wmclass(GTK_WINDOW(win), "conversation", "Gaim"); |
1692 gtk_window_set_wmclass(GTK_WINDOW(win), "conversation", "Gaim"); |
| 1642 gtk_window_set_policy(GTK_WINDOW(win), TRUE, TRUE, TRUE); |
1693 gtk_window_set_policy(GTK_WINDOW(win), TRUE, TRUE, TRUE); |
| 1676 |
1727 |
| 1677 gtk_paned_pack1(GTK_PANED(paned), vbox, FALSE, TRUE); |
1728 gtk_paned_pack1(GTK_PANED(paned), vbox, FALSE, TRUE); |
| 1678 gtk_paned_pack2(GTK_PANED(paned), vbox2, FALSE, FALSE); |
1729 gtk_paned_pack2(GTK_PANED(paned), vbox2, FALSE, FALSE); |
| 1679 gtk_widget_show(vbox2); |
1730 gtk_widget_show(vbox2); |
| 1680 gtk_widget_show(paned); |
1731 gtk_widget_show(paned); |
| |
1732 |
| |
1733 hbox = gtk_hbox_new(FALSE, 0); |
| |
1734 gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0); |
| |
1735 gtk_widget_show(hbox); |
| |
1736 |
| |
1737 label = gtk_label_new(_("Send message as: ")); |
| |
1738 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); |
| |
1739 gtk_widget_show(label); |
| |
1740 |
| |
1741 c->menu = gtk_option_menu_new(); |
| |
1742 gtk_box_pack_start(GTK_BOX(hbox), c->menu, FALSE, FALSE, 5); |
| |
1743 gtk_widget_show(c->menu); |
| |
1744 |
| |
1745 create_convo_menu(c); |
| 1681 |
1746 |
| 1682 entry = gtk_text_new(NULL, NULL); |
1747 entry = gtk_text_new(NULL, NULL); |
| 1683 gtk_text_set_editable(GTK_TEXT(entry), TRUE); |
1748 gtk_text_set_editable(GTK_TEXT(entry), TRUE); |
| 1684 gtk_text_set_word_wrap(GTK_TEXT(entry), TRUE); |
1749 gtk_text_set_word_wrap(GTK_TEXT(entry), TRUE); |
| 1685 gtk_object_set_user_data(GTK_OBJECT(entry), c); |
1750 gtk_object_set_user_data(GTK_OBJECT(entry), c); |