mirror of
https://github.com/brl/mutter.git
synced 2025-08-07 00:54:42 +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
|
* window size
|
||||||
*/
|
*/
|
||||||
meta_theme_get_frame_borders (frame->tv->theme,
|
meta_theme_get_frame_borders (frame->tv->theme,
|
||||||
|
frame->tv->style_context,
|
||||||
type,
|
type,
|
||||||
frame->text_height,
|
frame->text_height,
|
||||||
flags,
|
flags,
|
||||||
@@ -1687,6 +1688,7 @@ populate_cache (MetaFrames *frames,
|
|||||||
}
|
}
|
||||||
|
|
||||||
meta_theme_get_frame_borders (frame->tv->theme,
|
meta_theme_get_frame_borders (frame->tv->theme,
|
||||||
|
frame->tv->style_context,
|
||||||
frame_type,
|
frame_type,
|
||||||
frame->text_height,
|
frame->text_height,
|
||||||
frame_flags,
|
frame_flags,
|
||||||
@@ -1803,6 +1805,7 @@ subtract_client_area (cairo_region_t *region,
|
|||||||
META_CORE_GET_CLIENT_HEIGHT, &area.height,
|
META_CORE_GET_CLIENT_HEIGHT, &area.height,
|
||||||
META_CORE_GET_END);
|
META_CORE_GET_END);
|
||||||
meta_theme_get_frame_borders (frame->tv->theme,
|
meta_theme_get_frame_borders (frame->tv->theme,
|
||||||
|
frame->tv->style_context,
|
||||||
type, frame->text_height, flags,
|
type, frame->text_height, flags,
|
||||||
&borders);
|
&borders);
|
||||||
|
|
||||||
|
@@ -169,6 +169,7 @@ ensure_info (MetaPreview *preview)
|
|||||||
{
|
{
|
||||||
if (preview->theme)
|
if (preview->theme)
|
||||||
meta_theme_get_frame_borders (preview->theme,
|
meta_theme_get_frame_borders (preview->theme,
|
||||||
|
meta_theme_get_variant (preview->theme, NULL)->style_context,
|
||||||
preview->type,
|
preview->type,
|
||||||
preview->text_height,
|
preview->text_height,
|
||||||
preview->flags,
|
preview->flags,
|
||||||
|
@@ -1331,15 +1331,7 @@ parse_distance (GMarkupParseContext *context,
|
|||||||
g_assert (val >= 0); /* yeah, "non-negative" not "positive" get over it */
|
g_assert (val >= 0); /* yeah, "non-negative" not "positive" get over it */
|
||||||
g_assert (info->layout);
|
g_assert (info->layout);
|
||||||
|
|
||||||
if (strcmp (name, "left_width") == 0)
|
if (strcmp (name, "right_titlebar_edge") == 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)
|
|
||||||
info->layout->right_titlebar_edge = val;
|
info->layout->right_titlebar_edge = val;
|
||||||
else if (strcmp (name, "left_titlebar_edge") == 0)
|
else if (strcmp (name, "left_titlebar_edge") == 0)
|
||||||
info->layout->left_titlebar_edge = val;
|
info->layout->left_titlebar_edge = val;
|
||||||
|
@@ -134,22 +134,12 @@ struct _MetaFrameLayout
|
|||||||
{
|
{
|
||||||
/** Reference count. */
|
/** Reference count. */
|
||||||
int refcount;
|
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
|
/** Border of blue title region
|
||||||
* \bug (blue?!)
|
* \bug (blue?!)
|
||||||
**/
|
**/
|
||||||
GtkBorder title_border;
|
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 */
|
/** Right indent of buttons from edges of frame */
|
||||||
int right_titlebar_edge;
|
int right_titlebar_edge;
|
||||||
/** Left indent of buttons from edges of frame */
|
/** 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);
|
MetaFrameLayout* meta_frame_layout_copy (const MetaFrameLayout *src);
|
||||||
void meta_frame_layout_ref (MetaFrameLayout *layout);
|
void meta_frame_layout_ref (MetaFrameLayout *layout);
|
||||||
void meta_frame_layout_unref (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,
|
gboolean meta_frame_layout_validate (const MetaFrameLayout *layout,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
@@ -1058,6 +1043,7 @@ void meta_theme_draw_frame_with_style (MetaTheme *theme,
|
|||||||
GdkPixbuf *icon);
|
GdkPixbuf *icon);
|
||||||
|
|
||||||
void meta_theme_get_frame_borders (MetaTheme *theme,
|
void meta_theme_get_frame_borders (MetaTheme *theme,
|
||||||
|
GtkStyleContext *style_context,
|
||||||
MetaFrameType type,
|
MetaFrameType type,
|
||||||
int text_height,
|
int text_height,
|
||||||
MetaFrameFlags flags,
|
MetaFrameFlags flags,
|
||||||
|
@@ -975,6 +975,7 @@ run_theme_benchmark (void)
|
|||||||
gtk_widget_realize (widget);
|
gtk_widget_realize (widget);
|
||||||
|
|
||||||
meta_theme_get_frame_borders (global_theme,
|
meta_theme_get_frame_borders (global_theme,
|
||||||
|
meta_theme_get_variant (global_theme, NULL)->style_context,
|
||||||
META_FRAME_TYPE_NORMAL,
|
META_FRAME_TYPE_NORMAL,
|
||||||
get_text_height (widget),
|
get_text_height (widget),
|
||||||
get_flags (widget),
|
get_flags (widget),
|
||||||
|
@@ -118,15 +118,8 @@ meta_frame_layout_new (void)
|
|||||||
|
|
||||||
layout->refcount = 1;
|
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);
|
init_border (&layout->title_border);
|
||||||
|
|
||||||
layout->title_vertical_pad = -1;
|
|
||||||
|
|
||||||
layout->right_titlebar_edge = -1;
|
layout->right_titlebar_edge = -1;
|
||||||
layout->left_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
|
#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_BORDER (title_border);
|
||||||
|
|
||||||
CHECK_GEOMETRY_VALUE (title_vertical_pad);
|
|
||||||
|
|
||||||
CHECK_GEOMETRY_VALUE (right_titlebar_edge);
|
CHECK_GEOMETRY_VALUE (right_titlebar_edge);
|
||||||
CHECK_GEOMETRY_VALUE (left_titlebar_edge);
|
CHECK_GEOMETRY_VALUE (left_titlebar_edge);
|
||||||
|
|
||||||
@@ -311,15 +298,17 @@ get_style_flags (MetaFrameFlags flags)
|
|||||||
return gtk_flags;
|
return gtk_flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static void
|
||||||
meta_frame_layout_get_borders (const MetaFrameLayout *layout,
|
meta_frame_layout_get_borders (const MetaFrameLayout *layout,
|
||||||
|
GtkStyleContext *style_context,
|
||||||
int text_height,
|
int text_height,
|
||||||
MetaFrameFlags flags,
|
MetaFrameFlags flags,
|
||||||
MetaFrameType type,
|
MetaFrameType type,
|
||||||
MetaFrameBorders *borders)
|
MetaFrameBorders *borders)
|
||||||
{
|
{
|
||||||
int buttons_height, title_height, draggable_borders;
|
int draggable_borders;
|
||||||
|
GtkBorder padding;
|
||||||
|
|
||||||
meta_frame_borders_clear (borders);
|
meta_frame_borders_clear (borders);
|
||||||
|
|
||||||
/* For a full-screen window, we don't have any borders, visible or not. */
|
/* 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)
|
if (!layout->has_title)
|
||||||
text_height = 0;
|
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);
|
gtk_style_context_get_border (style_context,
|
||||||
borders->visible.left = layout->left_width;
|
get_style_flags (flags),
|
||||||
borders->visible.right = layout->right_width;
|
&borders->visible);
|
||||||
borders->visible.bottom = layout->bottom_height;
|
|
||||||
|
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 ();
|
draggable_borders = meta_prefs_get_draggable_border_width ();
|
||||||
|
|
||||||
@@ -556,7 +547,7 @@ meta_frame_layout_calc_geometry (const MetaFrameLayout *layout,
|
|||||||
|
|
||||||
MetaFrameBorders borders;
|
MetaFrameBorders borders;
|
||||||
|
|
||||||
meta_frame_layout_get_borders (layout, text_height,
|
meta_frame_layout_get_borders (layout, ctx, text_height,
|
||||||
flags, type,
|
flags, type,
|
||||||
&borders);
|
&borders);
|
||||||
|
|
||||||
@@ -800,7 +791,7 @@ meta_frame_layout_calc_geometry (const MetaFrameLayout *layout,
|
|||||||
rect->clickable.height = button_height + button_y;
|
rect->clickable.height = button_height + button_y;
|
||||||
|
|
||||||
if (i == n_right - 1)
|
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
|
else
|
||||||
@@ -5119,6 +5110,7 @@ meta_theme_draw_frame (MetaTheme *theme,
|
|||||||
|
|
||||||
void
|
void
|
||||||
meta_theme_get_frame_borders (MetaTheme *theme,
|
meta_theme_get_frame_borders (MetaTheme *theme,
|
||||||
|
GtkStyleContext *style_context,
|
||||||
MetaFrameType type,
|
MetaFrameType type,
|
||||||
int text_height,
|
int text_height,
|
||||||
MetaFrameFlags flags,
|
MetaFrameFlags flags,
|
||||||
@@ -5137,6 +5129,7 @@ meta_theme_get_frame_borders (MetaTheme *theme,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
meta_frame_layout_get_borders (style->layout,
|
meta_frame_layout_get_borders (style->layout,
|
||||||
|
style_context,
|
||||||
text_height,
|
text_height,
|
||||||
flags, type,
|
flags, type,
|
||||||
borders);
|
borders);
|
||||||
|
Reference in New Issue
Block a user