diff src/away.c @ 4412:8067614e49e4

[gaim-migrate @ 4685] Gtk2ification. Thanks, Ari. committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Sat, 25 Jan 2003 23:00:32 +0000
parents 5fb47ec9bfe4
children 62c1e5e656d0
line wrap: on
line diff
--- a/src/away.c	Sat Jan 25 21:23:02 2003 +0000
+++ b/src/away.c	Sat Jan 25 23:00:32 2003 +0000
@@ -36,8 +36,9 @@
 GtkWidget *imaway = NULL;
 
 GtkWidget *awaymenu = NULL;
-GtkWidget *clistqueue = NULL;
-GtkWidget *clistqueuesw;
+GtkWidget *awayqueue = NULL;
+GtkListStore *awayqueuestore = NULL;
+GtkWidget *awayqueuesw;
 
 struct away_message *awaymessage = NULL;
 struct away_message *default_away;
@@ -48,11 +49,55 @@
 	if (imaway)
 		gtk_widget_destroy(imaway);
 
-	clistqueue = NULL;
-	clistqueuesw = NULL;
+	awayqueue = NULL;
+	g_object_unref(G_OBJECT(awayqueuestore));
+	awayqueuestore = NULL;
+	awayqueuesw = NULL;
 	imaway = NULL;
 }
 
+static void dequeue_message(GtkTreeIter *iter)
+{
+	gchar *name;
+	GSList *templist;
+	struct gaim_conversation *cnv;
+
+	gtk_tree_model_get(GTK_TREE_MODEL(awayqueuestore), iter, 0, &name, -1);
+	
+	debug_printf("Unqueueing messages from %s.\n", name);
+	
+	templist = message_queue;
+	
+	while (templist) {
+		struct queued_message *qm = templist->data;
+		if (templist->data) {
+			if (!g_strcasecmp(qm->name, name)) {
+				cnv = gaim_find_conversation(name);
+
+				if (!cnv)
+					cnv = gaim_conversation_new(GAIM_CONV_IM, qm->name);
+
+				if (g_slist_index(connections, qm->gc) >= 0)
+					gaim_conversation_set_user(cnv, qm->gc->user);
+
+				gaim_im_write(GAIM_IM(cnv), NULL, qm->message, qm->len,
+						qm->flags, qm->tm);
+				g_free(qm->message);
+				g_free(qm);
+				templist = message_queue = g_slist_remove(message_queue, qm);
+				
+			} else {
+				templist = templist->next;
+			}
+		}
+	}
+	
+	g_free(name);
+	/* In GTK 2.2, _store_remove actually returns whether iter is valid or not
+	 * after the remove, but in GTK 2.0 it is a void function. */
+	gtk_list_store_remove(awayqueuestore, iter);
+}
+
 void purge_away_queue(GSList **queue)
 {
 	GSList *q = *queue;
@@ -83,65 +128,33 @@
 	*queue = NULL;
 }
 
-void dequeue_by_buddy(GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data) {
-	char *temp;
-	char *name;
-	GSList *templist;
-	struct gaim_conversation *cnv;
+gint dequeue_cb(GtkWidget *treeview, GdkEventButton *event, gpointer data) {
+	GtkTreeIter iter;
+	GtkTreeSelection *select;
 	
 	if(!(event->type == GDK_2BUTTON_PRESS && event->button == 1))
-		return; /* Double clicking on the clist will unqueue that users messages. */
+		return FALSE; /* Double clicking on the list will unqueue that user's messages. */
 	
-	gtk_clist_get_text(GTK_CLIST(clist), row, 0, &temp);
-	name = g_strdup(temp);
-
-	if (!name)
-		return;
-	debug_printf("Unqueueing messages from %s.\n", name);
-	templist = message_queue;
-	while (templist) {
-		struct queued_message *qm = templist->data;
-		if (templist->data) {
-			if (!g_strcasecmp(qm->name, name)) {
-				cnv = gaim_find_conversation(name);
-
-				if (!cnv)
-					cnv = gaim_conversation_new(GAIM_CONV_IM, qm->name);
+	select = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+	if(gtk_tree_selection_get_selected(select, NULL, &iter))
+			dequeue_message(&iter);
 
-				if (g_slist_index(connections, qm->gc) >= 0)
-					gaim_conversation_set_user(cnv, qm->gc->user);
-
-				gaim_conversation_write(cnv, NULL, qm->message, qm->len,
-										qm->flags, qm->tm);
-				g_free(qm->message);
-				g_free(qm);
-				templist = message_queue = g_slist_remove(message_queue, qm);
-				
-			} else {
-				templist = templist->next;
-			}
-		}
-	}
-	g_free(name);
-	gtk_clist_remove(GTK_CLIST(clist), row);
-
+	return FALSE;
 }
 	
-	
 
 
 void toggle_away_queue()
 {
-	if (!clistqueue || !clistqueuesw)
+	if (!awayqueue || !awayqueuesw)
 		return;
 
 	if (away_options & OPT_AWAY_QUEUE) {
-		gtk_widget_show(clistqueue);
-		gtk_widget_show(clistqueuesw);
+		gtk_widget_show(awayqueue);
+		gtk_widget_show(awayqueuesw);
 	} else {
-		gtk_widget_hide(clistqueue);
-		gtk_widget_hide(clistqueuesw);
-		gtk_clist_clear(GTK_CLIST(clistqueue));
+		gtk_widget_hide(awayqueue);
+		gtk_widget_hide(awayqueuesw);
 		purge_away_queue(&message_queue);
 	}
 }
@@ -151,13 +164,8 @@
 	if (imaway) {
 		GtkWidget *tmp = imaway;
 
-		gtk_clist_freeze(GTK_CLIST(clistqueue));
-		gtk_clist_clear(GTK_CLIST(clistqueue));
-
 		purge_away_queue(&message_queue);
 
-		gtk_clist_thaw(GTK_CLIST(clistqueue));
-
 		imaway = NULL;
 		gtk_widget_destroy(tmp);
 		if (w != tmp)
@@ -171,8 +179,10 @@
 	}
 
 	awaymessage = NULL;
-	clistqueue = NULL;
-	clistqueuesw = NULL;
+	awayqueue = NULL;
+	awayqueuesw = NULL;
+	g_object_unref(G_OBJECT(awayqueuestore));
+	awayqueuestore = NULL;
 	serv_set_away_all(NULL);
 }
 
