/pidgin/main: 70fe5f9926f0: Replace the blist headline widget wi...
Elliott Sales de Andrade
qulogic at pidgin.im
Tue Jul 24 04:03:46 EDT 2012
Changeset: 70fe5f9926f053f5eb6afabbff79f32a5cee2184
Author: Elliott Sales de Andrade <qulogic at pidgin.im>
Date: 2012-06-25 04:18 -0400
Branch: cpw.qulogic.gtk3-required
URL: http://hg.pidgin.im/pidgin/main/rev/70fe5f9926f0
Description:
Replace the blist headline widget with a GtkInfoBar.
This widget will style itself automatically instead of the kludge
we were using to copy tooltips. This should fix a headline with a
dark theme, too.
diffstat:
pidgin/gtkblist.c | 190 +++++++++++++++--------------------------------------
pidgin/gtkblist.h | 8 +-
2 files changed, 57 insertions(+), 141 deletions(-)
diffs (292 lines):
diff --git a/pidgin/gtkblist.c b/pidgin/gtkblist.c
--- a/pidgin/gtkblist.c
+++ b/pidgin/gtkblist.c
@@ -5011,20 +5011,6 @@
return FALSE;
}
-static gboolean
-headline_box_enter_cb(GtkWidget *widget, GdkEventCrossing *event, PidginBuddyList *gtkblist)
-{
- gdk_window_set_cursor(gtk_widget_get_window(widget), gtkblist->hand_cursor);
- return FALSE;
-}
-
-static gboolean
-headline_box_leave_cb(GtkWidget *widget, GdkEventCrossing *event, PidginBuddyList *gtkblist)
-{
- gdk_window_set_cursor(gtk_widget_get_window(widget), gtkblist->arrow_cursor);
- return FALSE;
-}
-
static void
reset_headline(PidginBuddyList *gtkblist)
{
@@ -5044,23 +5030,35 @@
}
static gboolean
-headline_close_press_cb(GtkButton *button, PidginBuddyList *gtkblist)
-{
- gtk_widget_hide(gtkblist->headline_hbox);
+headline_response_cb(GtkInfoBar *infobar, int resp, PidginBuddyList *gtkblist)
+{
+ gtk_widget_hide(gtkblist->headline);
+
+ if (resp == GTK_RESPONSE_OK) {
+ if (gtkblist->headline_callback)
+ g_idle_add(headline_click_callback, NULL);
+ else {
+ if (gtkblist->headline_destroy)
+ gtkblist->headline_destroy(gtkblist->headline_data);
+ reset_headline(gtkblist);
+ }
+ }
+
return FALSE;
}
+static void
+headline_realize_cb(GtkWidget *widget, gpointer data)
+{
+ GdkCursor *hand_cursor = gdk_cursor_new(GDK_HAND2);
+ gdk_window_set_cursor(gtk_widget_get_window(widget), hand_cursor);
+ gdk_cursor_unref(hand_cursor);
+}
+
static gboolean
-headline_box_press_cb(GtkWidget *widget, GdkEventButton *event, PidginBuddyList *gtkblist)
-{
- gtk_widget_hide(gtkblist->headline_hbox);
- if (gtkblist->headline_callback)
- g_idle_add(headline_click_callback, NULL);
- else {
- if (gtkblist->headline_destroy)
- gtkblist->headline_destroy(gtkblist->headline_data);
- reset_headline(gtkblist);
- }
+headline_press_cb(GtkWidget *widget, GdkEventButton *event, GtkInfoBar *infobar)
+{
+ gtk_info_bar_response(infobar, GTK_RESPONSE_OK);
return TRUE;
}
@@ -5493,30 +5491,6 @@
}
}
-static gboolean
-paint_headline_hbox (GtkWidget *widget,
- GdkEventExpose *event,
- gpointer user_data)
-{
- cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(widget));
- GtkAllocation allocation;
-
- gtk_widget_get_allocation(widget, &allocation);
- gtk_paint_flat_box (gtk_widget_get_style(widget),
- cr,
- GTK_STATE_NORMAL,
- GTK_SHADOW_OUT,
- widget,
- "tooltip",
- allocation.x + 1,
- allocation.y + 1,
- allocation.width - 2,
- allocation.height - 2);
- cairo_destroy(cr);
-
- return FALSE;
-}
-
/* This assumes there are not things like groupless buddies or multi-leveled groups.
* I'm sure other things in this code assumes that also.
*/
@@ -5533,51 +5507,6 @@
}
}
-static void
-headline_style_set (GtkWidget *widget,
- GtkStyle *prev_style)
-{
- GtkStyle *style;
-#if GTK_CHECK_VERSION(2,12,0)
- GtkWidget *window;
-
- if (gtkblist->changing_style)
- return;
-
- /* This is a hack needed to use the tooltip background colour */
- window = gtk_window_new(GTK_WINDOW_POPUP);
- gtk_widget_set_name(window, "gtk-tooltip");
- gtk_widget_ensure_style(window);
- style = gtk_widget_get_style(window);
-
- gtkblist->changing_style = TRUE;
- gtk_widget_set_style(gtkblist->headline_hbox, style);
- gtkblist->changing_style = FALSE;
-
- gtk_widget_destroy(window);
-
- gtk_widget_queue_draw(gtkblist->headline_hbox);
-#else
- GtkTooltips *tooltips;
-
- 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);
-#endif
-}
-
/******************************************/
/* End of connection error handling stuff */
/******************************************/
@@ -5806,8 +5735,9 @@
void *handle;
GtkTreeViewColumn *column;
GtkWidget *menu;
- GtkWidget *ebox;
GtkWidget *sep;
+ GtkWidget *infobar;
+ GtkWidget *content_area;
GtkWidget *label;
GtkWidget *close;
char *pretty, *tmp;
@@ -5935,43 +5865,38 @@
gtk_widget_show_all(gtkblist->notebook);
pidgin_blist_select_notebook_page(gtkblist);
- ebox = gtk_event_box_new();
- gtk_box_pack_start(GTK_BOX(gtkblist->vbox), ebox, FALSE, FALSE, 0);
- gtkblist->headline_hbox = gtk_hbox_new(FALSE, 3);
- gtk_container_set_border_width(GTK_CONTAINER(gtkblist->headline_hbox), 6);
- gtk_container_add(GTK_CONTAINER(ebox), gtkblist->headline_hbox);
+ gtkblist->headline = gtk_event_box_new();
+ gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->headline,
+ FALSE, FALSE, 0);
+ infobar = gtk_info_bar_new();
+ gtk_container_add(GTK_CONTAINER(gtkblist->headline), infobar);
+ gtk_info_bar_set_default_response(GTK_INFO_BAR(infobar), GTK_RESPONSE_OK);
+ gtk_info_bar_set_message_type(GTK_INFO_BAR(infobar), GTK_MESSAGE_INFO);
+
+ content_area = gtk_info_bar_get_content_area(GTK_INFO_BAR(infobar));
gtkblist->headline_image = gtk_image_new_from_pixbuf(NULL);
gtk_misc_set_alignment(GTK_MISC(gtkblist->headline_image), 0.5, 0.5);
gtkblist->headline_label = gtk_label_new(NULL);
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_label, /* connecting on headline_hbox doesn't work, because
- the signal is not emitted when theme is changed */
- "style-set",
- G_CALLBACK(headline_style_set),
- NULL);
- g_signal_connect (gtkblist->headline_hbox,
- "draw",
- 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);
-
- /* Close button. */
+ gtk_box_pack_start(GTK_BOX(content_area), gtkblist->headline_image,
+ FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(content_area), gtkblist->headline_label,
+ TRUE, TRUE, 0);
+
close = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU);
close = pidgin_create_small_button(close);
- gtk_box_pack_start(GTK_BOX(gtkblist->headline_hbox), close, FALSE, FALSE, 0);
-#if GTK_CHECK_VERSION(2,12,0)
gtk_widget_set_tooltip_text(close, _("Close"));
-#endif
- g_signal_connect(close, "clicked", G_CALLBACK(headline_close_press_cb), gtkblist);
-
- g_signal_connect(G_OBJECT(ebox), "enter-notify-event", G_CALLBACK(headline_box_enter_cb), gtkblist);
- g_signal_connect(G_OBJECT(ebox), "leave-notify-event", G_CALLBACK(headline_box_leave_cb), gtkblist);
- g_signal_connect(G_OBJECT(ebox), "button-press-event", G_CALLBACK(headline_box_press_cb), gtkblist);
+ gtk_info_bar_add_action_widget(GTK_INFO_BAR(infobar), close,
+ GTK_RESPONSE_CLOSE);
+
+ g_signal_connect(infobar, "response", G_CALLBACK(headline_response_cb),
+ gtkblist);
+ g_signal_connect(infobar, "close", G_CALLBACK(gtk_info_bar_response),
+ GINT_TO_POINTER(GTK_RESPONSE_CLOSE));
+ g_signal_connect(gtkblist->headline, "realize",
+ G_CALLBACK(headline_realize_cb), NULL);
+ g_signal_connect(gtkblist->headline, "button-press-event",
+ G_CALLBACK(headline_press_cb), infobar);
/****************************** GtkTreeView **********************************/
gtkblist->treemodel = gtk_tree_store_new(BLIST_COLUMNS,
@@ -6181,7 +6106,7 @@
PURPLE_CALLBACK(conversation_created_cb),
gtkblist);
- gtk_widget_hide(gtkblist->headline_hbox);
+ gtk_widget_hide(gtkblist->headline);
show_initial_account_errors(gtkblist);
@@ -6971,11 +6896,6 @@
g_object_unref(G_OBJECT(gtkblist->ui));
g_object_unref(G_OBJECT(gtkblist->empty_avatar));
- gdk_cursor_unref(gtkblist->hand_cursor);
- gdk_cursor_unref(gtkblist->arrow_cursor);
- gtkblist->hand_cursor = NULL;
- gtkblist->arrow_cursor = NULL;
-
priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist);
if (priv->current_theme)
g_object_unref(priv->current_theme);
@@ -7463,9 +7383,9 @@
gtkblist->headline_destroy = destroy;
if (text != NULL || pixbuf != NULL) {
set_urgent();
- gtk_widget_show_all(gtkblist->headline_hbox);
+ gtk_widget_show_all(gtkblist->headline);
} else {
- gtk_widget_hide(gtkblist->headline_hbox);
+ gtk_widget_hide(gtkblist->headline);
}
}
diff --git a/pidgin/gtkblist.h b/pidgin/gtkblist.h
--- a/pidgin/gtkblist.h
+++ b/pidgin/gtkblist.h
@@ -103,17 +103,13 @@
PurpleBlistNode *selected_node; /**< The currently selected node */
- GdkCursor *hand_cursor; /**< Hand cursor */
- GdkCursor *arrow_cursor; /**< Arrow cursor */
-
GtkWidget *scrollbook; /**< Scrollbook for alerts */
- GtkWidget *headline_hbox; /**< Hbox for headline notification */
- GtkWidget *headline_label; /**< Label for headline notifications */
+ GtkWidget *headline; /**< Hbox for headline notification */
+ GtkWidget *headline_label; /**< Label for headline notifications */
GtkWidget *headline_image; /**< Image for headline notifications */
GCallback headline_callback; /**< Callback for headline notifications */
gpointer headline_data; /**< User data for headline notifications */
GDestroyNotify headline_destroy; /**< Callback to use for destroying the headline-data */
- gboolean changing_style; /**< True when changing GTK+ theme style */
GtkWidget *statusbox; /**< The status selector dropdown */
GdkPixbuf *empty_avatar; /**< A 32x32 transparent pixbuf */
More information about the Commits
mailing list