[gtk+] Fix entry drawing in the presence of margins
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] Fix entry drawing in the presence of margins
- Date: Tue, 9 Aug 2011 14:06:17 +0000 (UTC)
commit d324a99454ebe3fbf556f091e724f02c5fa777b5
Author: Matthias Clasen <mclasen redhat com>
Date: Tue Aug 9 15:08:53 2011 +0200
Fix entry drawing in the presence of margins
Margins need to be taken into account when comparing requisitions
and allocations, which GtkEntry (and subclasses) do for some reason.
gtk/gtkentry.c | 21 ++++++++++++++-------
gtk/gtkspinbutton.c | 34 +++++++++++++++++++++++-----------
2 files changed, 37 insertions(+), 18 deletions(-)
---
diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c
index e58b107..f5b42d3 100644
--- a/gtk/gtkentry.c
+++ b/gtk/gtkentry.c
@@ -3171,17 +3171,20 @@ gtk_entry_get_text_area_size (GtkEntry *entry,
GtkWidget *widget = GTK_WIDGET (entry);
GtkAllocation allocation;
GtkRequisition requisition;
+ gint req_height;
gint frame_height;
gint xborder, yborder;
gtk_widget_get_preferred_size (widget, &requisition, NULL);
+ req_height = requisition.height - gtk_widget_get_margin_top (widget) - gtk_widget_get_margin_bottom (widget);
+
gtk_widget_get_allocation (widget, &allocation);
_gtk_entry_get_borders (entry, &xborder, &yborder);
if (gtk_widget_get_realized (widget))
get_frame_size (entry, TRUE, NULL, NULL, NULL, &frame_height);
else
- frame_height = requisition.height;
+ frame_height = req_height;
if (gtk_widget_has_focus (widget) && !priv->interior_focus)
frame_height -= 2 * priv->focus_width;
@@ -3190,13 +3193,13 @@ gtk_entry_get_text_area_size (GtkEntry *entry,
*x = xborder;
if (y)
- *y = frame_height / 2 - (requisition.height - yborder * 2) / 2;
+ *y = frame_height / 2 - (req_height - yborder * 2) / 2;
if (width)
*width = allocation.width - xborder * 2;
if (height)
- *height = requisition.height - yborder * 2;
+ *height = req_height - yborder * 2;
}
static void
@@ -3229,8 +3232,12 @@ get_frame_size (GtkEntry *entry,
GtkAllocation allocation;
GtkRequisition requisition;
GtkWidget *widget = GTK_WIDGET (entry);
+ gint req_height;
gtk_widget_get_preferred_size (widget, &requisition, NULL);
+
+ req_height = requisition.height - gtk_widget_get_margin_top (widget) - gtk_widget_get_margin_bottom (widget);
+
gtk_widget_get_allocation (widget, &allocation);
if (x)
@@ -3239,9 +3246,9 @@ get_frame_size (GtkEntry *entry,
if (y)
{
if (priv->is_cell_renderer)
- *y = 0;
+ *y = 0;
else
- *y = (allocation.height - requisition.height) / 2;
+ *y = (allocation.height - req_height) / 2;
if (relative_to_window)
*y += allocation.y;
@@ -3253,9 +3260,9 @@ get_frame_size (GtkEntry *entry,
if (height)
{
if (priv->is_cell_renderer)
- *height = allocation.height;
+ *height = allocation.height;
else
- *height = requisition.height;
+ *height = req_height;
}
}
diff --git a/gtk/gtkspinbutton.c b/gtk/gtkspinbutton.c
index 8ff0df4..9a6b3ea 100644
--- a/gtk/gtkspinbutton.c
+++ b/gtk/gtkspinbutton.c
@@ -703,11 +703,13 @@ gtk_spin_button_realize (GtkWidget *widget)
gint attributes_mask;
gboolean return_val;
gint arrow_size;
+ gint req_height;
GtkBorder padding;
arrow_size = spin_button_get_arrow_size (spin_button);
gtk_widget_get_preferred_size (widget, &requisition, NULL);
+ req_height = requisition.height - gtk_widget_get_margin_top (widget) - gtk_widget_get_margin_bottom (widget);
gtk_widget_get_allocation (widget, &allocation);
gtk_widget_set_events (widget, gtk_widget_get_events (widget) |
@@ -729,9 +731,9 @@ gtk_spin_button_realize (GtkWidget *widget)
gtk_style_context_get_padding (context, state, &padding);
attributes.x = allocation.x + allocation.width - arrow_size - (padding.left + padding.right);
- attributes.y = allocation.y + (allocation.height - requisition.height) / 2;
+ attributes.y = allocation.y + (allocation.height - req_height) / 2;
attributes.width = arrow_size + padding.left + padding.right;
- attributes.height = requisition.height;
+ attributes.height = req_height;
priv->panel = gdk_window_new (gtk_widget_get_window (widget),
&attributes, attributes_mask);
@@ -877,6 +879,7 @@ gtk_spin_button_size_allocate (GtkWidget *widget,
GtkBorder padding;
gint arrow_size;
gint panel_width;
+ gint req_height;
arrow_size = spin_button_get_arrow_size (spin);
context = gtk_widget_get_style_context (widget);
@@ -886,6 +889,7 @@ gtk_spin_button_size_allocate (GtkWidget *widget,
panel_width = arrow_size + padding.left + padding.right;
gtk_widget_get_preferred_size (widget, &requisition, NULL);
+ req_height = requisition.height - gtk_widget_get_margin_top (widget) - gtk_widget_get_margin_bottom (widget);
gtk_widget_set_allocation (widget, allocation);
@@ -895,10 +899,10 @@ gtk_spin_button_size_allocate (GtkWidget *widget,
panel_allocation.x = allocation->x + allocation->width - panel_width;
panel_allocation.width = panel_width;
- panel_allocation.height = MIN (requisition.height, allocation->height);
+ panel_allocation.height = MIN (req_height, allocation->height);
panel_allocation.y = allocation->y +
- (allocation->height - requisition.height) / 2;
+ (allocation->height - req_height) / 2;
GTK_WIDGET_CLASS (gtk_spin_button_parent_class)->size_allocate (widget, allocation);
@@ -1075,6 +1079,7 @@ gtk_spin_button_enter_notify (GtkWidget *widget,
GtkSpinButton *spin = GTK_SPIN_BUTTON (widget);
GtkSpinButtonPrivate *priv = spin->priv;
GtkRequisition requisition;
+ gint req_height;
if (event->window == priv->panel)
{
@@ -1086,8 +1091,9 @@ gtk_spin_button_enter_notify (GtkWidget *widget,
gdk_window_get_device_position (priv->panel, device, &x, &y, NULL);
gtk_widget_get_preferred_size (widget, &requisition, NULL);
+ req_height = requisition.height - gtk_widget_get_margin_top (widget) - gtk_widget_get_margin_bottom (widget);
- if (y <= requisition.height / 2)
+ if (y <= req_height / 2)
priv->in_child = GTK_ARROW_UP;
else
priv->in_child = GTK_ARROW_DOWN;
@@ -1260,6 +1266,7 @@ gtk_spin_button_button_press (GtkWidget *widget,
if (event->window == priv->panel)
{
GtkRequisition requisition;
+ gint req_height;
if (!gtk_widget_has_focus (widget))
gtk_widget_grab_focus (widget);
@@ -1269,8 +1276,9 @@ gtk_spin_button_button_press (GtkWidget *widget,
gtk_spin_button_update (spin);
gtk_widget_get_preferred_size (widget, &requisition, NULL);
+ req_height = requisition.height - gtk_widget_get_margin_top (widget) - gtk_widget_get_margin_bottom (widget);
- if (event->y <= requisition.height / 2)
+ if (event->y <= req_height / 2)
{
if (event->button == 1)
start_spinning (spin, GTK_ARROW_UP, gtk_adjustment_get_step_increment (priv->adjustment));
@@ -1315,22 +1323,24 @@ gtk_spin_button_button_release (GtkWidget *widget,
if (event->button == 3)
{
GtkRequisition requisition;
+ gint req_height;
GtkStyleContext *context;
GtkStateFlags state;
GtkBorder padding;
gtk_widget_get_preferred_size (widget, &requisition, NULL);
+ req_height = requisition.height - gtk_widget_get_margin_top (widget) - gtk_widget_get_margin_bottom (widget);
context = gtk_widget_get_style_context (widget);
state = gtk_widget_get_state_flags (widget);
gtk_style_context_get_padding (context, state, &padding);
if (event->y >= 0 && event->x >= 0 &&
- event->y <= requisition.height &&
+ event->y <= req_height &&
event->x <= arrow_size + padding.left + padding.right)
{
if (click_child == GTK_ARROW_UP &&
- event->y <= requisition.height / 2)
+ event->y <= req_height / 2)
{
gdouble diff;
@@ -1339,7 +1349,7 @@ gtk_spin_button_button_release (GtkWidget *widget,
gtk_spin_button_real_spin (spin, diff);
}
else if (click_child == GTK_ARROW_DOWN &&
- event->y > requisition.height / 2)
+ event->y > req_height / 2)
{
gdouble diff;
@@ -1370,19 +1380,21 @@ gtk_spin_button_motion_notify (GtkWidget *widget,
if (event->window == priv->panel)
{
GtkRequisition requisition;
+ gint req_height;
gint y = event->y;
gdk_event_request_motions (event);
gtk_widget_get_preferred_size (widget, &requisition, NULL);
+ req_height = requisition.height - gtk_widget_get_margin_top (widget) - gtk_widget_get_margin_bottom (widget);
- if (y <= requisition.height / 2 &&
+ if (y <= req_height / 2 &&
priv->in_child == GTK_ARROW_DOWN)
{
priv->in_child = GTK_ARROW_UP;
gtk_widget_queue_draw (GTK_WIDGET (spin));
}
- else if (y > requisition.height / 2 &&
+ else if (y > req_height / 2 &&
priv->in_child == GTK_ARROW_UP)
{
priv->in_child = GTK_ARROW_DOWN;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]