summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2011-01-19 16:09:43 -0500
committerRay Strode <rstrode@redhat.com>2011-01-19 18:19:31 -0500
commitf7a0a62d8d0d5892320889fc22098ca38406deee (patch)
treeaf26c41dea0cf50a661a0efb6f4c4126b15cf4ed
parent795fbce01470de0c529c681a292d8c097007f164 (diff)
downloadgdm-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.c13
-rw-r--r--gui/simple-greeter/gdm-scrollable-widget.c147
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);