Make GtkSpinButton a no-window widget

We still retain an input-only window here for now, but all
the painting is done to the parent window.
This commit is contained in:
Matthias Clasen 2010-10-21 11:41:20 +02:00
parent f4d57dbe98
commit 331323e5c7

View File

@ -135,7 +135,7 @@ static void gtk_spin_button_state_changed (GtkWidget *widget,
GtkStateType previous_state); GtkStateType previous_state);
static void gtk_spin_button_style_set (GtkWidget *widget, static void gtk_spin_button_style_set (GtkWidget *widget,
GtkStyle *previous_style); GtkStyle *previous_style);
static void gtk_spin_button_draw_arrow (GtkSpinButton *spin_button, static void gtk_spin_button_draw_arrow (GtkSpinButton *spin_button,
cairo_t *cr, cairo_t *cr,
GtkArrowType arrow_type); GtkArrowType arrow_type);
static gboolean gtk_spin_button_timer (GtkSpinButton *spin_button); static gboolean gtk_spin_button_timer (GtkSpinButton *spin_button);
@ -598,7 +598,7 @@ gtk_spin_button_realize (GtkWidget *widget)
GTK_WIDGET_CLASS (gtk_spin_button_parent_class)->realize (widget); GTK_WIDGET_CLASS (gtk_spin_button_parent_class)->realize (widget);
attributes.window_type = GDK_WINDOW_CHILD; attributes.window_type = GDK_WINDOW_CHILD;
attributes.wclass = GDK_INPUT_OUTPUT; attributes.wclass = GDK_INPUT_ONLY;
attributes.visual = gtk_widget_get_visual (widget); attributes.visual = gtk_widget_get_visual (widget);
attributes.event_mask = gtk_widget_get_events (widget); attributes.event_mask = gtk_widget_get_events (widget);
attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK
@ -616,9 +616,6 @@ gtk_spin_button_realize (GtkWidget *widget)
&attributes, attributes_mask); &attributes, attributes_mask);
gdk_window_set_user_data (priv->panel, widget); gdk_window_set_user_data (priv->panel, widget);
gtk_style_set_background (style,
priv->panel, GTK_STATE_NORMAL);
return_val = FALSE; return_val = FALSE;
g_signal_emit (spin_button, spinbutton_signals[OUTPUT], 0, &return_val); g_signal_emit (spin_button, spinbutton_signals[OUTPUT], 0, &return_val);
if (return_val == FALSE) if (return_val == FALSE)
@ -784,36 +781,32 @@ gtk_spin_button_draw (GtkWidget *widget,
{ {
GtkSpinButton *spin = GTK_SPIN_BUTTON (widget); GtkSpinButton *spin = GTK_SPIN_BUTTON (widget);
GtkSpinButtonPrivate *priv = spin->priv; GtkSpinButtonPrivate *priv = spin->priv;
GtkShadowType shadow_type;
GtkStateType state;
GTK_WIDGET_CLASS (gtk_spin_button_parent_class)->draw (widget, cr); GTK_WIDGET_CLASS (gtk_spin_button_parent_class)->draw (widget, cr);
if (gtk_cairo_should_draw_window (cr, priv->panel)) cairo_save (cr);
{
GtkShadowType shadow_type;
shadow_type = spin_button_get_shadow_type (spin); shadow_type = spin_button_get_shadow_type (spin);
gtk_cairo_transform_to_window (cr, widget, priv->panel); state = gtk_widget_has_focus (widget) ?
GTK_STATE_ACTIVE : gtk_widget_get_state (widget);
if (shadow_type != GTK_SHADOW_NONE) gtk_cairo_transform_to_window (cr, widget, priv->panel);
{
GtkStateType state;
state = gtk_widget_has_focus (widget) ? gtk_paint_box (gtk_widget_get_style (widget), cr,
GTK_STATE_ACTIVE : gtk_widget_get_state (widget); state, shadow_type,
widget, "spinbutton",
0, 0,
gdk_window_get_width (priv->panel),
gdk_window_get_height (priv->panel));
gtk_paint_box (gtk_widget_get_style (widget), cr, gtk_spin_button_draw_arrow (spin, cr, GTK_ARROW_UP);
state, shadow_type, gtk_spin_button_draw_arrow (spin, cr, GTK_ARROW_DOWN);
widget, "spinbutton",
0, 0, cairo_restore (cr);
gdk_window_get_width (priv->panel),
gdk_window_get_height (priv->panel));
}
gtk_spin_button_draw_arrow (spin, cr, GTK_ARROW_UP);
gtk_spin_button_draw_arrow (spin, cr, GTK_ARROW_DOWN);
}
return FALSE; return FALSE;
} }
@ -844,18 +837,18 @@ spin_button_at_limit (GtkSpinButton *spin_button,
} }
static void static void
gtk_spin_button_draw_arrow (GtkSpinButton *spin_button, gtk_spin_button_draw_arrow (GtkSpinButton *spin_button,
cairo_t *cr, cairo_t *cr,
GtkArrowType arrow_type) GtkArrowType arrow_type)
{ {
GtkSpinButtonPrivate *priv; GtkSpinButtonPrivate *priv;
GtkRequisition requisition;
GtkStateType state_type; GtkStateType state_type;
GtkShadowType shadow_type; GtkShadowType shadow_type;
GtkStyle *style; GtkStyle *style;
GtkWidget *widget; GtkWidget *widget;
gint x; gint x;
gint y; gint y;
gint panel_height;
gint height; gint height;
gint width; gint width;
gint h, w; gint h, w;
@ -866,23 +859,23 @@ gtk_spin_button_draw_arrow (GtkSpinButton *spin_button,
widget = GTK_WIDGET (spin_button); widget = GTK_WIDGET (spin_button);
style = gtk_widget_get_style (widget); style = gtk_widget_get_style (widget);
gtk_widget_get_preferred_size (widget, &requisition, NULL);
width = spin_button_get_arrow_size (spin_button) + 2 * style->xthickness; width = spin_button_get_arrow_size (spin_button) + 2 * style->xthickness;
panel_height = gdk_window_get_height (priv->panel);
if (arrow_type == GTK_ARROW_UP) if (arrow_type == GTK_ARROW_UP)
{ {
x = 0; x = 0;
y = 0; y = 0;
height = requisition.height / 2; height = panel_height / 2;
} }
else else
{ {
x = 0; x = 0;
y = requisition.height / 2; y = panel_height / 2;
height = (requisition.height + 1) / 2; height = (panel_height + 1) / 2;
} }
if (spin_button_at_limit (spin_button, arrow_type)) if (spin_button_at_limit (spin_button, arrow_type))
@ -919,7 +912,7 @@ gtk_spin_button_draw_arrow (GtkSpinButton *spin_button,
(arrow_type == GTK_ARROW_UP)? "spinbutton_up" : "spinbutton_down", (arrow_type == GTK_ARROW_UP)? "spinbutton_up" : "spinbutton_down",
x, y, width, height); x, y, width, height);
height = requisition.height; height = panel_height;
if (arrow_type == GTK_ARROW_DOWN) if (arrow_type == GTK_ARROW_DOWN)
{ {