[evolution-patches] Patch to Fix Bug #46349



The following patch fixes EComboButton to fix bug #46349 by
fixing the paint calls to do essentially the same things that
GtkButton does, so that the widget looks correct in all themes,
for all the states and relief types.

-- dobey


Index: e-combo-button.c
===================================================================
RCS file: /cvs/gnome/evolution/widgets/misc/e-combo-button.c,v
retrieving revision 1.14
diff -u -r1.14 e-combo-button.c
--- e-combo-button.c	23 Jul 2003 13:49:30 -0000	1.14
+++ e-combo-button.c	7 Dec 2003 22:25:48 -0000
@@ -137,51 +137,89 @@
        GdkRectangle *area)
 {
 	EComboButtonPrivate *priv = combo_button->priv;
+	GtkWidget *widget = GTK_WIDGET (combo_button);
 	GtkShadowType shadow_type;
+	gboolean interior_focus;
 	int separator_x;
+	int focus_width, focus_pad;
+	int x, y, width, height;
+	int border_width;
 
-	gdk_window_set_back_pixmap (GTK_WIDGET (combo_button)->window, NULL, TRUE);
-	gdk_window_clear_area (GTK_WIDGET (combo_button)->window,
-			       area->x, area->y,
-			       area->width, area->height);
-
-	/* Only paint the outline if we are in prelight state.  */
-	if (GTK_WIDGET_STATE (combo_button) != GTK_STATE_PRELIGHT
-	    && GTK_WIDGET_STATE (combo_button) != GTK_STATE_ACTIVE)
-		return;
+	if (GTK_WIDGET_STATE (widget) == GTK_STATE_ACTIVE)
+		shadow_type = GTK_SHADOW_IN;
+	else if (GTK_BUTTON (widget)->relief == GTK_RELIEF_NONE
+		 && GTK_WIDGET_STATE (widget) != GTK_STATE_PRELIGHT)
+		shadow_type = GTK_SHADOW_NONE;
+	else
+		shadow_type = GTK_SHADOW_OUT;
+
+	border_width = GTK_CONTAINER (widget)->border_width;
+
+	x = widget->allocation.x + border_width;
+	y = widget->allocation.y + border_width;
+	width = widget->allocation.width - border_width * 2;
+	height = widget->allocation.height - border_width * 2;
 
 	separator_x = (priv->label->allocation.width
 		       + priv->label->allocation.x
 		       + priv->arrow_pixmap->allocation.x) / 2;
 
-	if (GTK_WIDGET_STATE (combo_button) == GTK_STATE_ACTIVE)
-		shadow_type = GTK_SHADOW_IN;
-	else
-		shadow_type = GTK_SHADOW_OUT;
+	/*
+	gdk_window_set_back_pixmap (widget->window, NULL, TRUE);
 
-	gtk_paint_box (GTK_WIDGET (combo_button)->style,
-		       GTK_WIDGET (combo_button)->window,
-		       GTK_STATE_PRELIGHT,
-		       shadow_type,
-		       area,
-		       GTK_WIDGET (combo_button),
-		       "button",
-		       0,
-		       0,
-		       separator_x,
-		       GTK_WIDGET (combo_button)->allocation.height);
-
-	gtk_paint_box (GTK_WIDGET (combo_button)->style,
-		       GTK_WIDGET (combo_button)->window,
-		       GTK_STATE_PRELIGHT,
-		       shadow_type,
-		       area,
-		       GTK_WIDGET (combo_button),
-		       "button",
-		       separator_x,
-		       0,
-		       GTK_WIDGET (combo_button)->allocation.width - separator_x,
-		       GTK_WIDGET (combo_button)->allocation.height);
+	gdk_window_clear_area (widget->window, x, y, width, height);
+	*/
+
+	gtk_widget_style_get (GTK_WIDGET (widget),
+			      "focus-line-width", &focus_width,
+			      "focus-padding", &focus_pad,
+			      "interior-focus", &interior_focus,
+			      NULL); 
+
+	if (GTK_WIDGET_HAS_DEFAULT (widget)
+	    && GTK_BUTTON (widget)->relief == GTK_RELIEF_NORMAL)
+		gtk_paint_box (widget->style, widget->window,
+			       GTK_STATE_NORMAL, GTK_SHADOW_IN,
+			       area, widget, "buttondefault",
+			       x, y, width, height);
+
+	if (!interior_focus && GTK_WIDGET_HAS_FOCUS (widget)) {
+		x += focus_width + focus_pad;
+		y += focus_width + focus_pad;
+		width -= 2 * (focus_width + focus_pad);
+		height -= 2 * (focus_width + focus_pad);
+	}
+
+	if (GTK_WIDGET_STATE (widget) != GTK_STATE_ACTIVE
+	    || GTK_BUTTON (widget)->depressed) {
+		gtk_paint_box (widget->style, widget->window,
+			       GTK_WIDGET_STATE (widget), shadow_type,
+			       area, widget, "button",
+			       x, y, separator_x, height);
+		gtk_paint_box (widget->style, widget->window,
+			       GTK_WIDGET_STATE (widget), shadow_type,
+			       area, widget, "button",
+			       separator_x, y, width - separator_x, height);
+	}
+
+	if (GTK_WIDGET_HAS_FOCUS (widget)) {
+		if (interior_focus) {
+			x += widget->style->xthickness + focus_pad;
+			y += widget->style->ythickness + focus_pad;
+			width -= 2 * (widget->style->xthickness + focus_pad);
+			height -=  2 * (widget->style->xthickness + focus_pad);
+		} else {
+			x -= focus_width + focus_pad;
+			y -= focus_width + focus_pad;
+			width += 2 * (focus_width + focus_pad);
+			height += 2 * (focus_width + focus_pad);
+		}
+
+		gtk_paint_focus (widget->style, widget->window,
+				 GTK_WIDGET_STATE (widget),
+				 area, widget, "button",
+				 x, y, width, height);
+	}
 }
 
 

Attachment: signature.asc
Description: This is a digitally signed message part



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