theme: Parse window radiuses from CSS

This requires a local hack to GTK+ that's ugly and I'm not sharing it.
We'll do things properly soon enough.
This commit is contained in:
Jasper St. Pierre 2012-04-26 19:28:16 -04:00
parent fef2a061a8
commit cc3be6da4d
3 changed files with 15 additions and 89 deletions

View File

@ -685,41 +685,6 @@ parse_boolean (const char *str,
return TRUE; return TRUE;
} }
static gboolean
parse_rounding (const char *str,
guint *val,
GMarkupParseContext *context,
MetaTheme *theme,
GError **error)
{
if (strcmp ("true", str) == 0)
*val = 5; /* historical "true" value */
else if (strcmp ("false", str) == 0)
*val = 0;
else
{
int tmp;
gboolean result;
if (!META_THEME_ALLOWS (theme, META_THEME_VARIED_ROUND_CORNERS))
{
/* Not known in this version, so bail. */
set_error (error, context, G_MARKUP_ERROR,
G_MARKUP_ERROR_PARSE,
_("Boolean values must be \"true\" or \"false\" not \"%s\""),
str);
return FALSE;
}
result = parse_positive_integer (str, &tmp, context, theme, error);
*val = tmp;
return result;
}
return TRUE;
}
static gboolean static gboolean
parse_angle (const char *str, parse_angle (const char *str,
double *val, double *val,
@ -961,16 +926,8 @@ parse_toplevel_element (GMarkupParseContext *context,
const char *parent = NULL; const char *parent = NULL;
const char *has_title = NULL; const char *has_title = NULL;
const char *title_scale = NULL; const char *title_scale = NULL;
const char *rounded_top_left = NULL;
const char *rounded_top_right = NULL;
const char *rounded_bottom_left = NULL;
const char *rounded_bottom_right = NULL;
const char *hide_buttons = NULL; const char *hide_buttons = NULL;
gboolean has_title_val; gboolean has_title_val;
guint rounded_top_left_val;
guint rounded_top_right_val;
guint rounded_bottom_left_val;
guint rounded_bottom_right_val;
gboolean hide_buttons_val; gboolean hide_buttons_val;
double title_scale_val; double title_scale_val;
MetaFrameLayout *parent_layout; MetaFrameLayout *parent_layout;
@ -979,10 +936,6 @@ parse_toplevel_element (GMarkupParseContext *context,
error, error,
"!name", &name, "parent", &parent, "!name", &name, "parent", &parent,
"has_title", &has_title, "title_scale", &title_scale, "has_title", &has_title, "title_scale", &title_scale,
"rounded_top_left", &rounded_top_left,
"rounded_top_right", &rounded_top_right,
"rounded_bottom_left", &rounded_bottom_left,
"rounded_bottom_right", &rounded_bottom_right,
"hide_buttons", &hide_buttons, "hide_buttons", &hide_buttons,
NULL)) NULL))
return; return;
@ -995,20 +948,6 @@ parse_toplevel_element (GMarkupParseContext *context,
if (hide_buttons && !parse_boolean (hide_buttons, &hide_buttons_val, context, error)) if (hide_buttons && !parse_boolean (hide_buttons, &hide_buttons_val, context, error))
return; return;
rounded_top_left_val = 0;
rounded_top_right_val = 0;
rounded_bottom_left_val = 0;
rounded_bottom_right_val = 0;
if (rounded_top_left && !parse_rounding (rounded_top_left, &rounded_top_left_val, context, info->theme, error))
return;
if (rounded_top_right && !parse_rounding (rounded_top_right, &rounded_top_right_val, context, info->theme, error))
return;
if (rounded_bottom_left && !parse_rounding (rounded_bottom_left, &rounded_bottom_left_val, context, info->theme, error))
return;
if (rounded_bottom_right && !parse_rounding (rounded_bottom_right, &rounded_bottom_right_val, context, info->theme, error))
return;
title_scale_val = 1.0; title_scale_val = 1.0;
if (title_scale && !parse_title_scale (title_scale, &title_scale_val, context, error)) if (title_scale && !parse_title_scale (title_scale, &title_scale_val, context, error))
return; return;
@ -1050,18 +989,6 @@ parse_toplevel_element (GMarkupParseContext *context,
if (title_scale) if (title_scale)
info->layout->title_scale = title_scale_val; info->layout->title_scale = title_scale_val;
if (rounded_top_left)
info->layout->top_left_corner_rounded_radius = rounded_top_left_val;
if (rounded_top_right)
info->layout->top_right_corner_rounded_radius = rounded_top_right_val;
if (rounded_bottom_left)
info->layout->bottom_left_corner_rounded_radius = rounded_bottom_left_val;
if (rounded_bottom_right)
info->layout->bottom_right_corner_rounded_radius = rounded_bottom_right_val;
meta_theme_insert_layout (info->theme, name, info->layout); meta_theme_insert_layout (info->theme, name, info->layout);
push_state (info, STATE_FRAME_GEOMETRY); push_state (info, STATE_FRAME_GEOMETRY);

View File

@ -188,15 +188,6 @@ struct _MetaFrameLayout
/** Whether we should hide the buttons */ /** Whether we should hide the buttons */
guint hide_buttons : 1; guint hide_buttons : 1;
/** Radius of the top left-hand corner; 0 if not rounded */
guint top_left_corner_rounded_radius;
/** Radius of the top right-hand corner; 0 if not rounded */
guint top_right_corner_rounded_radius;
/** Radius of the bottom left-hand corner; 0 if not rounded */
guint bottom_left_corner_rounded_radius;
/** Radius of the bottom right-hand corner; 0 if not rounded */
guint bottom_right_corner_rounded_radius;
}; };
/** /**

View File

@ -531,6 +531,7 @@ meta_frame_layout_calc_geometry (const MetaFrameLayout *layout,
int width, height; int width, height;
int button_width, button_height; int button_width, button_height;
int min_size_for_rounding; int min_size_for_rounding;
double tl, tr, bl, br;
/* the left/right rects in order; the max # of rects /* the left/right rects in order; the max # of rects
* is the number of button functions * is the number of button functions
@ -871,15 +872,22 @@ meta_frame_layout_calc_geometry (const MetaFrameLayout *layout,
fgeom->bottom_left_corner_rounded_radius = 0; fgeom->bottom_left_corner_rounded_radius = 0;
fgeom->bottom_right_corner_rounded_radius = 0; fgeom->bottom_right_corner_rounded_radius = 0;
if (borders.visible.top + borders.visible.left >= min_size_for_rounding) gtk_style_context_get (ctx,
fgeom->top_left_corner_rounded_radius = layout->top_left_corner_rounded_radius; GTK_STATE_ACTIVE,
if (borders.visible.top + borders.visible.right >= min_size_for_rounding) "border-top-left-radius", &tl,
fgeom->top_right_corner_rounded_radius = layout->top_right_corner_rounded_radius; "border-top-right-radius", &tr,
"border-bottom-left-radius", &bl,
"border-bottom-right-radius", &br,
NULL);
if (borders.visible.top + borders.visible.left >= min_size_for_rounding)
fgeom->top_left_corner_rounded_radius = tl;
if (borders.visible.top + borders.visible.right >= min_size_for_rounding)
fgeom->top_right_corner_rounded_radius = tr;
if (borders.visible.bottom + borders.visible.left >= min_size_for_rounding) if (borders.visible.bottom + borders.visible.left >= min_size_for_rounding)
fgeom->bottom_left_corner_rounded_radius = layout->bottom_left_corner_rounded_radius; fgeom->bottom_left_corner_rounded_radius = bl;
if (borders.visible.bottom + borders.visible.right >= min_size_for_rounding) if (borders.visible.bottom + borders.visible.right >= min_size_for_rounding)
fgeom->bottom_right_corner_rounded_radius = layout->bottom_right_corner_rounded_radius; fgeom->bottom_right_corner_rounded_radius = br;
} }
/** /**