diff 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
line wrap: on
line diff
--- a/src/conversation.c	Sun Jul 09 18:06:11 2000 +0000
+++ b/src/conversation.c	Sun Jul 09 23:19:21 2000 +0000
@@ -31,26 +31,9 @@
 #include <stdlib.h>
 #include <ctype.h>
 #include <gtk/gtk.h>
-#include "gaim.h"
 #include "gtkhtml.h"
 #include <gdk/gdkkeysyms.h>
-#include "pixmaps/underline.xpm"
-#include "pixmaps/bold.xpm"
-#include "pixmaps/italic.xpm"
-#include "pixmaps/small.xpm"
-#include "pixmaps/normal.xpm"
-#include "pixmaps/big.xpm"
-#include "pixmaps/fontface.xpm"
-#include "pixmaps/speaker.xpm"
-/* #include "pixmaps/aimicon2.xpm" */
-#include "pixmaps/wood.xpm"
-#include "pixmaps/palette.xpm"
-#include "pixmaps/link.xpm"
-#include "pixmaps/strike.xpm"
-
-#include "pixmaps/smile_happy.xpm"
-#include "pixmaps/smile_sad.xpm"
-#include "pixmaps/smile_wink.xpm"
+#include "convo.h"
 
 int state_lock=0;
 
@@ -61,7 +44,7 @@
 
 void check_everything(GtkWidget *entry);
 char *get_tag_by_prefix(GtkWidget *entry, const char *prefix);
-gboolean user_keypress_callback(GtkWidget *entry, GdkEventKey *event,  struct conversation *c);
+gboolean keypress_callback(GtkWidget *entry, GdkEventKey *event,  struct conversation *c);
 
 /*------------------------------------------------------------------------*/
 /*  Helpers                                                               */
@@ -235,6 +218,16 @@
 
 		cnv = cnv->next;
 	}
+
+	cnv = buddy_chats;
+	while(cnv) {
+		c = (struct conversation *)cnv->data;
+
+		if (c->log_button)
+			gtk_widget_set_sensitive(c->log_button, ((general_options & OPT_GEN_LOG_ALL)) ? FALSE : TRUE);
+
+		cnv = cnv->next;
+	}
 }
 
 void update_font_buttons()
@@ -300,10 +293,17 @@
 		show_log_dialog(p->name);
 }
 
-static int close_callback(GtkWidget *widget, struct conversation *c)
+int close_callback(GtkWidget *widget, struct conversation *c)
 {
-        gtk_widget_destroy(c->window);
-        delete_conversation(c);
+	if (c->window)
+	        gtk_widget_destroy(c->window);
+	c->window = NULL;
+
+	if (c->is_chat)
+		serv_chat_leave(c->id);
+	else
+	        delete_conversation(c);
+
         return TRUE;
 }
 
@@ -358,7 +358,7 @@
 	gtk_widget_grab_focus(c->entry);
 }
 
