mirror of
https://github.com/brl/mutter.git
synced 2025-08-06 16:44:40 +00:00
theme: Calculate frame geometry borders from CSS
Use the CSS 'border' and 'padding' properties rather than frame geometry. This is a bit messy, so I'll fix it up with a new path representing the titlebar soon.
This commit is contained in:
@@ -680,6 +680,7 @@ meta_frames_get_borders (MetaFrames *frames,
|
||||
* window size
|
||||
*/
|
||||
meta_theme_get_frame_borders (frame->tv->theme,
|
||||
frame->tv->style_context,
|
||||
type,
|
||||
frame->text_height,
|
||||
flags,
|
||||
@@ -1687,6 +1688,7 @@ populate_cache (MetaFrames *frames,
|
||||
}
|
||||
|
||||
meta_theme_get_frame_borders (frame->tv->theme,
|
||||
frame->tv->style_context,
|
||||
frame_type,
|
||||
frame->text_height,
|
||||
frame_flags,
|
||||
@@ -1803,6 +1805,7 @@ subtract_client_area (cairo_region_t *region,
|
||||
META_CORE_GET_CLIENT_HEIGHT, &area.height,
|
||||
META_CORE_GET_END);
|
||||
meta_theme_get_frame_borders (frame->tv->theme,
|
||||
frame->tv->style_context,
|
||||
type, frame->text_height, flags,
|
||||
&borders);
|
||||
|
||||
|
@@ -169,6 +169,7 @@ ensure_info (MetaPreview *preview)
|
||||
{
|
||||
if (preview->theme)
|
||||
meta_theme_get_frame_borders (preview->theme,
|
||||
meta_theme_get_variant (preview->theme, NULL)->style_context,
|
||||
preview->type,
|
||||
preview->text_height,
|
||||
preview->flags,
|
||||
|
@@ -1331,15 +1331,7 @@ parse_distance (GMarkupParseContext *context,
|
||||
g_assert (val >= 0); /* yeah, "non-negative" not "positive" get over it */
|
||||
g_assert (info->layout);
|
||||
|
||||
if (strcmp (name, "left_width") == 0)
|
||||
info->layout->left_width = val;
|
||||
else if (strcmp (name, "right_width") == 0)
|
||||
info->layout->right_width = val;
|
||||
else if (strcmp (name, "bottom_height") == 0)
|
||||
info->layout->bottom_height = val;
|
||||
else if (strcmp (name, "title_vertical_pad") == 0)
|
||||
info->layout->title_vertical_pad = val;
|
||||
else if (strcmp (name, "right_titlebar_edge") == 0)
|
||||
if (strcmp (name, "right_titlebar_edge") == 0)
|
||||
info->layout->right_titlebar_edge = val;
|
||||
else if (strcmp (name, "left_titlebar_edge") == 0)
|
||||
info->layout->left_titlebar_edge = val;
|
||||
|
@@ -134,22 +134,12 @@ struct _MetaFrameLayout
|
||||
{
|
||||
/** Reference count. */
|
||||
int refcount;
|
||||
|
||||
/** Size of left side */
|
||||
int left_width;
|
||||
/** Size of right side */
|
||||
int right_width;
|
||||
/** Size of bottom side */
|
||||
int bottom_height;
|
||||
|
||||
|
||||
/** Border of blue title region
|
||||
* \bug (blue?!)
|
||||
**/
|
||||
GtkBorder title_border;
|
||||
|
||||
/** Extra height for inside of title region, above the font height */
|
||||
int title_vertical_pad;
|
||||
|
||||
/** Right indent of buttons from edges of frame */
|
||||
int right_titlebar_edge;
|
||||
/** Left indent of buttons from edges of frame */
|
||||
@@ -918,11 +908,6 @@ MetaFrameLayout* meta_frame_layout_new (void);
|
||||
MetaFrameLayout* meta_frame_layout_copy (const MetaFrameLayout *src);
|
||||
void meta_frame_layout_ref (MetaFrameLayout *layout);
|
||||
void meta_frame_layout_unref (MetaFrameLayout *layout);
|
||||
void meta_frame_layout_get_borders (const MetaFrameLayout *layout,
|
||||
int text_height,
|
||||
MetaFrameFlags flags,
|
||||
MetaFrameType type,
|
||||
MetaFrameBorders *borders);
|
||||
gboolean meta_frame_layout_validate (const MetaFrameLayout *layout,
|
||||
GError **error);
|
||||
|
||||
@@ -1058,6 +1043,7 @@ void meta_theme_draw_frame_with_style (MetaTheme *theme,
|
||||
GdkPixbuf *icon);
|
||||
|
||||
void meta_theme_get_frame_borders (MetaTheme *theme,
|
||||
GtkStyleContext *style_context,
|
||||
MetaFrameType type,
|
||||
int text_height,
|
||||
MetaFrameFlags flags,
|
||||
|
@@ -975,6 +975,7 @@ run_theme_benchmark (void)
|
||||
gtk_widget_realize (widget);
|
||||
|
||||
meta_theme_get_frame_borders (global_theme,
|
||||
meta_theme_get_variant (global_theme, NULL)->style_context,
|
||||
META_FRAME_TYPE_NORMAL,
|
||||
get_text_height (widget),
|
||||
get_flags (widget),
|
||||
|
@@ -118,15 +118,8 @@ meta_frame_layout_new (void)
|
||||
|
||||
layout->refcount = 1;
|
||||
|
||||
/* Fill with -1 values to detect invalid themes */
|
||||
layout->left_width = -1;
|
||||
layout->right_width = -1;
|
||||
layout->bottom_height = -1;
|
||||
|
||||
init_border (&layout->title_border);
|
||||
|
||||
layout->title_vertical_pad = -1;
|
||||
|
||||
layout->right_titlebar_edge = -1;
|
||||
layout->left_titlebar_edge = -1;
|
||||
|
||||
@@ -221,14 +214,8 @@ meta_frame_layout_validate (const MetaFrameLayout *layout,
|
||||
|
||||
#define CHECK_GEOMETRY_BORDER(bname) if (!validate_geometry_border (&layout->bname, #bname, error)) return FALSE
|
||||
|
||||
CHECK_GEOMETRY_VALUE (left_width);
|
||||
CHECK_GEOMETRY_VALUE (right_width);
|
||||
CHECK_GEOMETRY_VALUE (bottom_height);
|
||||
|
||||
CHECK_GEOMETRY_BORDER (title_border);
|
||||
|
||||
CHECK_GEOMETRY_VALUE (title_vertical_pad);
|
||||
|
||||
CHECK_GEOMETRY_VALUE (right_titlebar_edge);
|
||||
CHECK_GEOMETRY_VALUE (left_titlebar_edge);
|
||||
|
||||
@@ -311,15 +298,17 @@ get_style_flags (MetaFrameFlags flags)
|
||||
return gtk_flags;
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
meta_frame_layout_get_borders (const MetaFrameLayout *layout,
|
||||
GtkStyleContext *style_context,
|
||||
int text_height,
|
||||
MetaFrameFlags flags,
|
||||
MetaFrameType type,
|
||||
MetaFrameBorders *borders)
|
||||
{
|
||||
int buttons_height, title_height, draggable_borders;
|
||||
|
||||
int draggable_borders;
|
||||
GtkBorder padding;
|
||||
|
||||
meta_frame_borders_clear (borders);
|
||||
|
||||
/* For a full-screen window, we don't have any borders, visible or not. */
|
||||
@@ -330,17 +319,19 @@ meta_frame_layout_get_borders (const MetaFrameLayout *layout,
|
||||
|
||||
if (!layout->has_title)
|
||||
text_height = 0;
|
||||
|
||||
buttons_height = layout->button_height +
|
||||
layout->button_border.top + layout->button_border.bottom;
|
||||
title_height = text_height +
|
||||
layout->title_vertical_pad +
|
||||
layout->title_border.top + layout->title_border.bottom;
|
||||
|
||||
borders->visible.top = MAX (buttons_height, title_height);
|
||||
borders->visible.left = layout->left_width;
|
||||
borders->visible.right = layout->right_width;
|
||||
borders->visible.bottom = layout->bottom_height;
|
||||
gtk_style_context_get_border (style_context,
|
||||
get_style_flags (flags),
|
||||
&borders->visible);
|
||||
|
||||
gtk_style_context_get_padding (style_context,
|
||||
get_style_flags (flags),
|
||||
&padding);
|
||||
|
||||
borders->visible.left += padding.left;
|
||||
borders->visible.right += padding.right;
|
||||
borders->visible.top += padding.top;
|
||||
borders->visible.bottom += padding.bottom;
|
||||
|
||||
draggable_borders = meta_prefs_get_draggable_border_width ();
|
||||
|
||||
@@ -556,7 +547,7 @@ meta_frame_layout_calc_geometry (const MetaFrameLayout *layout,
|
||||
|
||||
MetaFrameBorders borders;
|
||||
|
||||
meta_frame_layout_get_borders (layout, text_height,
|
||||
meta_frame_layout_get_borders (layout, ctx, text_height,
|
||||
flags, type,
|
||||
&borders);
|
||||
|
||||
@@ -800,7 +791,7 @@ meta_frame_layout_calc_geometry (const MetaFrameLayout *layout,
|
||||
rect->clickable.height = button_height + button_y;
|
||||
|
||||
if (i == n_right - 1)
|
||||
rect->clickable.width += layout->right_titlebar_edge + layout->right_width + layout->button_border.right;
|
||||
rect->clickable.width += layout->right_titlebar_edge + borders.visible.right + layout->button_border.right;
|
||||
|
||||
}
|
||||
else
|
||||
@@ -5119,6 +5110,7 @@ meta_theme_draw_frame (MetaTheme *theme,
|
||||
|
||||
void
|
||||
meta_theme_get_frame_borders (MetaTheme *theme,
|
||||
GtkStyleContext *style_context,
|
||||
MetaFrameType type,
|
||||
int text_height,
|
||||
MetaFrameFlags flags,
|
||||
@@ -5137,6 +5129,7 @@ meta_theme_get_frame_borders (MetaTheme *theme,
|
||||
return;
|
||||
|
||||
meta_frame_layout_get_borders (style->layout,
|
||||
style_context,
|
||||
text_height,
|
||||
flags, type,
|
||||
borders);
|
||||
|
Reference in New Issue
Block a user