diff options
author | Ray Strode <rstrode@redhat.com> | 2011-01-19 16:09:43 -0500 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2011-01-19 18:19:31 -0500 |
commit | f7a0a62d8d0d5892320889fc22098ca38406deee (patch) | |
tree | af26c41dea0cf50a661a0efb6f4c4126b15cf4ed | |
parent | 795fbce01470de0c529c681a292d8c097007f164 (diff) | |
download | gdm-f7a0a62d8d0d5892320889fc22098ca38406deee.tar.gz |
greeter: more gtk3 rendering fixups
This commit fixes the widgets to take better account
of padding, borders, etc, which fixes a frame drawing
problem.
-rw-r--r-- | gui/simple-greeter/gdm-greeter-login-window.c | 13 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-scrollable-widget.c | 147 |
2 files changed, 108 insertions, 52 deletions
diff --git a/gui/simple-greeter/gdm-greeter-login-window.c b/gui/simple-greeter/gdm-greeter-login-window.c index 3db63dda..9a21eddb 100644 --- a/gui/simple-greeter/gdm-greeter-login-window.c +++ b/gui/simple-greeter/gdm-greeter-login-window.c @@ -1349,7 +1349,6 @@ gdm_greeter_login_window_get_preferred_width (GtkWidget *widget, GtkAllocation widget_allocation; int min_size; int nat_size; - guint border_width; min_size = 0; nat_size = 0; @@ -1362,10 +1361,6 @@ gdm_greeter_login_window_get_preferred_width (GtkWidget *widget, &min_size, &nat_size); - border_width = gtk_container_get_border_width (GTK_CONTAINER (widget)); - min_size += 2 * border_width; - nat_size += 2 * border_width; - /* Make width be at least 33% screen width */ screen = gtk_widget_get_screen (widget); monitor = gdk_screen_get_monitor_at_window (screen, gtk_widget_get_window (widget)); @@ -1396,7 +1391,6 @@ gdm_greeter_login_window_get_preferred_height (GtkWidget *widget, GdkRectangle area; int min_size; int nat_size; - guint border_width; min_size = 0; nat_size = 0; @@ -1409,10 +1403,6 @@ gdm_greeter_login_window_get_preferred_height (GtkWidget *widget, &min_size, &nat_size); - border_width = gtk_container_get_border_width (GTK_CONTAINER (widget)); - min_size += 2 * border_width; - nat_size += 2 * border_width; - /* Make height be at most 80% of screen height */ screen = gtk_widget_get_screen (widget); monitor = gdk_screen_get_monitor_at_window (screen, gtk_widget_get_window (widget)); @@ -1509,6 +1499,7 @@ gdm_greeter_login_window_class_init (GdmGreeterLoginWindowClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass); object_class->get_property = gdm_greeter_login_window_get_property; object_class->set_property = gdm_greeter_login_window_set_property; @@ -1519,6 +1510,8 @@ gdm_greeter_login_window_class_init (GdmGreeterLoginWindowClass *klass) widget_class->get_preferred_width = gdm_greeter_login_window_get_preferred_width; widget_class->get_preferred_height = gdm_greeter_login_window_get_preferred_height; + gtk_container_class_handle_border_width (container_class); + signals [BEGIN_AUTO_LOGIN] = g_signal_new ("begin-auto-login", G_TYPE_FROM_CLASS (object_class), diff --git a/gui/simple-greeter/gdm-scrollable-widget.c b/gui/simple-greeter/gdm-scrollable-widget.c index dc8c230d..7d493c61 100644 --- a/gui/simple-greeter/gdm-scrollable-widget.c +++ b/gui/simple-greeter/gdm-scrollable-widget.c @@ -40,6 +40,8 @@ #define GDM_SCROLLABLE_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_SCROLLABLE_WIDGET, GdmScrollableWidgetPrivate)) +#define GDM_STYLE_CLASS_SCROLLABLE_WIDGET "gdm-scrollable-widget" + enum { SCROLL_CHILD, @@ -141,7 +143,6 @@ on_animation_tick (GdmScrollableWidgetAnimation *animation, height = animation->desired_height; height -= gtk_widget_get_style (animation->widget)->ythickness * 2; - height -= gtk_container_get_border_width (GTK_CONTAINER (animation->widget)) * 2; timer = g_object_ref (animation->timer); animation->step_func (GDM_SCROLLABLE_WIDGET (animation->widget), @@ -151,7 +152,6 @@ on_animation_tick (GdmScrollableWidgetAnimation *animation, if (gdm_timer_is_started (timer)) { height += gtk_widget_get_style (animation->widget)->ythickness * 2; - height += gtk_container_get_border_width (GTK_CONTAINER (animation->widget)) * 2; animation->desired_height = height; } @@ -288,13 +288,24 @@ gdm_scrollable_widget_get_preferred_size (GtkWidget *widget, gint *natural_size) { GdmScrollableWidget *scrollable_widget; + GtkStyleContext *context; + GtkStateFlags state; + GtkBorder padding, border; GtkRequisition scrollbar_requisition; GtkRequisition minimum_req, natural_req; GtkWidget *child; int min_child_size, nat_child_size; - scrollable_widget = GDM_SCROLLABLE_WIDGET (widget); + context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); + gtk_style_context_save (context); + gtk_style_context_add_class (context, GTK_STYLE_CLASS_FRAME); + gtk_style_context_add_class (context, GDM_STYLE_CLASS_SCROLLABLE_WIDGET); + gtk_style_context_get_padding (context, state, &padding); + gtk_style_context_get_border (context, state, &border); + + scrollable_widget = GDM_SCROLLABLE_WIDGET (widget); if (orientation == GTK_ORIENTATION_VERTICAL && scrollable_widget->priv->forced_height >= 0) { minimum_req.height = scrollable_widget->priv->forced_height; @@ -306,14 +317,13 @@ gdm_scrollable_widget_get_preferred_size (GtkWidget *widget, &scrollbar_requisition, NULL); - minimum_req.width = 2 * gtk_container_get_border_width (GTK_CONTAINER (widget)); - minimum_req.height = 2 * gtk_container_get_border_width (GTK_CONTAINER (widget)); - - minimum_req.width += 2 * gtk_widget_get_style (widget)->xthickness; - minimum_req.height += 2 * gtk_widget_get_style (widget)->ythickness; - - natural_req.width = minimum_req.width; - natural_req.height = minimum_req.height; + minimum_req.width = padding.left + padding.right; + minimum_req.width = border.left + border.right; + minimum_req.height = padding.top + padding.bottom; + natural_req.width = padding.left + padding.right; + natural_req.width = border.left + border.right; + natural_req.height = padding.top + padding.bottom; + natural_req.height = border.top + border.bottom; if (child && gtk_widget_get_visible (child)) { if (orientation == GTK_ORIENTATION_HORIZONTAL) { @@ -353,6 +363,8 @@ gdm_scrollable_widget_get_preferred_size (GtkWidget *widget, if (natural_size) *natural_size = natural_req.height; } + + gtk_style_context_restore (context); } static void @@ -382,8 +394,19 @@ gdm_scrollable_widget_size_allocate (GtkWidget *widget, gboolean needs_scrollbar; gboolean is_flipped; GtkWidget *child; + GtkStyleContext *context; + GtkStateFlags state; + GtkBorder padding, border; scrollable_widget = GDM_SCROLLABLE_WIDGET (widget); + context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); + + gtk_style_context_save (context); + gtk_style_context_add_class (context, GTK_STYLE_CLASS_FRAME); + gtk_style_context_add_class (context, GDM_STYLE_CLASS_SCROLLABLE_WIDGET); + gtk_style_context_get_padding (context, state, &padding); + gtk_style_context_get_padding (context, state, &border); gtk_widget_set_allocation (widget, allocation); @@ -399,18 +422,14 @@ gdm_scrollable_widget_size_allocate (GtkWidget *widget, if (!is_flipped) { scrollbar_allocation.x = allocation->x + allocation->width; - scrollbar_allocation.x -= gtk_container_get_border_width (GTK_CONTAINER (widget)); - scrollbar_allocation.x -= scrollbar_allocation.width; + scrollbar_allocation.x -= scrollbar_allocation.width - padding.right; } else { - scrollbar_allocation.x = allocation->x; - scrollbar_allocation.x += gtk_container_get_border_width (GTK_CONTAINER (widget)); + scrollbar_allocation.x = allocation->x + padding.right + border.right; } scrollbar_allocation.height = allocation->height; - scrollbar_allocation.height -= 2 * gtk_container_get_border_width (GTK_CONTAINER (widget)); - scrollbar_allocation.y = allocation->y; - scrollbar_allocation.y += gtk_container_get_border_width (GTK_CONTAINER (widget)); + scrollbar_allocation.y = allocation->y + padding.top; gtk_widget_size_allocate (scrollable_widget->priv->scrollbar, &scrollbar_allocation); @@ -420,35 +439,41 @@ gdm_scrollable_widget_size_allocate (GtkWidget *widget, if (has_child) { child_allocation.width = allocation->width; - child_allocation.width -= 2 * gtk_container_get_border_width (GTK_CONTAINER (widget)); - child_allocation.width -= 2 * gtk_widget_get_style (widget)->xthickness; + child_allocation.width = MAX (child_allocation.width - padding.left, 1); + child_allocation.width = MAX (child_allocation.width - padding.right, 1); + child_allocation.width = MAX (child_allocation.width - border.left, 1); + child_allocation.width = MAX (child_allocation.width - border.right, 1); if (needs_scrollbar) { - child_allocation.width -= scrollbar_allocation.width; + child_allocation.width = MAX (child_allocation.width - scrollbar_allocation.width, 1); } if (!is_flipped) { child_allocation.x = allocation->x; - child_allocation.x += gtk_container_get_border_width (GTK_CONTAINER (widget)); - child_allocation.x += gtk_widget_get_style (widget)->xthickness; + child_allocation.x += padding.left; + child_allocation.x += border.left; } else { child_allocation.x = allocation->x + allocation->width; - child_allocation.x -= gtk_container_get_border_width (GTK_CONTAINER (widget)); child_allocation.x -= child_allocation.width; - child_allocation.x -= gtk_widget_get_style (widget)->xthickness; + child_allocation.x -= padding.left; + child_allocation.x -= border.left; } child_allocation.height = allocation->height; - child_allocation.height -= 2 * gtk_container_get_border_width (GTK_CONTAINER (widget)); - child_allocation.height -= 2 * gtk_widget_get_style (widget)->ythickness; + child_allocation.height = MAX (child_allocation.height - padding.top, 1); + child_allocation.height = MAX (child_allocation.height - border.top, 1); + child_allocation.height = MAX (child_allocation.height - padding.bottom, 1); + child_allocation.height = MAX (child_allocation.height - border.bottom, 1); + child_allocation.y = allocation->y; - child_allocation.y += gtk_container_get_border_width (GTK_CONTAINER (widget)); - child_allocation.y += gtk_widget_get_style (widget)->ythickness; + child_allocation.y += padding.top; + child_allocation.y += border.top; gtk_widget_size_allocate (child, &child_allocation); scrollable_widget->priv->child_adjustments_stale = FALSE; } + gtk_style_context_restore (context); } static void @@ -541,8 +566,20 @@ gdm_scrollable_widget_draw (GtkWidget *widget, int height; gboolean is_flipped; GtkStyleContext *context; + GtkStateFlags state; + GtkBorder padding, border; GtkAllocation widget_allocation; + context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); + is_flipped = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL; + + gtk_style_context_save (context); + gtk_style_context_add_class (context, GTK_STYLE_CLASS_FRAME); + gtk_style_context_add_class (context, GDM_STYLE_CLASS_SCROLLABLE_WIDGET); + gtk_style_context_get_padding (context, state, &padding); + gtk_style_context_get_border (context, state, &border); + gtk_widget_get_allocation (widget, &widget_allocation); scrollable_widget = GDM_SCROLLABLE_WIDGET (widget); @@ -551,13 +588,11 @@ gdm_scrollable_widget_draw (GtkWidget *widget, return FALSE; } - is_flipped = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL; - - x = widget_allocation.x; - x += 2 * gtk_container_get_border_width (GTK_CONTAINER (widget)); + x = 0; + x += padding.left; width = widget_allocation.width; - width -= 2 * gtk_container_get_border_width (GTK_CONTAINER (widget)); + width -= padding.left + padding.right; if (gdm_scrollable_widget_needs_scrollbar (scrollable_widget)) { GtkAllocation scrollbar_allocation; @@ -569,15 +604,11 @@ gdm_scrollable_widget_draw (GtkWidget *widget, } } - y = widget_allocation.y; - y += 2 * gtk_container_get_border_width (GTK_CONTAINER (widget)); + y = 0; + y += padding.top; height = widget_allocation.height; - height -= 2 * gtk_container_get_border_width (GTK_CONTAINER (widget)); - - context = gtk_widget_get_style_context (widget); - gtk_style_context_save (context); - gtk_style_context_add_class (context, GTK_STYLE_CLASS_FRAME); + height -= padding.top + padding.bottom; gtk_render_frame (context, cr, x, y, width, height); @@ -677,6 +708,7 @@ gdm_scrollable_widget_class_init (GdmScrollableWidgetClass *klass) container_class->add = gdm_scrollable_widget_add; container_class->remove = gdm_scrollable_widget_remove; container_class->forall = gdm_scrollable_widget_forall; + gtk_container_class_handle_border_width (container_class); signals[SCROLL_CHILD] = g_signal_new ("scroll-child", @@ -726,10 +758,42 @@ gdm_scrollable_widget_add_invisible_event_sink (GdmScrollableWidget *widget) static void gdm_scrollable_widget_init (GdmScrollableWidget *widget) { + GtkCssProvider *provider; + GtkStyleContext *context; + GError *error; + widget->priv = GDM_SCROLLABLE_WIDGET_GET_PRIVATE (widget); widget->priv->forced_height = -1; + context = gtk_widget_get_style_context (GTK_WIDGET (widget)); + provider = gtk_css_provider_new (); + + error = NULL; + /* FIXME: apparently no easy way to say + * "use the same style as scrolled window" + */ + gtk_css_provider_load_from_data (provider, + + "." GDM_STYLE_CLASS_SCROLLABLE_WIDGET " {\n" + " border-style: solid;\n" + " border-color: darker (@bg_color);\n" + " border-width: 1; \n" + " border-radius: 0;\n" + "}\n", + -1, + &error); + + if (error != NULL) { + g_warning ("Error loading style data: %s", error->message); + g_error_free (error); + } else { + gtk_style_context_add_provider (context, + GTK_STYLE_PROVIDER (provider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + } + g_object_unref (provider); + gdm_scrollable_widget_add_scrollbar (widget); gdm_scrollable_widget_add_invisible_event_sink (widget); } @@ -806,7 +870,6 @@ gdm_scrollable_widget_slide_to_height (GdmScrollableWidget *scrollable_widget, } height += gtk_widget_get_style (widget)->ythickness * 2; - height += gtk_container_get_border_width (GTK_CONTAINER (widget)) * 2; gtk_widget_get_allocation (widget, &widget_allocation); |