@@ -183,6 +193,8 @@
 	GtkWidget *awaytext;
 	GtkWidget *sw;
 	GtkWidget *vbox;
+	GtkTreeViewColumn *column;
+	GtkCellRenderer *renderer;
 	char *buf2;
 	char *buf;
 
@@ -227,22 +239,35 @@
 		gtk_imhtml_append_text(GTK_IMHTML(awaytext), "<BR>", -1, GTK_IMHTML_NO_TITLE |
 				       GTK_IMHTML_NO_COMMENTS | GTK_IMHTML_NO_SCROLL);
 
-		clistqueuesw = gtk_scrolled_window_new(NULL, NULL);
-		gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(clistqueuesw), GTK_POLICY_NEVER,
+		awayqueuesw = gtk_scrolled_window_new(NULL, NULL);
+		gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(awayqueuesw), GTK_POLICY_NEVER,
 					       GTK_POLICY_AUTOMATIC);
-		gtk_box_pack_start(GTK_BOX(vbox), clistqueuesw, TRUE, TRUE, 0);
+		gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(awayqueuesw),
+							GTK_SHADOW_IN);
+		gtk_box_pack_start(GTK_BOX(vbox), awayqueuesw, TRUE, TRUE, 0);
 
-		clistqueue = gtk_clist_new(2);
-		gtk_clist_set_column_width(GTK_CLIST(clistqueue), 0, 100);
-		gtk_widget_set_usize(GTK_WIDGET(clistqueue), -1, 50);
-		gtk_container_add(GTK_CONTAINER(clistqueuesw), clistqueue);
-		gtk_signal_connect(GTK_OBJECT(clistqueue), "select_row", GTK_SIGNAL_FUNC(dequeue_by_buddy), NULL);
-
+		awayqueuestore = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
+		awayqueue = gtk_tree_view_new_with_model(GTK_TREE_MODEL(awayqueuestore));
+		renderer = gtk_cell_renderer_text_new();
+		
+		gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(awayqueue), FALSE);
+		column = gtk_tree_view_column_new_with_attributes (NULL, renderer,
+										"text", 0,
+										NULL);
+		gtk_tree_view_append_column(GTK_TREE_VIEW(awayqueue), column);
+		column = gtk_tree_view_column_new_with_attributes(NULL, renderer,
+										"text", 1, 
+										NULL);
+		gtk_tree_view_append_column(GTK_TREE_VIEW(awayqueue), column);
+			
+		gtk_container_add(GTK_CONTAINER(awayqueuesw), awayqueue);
+		
+		g_signal_connect(G_OBJECT(awayqueue), "button_press_event", G_CALLBACK(dequeue_cb), NULL);
 
 
 		if (away_options & OPT_AWAY_QUEUE) {
-			gtk_widget_show(clistqueuesw);
-			gtk_widget_show(clistqueue);
+			gtk_widget_show(awayqueuesw);
+			gtk_widget_show(awayqueue);
 		}
 
 		back = picture_button(imaway, _("I'm Back!"), join_xpm);
@@ -605,5 +630,4 @@
 		default_away_menu_init(GTK_WIDGET(prefs_away_menu));
 		gtk_widget_show(prefs_away_menu);
 	}
-
 }