[gtk+/wip/css: 16/37] css: Make border-width a length property
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/css: 16/37] css: Make border-width a length property
- Date: Mon, 23 Jan 2012 15:37:01 +0000 (UTC)
commit c30d514fd8bc9ee76acee9ae057426d5fa91a616
Author: Benjamin Otte <otte redhat com>
Date: Sun Jan 15 02:53:39 2012 +0100
css: Make border-width a length property
gtk/gtk-default.css | 30 ++++++------
gtk/gtk-win32.css | 6 +-
gtk/gtkcssprovider.c | 1 -
gtk/gtkcssshorthandpropertyimpl.c | 86 ++++++++++++++++++++++++++++++------
gtk/gtkcssstylepropertyimpl.c | 70 ++++++++++++++++++++++--------
5 files changed, 141 insertions(+), 52 deletions(-)
---
diff --git a/gtk/gtk-default.css b/gtk/gtk-default.css
index f068684..5496260 100644
--- a/gtk/gtk-default.css
+++ b/gtk/gtk-default.css
@@ -120,7 +120,7 @@ GtkTreeView.view.expander:selected:prelight {
background-color: alpha (@fg_color, 0.25);
border-color: @fg_color;
border-style: solid;
- border-width: 1;
+ border-width: 1px;
}
.tooltip,
@@ -128,14 +128,14 @@ GtkTreeView.view.expander:selected:prelight {
background-color: @tooltip_bg_color;
color: @tooltip_fg_color;
border-color: @tooltip_fg_color;
- border-width: 1;
+ border-width: 1px;
border-style: solid;
}
.button,
.slider {
border-style: outset;
- border-width: 2;
+ border-width: 2px;
}
.button:active {
@@ -153,13 +153,13 @@ GtkTreeView.view.expander:selected:prelight {
.trough {
background-color: darker (@bg_color);
border-style: inset;
- border-width: 1;
+ border-width: 1px;
padding: 0;
}
.entry {
border-style: inset;
- border-width: 2;
+ border-width: 2px;
background-color: @base_color;
color: @text_color;
}
@@ -180,7 +180,7 @@ GtkTreeView.view.expander:selected:prelight {
border-color: shade (@selected_bg_color, 0.7);
color: @selected_fg_color;
border-style: outset;
- border-width: 1;
+ border-width: 1px;
}
GtkCheckButton:hover,
@@ -194,7 +194,7 @@ GtkRadioButton:selected {
.cell.check, .cell.radio,
.cell.check:hover, .cell.radio:hover {
border-style: solid;
- border-width: 1;
+ border-width: 1px;
background-color: @base_color;
border-color: @fg_color;
}
@@ -224,22 +224,22 @@ GtkRadioButton:selected {
.popup {
border-style: outset;
- border-width: 1;
+ border-width: 1px;
}
.viewport {
border-style: inset;
- border-width: 2;
+ border-width: 2px;
}
.notebook {
border-style: outset;
- border-width: 1;
+ border-width: 1px;
}
.frame {
border-style: inset;
- border-width: 1;
+ border-width: 1px;
}
GtkScrolledWindow.frame {
@@ -250,7 +250,7 @@ GtkScrolledWindow.frame {
.menubar,
.toolbar {
border-style: outset;
- border-width: 1;
+ border-width: 1px;
}
.menu:hover,
@@ -263,7 +263,7 @@ GtkScrolledWindow.frame {
}
GtkSpinButton.button {
- border-width: 1;
+ border-width: 1px;
}
.scale.slider:hover,
@@ -329,7 +329,7 @@ GtkLabel:selected:focused {
color: #fff;
}
GtkCalendar.view {
- border-width: 1;
+ border-width: 1px;
border-style: inset;
padding: 1;
}
@@ -341,7 +341,7 @@ GtkCalendar.view:inconsistent {
GtkCalendar.header {
background-color: @bg_color;
border-style: outset;
- border-width: 2;
+ border-width: 2px;
}
GtkCalendar.highlight {
diff --git a/gtk/gtk-win32.css b/gtk/gtk-win32.css
index e5978b9..e1782fc 100644
--- a/gtk/gtk-win32.css
+++ b/gtk/gtk-win32.css
@@ -240,7 +240,7 @@
.spinbutton.button,
.spinbutton.button:focused {
background-color: transparent;
- border-width: 1 1 0 0;
+ border-width: 1px 1px 0 0;
border-style: none;
background-image: -gtk-win32-theme-part(spin, 1 1);
color: rgba(0, 0, 0, 0);
@@ -265,7 +265,7 @@
.spinbutton.button.bottom,
.spinbutton.button.bottom:focused {
- border-width: 0 1 1 0;
+ border-width: 0 1px 1px 0;
background-image: -gtk-win32-theme-part(spin, 2 1);
color: rgba(0, 0, 0, 0);
}
@@ -589,7 +589,7 @@ GtkComboBox.combobox-entry .button:insensitive {
.notebook {
background-color: transparent;
- border-width: 1 3 2 2;
+ border-width: 1px 3px 2px 2px;
border-style: solid;
background-origin: padding-box;
background-clip: border-box;
diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c
index 72c3749..a93a081 100644
--- a/gtk/gtkcssprovider.c
+++ b/gtk/gtkcssprovider.c
@@ -2791,7 +2791,6 @@ gtk_css_provider_get_default (void)
if (G_UNLIKELY (!provider))
{
-
provider = gtk_css_provider_new ();
if (!_gtk_css_provider_load_from_resource (provider, "/org/gtk/libgtk/gtk-default.css"))
{
diff --git a/gtk/gtkcssshorthandpropertyimpl.c b/gtk/gtkcssshorthandpropertyimpl.c
index 467f34f..d0aa8ac 100644
--- a/gtk/gtkcssshorthandpropertyimpl.c
+++ b/gtk/gtkcssshorthandpropertyimpl.c
@@ -80,6 +80,48 @@ parse_border_width (GtkCssShorthandProperty *shorthand,
return TRUE;
}
+static gboolean
+parse_border_width_really (GtkCssShorthandProperty *shorthand,
+ GValue *values,
+ GtkCssParser *parser,
+ GFile *base)
+{
+ GtkCssNumber numbers[4];
+ guint i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (!_gtk_css_parser_has_number (parser))
+ break;
+
+ if (!_gtk_css_parser_read_number (parser,
+ &numbers[i],
+ GTK_CSS_POSITIVE_ONLY
+ | GTK_CSS_NUMBER_AS_PIXELS
+ | GTK_CSS_PARSE_LENGTH))
+ return FALSE;
+ }
+
+ if (i == 0)
+ {
+ _gtk_css_parser_error (parser, "Expected a length");
+ return FALSE;
+ }
+
+ for (; i < 4; i++)
+ {
+ numbers[i] = numbers[(i - 1) >> 1];
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ g_value_init (&values[i], GTK_TYPE_CSS_NUMBER);
+ g_value_set_boxed (&values[i], &numbers[i]);
+ }
+
+ return TRUE;
+}
+
static gboolean
parse_border_radius (GtkCssShorthandProperty *shorthand,
GValue *values,
@@ -269,16 +311,23 @@ parse_border_side (GtkCssShorthandProperty *shorthand,
GtkCssParser *parser,
GFile *base)
{
- int width;
int style;
do
{
if (!G_IS_VALUE (&values[0]) &&
- _gtk_css_parser_try_length (parser, &width))
+ _gtk_css_parser_has_number (parser))
{
- g_value_init (&values[0], G_TYPE_INT);
- g_value_set_int (&values[0], width);
+ GtkCssNumber number;
+ if (!_gtk_css_parser_read_number (parser,
+ &number,
+ GTK_CSS_POSITIVE_ONLY
+ | GTK_CSS_NUMBER_AS_PIXELS
+ | GTK_CSS_PARSE_LENGTH))
+ return FALSE;
+
+ g_value_init (&values[0], GTK_TYPE_CSS_NUMBER);
+ g_value_set_boxed (&values[0], &number);
}
else if (!G_IS_VALUE (&values[1]) &&
_gtk_css_parser_try_enum (parser, GTK_TYPE_BORDER_STYLE, &style))
@@ -316,22 +365,29 @@ parse_border (GtkCssShorthandProperty *shorthand,
GtkCssParser *parser,
GFile *base)
{
- int width;
int style;
do
{
if (!G_IS_VALUE (&values[0]) &&
- _gtk_css_parser_try_length (parser, &width))
+ _gtk_css_parser_has_number (parser))
{
- g_value_init (&values[0], G_TYPE_INT);
- g_value_init (&values[1], G_TYPE_INT);
- g_value_init (&values[2], G_TYPE_INT);
- g_value_init (&values[3], G_TYPE_INT);
- g_value_set_int (&values[0], width);
- g_value_set_int (&values[1], width);
- g_value_set_int (&values[2], width);
- g_value_set_int (&values[3], width);
+ GtkCssNumber number;
+ if (!_gtk_css_parser_read_number (parser,
+ &number,
+ GTK_CSS_POSITIVE_ONLY
+ | GTK_CSS_NUMBER_AS_PIXELS
+ | GTK_CSS_PARSE_LENGTH))
+ return FALSE;
+
+ g_value_init (&values[0], GTK_TYPE_CSS_NUMBER);
+ g_value_init (&values[1], GTK_TYPE_CSS_NUMBER);
+ g_value_init (&values[2], GTK_TYPE_CSS_NUMBER);
+ g_value_init (&values[3], GTK_TYPE_CSS_NUMBER);
+ g_value_set_boxed (&values[0], &number);
+ g_value_set_boxed (&values[1], &number);
+ g_value_set_boxed (&values[2], &number);
+ g_value_set_boxed (&values[3], &number);
}
else if (!G_IS_VALUE (&values[4]) &&
_gtk_css_parser_try_enum (parser, GTK_TYPE_BORDER_STYLE, &style))
@@ -843,7 +899,7 @@ _gtk_css_shorthand_property_init_properties (void)
_gtk_css_shorthand_property_register ("border-width",
GTK_TYPE_BORDER,
border_width_subproperties,
- parse_border_width,
+ parse_border_width_really,
unpack_border,
pack_border);
_gtk_css_shorthand_property_register ("border-radius",
diff --git a/gtk/gtkcssstylepropertyimpl.c b/gtk/gtkcssstylepropertyimpl.c
index 8e00900..5c1ce201c 100644
--- a/gtk/gtkcssstylepropertyimpl.c
+++ b/gtk/gtkcssstylepropertyimpl.c
@@ -24,6 +24,7 @@
#include <gobject/gvaluecollector.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <cairo-gobject.h>
+#include <math.h>
#include "gtkcssparserprivate.h"
#include "gtkcssstylefuncsprivate.h"
@@ -33,6 +34,11 @@
#include "gtkprivatetypebuiltins.h"
#include "gtkstylepropertiesprivate.h"
+/* this is in case round() is not provided by the compiler,
+ * such as in the case of C89 compilers, like MSVC
+ */
+#include "fallback-c89.c"
+
/* the actual parsers we have */
#include "gtkanimationdescription.h"
#include "gtkbindings.h"
@@ -419,6 +425,25 @@ css_image_value_compute (GtkCssStyleProperty *property,
g_value_take_object (computed, image);
}
+static gboolean
+parse_border_width (GtkCssStyleProperty *property,
+ GValue *value,
+ GtkCssParser *parser,
+ GFile *base)
+{
+ GtkCssNumber number;
+
+ if (!_gtk_css_parser_read_number (parser,
+ &number,
+ GTK_CSS_POSITIVE_ONLY
+ | GTK_CSS_NUMBER_AS_PIXELS
+ | GTK_CSS_PARSE_LENGTH))
+ return FALSE;
+
+ g_value_set_boxed (value, &number);
+ return TRUE;
+}
+
static void
compute_border_width (GtkCssStyleProperty *property,
GValue *computed,
@@ -427,6 +452,7 @@ compute_border_width (GtkCssStyleProperty *property,
{
GtkCssStyleProperty *style;
GtkBorderStyle border_style;
+ GtkCssNumber number;
/* The -1 is magic that is only true because we register the style
* properties directly after the width properties.
@@ -436,9 +462,15 @@ compute_border_width (GtkCssStyleProperty *property,
if (border_style == GTK_BORDER_STYLE_NONE ||
border_style == GTK_BORDER_STYLE_HIDDEN)
- g_value_set_int (computed, 0);
- else
- g_value_copy (specified, computed);
+ {
+ g_value_set_int (computed, 0);
+ return;
+ }
+
+ _gtk_css_number_compute (&number,
+ g_value_get_boxed (specified),
+ context);
+ g_value_set_int (computed, round (number.value));
}
static gboolean
@@ -524,6 +556,7 @@ void
_gtk_css_style_property_init_properties (void)
{
char *default_font_family[] = { "Sans", NULL };
+ GtkCssNumber number;
GtkSymbolicColor *symbolic;
GtkCssBorderCornerRadius no_corner_radius = { 0, };
GtkBorder border_of_ones = { 1, 1, 1, 1 };
@@ -708,6 +741,7 @@ _gtk_css_style_property_init_properties (void)
NULL,
NULL,
0);
+ _gtk_css_number_init (&number, 0, GTK_CSS_PX);
/* IMPORTANT: compute_border_width() requires that the border-width
* properties be immeditaly followed by the border-style properties
*/
@@ -721,14 +755,14 @@ _gtk_css_style_property_init_properties (void)
NULL,
GTK_BORDER_STYLE_NONE);
gtk_css_style_property_register ("border-top-width",
- G_TYPE_INT,
+ GTK_TYPE_CSS_NUMBER,
G_TYPE_INT,
G_TYPE_INT,
0,
- NULL,
+ parse_border_width,
NULL,
compute_border_width,
- 0);
+ &number);
gtk_css_style_property_register ("border-left-style",
GTK_TYPE_BORDER_STYLE,
GTK_TYPE_BORDER_STYLE,
@@ -739,14 +773,14 @@ _gtk_css_style_property_init_properties (void)
NULL,
GTK_BORDER_STYLE_NONE);
gtk_css_style_property_register ("border-left-width",
- G_TYPE_INT,
+ GTK_TYPE_CSS_NUMBER,
G_TYPE_INT,
G_TYPE_INT,
0,
- NULL,
+ parse_border_width,
NULL,
compute_border_width,
- 0);
+ &number);
gtk_css_style_property_register ("border-bottom-style",
GTK_TYPE_BORDER_STYLE,
GTK_TYPE_BORDER_STYLE,
@@ -757,14 +791,14 @@ _gtk_css_style_property_init_properties (void)
NULL,
GTK_BORDER_STYLE_NONE);
gtk_css_style_property_register ("border-bottom-width",
- G_TYPE_INT,
+ GTK_TYPE_CSS_NUMBER,
G_TYPE_INT,
G_TYPE_INT,
0,
- NULL,
+ parse_border_width,
NULL,
compute_border_width,
- 0);
+ &number);
gtk_css_style_property_register ("border-right-style",
GTK_TYPE_BORDER_STYLE,
GTK_TYPE_BORDER_STYLE,
@@ -775,14 +809,14 @@ _gtk_css_style_property_init_properties (void)
NULL,
GTK_BORDER_STYLE_NONE);
gtk_css_style_property_register ("border-right-width",
- G_TYPE_INT,
+ GTK_TYPE_CSS_NUMBER,
G_TYPE_INT,
G_TYPE_INT,
0,
- NULL,
+ parse_border_width,
NULL,
compute_border_width,
- 0);
+ &number);
gtk_css_style_property_register ("border-top-left-radius",
GTK_TYPE_CSS_BORDER_CORNER_RADIUS,
@@ -831,14 +865,14 @@ _gtk_css_style_property_init_properties (void)
NULL,
GTK_BORDER_STYLE_NONE);
gtk_css_style_property_register ("outline-width",
- G_TYPE_INT,
+ GTK_TYPE_CSS_NUMBER,
G_TYPE_INT,
G_TYPE_INT,
0,
- NULL,
+ parse_border_width,
NULL,
compute_border_width,
- 0);
+ &number);
gtk_css_style_property_register ("outline-offset",
G_TYPE_INT,
G_TYPE_INT,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]