-static void add_callback(GtkWidget *widget, struct conversation *c)
+void add_callback(GtkWidget *widget, struct conversation *c)
 {
 	if (find_buddy(c->name) != NULL) {
 		sprintf(debug_buff,_("Removing '%s' from buddylist.\n"), c->name);
@@ -376,25 +376,38 @@
 }
 
 
-static void block_callback(GtkWidget *widget, struct conversation *c)
+void block_callback(GtkWidget *widget, struct conversation *c)
 {
         show_add_perm(c->name);
 	gtk_widget_grab_focus(c->entry);
 }
 
-static void warn_callback(GtkWidget *widget, struct conversation *c)
+void warn_callback(GtkWidget *widget, struct conversation *c)
 {
         show_warn_dialog(c->name);
 	gtk_widget_grab_focus(c->entry);
 }
 
-static void info_callback(GtkWidget *widget, struct conversation *c)
+void info_callback(GtkWidget *w, struct conversation *c)
 {
-        serv_get_info(c->name);
-	gtk_widget_grab_focus(c->entry);
+	if (c->is_chat) {
+	        char *name;
+	        GList *i;
+
+	        i = GTK_LIST(c->list)->selection;
+	        if (i)
+	                name = (char *)gtk_object_get_user_data(GTK_OBJECT(i->data));
+	        else
+	                return;
+
+	        serv_get_info(name);
+	} else {
+	        serv_get_info(c->name);
+		gtk_widget_grab_focus(c->entry);
+	}
 }
 
-gboolean user_keypress_callback(GtkWidget *entry, GdkEventKey *event,  struct conversation *c)
+gboolean keypress_callback(GtkWidget *entry, GdkEventKey *event,  struct conversation *c)
 {
   int pos;
   if(event->keyval==GDK_Return) {
@@ -415,10 +428,11 @@
 }
 
 
-static void send_callback(GtkWidget *widget, struct conversation *c)
+void send_callback(GtkWidget *widget, struct conversation *c)
 {
         char *buf = g_malloc(BUF_LEN * 4);
 	char *buf2;
+	char *buf3;
 	gchar *buf4;
         int hdrlen;
 
@@ -433,6 +447,8 @@
                 return;
         }
 
+	gtk_editable_delete_text(GTK_EDITABLE(c->entry), 0, -1);
+
         if (general_options & OPT_GEN_SEND_LINKS) {
                 linkify_text(buf);
         }
@@ -474,9 +490,10 @@
 		struct gaim_callback *g;
 		void (*function)(char *, char **, void *);
 		char *buffy = g_strdup(buf);
+		enum gaim_event evnt = c->is_chat ? event_chat_send : event_im_send;
 		while (ca) {
 			g = (struct gaim_callback *)(ca->data);
-			if (g->event == event_im_send && g->function != NULL) {
+			if (g->event == evnt && g->function != NULL) {
 				function = g->function;
 				(*function)(c->name, &buffy, g->data);
 			}
@@ -491,16 +508,27 @@
 	}
 #endif
         
-	write_to_conv(c, buf, WFLAG_SEND);
-
-	gtk_editable_delete_text(GTK_EDITABLE(c->entry), 0, -1);
+	if (!c->is_chat) {
+		buf3 = g_strdup(buf);
+		write_to_conv(c, buf3, WFLAG_SEND, NULL);
+		g_free(buf3);
+	}
 
 	escape_text(buf);
 	if (escape_message(buf) > MSG_LEN - hdrlen) {
 		do_error_dialog(_("Message too long, some data truncated."), _("Error"));
 	}
 
-        serv_send_im(c->name, buf, 0);
+	if (c->is_chat) {
+		serv_chat_send(c->id, buf);
+
+		/* no sound because we do that when we receive our message */
+	} else {
+	        serv_send_im(c->name, buf, 0);
+
+		if (c->makesound && (sound_options & OPT_SOUND_SEND))
+			play_sound(SEND);
+	}
         
 	quiet_set(c->bold, FALSE);
 	quiet_set(c->strike, FALSE);
@@ -510,14 +538,11 @@
 	quiet_set(c->palette, FALSE);
 	quiet_set(c->link, FALSE);
         
-	if (c->makesound && (sound_options & OPT_SOUND_SEND))
-		play_sound(SEND);
-
 	if ((general_options & OPT_GEN_BACK_ON_IM) && awaymessage != NULL) {
 		do_im_back();
 	}
 
-    set_font_face(NULL, c);
+	set_font_face(NULL, c);
 	
 	gtk_widget_grab_focus(c->entry);
 
@@ -684,7 +709,7 @@
 	gtk_widget_grab_focus(entry);
 }
 
-static void toggle_color(GtkWidget *color, struct conversation *c)
+void toggle_color(GtkWidget *color, struct conversation *c)
 {
 	if (state_lock)
                 return;
@@ -694,7 +719,7 @@
 		advance_past(c->entry, "<FONT COLOR>", "</FONT>" );
 }
 
-static void toggle_font(GtkWidget *font, struct conversation *c)
+void toggle_font(GtkWidget *font, struct conversation *c)
 {
 	if (state_lock)
 		return;
@@ -841,11 +866,14 @@
 /*------------------------------------------------------------------------*/
 
 
-void write_to_conv(struct conversation *c, char *what, int flags)
+/* this is going to be interesting since the conversation could either be a
+ * normal IM conversation or a chat window. but hopefully it won't matter */
+void write_to_conv(struct conversation *c, char *what, int flags, char *who)
 {
 	char *buf = g_malloc(BUF_LONG);
         char *buf2 = g_malloc(BUF_LONG);
-        char *who = NULL;
+	char *buf3;
+	char *str;
         FILE *fd;
         char colour[10];
 	GdkBitmap *mask;
@@ -854,6 +882,8 @@
 	int y;
 	int i;
 	char *smiley = g_malloc(7);
+
+	if (!who) who = c->name;
 	
         if (flags & WFLAG_SYSTEM) {
 
@@ -883,23 +913,44 @@
                 
         } else {
 
-                if (flags & WFLAG_RECV) {
-                        strcpy(colour, "#ff0000");
-			who = c->name;
-                } else if (flags & WFLAG_SEND) {
-                        strcpy(colour, "#0000ff");
-                        who = current_user->username;
-                }
+		buf3 = g_malloc(BUF_LONG);
+		
+		if (flags & WFLAG_WHISPER) {
+			/* if we're whispering, it's not an autoresponse */
+			if (meify(what)) {
+				str = g_malloc(64);
+				g_snprintf(str, 62, "***%s", who);
+				strcpy(colour, "#6C2585\0");
+			} else {
+				str = g_malloc(64);
+				g_snprintf(str, 62, "*%s*:", who);
+				strcpy(colour, "#00ff00\0");
+			}
+		} else {
+			if (meify(what)) {
+				str = g_malloc(64);
+				if (flags & WFLAG_AUTO)
+					g_snprintf(str, 62, "%s ***%s", AUTO_RESPONSE, who);
+				else
+					g_snprintf(str, 62, "***%s", who);
+				strcpy(colour, "#062585\0");
+			} else {
+				str = g_malloc(64);
+				if (flags & WFLAG_AUTO)
+					g_snprintf(str, 62, "%s %s", who, AUTO_RESPONSE);
+				else
+					g_snprintf(str, 62, "%s:", who);
+		                if (flags & WFLAG_RECV)
+		                        strcpy(colour, "#ff0000");
+				else if (flags & WFLAG_SEND)
+		                        strcpy(colour, "#0000ff");
+			}
+		}
 
-                if (flags & WFLAG_AUTO)
-                        sprintf(buf2, " %s", AUTO_RESPONSE);
-                else
-                        buf2[0]=0; /* sprintf(buf2, ""); */
-
-                if (display_options & OPT_DISP_SHOW_TIME)
-                        g_snprintf(buf, BUF_LONG, "<FONT COLOR=\"%s\"><B>%s %s:%s</B></FONT> ", colour, date(), who, buf2);
-                else
-                        g_snprintf(buf, BUF_LONG, "<FONT COLOR=\"%s\"><B>%s:%s</B></FONT> ", colour, who, buf2);
+		if (display_options & OPT_DISP_SHOW_TIME)
+			g_snprintf(buf, BUF_LONG, "<FONT COLOR=\"%s\"><B>%s %s</B></FONT> ", colour, date(), str);
+		else
+			g_snprintf(buf, BUF_LONG, "<FONT COLOR=\"%s\"><B>%s</B></FONT>", colour, str);
 
                 gtk_html_freeze(GTK_HTML(c->text));
 
@@ -917,7 +968,7 @@
                			buf2[y] = what[i];
                			y++;
 
-		                if ( (what[i] == ':') || (what[i] == ';') || (what[i] == 'O') )
+		                if ( (what[i] == ':') || (what[i] == ';') || (what[i] == '8') )
                			{
                        			if (state < 2)
                         	  	{
@@ -1007,6 +1058,11 @@
 
                 if ((general_options & OPT_GEN_LOG_ALL) || find_log_info(c->name)) {
                         char *t1, *t2;
+			char *nm = g_malloc(256);
+			if (c->is_chat)
+				g_snprintf(nm, 256, "%s.chat", c->name);
+			else
+				g_snprintf(nm, 256, "%s", c->name);
 
                         if (general_options & OPT_GEN_STRIP_HTML) {
                                 t1 = strip_html(buf);
@@ -1015,13 +1071,14 @@
                                 t1 = buf;
                                 t2 = what;
                         }
-                        fd = open_log_file(c->name);
+                        fd = open_log_file(nm);
                         fprintf(fd, "%s%s\n", t1, t2);
                         fclose(fd);
                         if (general_options & OPT_GEN_STRIP_HTML) {
                                 g_free(t1);
                                 g_free(t2);
                         }
+			g_free(nm);
                 }
         }
 
@@ -1034,7 +1091,8 @@
 	}
 */
 
-        if (general_options & OPT_GEN_POPUP_WINDOWS)
+        if ((c->is_chat && (general_options & OPT_GEN_POPUP_CHAT)) ||
+	   (!c->is_chat && (general_options & OPT_GEN_POPUP_WINDOWS)))
                 gdk_window_show(c->window->window);
 
 	g_free(smiley);        
@@ -1067,69 +1125,18 @@
 }
 
 
-void show_conv(struct conversation *c)
-{
-	GtkWidget *win;
-        char buf[256];
-        GtkWidget *text;
-        GtkWidget *sw;
-	GtkWidget *send;
-	GtkWidget *info;
-        GtkWidget *warn;
-        GtkWidget *block;
-	/* GtkWidget *color; */
-	GtkWidget *close;
-	GtkWidget *entry;
-	GtkWidget *toolbar;
-	GtkWidget *bbox;
-        GtkWidget *vbox;
-	GtkWidget *vbox2;
-	GtkWidget *paned;
-        GtkWidget *add;
+GtkWidget *build_conv_toolbar(struct conversation *c) {
         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;
         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;
         GtkWidget *strike, *small, *normal, *big, *bold, *italic, *underline, *speaker, *wood, *palette, *link, *font;
         GdkBitmap *mask;
-	
-	win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-        gtk_window_set_policy(GTK_WINDOW(win), TRUE, TRUE, TRUE);
+	GtkWidget *toolbar;
+	GtkWidget *win;
+	GtkWidget *entry;
 
-        gtk_widget_realize(win);
-        aol_icon(win->window);
- 
-        
-        c->window = win;
-        
-	send = gtk_button_new_with_label(_("Send"));
-	info = gtk_button_new_with_label(_("Info"));
-	warn = gtk_button_new_with_label(_("Warn"));
-	/* color = gtk_button_new_with_label("Color"); */
-	close = gtk_button_new_with_label(_("Close"));
-	if (find_buddy(c->name) != NULL) {
-       		add = gtk_button_new_with_label(_("Remove"));
-	}
-	else {
-		add = gtk_button_new_with_label(_("Add"));
-	}
-        block = gtk_button_new_with_label(_("Block"));
-
-
-        bbox = gtk_hbox_new(TRUE, 0);
-	vbox = gtk_vbox_new(FALSE, 0);
-	vbox2 = gtk_vbox_new(FALSE, 0);
-	paned = gtk_vpaned_new();
-
-	gtk_paned_pack1(GTK_PANED(paned), vbox, FALSE, TRUE);
-	gtk_paned_pack2(GTK_PANED(paned), vbox2, FALSE, FALSE);
-	gtk_widget_show(vbox2);
-	gtk_widget_show(paned);
-	
-	entry = gtk_text_new(NULL, NULL);
-	gtk_text_set_editable(GTK_TEXT(entry), TRUE);
-	gtk_text_set_word_wrap(GTK_TEXT(entry), TRUE);
-
-	/* Toolbar */
 	toolbar = gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_ICONS);
+	win = c->window;
+	entry = c->entry;
 
 	link_i = gdk_pixmap_create_from_xpm_d(win->window, &mask,
 	     &win->style->white, link_xpm );
@@ -1239,7 +1246,6 @@
         
 	gtk_widget_show(toolbar);
 	
-	c->entry = entry;
 	c->bold = bold;
 	c->strike = strike;
         c->italic = italic;
@@ -1247,7 +1253,6 @@
         c->log_button = wood;
 	c->palette = palette;
 	c->link = link;  
-        c->add_button = add;
 	c->font = font;
 
         gtk_widget_set_sensitive(c->log_button, ((general_options & OPT_GEN_LOG_ALL)) ? FALSE : TRUE);
@@ -1256,9 +1261,75 @@
 	gtk_widget_set_sensitive(c->italic, ((font_options & OPT_FONT_ITALIC)) ? FALSE : TRUE);
 	gtk_widget_set_sensitive(c->underline, ((font_options & OPT_FONT_UNDERLINE)) ? FALSE : TRUE);
 	gtk_widget_set_sensitive(c->strike, ((font_options & OPT_FONT_STRIKE)) ? FALSE : TRUE);
+
+	return toolbar;
+}
+
+
+void show_conv(struct conversation *c)
+{
+	GtkWidget *win;
+        char buf[256];
+        GtkWidget *text;
+        GtkWidget *sw;
+	GtkWidget *send;
+	GtkWidget *info;
+        GtkWidget *warn;
+        GtkWidget *block;
+	/* GtkWidget *color; */
+	GtkWidget *close;
+	GtkWidget *entry;
+	GtkWidget *toolbar;
+	GtkWidget *bbox;
+        GtkWidget *vbox;
+	GtkWidget *vbox2;
+	GtkWidget *paned;
+        GtkWidget *add;
+	
+	win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+        gtk_window_set_policy(GTK_WINDOW(win), TRUE, TRUE, TRUE);
+
+        gtk_widget_realize(win);
+        aol_icon(win->window);
+ 
         
+        c->window = win;
+        
+	send = gtk_button_new_with_label(_("Send"));
+	info = gtk_button_new_with_label(_("Info"));
+	warn = gtk_button_new_with_label(_("Warn"));
+	/* color = gtk_button_new_with_label("Color"); */
+	close = gtk_button_new_with_label(_("Close"));
+	if (find_buddy(c->name) != NULL) {
+       		add = gtk_button_new_with_label(_("Remove"));
+	}
+	else {
+		add = gtk_button_new_with_label(_("Add"));
+	}
+        block = gtk_button_new_with_label(_("Block"));
+
+
+        bbox = gtk_hbox_new(TRUE, 0);
+	vbox = gtk_vbox_new(FALSE, 0);
+	vbox2 = gtk_vbox_new(FALSE, 0);
+	paned = gtk_vpaned_new();
+
+	gtk_paned_pack1(GTK_PANED(paned), vbox, FALSE, TRUE);
+	gtk_paned_pack2(GTK_PANED(paned), vbox2, FALSE, FALSE);
+	gtk_widget_show(vbox2);
+	gtk_widget_show(paned);
+	
+	entry = gtk_text_new(NULL, NULL);
+	gtk_text_set_editable(GTK_TEXT(entry), TRUE);
+	gtk_text_set_word_wrap(GTK_TEXT(entry), TRUE);
 	gtk_object_set_user_data(GTK_OBJECT(entry), c);
+	c->entry = entry;
 
+	/* Toolbar */
+	toolbar = build_conv_toolbar(c);
+        
+
+        c->add_button = add;
 	
 
 	gtk_signal_connect(GTK_OBJECT(entry), "activate", GTK_SIGNAL_FUNC(send_callback),c);
@@ -1300,7 +1371,7 @@
         gtk_signal_connect(GTK_OBJECT(block), "clicked", GTK_SIGNAL_FUNC(block_callback), c);
 	/* gtk_signal_connect(GTK_OBJECT(color), "clicked", GTK_SIGNAL_FUNC(color_callback), c); */
        
-	gtk_signal_connect(GTK_OBJECT(entry), "key_press_event", GTK_SIGNAL_FUNC(user_keypress_callback), c);
+	gtk_signal_connect(GTK_OBJECT(entry), "key_press_event", GTK_SIGNAL_FUNC(keypress_callback), c);
 	gtk_widget_set_usize(entry, 300, 25);
 
 	gtk_box_pack_start(GTK_BOX(bbox), send, TRUE, TRUE, 5);