diff gtk/gtkblist.c @ 15185:a505577b6f4b

[gaim-migrate @ 17973] I realized doing Gmail notifications that mail notifications spawn dialogs that are non-user-initiated. I no longer like this, so I came up with "headlines," non-critical alerts that appear at the top of the buddy list until they're clicked or a new headline is set. Now, when you get a new mail notification, a headline will appear saying "You have 60 new e-mails." When you click it, the old mail notification will show up. Also, it looks wicked awesome: http://gaim.sf.net/sean/images/headline.png committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Tue, 12 Dec 2006 08:53:35 +0000
parents fbe2187bceec
children 933ae49622e7
line wrap: on
line diff
--- a/gtk/gtkblist.c	Tue Dec 12 08:52:46 2006 +0000
+++ b/gtk/gtkblist.c	Tue Dec 12 08:53:35 2006 +0000
@@ -3686,9 +3686,11 @@
 }
 
 static gboolean
-headline_box_press_cb(GtkWidget *widget, GdkEventButton *event, GaimGtkBuddyList *box)
+headline_box_press_cb(GtkWidget *widget, GdkEventButton *event, GaimGtkBuddyList *gtkblist)
 {
 	gtk_widget_hide(gtkblist->headline_hbox);
+	if (gtkblist->headline_callback)
+		g_idle_add(G_CALLBACK(gtkblist->headline_callback), gtkblist->headline_data);
 }
 
 /***********************************/
@@ -3812,8 +3814,8 @@
 
 static gboolean
 paint_headline_hbox  (GtkWidget      *widget,
-			  GdkEventExpose *event,
-			  gpointer        user_data)
+		      GdkEventExpose *event,
+		      gpointer        user_data)
 {
   gtk_paint_flat_box (widget->style, 
 		      widget->window,
@@ -3830,6 +3832,29 @@
   return FALSE;		      
 }
 
+static void
+headline_style_set (GtkWidget *widget,
+		    GtkStyle  *prev_style)
+{
+	GtkTooltips *tooltips;
+	GtkStyle *style;
+	
+	if (gtkblist->changing_style)
+		return;
+	
+	tooltips = gtk_tooltips_new ();
+	g_object_ref_sink (tooltips);
+
+	gtk_tooltips_force_window (tooltips);
+	gtk_widget_ensure_style (tooltips->tip_window);
+	style = gtk_widget_get_style (tooltips->tip_window);
+	
+	gtkblist->changing_style = TRUE;
+	gtk_widget_set_style (gtkblist->headline_hbox, style);
+	gtkblist->changing_style = FALSE;	
+	
+	g_object_unref (tooltips);
+}
 
 /******************************************/
 /* End of connection error handling stuff */
@@ -3988,13 +4013,23 @@
 	gtk_container_set_border_width(GTK_CONTAINER(gtkblist->headline_hbox), 6);
 	gtk_container_add(GTK_CONTAINER(ebox), gtkblist->headline_hbox);
 	gtkblist->headline_image = gtk_image_new_from_pixbuf(NULL);
+	gtk_misc_set_alignment(GTK_MISC(gtkblist->headline_image), 0.0, 0);
 	gtkblist->headline_label = gtk_label_new(NULL);
+	gtk_widget_set_size_request(gtkblist->headline_label,
+				    gaim_prefs_get_int("/gaim/gtk/blist/width")-25,-1);
+	gtk_label_set_line_wrap(GTK_LABEL(gtkblist->headline_label), TRUE);
 	gtk_box_pack_start(GTK_BOX(gtkblist->headline_hbox), gtkblist->headline_image, FALSE, FALSE, 0);
 	gtk_box_pack_start(GTK_BOX(gtkblist->headline_hbox), gtkblist->headline_label, TRUE, TRUE, 0);
+	g_signal_connect(gtkblist->headline_hbox,
+			 "style-set",
+			 G_CALLBACK(headline_style_set),
+			 NULL);
 	g_signal_connect (gtkblist->headline_hbox,
 			  "expose_event",
 			  G_CALLBACK (paint_headline_hbox),
 			  NULL);
+	gtk_widget_set_name(gtkblist->headline_hbox, "gtk-tooltips");
+
 	gtkblist->hand_cursor = gdk_cursor_new (GDK_HAND2);
 	gtkblist->arrow_cursor = gdk_cursor_new (GDK_LEFT_PTR);
 	g_signal_connect(G_OBJECT(ebox), "enter-notify-event", G_CALLBACK(headline_box_enter_cb), gtkblist);
@@ -4247,7 +4282,8 @@
 						gtkblist, GAIM_CALLBACK(conversation_deleting_cb),
 						gtkblist);
 
-	gtk_widget_hide(gtkblist->scrollbook);
+//	gtk_widget_hide(gtkblist->scrollbook);
+	gtk_widget_hide(gtkblist->headline_hbox);
 	
 	/* emit our created signal */
 	gaim_signal_emit(handle, "gtkblist-created", list);
@@ -5481,8 +5517,8 @@
 void
 gaim_gtk_blist_set_headline(const char *text, GdkPixbuf *pixbuf, GCallback callback, gpointer user_data)
 {
-	gtk_label_set_markup(gtkblist->headline_label, text);
-	gtk_image_set_from_pixbuf(gtkblist->headline_image, pixbuf);
+	gtk_label_set_markup(GTK_LABEL(gtkblist->headline_label), text);
+	gtk_image_set_from_pixbuf(GTK_IMAGE(gtkblist->headline_image), pixbuf);
 	
 	gtkblist->headline_callback = callback;
 	gtkblist->headline_data = user_data;