diff src/buddy_chat.c @ 1:2846a03bda67

[gaim-migrate @ 10] The other missing files :) committer: Tailor Script <tailor@pidgin.im>
author Rob Flynn <gaim@robflynn.com>
date Thu, 23 Mar 2000 03:13:54 +0000
parents
children 8ba601b1949a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/buddy_chat.c	Thu Mar 23 03:13:54 2000 +0000
@@ -0,0 +1,654 @@
+/*
+ * gaim
+ *
+ * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <string.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <gtk/gtk.h>
+#include "gaim.h"
+#include "gtkhtml.h"
+
+static GtkWidget *joinchat;
+static GtkWidget *entry;
+static GtkWidget *invite;
+static GtkWidget *inviteentry;
+static GtkWidget *invitemess;
+
+static void destroy_join_chat()
+{
+	if (joinchat)
+		gtk_widget_destroy(joinchat);
+	joinchat=NULL;
+}
+
+static void destroy_invite()
+{
+	if (invite)
+		gtk_widget_destroy(invite);
+	invite=NULL;
+}
+
+
+
+
+static void do_join_chat()
+{
+	char *group;
+
+	group = gtk_entry_get_text(GTK_ENTRY(entry));
+
+        if (joinchat) {
+                serv_join_chat(4, group);
+		gtk_widget_destroy(joinchat);
+	}
+	joinchat=NULL;
+}
+
+
+
+void join_chat()
+{
+	GtkWidget *cancel;
+	GtkWidget *join;
+	GtkWidget *label;
+	GtkWidget *bbox;
+	GtkWidget *vbox;
+	GtkWidget *topbox;
+	if (!joinchat) {
+		joinchat = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+		cancel = gtk_button_new_with_label("Cancel");
+		join = gtk_button_new_with_label("Join");
+		bbox = gtk_hbox_new(TRUE, 10);
+		topbox = gtk_hbox_new(FALSE, 5);
+		vbox = gtk_vbox_new(FALSE, 5);
+		entry = gtk_entry_new();
+
+		/* Put the buttons in the box */
+		gtk_box_pack_start(GTK_BOX(bbox), join, TRUE, TRUE, 10);
+		gtk_box_pack_start(GTK_BOX(bbox), cancel, TRUE, TRUE, 10);
+		
+		label = gtk_label_new("Join what group:");
+		gtk_widget_show(label);
+		gtk_box_pack_start(GTK_BOX(topbox), label, FALSE, FALSE, 5);
+		gtk_box_pack_start(GTK_BOX(topbox), entry, FALSE, FALSE, 5);
+	
+		/* And the boxes in the box */
+		gtk_box_pack_start(GTK_BOX(vbox), topbox, TRUE, TRUE, 5);
+		gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 5);
+		
+		/* Handle closes right */
+		gtk_signal_connect(GTK_OBJECT(joinchat), "delete_event",
+			   GTK_SIGNAL_FUNC(destroy_join_chat), joinchat);
+
+		gtk_signal_connect(GTK_OBJECT(cancel), "clicked",
+			   GTK_SIGNAL_FUNC(destroy_join_chat), joinchat);
+		gtk_signal_connect(GTK_OBJECT(join), "clicked",
+			   GTK_SIGNAL_FUNC(do_join_chat), joinchat);
+		gtk_signal_connect(GTK_OBJECT(entry), "activate",
+			   GTK_SIGNAL_FUNC(do_join_chat), joinchat);
+		/* Finish up */
+		gtk_widget_show(join);
+		gtk_widget_show(cancel);
+		gtk_widget_show(entry);
+		gtk_widget_show(topbox);
+		gtk_widget_show(bbox);
+		gtk_widget_show(vbox);
+		gtk_window_set_title(GTK_WINDOW(joinchat), "Join Chat");
+		gtk_window_set_focus(GTK_WINDOW(joinchat), entry);
+                gtk_container_add(GTK_CONTAINER(joinchat), vbox);
+                gtk_widget_realize(joinchat);
+		aol_icon(joinchat->window);
+
+	}
+	gtk_widget_show(joinchat);
+}
+
+
+static void do_invite(GtkWidget *w, struct buddy_chat *b)
+{
+	char *buddy;
+	char *mess;
+
+	buddy = gtk_entry_get_text(GTK_ENTRY(inviteentry));
+	mess = gtk_entry_get_text(GTK_ENTRY(invitemess));
+
+        if (invite) {
+                serv_chat_invite(b->id, mess, buddy);
+		gtk_widget_destroy(invite);
+	}
+	invite=NULL;
+}
+
+
+
+static void invite_callback(GtkWidget *w, struct buddy_chat *b)
+{
+	GtkWidget *cancel;
+	GtkWidget *invite_btn;
+	GtkWidget *label;
+	GtkWidget *bbox;
+	GtkWidget *vbox;
+	GtkWidget *topbox;
+	if (!invite) {
+		invite = gtk_window_new(GTK_WINDOW_DIALOG);
+		cancel = gtk_button_new_with_label("Cancel");
+		invite_btn = gtk_button_new_with_label("Invite");
+		bbox = gtk_hbox_new(TRUE, 10);
+		topbox = gtk_hbox_new(FALSE, 5);
+		vbox = gtk_vbox_new(FALSE, 5);
+		inviteentry = gtk_entry_new();
+		invitemess = gtk_entry_new();
+
+		/* Put the buttons in the box */
+		gtk_box_pack_start(GTK_BOX(bbox), invite_btn, TRUE, TRUE, 10);
+		gtk_box_pack_start(GTK_BOX(bbox), cancel, TRUE, TRUE, 10);
+		
+		label = gtk_label_new("Invite who?");
+		gtk_widget_show(label);
+		gtk_box_pack_start(GTK_BOX(topbox), label, FALSE, FALSE, 5);
+		gtk_box_pack_start(GTK_BOX(topbox), inviteentry, FALSE, FALSE, 5);
+		label = gtk_label_new("With message:");
+		gtk_widget_show(label);
+		gtk_box_pack_start(GTK_BOX(topbox), label, FALSE, FALSE, 5);
+		gtk_box_pack_start(GTK_BOX(topbox), invitemess, FALSE, FALSE, 5);
+	
+		/* And the boxes in the box */
+		gtk_box_pack_start(GTK_BOX(vbox), topbox, TRUE, TRUE, 5);
+		gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 5);
+		
+		/* Handle closes right */
+		gtk_signal_connect(GTK_OBJECT(invite), "delete_event",
+			   GTK_SIGNAL_FUNC(destroy_invite), invite);
+
+		gtk_signal_connect(GTK_OBJECT(cancel), "clicked",
+			   GTK_SIGNAL_FUNC(destroy_invite), b);
+		gtk_signal_connect(GTK_OBJECT(invite_btn), "clicked",
+			   GTK_SIGNAL_FUNC(do_invite), b);
+		gtk_signal_connect(GTK_OBJECT(inviteentry), "activate",
+			   GTK_SIGNAL_FUNC(do_invite), b);
+		/* Finish up */
+		gtk_widget_show(invite_btn);
+		gtk_widget_show(cancel);
+		gtk_widget_show(inviteentry);
+		gtk_widget_show(invitemess);
+		gtk_widget_show(topbox);
+		gtk_widget_show(bbox);
+		gtk_widget_show(vbox);
+		gtk_window_set_title(GTK_WINDOW(invite), "Invite to Buddy Chat");
+		gtk_window_set_focus(GTK_WINDOW(invite), inviteentry);
+                gtk_container_add(GTK_CONTAINER(invite), vbox);
+                gtk_widget_realize(invite);
+		aol_icon(invite->window);
+
+	}
+	gtk_widget_show(invite);
+}
+
+void chat_write(struct buddy_chat *b, char *who, int flag, char *message)
+{
+        char *buf;
+        GList *ignore = b->ignored;
+        char *str;
+        char colour[10];
+
+
+        while(ignore) {
+                if (!strcasecmp(who, ignore->data))
+                        return;
+                ignore = ignore->next;
+        }
+        
+        buf = g_malloc(BUF_LONG);
+        
+        if (flag & WFLAG_WHISPER) {
+                str = g_malloc(64);
+                g_snprintf(str, 62, "*%s*", who);
+                strcpy(colour, "#00ff00\0");
+        } else {
+                str = g_strdup(normalize(who));
+                if (!strcasecmp(str, normalize(current_user->username)))
+                        strcpy(colour, "#0000ff\0");
+                else
+                        strcpy(colour, "#ff0000\0");
+                g_free(str);
+                str = who;
+        }
+
+
+
+	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(b->text));
+                        
+        gtk_html_append_text(GTK_HTML(b->text), buf, 0);
+        gtk_html_append_text(GTK_HTML(b->text), message, (display_options & OPT_DISP_IGNORE_COLOUR) ? HTML_OPTION_NO_COLOURS : 0);
+        gtk_html_append_text(GTK_HTML(b->text), "<BR>", 0);
+        
+        gtk_html_thaw(GTK_HTML(b->text));
+        
+        if (flag & WFLAG_WHISPER)
+                g_free(str);
+
+        g_free(buf);
+}
+
+static void close_callback(GtkWidget *widget, struct buddy_chat *b)
+{
+        serv_chat_leave(b->id);
+        
+        if (b->window)
+                gtk_widget_destroy(b->window);
+        b->window = NULL;
+}
+
+
+static void whisper_callback(GtkWidget *widget, struct buddy_chat *b)
+{
+	char buf[BUF_LONG];
+	char buf2[BUF_LONG];
+	GList *selected;
+	char *who;
+
+	strncpy(buf, gtk_entry_get_text(GTK_ENTRY(b->entry)), sizeof(buf)/2);
+	if (!strlen(buf))
+		return;
+
+	selected = GTK_LIST(b->list)->selection;
+
+	if (!selected)
+		return;
+	
+
+	who = GTK_LABEL(gtk_container_children(GTK_CONTAINER(selected->data))->data)->label;
+
+	if (!who)
+		return;
+
+	gtk_entry_set_text(GTK_ENTRY(b->entry), "");
+
+        escape_text(buf);
+        serv_chat_whisper(b->id, who, buf);
+                          
+	g_snprintf(buf2, sizeof(buf2), "%s->%s", current_user->username, who);
+
+	chat_write(b, buf2, WFLAG_WHISPER, buf);
+
+	gtk_widget_grab_focus(GTK_WIDGET(b->entry));
+
+
+}
+
+
+static void send_callback(GtkWidget *widget, struct buddy_chat *b)
+{
+	char buf[BUF_LONG];
+
+	strncpy(buf, gtk_entry_get_text(GTK_ENTRY(b->entry)), sizeof(buf)/2);
+	if (!strlen(buf))
+		return;
+
+	gtk_entry_set_text(GTK_ENTRY(b->entry), "");
+
+	if (general_options & OPT_GEN_SEND_LINKS) {
+		linkify_text(buf);
+	}
+
+        escape_text(buf);
+        serv_chat_send(b->id, buf);
+        
+	gtk_widget_grab_focus(GTK_WIDGET(b->entry));
+
+
+}
+
+
+void update_chat_list(struct buddy_chat *b)
+{
+        GtkWidget *list_item;
+        char name[80];
+        char *tmp;
+        GList *names = b->in_room;
+
+
+        gtk_list_clear_items(GTK_LIST(b->list), 0, -1);
+
+
+        while(names) {
+                tmp = (char *)names->data;
+                if (g_list_index(b->ignored, names->data) != -1)
+                        g_snprintf(name, sizeof(name), "X %s", tmp);
+                else
+                        g_snprintf(name, sizeof(name), "%s", tmp);
+
+                list_item = gtk_list_item_new_with_label(name);
+                gtk_widget_show(list_item);
+                gtk_object_set_user_data(GTK_OBJECT(list_item), tmp);
+
+                gtk_list_append_items(GTK_LIST(b->list), g_list_append(NULL, list_item));
+
+                names = names->next;
+        }
+
+}
+
+
+
+void add_chat_buddy(struct buddy_chat *b, char *buddy)
+{
+        char *name = g_strdup(buddy);
+
+        b->in_room = g_list_append(b->in_room, name);
+
+        update_chat_list(b);
+
+}
+
+
+
+
+void remove_chat_buddy(struct buddy_chat *b, char *buddy)
+{	
+        GList *names = b->in_room;
+
+        while(names) {
+                if (!strcasecmp((char *)names->data, buddy)) {
+                        b->in_room = g_list_remove(b->in_room, names->data);
+                        update_chat_list(b);
+                        break;
+                }
+                names = names->next;
+        }
+}
+
+
+static void im_callback(GtkWidget *w, struct buddy_chat *b)
+{
+        char *name;
+        GList *i;
+        struct conversation *c;
+
+        i = GTK_LIST(b->list)->selection;
+        if (i)
+                name = (char *)gtk_object_get_user_data(GTK_OBJECT(i->data));
+        else
+                return;
+
+	c = find_conversation(name);
+
+	if (c != NULL) {
+		gdk_window_raise(c->window->window);
+	} else {
+		c = new_conversation(name);
+	}
+
+        
+}
+
+static void ignore_callback(GtkWidget *w, struct buddy_chat *b)
+{
+        char *name;
+        GList *i;
+
+        i = GTK_LIST(b->list)->selection;
+        if (i)
+                name = (char *)gtk_object_get_user_data(GTK_OBJECT(i->data));
+        else
+                return;
+
+        if (g_list_index(b->ignored, (gpointer)name) == -1)
+                b->ignored = g_list_append(b->ignored, name);
+        else
+                b->ignored = g_list_remove(b->ignored, name);
+
+        update_chat_list(b);
+}
+
+static void info_callback(GtkWidget *w, struct buddy_chat *b)
+{
+        char *name;
+        GList *i;
+
+        i = GTK_LIST(b->list)->selection;
+        if (i)
+                name = (char *)gtk_object_get_user_data(GTK_OBJECT(i->data));
+        else
+                return;
+
+        serv_get_info(name);
+}
+
+
+
+void show_new_buddy_chat(struct buddy_chat *b)
+{
+	GtkWidget *win;
+	GtkWidget *text;
+	GtkWidget *send;
+	GtkWidget *list;
+	GtkWidget *invite_btn;
+	GtkWidget *whisper;
+	GtkWidget *close;
+	GtkWidget *chatentry;
+        GtkWidget *tbox;
+        GtkWidget *lbox;
+        GtkWidget *bbox;
+        GtkWidget *bbox2;
+        GtkWidget *im, *ignore, *info;
+        GtkWidget *sw;
+        GtkWidget *sw2;
+	GtkWidget *vbox;
+
+	
+	win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+	b->window = win;
+
+	close = gtk_button_new_with_label("Close");
+	invite_btn = gtk_button_new_with_label("Invite");
+	whisper = gtk_button_new_with_label("Whisper");
+        send = gtk_button_new_with_label("Send");
+
+        im = gtk_button_new_with_label("IM");
+        ignore = gtk_button_new_with_label("Ignore");
+        info = gtk_button_new_with_label("Info");
+
+	text = gtk_html_new(NULL, NULL);
+	
+	b->text = text;
+
+	list = gtk_list_new();
+	b->list = list;
+
+        bbox = gtk_hbox_new(TRUE, 0);
+        bbox2 = gtk_hbox_new(TRUE, 0);
+	tbox = gtk_hbox_new(FALSE, 0);
+        vbox = gtk_vbox_new(FALSE, 0);
+        lbox = gtk_vbox_new(FALSE, 4);
+	chatentry = gtk_entry_new();
+
+	gtk_widget_realize(win);
+
+
+	b->makesound=1;
+
+	gtk_object_set_user_data(GTK_OBJECT(chatentry), b);
+	b->entry = chatentry;
+	
+	/* Hack something so we know have an entry click event */
+
+	gtk_signal_connect(GTK_OBJECT(chatentry), "activate", GTK_SIGNAL_FUNC(send_callback),b);
+        /* Text box */
+
+        sw = gtk_scrolled_window_new (NULL, NULL);
+        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
+                                        GTK_POLICY_NEVER,
+                                        GTK_POLICY_ALWAYS);
+        gtk_widget_show(sw);
+        gtk_container_add(GTK_CONTAINER(sw), text);
+        gtk_widget_show(text);
+
+
+        GTK_HTML (text)->hadj->step_increment = 10.0;
+        GTK_HTML (text)->vadj->step_increment = 10.0;
+        gtk_widget_set_usize(sw, 320, 150);
+
+        gtk_box_pack_start(GTK_BOX(tbox), sw, TRUE, TRUE, 0);
+
+
+        sw2 = gtk_scrolled_window_new(NULL, NULL);
+        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw2),
+                                       GTK_POLICY_NEVER,
+                                       GTK_POLICY_AUTOMATIC);
+        gtk_widget_show(sw2);
+        gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw2), list);
+
+        gtk_box_pack_start(GTK_BOX(lbox), sw2, TRUE, TRUE, 0);
+        gtk_box_pack_start(GTK_BOX(lbox), bbox2, FALSE, FALSE, 0);
+                                       
+        
+	gtk_box_pack_start(GTK_BOX(tbox), lbox, TRUE, TRUE, 0);
+	gtk_widget_show(list);
+
+
+	gtk_widget_set_usize(list, 150, 150);
+
+
+	/* Ready and pack buttons */
+	gtk_object_set_user_data(GTK_OBJECT(win), b);
+	gtk_object_set_user_data(GTK_OBJECT(close), b);
+	gtk_signal_connect(GTK_OBJECT(close), "clicked", GTK_SIGNAL_FUNC(close_callback),b);
+	gtk_signal_connect(GTK_OBJECT(send), "clicked", GTK_SIGNAL_FUNC(send_callback),b);
+	gtk_signal_connect(GTK_OBJECT(invite_btn), "clicked", GTK_SIGNAL_FUNC(invite_callback), b);
+	gtk_signal_connect(GTK_OBJECT(whisper), "clicked", GTK_SIGNAL_FUNC(whisper_callback), b);
+
+        gtk_signal_connect(GTK_OBJECT(im), "clicked", GTK_SIGNAL_FUNC(im_callback), b);
+        gtk_signal_connect(GTK_OBJECT(ignore), "clicked", GTK_SIGNAL_FUNC(ignore_callback), b);
+        gtk_signal_connect(GTK_OBJECT(info), "clicked", GTK_SIGNAL_FUNC(info_callback), b);
+
+	gtk_box_pack_start(GTK_BOX(bbox), send, TRUE, TRUE, 5);
+	gtk_box_pack_start(GTK_BOX(bbox), whisper, TRUE, TRUE, 5);
+	gtk_box_pack_start(GTK_BOX(bbox), invite_btn, TRUE, TRUE, 5);
+        gtk_box_pack_start(GTK_BOX(bbox), close, TRUE, TRUE, 5);
+
+        gtk_box_pack_start(GTK_BOX(bbox2), im, TRUE, TRUE, 5);
+        gtk_box_pack_start(GTK_BOX(bbox2), ignore, TRUE, TRUE, 5);
+        gtk_box_pack_start(GTK_BOX(bbox2), info, TRUE, TRUE, 5);
+	
+	/* pack and fill the rest */
+	
+	
+	gtk_box_pack_start(GTK_BOX(vbox), tbox, TRUE, TRUE, 5);
+	gtk_box_pack_start(GTK_BOX(vbox), chatentry, FALSE, FALSE, 5);
+	gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 5);
+
+	gtk_widget_show(send);
+	gtk_widget_show(invite_btn);
+	gtk_widget_show(whisper);
+        gtk_widget_show(close);
+        gtk_widget_show(im);
+        gtk_widget_show(ignore);
+        gtk_widget_show(info);
+        gtk_widget_show(bbox);
+        gtk_widget_show(lbox);
+        gtk_widget_show(bbox2);
+	gtk_widget_show(vbox);
+	gtk_widget_show(tbox);
+	gtk_widget_show(chatentry);
+
+	
+	gtk_container_add(GTK_CONTAINER(win),vbox);
+	gtk_container_border_width(GTK_CONTAINER(win), 10);
+
+	gtk_window_set_title(GTK_WINDOW(win), b->name);
+	gtk_window_set_focus(GTK_WINDOW(win), chatentry);
+
+	gtk_signal_connect(GTK_OBJECT(win), "destroy", GTK_SIGNAL_FUNC(close_callback),b);
+
+
+        gtk_widget_realize(win);
+	aol_icon(win->window);
+
+	gtk_widget_show(win);
+
+	
+}
+
+
+
+void handle_click_chat(GtkWidget *widget, GdkEventButton *event, struct chat_room *cr)
+{
+        if (event->type == GDK_2BUTTON_PRESS && event->button == 1) {
+                serv_join_chat(cr->exchange, cr->name);
+        }
+}
+
+
+void setup_buddy_chats()
+{
+        GList *list = GTK_TREE(buddies)->children;
+        struct chat_room *cr;
+        GList *crs = chat_rooms;
+        GtkWidget *w;
+        GtkWidget *item;
+        GtkWidget *tree;
+
+        while(list) {
+                w = (GtkWidget *)list->data;
+                if (!strcmp(GTK_LABEL(GTK_BIN(w)->child)->label, "Buddy Chat")) {
+                        gtk_tree_remove_items(GTK_TREE(buddies), list);
+                        list = GTK_TREE(buddies)->children;
+                        if (!list)
+                        	break;
+                }
+                list = list->next;
+        }
+
+        if (crs == NULL)
+                return;
+
+        item = gtk_tree_item_new_with_label("Buddy Chat");
+        tree = gtk_tree_new();
+        gtk_widget_show(item);
+        gtk_widget_show(tree);
+        gtk_tree_append(GTK_TREE(buddies), item);
+        gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), tree);
+        gtk_tree_item_expand(GTK_TREE_ITEM(item));
+
+        while (crs) {
+                cr = (struct chat_room *)crs->data;
+
+                item = gtk_tree_item_new_with_label(cr->name);
+                gtk_object_set_user_data(GTK_OBJECT(item), cr);
+                gtk_tree_append(GTK_TREE(tree), item);
+                gtk_widget_show(item);
+                gtk_signal_connect(GTK_OBJECT(item), "button_press_event",
+                                   GTK_SIGNAL_FUNC(handle_click_chat),
+                                   cr);
+
+                crs = crs->next;
+
+        }
+
+}