[evolution/gnome-3-6] Bug #685808 - Search bar entry background does not change on search



commit def9c3c6c9730e059a491a85ac749ac59c19fc76
Author: Milan Crha <mcrha redhat com>
Date:   Wed Nov 21 11:12:16 2012 +0100

    Bug #685808 - Search bar entry background does not change on search

 shell/e-shell-searchbar.c |   70 ++++++++++++++++++++++++++++++++++++++------
 1 files changed, 60 insertions(+), 10 deletions(-)
---
diff --git a/shell/e-shell-searchbar.c b/shell/e-shell-searchbar.c
index 36f3929..7975f74 100644
--- a/shell/e-shell-searchbar.c
+++ b/shell/e-shell-searchbar.c
@@ -59,6 +59,7 @@ struct _EShellSearchbarPrivate {
 
 	GtkRadioAction *search_option;
 	EFilterRule *search_rule;
+	GtkCssProvider *css_provider;
 
 	/* Child Widgets (not referenced) */
 	GtkWidget *filter_combo_box;
@@ -246,17 +247,27 @@ shell_searchbar_update_search_widgets (EShellSearchbar *searchbar)
 		(e_shell_view_get_search_rule (shell_view) != NULL);
 
 	if (sensitive) {
-		GtkStyle *style;
-		const GdkColor *color;
-
-		style = gtk_widget_get_style (widget);
-		color = &style->mid[GTK_STATE_SELECTED];
-
-		gtk_widget_modify_bg (widget, GTK_STATE_NORMAL, color);
-		gtk_widget_modify_text (widget, GTK_STATE_NORMAL, NULL);
+		GtkStyleContext *style;
+		GdkRGBA bg, fg;
+		gchar *css;
+
+		style = gtk_widget_get_style_context (widget);
+		gtk_style_context_get_background_color (style, GTK_STATE_FLAG_SELECTED, &bg);
+		gtk_style_context_get_color (style, GTK_STATE_FLAG_SELECTED, &fg);
+
+		css = g_strdup_printf ("GtkEntry#searchbar_searchentry_active { "
+					"   background:none; "
+					"   background-color:#%06x; "
+					"   color:#%06x; "
+					"}",
+					e_rgba_to_value (&bg),
+					e_rgba_to_value (&fg));
+		gtk_css_provider_load_from_data (searchbar->priv->css_provider, css, -1, NULL);
+		g_free (css);
+
+		gtk_widget_set_name (widget, "searchbar_searchentry_active");
 	} else {
-		/* Text color will be updated when we move the focus. */
-		gtk_widget_modify_bg (widget, GTK_STATE_NORMAL, NULL);
+		gtk_widget_set_name (widget, "searchbar_searchentry");
 	}
 
 	action = E_SHELL_WINDOW_ACTION_SEARCH_CLEAR (shell_window);
@@ -461,6 +472,27 @@ shell_searchbar_option_changed_cb (GtkRadioAction *action,
 		e_shell_searchbar_set_search_text (searchbar, NULL);
 }
 
+static gboolean
+shell_searchbar_entry_focus_in_cb (GtkWidget *entry,
+				   GdkEvent *event,
+				   EShellSearchbar *searchbar)
+{
+	/* to not change background when user changes search entry content */
+	gtk_widget_set_name (entry, "searchbar_searchentry");
+
+	return FALSE;
+}
+
+static gboolean
+shell_searchbar_entry_focus_out_cb (GtkWidget *entry,
+				    GdkEvent *event,
+				    EShellSearchbar *searchbar)
+{
+	shell_searchbar_update_search_widgets (searchbar);
+
+	return FALSE;
+}
+
 static void
 shell_searchbar_set_shell_view (EShellSearchbar *searchbar,
                                 EShellView *shell_view)
@@ -654,6 +686,11 @@ shell_searchbar_dispose (GObject *object)
 		priv->state_group = NULL;
 	}
 
+	if (priv->css_provider) {
+		g_object_unref (priv->css_provider);
+		priv->css_provider = NULL;
+	}
+
 	/* Chain up to parent's dispose() method. */
 	G_OBJECT_CLASS (e_shell_searchbar_parent_class)->dispose (object);
 }
@@ -700,7 +737,10 @@ shell_searchbar_constructed (GObject *object)
 		shell_view, (GClosureNotify) NULL,
 		G_CONNECT_AFTER | G_CONNECT_SWAPPED);
 
+	searchbar->priv->css_provider = gtk_css_provider_new ();
 	widget = searchbar->priv->search_entry;
+	gtk_style_context_add_provider (gtk_widget_get_style_context (widget),
+		GTK_STYLE_PROVIDER (searchbar->priv->css_provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
 
 	action = E_SHELL_WINDOW_ACTION_SEARCH_CLEAR (shell_window);
 
@@ -1017,6 +1057,16 @@ e_shell_searchbar_init (EShellSearchbar *searchbar)
 		G_CALLBACK (shell_searchbar_entry_key_press_cb),
 		searchbar);
 
+	g_signal_connect (
+		widget, "focus-in-event",
+		G_CALLBACK (shell_searchbar_entry_focus_in_cb),
+		searchbar);
+
+	g_signal_connect (
+		widget, "focus-out-event",
+		G_CALLBACK (shell_searchbar_entry_focus_out_cb),
+		searchbar);
+
 	/* Scope Combo Widgets */
 
 	box = GTK_BOX (searchbar);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]