comparison src/conversation.c @ 472:6a92cd7322cc

[gaim-migrate @ 482] merged chat and IM windows. /me is now in IM, font/color dialogs in chat, and smileys in chat too. also, fixed the GOOD bug. i don't know what kind of crack rob was smoking when he decided O could be eyes. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Sun, 09 Jul 2000 23:19:21 +0000
parents a330017b3aa4
children f9bb7761c52b
comparison
equal deleted inserted replaced
471:4d0b703a094c 472:6a92cd7322cc
29 #include <unistd.h> 29 #include <unistd.h>
30 #include <stdio.h> 30 #include <stdio.h>
31 #include <stdlib.h> 31 #include <stdlib.h>
32 #include <ctype.h> 32 #include <ctype.h>
33 #include <gtk/gtk.h> 33 #include <gtk/gtk.h>
34 #include "gaim.h"
35 #include "gtkhtml.h" 34 #include "gtkhtml.h"
36 #include <gdk/gdkkeysyms.h> 35 #include <gdk/gdkkeysyms.h>
37 #include "pixmaps/underline.xpm" 36 #include "convo.h"
38 #include "pixmaps/bold.xpm"
39 #include "pixmaps/italic.xpm"
40 #include "pixmaps/small.xpm"
41 #include "pixmaps/normal.xpm"
42 #include "pixmaps/big.xpm"
43 #include "pixmaps/fontface.xpm"
44 #include "pixmaps/speaker.xpm"
45 /* #include "pixmaps/aimicon2.xpm" */
46 #include "pixmaps/wood.xpm"
47 #include "pixmaps/palette.xpm"
48 #include "pixmaps/link.xpm"
49 #include "pixmaps/strike.xpm"
50
51 #include "pixmaps/smile_happy.xpm"
52 #include "pixmaps/smile_sad.xpm"
53 #include "pixmaps/smile_wink.xpm"
54 37
55 int state_lock=0; 38 int state_lock=0;
56 39
57 GdkPixmap *dark_icon_pm = NULL; 40 GdkPixmap *dark_icon_pm = NULL;
58 GdkBitmap *dark_icon_bm = NULL; 41 GdkBitmap *dark_icon_bm = NULL;
59 42
60 char *fontface; 43 char *fontface;
61 44
62 void check_everything(GtkWidget *entry); 45 void check_everything(GtkWidget *entry);
63 char *get_tag_by_prefix(GtkWidget *entry, const char *prefix); 46 char *get_tag_by_prefix(GtkWidget *entry, const char *prefix);
64 gboolean user_keypress_callback(GtkWidget *entry, GdkEventKey *event, struct conversation *c); 47 gboolean keypress_callback(GtkWidget *entry, GdkEventKey *event, struct conversation *c);
65 48
66 /*------------------------------------------------------------------------*/ 49 /*------------------------------------------------------------------------*/
67 /* Helpers */ 50 /* Helpers */
68 /*------------------------------------------------------------------------*/ 51 /*------------------------------------------------------------------------*/
69 52
233 if (c->log_button) 216 if (c->log_button)
234 gtk_widget_set_sensitive(c->log_button, ((general_options & OPT_GEN_LOG_ALL)) ? FALSE : TRUE); 217 gtk_widget_set_sensitive(c->log_button, ((general_options & OPT_GEN_LOG_ALL)) ? FALSE : TRUE);
235 218
236 cnv = cnv->next; 219 cnv = cnv->next;
237 } 220 }
221
222 cnv = buddy_chats;
223 while(cnv) {
224 c = (struct conversation *)cnv->data;
225
226 if (c->log_button)
227 gtk_widget_set_sensitive(c->log_button, ((general_options & OPT_GEN_LOG_ALL)) ? FALSE : TRUE);
228
229 cnv = cnv->next;
230 }
238 } 231 }
239 232
240 void update_font_buttons() 233 void update_font_buttons()
241 { 234 {
242 GList *cnv = conversations; 235 GList *cnv = conversations;
298 rm_log(find_log_info(p->name)); 291 rm_log(find_log_info(p->name));
299 else 292 else
300 show_log_dialog(p->name); 293 show_log_dialog(p->name);
301 } 294 }
302 295
303 static int close_callback(GtkWidget *widget, struct conversation *c) 296 int close_callback(GtkWidget *widget, struct conversation *c)
304 { 297 {
305 gtk_widget_destroy(c->window); 298 if (c->window)
306 delete_conversation(c); 299 gtk_widget_destroy(c->window);
300 c->window = NULL;
301
302 if (c->is_chat)
303 serv_chat_leave(c->id);
304 else
305 delete_conversation(c);
306
307 return TRUE; 307 return TRUE;
308 } 308 }
309 309
310 void set_font_face(GtkWidget *widget, struct conversation *c) 310 void set_font_face(GtkWidget *widget, struct conversation *c)
311 { 311 {
356 { 356 {
357 /* show_color_dialog(c); */ 357 /* show_color_dialog(c); */
358 gtk_widget_grab_focus(c->entry); 358 gtk_widget_grab_focus(c->entry);
359 } 359 }
360 360
361 static void add_callback(GtkWidget *widget, struct conversation *c) 361 void add_callback(GtkWidget *widget, struct conversation *c)
362 { 362 {
363 if (find_buddy(c->name) != NULL) { 363 if (find_buddy(c->name) != NULL) {
364 sprintf(debug_buff,_("Removing '%s' from buddylist.\n"), c->name); 364 sprintf(debug_buff,_("Removing '%s' from buddylist.\n"), c->name);
365 debug_print(debug_buff); 365 debug_print(debug_buff);
366 remove_buddy(find_group_by_buddy(c->name), find_buddy(c->name)); 366 remove_buddy(find_group_by_buddy(c->name), find_buddy(c->name));
374 374
375 gtk_widget_grab_focus(c->entry); 375 gtk_widget_grab_focus(c->entry);
376 } 376 }
377 377
378 378
379 static void block_callback(GtkWidget *widget, struct conversation *c) 379 void block_callback(GtkWidget *widget, struct conversation *c)
380 { 380 {
381 show_add_perm(c->name); 381 show_add_perm(c->name);
382 gtk_widget_grab_focus(c->entry); 382 gtk_widget_grab_focus(c->entry);
383 } 383 }
384 384
385 static void warn_callback(GtkWidget *widget, struct conversation *c) 385 void warn_callback(GtkWidget *widget, struct conversation *c)
386 { 386 {
387 show_warn_dialog(c->name); 387 show_warn_dialog(c->name);
388 gtk_widget_grab_focus(c->entry); 388 gtk_widget_grab_focus(c->entry);
389 } 389 }
390 390
391 static void info_callback(GtkWidget *widget, struct conversation *c) 391 void info_callback(GtkWidget *w, struct conversation *c)
392 { 392 {
393 serv_get_info(c->name); 393 if (c->is_chat) {
394 gtk_widget_grab_focus(c->entry); 394 char *name;
395 } 395 GList *i;
396 396
397 gboolean user_keypress_callback(GtkWidget *entry, GdkEventKey *event, struct conversation *c) 397 i = GTK_LIST(c->list)->selection;
398 if (i)
399 name = (char *)gtk_object_get_user_data(GTK_OBJECT(i->data));
400 else
401 return;
402
403 serv_get_info(name);
404 } else {
405 serv_get_info(c->name);
406 gtk_widget_grab_focus(c->entry);
407 }
408 }
409
410 gboolean keypress_callback(GtkWidget *entry, GdkEventKey *event, struct conversation *c)
398 { 411 {
399 int pos; 412 int pos;
400 if(event->keyval==GDK_Return) { 413 if(event->keyval==GDK_Return) {
401 if(!(event->state & GDK_SHIFT_MASK) 414 if(!(event->state & GDK_SHIFT_MASK)
402 && (general_options & OPT_GEN_ENTER_SENDS)) { 415 && (general_options & OPT_GEN_ENTER_SENDS)) {
413 return TRUE; 426 return TRUE;
414 427
415 } 428 }
416 429
417 430
418 static void send_callback(GtkWidget *widget, struct conversation *c) 431 void send_callback(GtkWidget *widget, struct conversation *c)
419 { 432 {
420 char *buf = g_malloc(BUF_LEN * 4); 433 char *buf = g_malloc(BUF_LEN * 4);
421 char *buf2; 434 char *buf2;
435 char *buf3;
422 gchar *buf4; 436 gchar *buf4;
423 int hdrlen; 437 int hdrlen;
424 438
425 /* FIXME : for USE_OSCAR, libfaim can send messages much longer 439 /* FIXME : for USE_OSCAR, libfaim can send messages much longer
426 * than this (I think it's about 7K rather than 4K. So we need 440 * than this (I think it's about 7K rather than 4K. So we need
431 445
432 if (!strlen(buf)) { 446 if (!strlen(buf)) {
433 return; 447 return;
434 } 448 }
435 449
450 gtk_editable_delete_text(GTK_EDITABLE(c->entry), 0, -1);
451
436 if (general_options & OPT_GEN_SEND_LINKS) { 452 if (general_options & OPT_GEN_SEND_LINKS) {
437 linkify_text(buf); 453 linkify_text(buf);
438 } 454 }
439 455
440 /* Let us determine how long the message CAN be. 456 /* Let us determine how long the message CAN be.
472 { 488 {
473 GList *ca = callbacks; 489 GList *ca = callbacks;
474 struct gaim_callback *g; 490 struct gaim_callback *g;
475 void (*function)(char *, char **, void *); 491 void (*function)(char *, char **, void *);
476 char *buffy = g_strdup(buf); 492 char *buffy = g_strdup(buf);
493 enum gaim_event evnt = c->is_chat ? event_chat_send : event_im_send;
477 while (ca) { 494 while (ca) {
478 g = (struct gaim_callback *)(ca->data); 495 g = (struct gaim_callback *)(ca->data);
479 if (g->event == event_im_send && g->function != NULL) { 496 if (g->event == evnt && g->function != NULL) {
480 function = g->function; 497 function = g->function;
481 (*function)(c->name, &buffy, g->data); 498 (*function)(c->name, &buffy, g->data);
482 } 499 }
483 ca = ca->next; 500 ca = ca->next;
484 } 501 }
489 g_snprintf(buf, BUF_LONG, "%s", buffy); 506 g_snprintf(buf, BUF_LONG, "%s", buffy);
490 g_free(buffy); 507 g_free(buffy);
491 } 508 }
492 #endif 509 #endif
493 510
494 write_to_conv(c, buf, WFLAG_SEND); 511 if (!c->is_chat) {
495 512 buf3 = g_strdup(buf);
496 gtk_editable_delete_text(GTK_EDITABLE(c->entry), 0, -1); 513 write_to_conv(c, buf3, WFLAG_SEND, NULL);
514 g_free(buf3);
515 }
497 516
498 escape_text(buf); 517 escape_text(buf);
499 if (escape_message(buf) > MSG_LEN - hdrlen) { 518 if (escape_message(buf) > MSG_LEN - hdrlen) {
500 do_error_dialog(_("Message too long, some data truncated."), _("Error")); 519 do_error_dialog(_("Message too long, some data truncated."), _("Error"));
501 } 520 }
502 521
503 serv_send_im(c->name, buf, 0); 522 if (c->is_chat) {
523 serv_chat_send(c->id, buf);
524
525 /* no sound because we do that when we receive our message */
526 } else {
527 serv_send_im(c->name, buf, 0);
528
529 if (c->makesound && (sound_options & OPT_SOUND_SEND))
530 play_sound(SEND);
531 }
504 532
505 quiet_set(c->bold, FALSE); 533 quiet_set(c->bold, FALSE);
506 quiet_set(c->strike, FALSE); 534 quiet_set(c->strike, FALSE);
507 quiet_set(c->italic, FALSE); 535 quiet_set(c->italic, FALSE);
508 quiet_set(c->underline, FALSE); 536 quiet_set(c->underline, FALSE);
509 quiet_set(c->font, FALSE); 537 quiet_set(c->font, FALSE);
510 quiet_set(c->palette, FALSE); 538 quiet_set(c->palette, FALSE);
511 quiet_set(c->link, FALSE); 539 quiet_set(c->link, FALSE);
512 540
513 if (c->makesound && (sound_options & OPT_SOUND_SEND))
514 play_sound(SEND);
515
516 if ((general_options & OPT_GEN_BACK_ON_IM) && awaymessage != NULL) { 541 if ((general_options & OPT_GEN_BACK_ON_IM) && awaymessage != NULL) {
517 do_im_back(); 542 do_im_back();
518 } 543 }
519 544
520 set_font_face(NULL, c); 545 set_font_face(NULL, c);
521 546
522 gtk_widget_grab_focus(c->entry); 547 gtk_widget_grab_focus(c->entry);
523 548
524 g_free(buf2); 549 g_free(buf2);
525 g_free(buf); 550 g_free(buf);
682 debug_print(debug_buff); 707 debug_print(debug_buff);
683 gtk_editable_set_position(GTK_EDITABLE(entry), pos); 708 gtk_editable_set_position(GTK_EDITABLE(entry), pos);
684 gtk_widget_grab_focus(entry); 709 gtk_widget_grab_focus(entry);
685 } 710 }
686 711
687 static void toggle_color(GtkWidget *color, struct conversation *c) 712 void toggle_color(GtkWidget *color, struct conversation *c)
688 { 713 {
689 if (state_lock) 714 if (state_lock)
690 return; 715 return;
691 if (GTK_TOGGLE_BUTTON(color)->active) 716 if (GTK_TOGGLE_BUTTON(color)->active)
692 show_color_dialog(c, color); 717 show_color_dialog(c, color);
693 else 718 else
694 advance_past(c->entry, "<FONT COLOR>", "</FONT>" ); 719 advance_past(c->entry, "<FONT COLOR>", "</FONT>" );
695 } 720 }
696 721
697 static void toggle_font(GtkWidget *font, struct conversation *c) 722 void toggle_font(GtkWidget *font, struct conversation *c)
698 { 723 {
699 if (state_lock) 724 if (state_lock)
700 return; 725 return;
701 if (GTK_TOGGLE_BUTTON(font)->active) 726 if (GTK_TOGGLE_BUTTON(font)->active)
702 show_font_dialog(c, font); 727 show_font_dialog(c, font);
839 /*------------------------------------------------------------------------*/ 864 /*------------------------------------------------------------------------*/
840 /* Takin care of the window.. */ 865 /* Takin care of the window.. */
841 /*------------------------------------------------------------------------*/ 866 /*------------------------------------------------------------------------*/
842 867
843 868
844 void write_to_conv(struct conversation *c, char *what, int flags) 869 /* this is going to be interesting since the conversation could either be a
870 * normal IM conversation or a chat window. but hopefully it won't matter */
871 void write_to_conv(struct conversation *c, char *what, int flags, char *who)
845 { 872 {
846 char *buf = g_malloc(BUF_LONG); 873 char *buf = g_malloc(BUF_LONG);
847 char *buf2 = g_malloc(BUF_LONG); 874 char *buf2 = g_malloc(BUF_LONG);
848 char *who = NULL; 875 char *buf3;
876 char *str;
849 FILE *fd; 877 FILE *fd;
850 char colour[10]; 878 char colour[10];
851 GdkBitmap *mask; 879 GdkBitmap *mask;
852 GdkPixmap *face; 880 GdkPixmap *face;
853 int state; 881 int state;
854 int y; 882 int y;
855 int i; 883 int i;
856 char *smiley = g_malloc(7); 884 char *smiley = g_malloc(7);
885
886 if (!who) who = c->name;
857 887
858 if (flags & WFLAG_SYSTEM) { 888 if (flags & WFLAG_SYSTEM) {
859 889
860 gtk_html_freeze(GTK_HTML(c->text)); 890 gtk_html_freeze(GTK_HTML(c->text));
861 891
881 } 911 }
882 } 912 }
883 913
884 } else { 914 } else {
885 915
886 if (flags & WFLAG_RECV) { 916 buf3 = g_malloc(BUF_LONG);
887 strcpy(colour, "#ff0000"); 917
888 who = c->name; 918 if (flags & WFLAG_WHISPER) {
889 } else if (flags & WFLAG_SEND) { 919 /* if we're whispering, it's not an autoresponse */
890 strcpy(colour, "#0000ff"); 920 if (meify(what)) {
891 who = current_user->username; 921 str = g_malloc(64);
892 } 922 g_snprintf(str, 62, "***%s", who);
893 923 strcpy(colour, "#6C2585\0");
894 if (flags & WFLAG_AUTO) 924 } else {
895 sprintf(buf2, " %s", AUTO_RESPONSE); 925 str = g_malloc(64);
896 else 926 g_snprintf(str, 62, "*%s*:", who);
897 buf2[0]=0; /* sprintf(buf2, ""); */ 927 strcpy(colour, "#00ff00\0");
898 928 }
899 if (display_options & OPT_DISP_SHOW_TIME) 929 } else {
900 g_snprintf(buf, BUF_LONG, "<FONT COLOR=\"%s\"><B>%s %s:%s</B></FONT> ", colour, date(), who, buf2); 930 if (meify(what)) {
901 else 931 str = g_malloc(64);
902 g_snprintf(buf, BUF_LONG, "<FONT COLOR=\"%s\"><B>%s:%s</B></FONT> ", colour, who, buf2); 932 if (flags & WFLAG_AUTO)
933 g_snprintf(str, 62, "%s ***%s", AUTO_RESPONSE, who);
934 else
935 g_snprintf(str, 62, "***%s", who);
936 strcpy(colour, "#062585\0");
937 } else {
938 str = g_malloc(64);
939 if (flags & WFLAG_AUTO)
940 g_snprintf(str, 62, "%s %s", who, AUTO_RESPONSE);
941 else
942 g_snprintf(str, 62, "%s:", who);
943 if (flags & WFLAG_RECV)
944 strcpy(colour, "#ff0000");
945 else if (flags & WFLAG_SEND)
946 strcpy(colour, "#0000ff");
947 }
948 }
949
950 if (display_options & OPT_DISP_SHOW_TIME)
951 g_snprintf(buf, BUF_LONG, "<FONT COLOR=\"%s\"><B>%s %s</B></FONT> ", colour, date(), str);
952 else
953 g_snprintf(buf, BUF_LONG, "<FONT COLOR=\"%s\"><B>%s</B></FONT>", colour, str);
903 954
904 gtk_html_freeze(GTK_HTML(c->text)); 955 gtk_html_freeze(GTK_HTML(c->text));
905 956
906 y = 0; 957 y = 0;
907 state = 0; 958 state = 0;
915 for (i = 0; i < strlen(what); i++) 966 for (i = 0; i < strlen(what); i++)
916 { 967 {
917 buf2[y] = what[i]; 968 buf2[y] = what[i];
918 y++; 969 y++;
919 970
920 if ( (what[i] == ':') || (what[i] == ';') || (what[i] == 'O') ) 971 if ( (what[i] == ':') || (what[i] == ';') || (what[i] == '8') )
921 { 972 {
922 if (state < 2) 973 if (state < 2)
923 { 974 {
924 smiley[state] = what[i]; 975 smiley[state] = what[i];
925 state++; 976 state++;
1005 1056
1006 gtk_html_thaw(GTK_HTML(c->text)); 1057 gtk_html_thaw(GTK_HTML(c->text));
1007 1058
1008 if ((general_options & OPT_GEN_LOG_ALL) || find_log_info(c->name)) { 1059 if ((general_options & OPT_GEN_LOG_ALL) || find_log_info(c->name)) {
1009 char *t1, *t2; 1060 char *t1, *t2;
1061 char *nm = g_malloc(256);
1062 if (c->is_chat)
1063 g_snprintf(nm, 256, "%s.chat", c->name);
1064 else
1065 g_snprintf(nm, 256, "%s", c->name);
1010 1066
1011 if (general_options & OPT_GEN_STRIP_HTML) { 1067 if (general_options & OPT_GEN_STRIP_HTML) {
1012 t1 = strip_html(buf); 1068 t1 = strip_html(buf);
1013 t2 = strip_html(what); 1069 t2 = strip_html(what);
1014 } else { 1070 } else {
1015 t1 = buf; 1071 t1 = buf;
1016 t2 = what; 1072 t2 = what;
1017 } 1073 }
1018 fd = open_log_file(c->name); 1074 fd = open_log_file(nm);
1019 fprintf(fd, "%s%s\n", t1, t2); 1075 fprintf(fd, "%s%s\n", t1, t2);
1020 fclose(fd); 1076 fclose(fd);
1021 if (general_options & OPT_GEN_STRIP_HTML) { 1077 if (general_options & OPT_GEN_STRIP_HTML) {
1022 g_free(t1); 1078 g_free(t1);
1023 g_free(t2); 1079 g_free(t2);
1024 } 1080 }
1081 g_free(nm);
1025 } 1082 }
1026 } 1083 }
1027 1084
1028 /* if (!GTK_WIDGET_MAPPED(c->window)) { 1085 /* if (!GTK_WIDGET_MAPPED(c->window)) {
1029 1086
1032 NULL, (gchar **)aimicon2_xpm); 1089 NULL, (gchar **)aimicon2_xpm);
1033 gdk_window_set_icon(c->window->window, NULL, dark_icon_pm, dark_icon_bm); 1090 gdk_window_set_icon(c->window->window, NULL, dark_icon_pm, dark_icon_bm);
1034 } 1091 }
1035 */ 1092 */
1036 1093
1037 if (general_options & OPT_GEN_POPUP_WINDOWS) 1094 if ((c->is_chat && (general_options & OPT_GEN_POPUP_CHAT)) ||
1095 (!c->is_chat && (general_options & OPT_GEN_POPUP_WINDOWS)))
1038 gdk_window_show(c->window->window); 1096 gdk_window_show(c->window->window);
1039 1097
1040 g_free(smiley); 1098 g_free(smiley);
1041 g_free(buf); 1099 g_free(buf);
1042 g_free(buf2); 1100 g_free(buf2);
1065 gtk_signal_emit_stop_by_name(GTK_OBJECT(editable), "insert-text"); 1123 gtk_signal_emit_stop_by_name(GTK_OBJECT(editable), "insert-text");
1066 } 1124 }
1067 } 1125 }
1068 1126
1069 1127
1070 void show_conv(struct conversation *c) 1128 GtkWidget *build_conv_toolbar(struct conversation *c) {
1071 {
1072 GtkWidget *win;
1073 char buf[256];
1074 GtkWidget *text;
1075 GtkWidget *sw;
1076 GtkWidget *send;
1077 GtkWidget *info;
1078 GtkWidget *warn;
1079 GtkWidget *block;
1080 /* GtkWidget *color; */
1081 GtkWidget *close;
1082 GtkWidget *entry;
1083 GtkWidget *toolbar;
1084 GtkWidget *bbox;
1085 GtkWidget *vbox;
1086 GtkWidget *vbox2;
1087 GtkWidget *paned;
1088 GtkWidget *add;
1089 GdkPixmap *strike_i, *small_i, *normal_i, *big_i, *bold_i, *italic_i, *underline_i, *speaker_i, *wood_i, *palette_i, *link_i, *font_i; 1129 GdkPixmap *strike_i, *small_i, *normal_i, *big_i, *bold_i, *italic_i, *underline_i, *speaker_i, *wood_i, *palette_i, *link_i, *font_i;
1090 GtkWidget *strike_p, *small_p, *normal_p, *big_p, *bold_p, *italic_p, *underline_p, *speaker_p, *wood_p, *palette_p, *link_p, *font_p; 1130 GtkWidget *strike_p, *small_p, *normal_p, *big_p, *bold_p, *italic_p, *underline_p, *speaker_p, *wood_p, *palette_p, *link_p, *font_p;
1091 GtkWidget *strike, *small, *normal, *big, *bold, *italic, *underline, *speaker, *wood, *palette, *link, *font; 1131 GtkWidget *strike, *small, *normal, *big, *bold, *italic, *underline, *speaker, *wood, *palette, *link, *font;
1092 GdkBitmap *mask; 1132 GdkBitmap *mask;
1093 1133 GtkWidget *toolbar;
1094 win = gtk_window_new(GTK_WINDOW_TOPLEVEL); 1134 GtkWidget *win;
1095 gtk_window_set_policy(GTK_WINDOW(win), TRUE, TRUE, TRUE); 1135 GtkWidget *entry;
1096 1136
1097 gtk_widget_realize(win);
1098 aol_icon(win->window);
1099
1100
1101 c->window = win;
1102
1103 send = gtk_button_new_with_label(_("Send"));
1104 info = gtk_button_new_with_label(_("Info"));
1105 warn = gtk_button_new_with_label(_("Warn"));
1106 /* color = gtk_button_new_with_label("Color"); */
1107 close = gtk_button_new_with_label(_("Close"));
1108 if (find_buddy(c->name) != NULL) {
1109 add = gtk_button_new_with_label(_("Remove"));
1110 }
1111 else {
1112 add = gtk_button_new_with_label(_("Add"));
1113 }
1114 block = gtk_button_new_with_label(_("Block"));
1115
1116
1117 bbox = gtk_hbox_new(TRUE, 0);
1118 vbox = gtk_vbox_new(FALSE, 0);
1119 vbox2 = gtk_vbox_new(FALSE, 0);
1120 paned = gtk_vpaned_new();
1121
1122 gtk_paned_pack1(GTK_PANED(paned), vbox, FALSE, TRUE);
1123 gtk_paned_pack2(GTK_PANED(paned), vbox2, FALSE, FALSE);
1124 gtk_widget_show(vbox2);
1125 gtk_widget_show(paned);
1126
1127 entry = gtk_text_new(NULL, NULL);
1128 gtk_text_set_editable(GTK_TEXT(entry), TRUE);
1129 gtk_text_set_word_wrap(GTK_TEXT(entry), TRUE);
1130
1131 /* Toolbar */
1132 toolbar = gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_ICONS); 1137 toolbar = gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_ICONS);
1138 win = c->window;
1139 entry = c->entry;
1133 1140
1134 link_i = gdk_pixmap_create_from_xpm_d(win->window, &mask, 1141 link_i = gdk_pixmap_create_from_xpm_d(win->window, &mask,
1135 &win->style->white, link_xpm ); 1142 &win->style->white, link_xpm );
1136 link_p = gtk_pixmap_new(link_i, mask); 1143 link_p = gtk_pixmap_new(link_i, mask);
1137 gtk_widget_show(link_p); 1144 gtk_widget_show(link_p);
1237 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(wood), FALSE); 1244 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(wood), FALSE);
1238 state_lock = 0; 1245 state_lock = 0;
1239 1246
1240 gtk_widget_show(toolbar); 1247 gtk_widget_show(toolbar);
1241 1248
1242 c->entry = entry;
1243 c->bold = bold; 1249 c->bold = bold;
1244 c->strike = strike; 1250 c->strike = strike;
1245 c->italic = italic; 1251 c->italic = italic;
1246 c->underline = underline; 1252 c->underline = underline;
1247 c->log_button = wood; 1253 c->log_button = wood;
1248 c->palette = palette; 1254 c->palette = palette;
1249 c->link = link; 1255 c->link = link;
1250 c->add_button = add;
1251 c->font = font; 1256 c->font = font;
1252 1257
1253 gtk_widget_set_sensitive(c->log_button, ((general_options & OPT_GEN_LOG_ALL)) ? FALSE : TRUE); 1258 gtk_widget_set_sensitive(c->log_button, ((general_options & OPT_GEN_LOG_ALL)) ? FALSE : TRUE);
1254 1259
1255 gtk_widget_set_sensitive(c->bold, ((font_options & OPT_FONT_BOLD)) ? FALSE : TRUE); 1260 gtk_widget_set_sensitive(c->bold, ((font_options & OPT_FONT_BOLD)) ? FALSE : TRUE);
1256 gtk_widget_set_sensitive(c->italic, ((font_options & OPT_FONT_ITALIC)) ? FALSE : TRUE); 1261 gtk_widget_set_sensitive(c->italic, ((font_options & OPT_FONT_ITALIC)) ? FALSE : TRUE);
1257 gtk_widget_set_sensitive(c->underline, ((font_options & OPT_FONT_UNDERLINE)) ? FALSE : TRUE); 1262 gtk_widget_set_sensitive(c->underline, ((font_options & OPT_FONT_UNDERLINE)) ? FALSE : TRUE);
1258 gtk_widget_set_sensitive(c->strike, ((font_options & OPT_FONT_STRIKE)) ? FALSE : TRUE); 1263 gtk_widget_set_sensitive(c->strike, ((font_options & OPT_FONT_STRIKE)) ? FALSE : TRUE);
1264
1265 return toolbar;
1266 }
1267
1268
1269 void show_conv(struct conversation *c)
1270 {
1271 GtkWidget *win;
1272 char buf[256];
1273 GtkWidget *text;
1274 GtkWidget *sw;
1275 GtkWidget *send;
1276 GtkWidget *info;
1277 GtkWidget *warn;
1278 GtkWidget *block;
1279 /* GtkWidget *color; */
1280 GtkWidget *close;
1281 GtkWidget *entry;
1282 GtkWidget *toolbar;
1283 GtkWidget *bbox;
1284 GtkWidget *vbox;
1285 GtkWidget *vbox2;
1286 GtkWidget *paned;
1287 GtkWidget *add;
1288
1289 win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1290 gtk_window_set_policy(GTK_WINDOW(win), TRUE, TRUE, TRUE);
1291
1292 gtk_widget_realize(win);
1293 aol_icon(win->window);
1294
1259 1295
1296 c->window = win;
1297
1298 send = gtk_button_new_with_label(_("Send"));
1299 info = gtk_button_new_with_label(_("Info"));
1300 warn = gtk_button_new_with_label(_("Warn"));
1301 /* color = gtk_button_new_with_label("Color"); */
1302 close = gtk_button_new_with_label(_("Close"));
1303 if (find_buddy(c->name) != NULL) {
1304 add = gtk_button_new_with_label(_("Remove"));
1305 }
1306 else {
1307 add = gtk_button_new_with_label(_("Add"));
1308 }
1309 block = gtk_button_new_with_label(_("Block"));
1310
1311
1312 bbox = gtk_hbox_new(TRUE, 0);
1313 vbox = gtk_vbox_new(FALSE, 0);
1314 vbox2 = gtk_vbox_new(FALSE, 0);
1315 paned = gtk_vpaned_new();
1316
1317 gtk_paned_pack1(GTK_PANED(paned), vbox, FALSE, TRUE);
1318 gtk_paned_pack2(GTK_PANED(paned), vbox2, FALSE, FALSE);
1319 gtk_widget_show(vbox2);
1320 gtk_widget_show(paned);
1321
1322 entry = gtk_text_new(NULL, NULL);
1323 gtk_text_set_editable(GTK_TEXT(entry), TRUE);
1324 gtk_text_set_word_wrap(GTK_TEXT(entry), TRUE);
1260 gtk_object_set_user_data(GTK_OBJECT(entry), c); 1325 gtk_object_set_user_data(GTK_OBJECT(entry), c);
1261 1326 c->entry = entry;
1327
1328 /* Toolbar */
1329 toolbar = build_conv_toolbar(c);
1330
1331
1332 c->add_button = add;
1262 1333
1263 1334
1264 gtk_signal_connect(GTK_OBJECT(entry), "activate", GTK_SIGNAL_FUNC(send_callback),c); 1335 gtk_signal_connect(GTK_OBJECT(entry), "activate", GTK_SIGNAL_FUNC(send_callback),c);
1265 1336
1266 /* Text box */ 1337 /* Text box */
1298 gtk_signal_connect(GTK_OBJECT(info), "clicked", GTK_SIGNAL_FUNC(info_callback), c); 1369 gtk_signal_connect(GTK_OBJECT(info), "clicked", GTK_SIGNAL_FUNC(info_callback), c);
1299 gtk_signal_connect(GTK_OBJECT(warn), "clicked", GTK_SIGNAL_FUNC(warn_callback), c); 1370 gtk_signal_connect(GTK_OBJECT(warn), "clicked", GTK_SIGNAL_FUNC(warn_callback), c);
1300 gtk_signal_connect(GTK_OBJECT(block), "clicked", GTK_SIGNAL_FUNC(block_callback), c); 1371 gtk_signal_connect(GTK_OBJECT(block), "clicked", GTK_SIGNAL_FUNC(block_callback), c);
1301 /* gtk_signal_connect(GTK_OBJECT(color), "clicked", GTK_SIGNAL_FUNC(color_callback), c); */ 1372 /* gtk_signal_connect(GTK_OBJECT(color), "clicked", GTK_SIGNAL_FUNC(color_callback), c); */
1302 1373
1303 gtk_signal_connect(GTK_OBJECT(entry), "key_press_event", GTK_SIGNAL_FUNC(user_keypress_callback), c); 1374 gtk_signal_connect(GTK_OBJECT(entry), "key_press_event", GTK_SIGNAL_FUNC(keypress_callback), c);
1304 gtk_widget_set_usize(entry, 300, 25); 1375 gtk_widget_set_usize(entry, 300, 25);
1305 1376
1306 gtk_box_pack_start(GTK_BOX(bbox), send, TRUE, TRUE, 5); 1377 gtk_box_pack_start(GTK_BOX(bbox), send, TRUE, TRUE, 5);
1307 gtk_box_pack_start(GTK_BOX(bbox), info, TRUE, TRUE, 5); 1378 gtk_box_pack_start(GTK_BOX(bbox), info, TRUE, TRUE, 5);
1308 gtk_box_pack_start(GTK_BOX(bbox), warn, TRUE, TRUE, 5); 1379 gtk_box_pack_start(GTK_BOX(bbox), warn, TRUE, TRUE, 5);