mirror of
https://github.com/brl/mutter.git
synced 2024-12-23 03:22:04 +00:00
theme: Move the layout we save closer to GTK+'s model
With support for the old metacity theme format gone, there's no reason to keep storing theme information in terms of the old theme properties. Just store the padding/border information for each element directly. https://bugzilla.gnome.org/show_bug.cgi?id=741917
This commit is contained in:
parent
ee461b5495
commit
6b92b45021
@ -53,36 +53,13 @@ typedef struct _MetaFrameGeometry MetaFrameGeometry;
|
||||
**/
|
||||
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 */
|
||||
int left_titlebar_edge;
|
||||
|
||||
/** Width of a button; set even when we are using aspect sizing */
|
||||
int button_width;
|
||||
|
||||
/** Height of a button; set even when we are using aspect sizing */
|
||||
int button_height;
|
||||
|
||||
/** Space around buttons */
|
||||
/** Border/padding of the entire frame */
|
||||
GtkBorder frame_border;
|
||||
/** Border/padding of the titlebar region */
|
||||
GtkBorder titlebar_border;
|
||||
/** Border/padding of titlebar buttons */
|
||||
GtkBorder button_border;
|
||||
|
||||
/** Size of images in buttons */
|
||||
@ -136,10 +113,7 @@ struct _MetaFrameGeometry
|
||||
|
||||
GdkRectangle title_rect;
|
||||
|
||||
int left_titlebar_edge;
|
||||
int right_titlebar_edge;
|
||||
int top_titlebar_edge;
|
||||
int bottom_titlebar_edge;
|
||||
GtkBorder content_border;
|
||||
|
||||
/* used for a memset hack */
|
||||
#define ADDRESS_OF_BUTTON_RECTS(fgeom) (((char*)(fgeom)) + G_STRUCT_OFFSET (MetaFrameGeometry, close_rect))
|
||||
|
108
src/ui/theme.c
108
src/ui/theme.c
@ -69,7 +69,7 @@ meta_frame_layout_new (void)
|
||||
*/
|
||||
layout->titlebar_spacing = 6;
|
||||
layout->has_title = TRUE;
|
||||
layout->title_scale = 1.0;
|
||||
layout->title_scale = PANGO_SCALE_MEDIUM;
|
||||
layout->icon_size = META_MINI_ICON_WIDTH;
|
||||
|
||||
return layout;
|
||||
@ -119,7 +119,7 @@ meta_frame_layout_get_borders (const MetaFrameLayout *layout,
|
||||
MetaFrameType type,
|
||||
MetaFrameBorders *borders)
|
||||
{
|
||||
int buttons_height, title_height, draggable_borders;
|
||||
int buttons_height, content_height, draggable_borders;
|
||||
|
||||
meta_frame_borders_clear (borders);
|
||||
|
||||
@ -132,16 +132,15 @@ meta_frame_layout_get_borders (const MetaFrameLayout *layout,
|
||||
if (!layout->has_title)
|
||||
text_height = 0;
|
||||
|
||||
buttons_height = layout->button_height +
|
||||
buttons_height = layout->icon_size +
|
||||
layout->button_border.top + layout->button_border.bottom;
|
||||
title_height = text_height +
|
||||
layout->title_vertical_pad +
|
||||
layout->title_border.top + layout->title_border.bottom;
|
||||
content_height = MAX (buttons_height, text_height) +
|
||||
layout->titlebar_border.top + layout->titlebar_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;
|
||||
borders->visible.top = layout->frame_border.top + content_height;
|
||||
borders->visible.left = layout->frame_border.left;
|
||||
borders->visible.right = layout->frame_border.right;
|
||||
borders->visible.bottom = layout->frame_border.bottom;
|
||||
|
||||
draggable_borders = meta_prefs_get_draggable_border_width ();
|
||||
|
||||
@ -300,12 +299,8 @@ meta_frame_layout_sync_with_style (MetaFrameLayout *layout,
|
||||
meta_style_info_set_flags (style_info, flags);
|
||||
|
||||
style = style_info->styles[META_STYLE_ELEMENT_FRAME];
|
||||
get_padding_and_border (style, &border);
|
||||
scale_border (&border, layout->title_scale);
|
||||
|
||||
layout->left_width = border.left;
|
||||
layout->right_width = border.right;
|
||||
layout->bottom_height = border.bottom;
|
||||
get_padding_and_border (style, &layout->frame_border);
|
||||
scale_border (&layout->frame_border, layout->title_scale);
|
||||
|
||||
if (layout->hide_buttons)
|
||||
layout->icon_size = 0;
|
||||
@ -324,36 +319,26 @@ meta_frame_layout_sync_with_style (MetaFrameLayout *layout,
|
||||
*/
|
||||
layout->top_left_corner_rounded_radius = border_radius;
|
||||
layout->top_right_corner_rounded_radius = border_radius;
|
||||
max_radius = MIN (layout->bottom_height, layout->left_width);
|
||||
max_radius = MIN (layout->frame_border.bottom, layout->frame_border.left);
|
||||
layout->bottom_left_corner_rounded_radius = MAX (border_radius, max_radius);
|
||||
max_radius = MIN (layout->bottom_height, layout->right_width);
|
||||
max_radius = MIN (layout->frame_border.bottom, layout->frame_border.right);
|
||||
layout->bottom_right_corner_rounded_radius = MAX (border_radius, max_radius);
|
||||
|
||||
get_padding_and_border (style, &border);
|
||||
scale_border (&border, layout->title_scale);
|
||||
layout->left_titlebar_edge = border.left;
|
||||
layout->right_titlebar_edge = border.right;
|
||||
layout->title_vertical_pad = border.top;
|
||||
|
||||
layout->button_border.top = border.top;
|
||||
layout->button_border.bottom = border.bottom;
|
||||
layout->button_border.left = 0;
|
||||
layout->button_border.right = 0;
|
||||
|
||||
layout->button_width = layout->icon_size;
|
||||
layout->button_height = layout->icon_size;
|
||||
get_padding_and_border (style, &layout->titlebar_border);
|
||||
scale_border (&layout->titlebar_border, layout->title_scale);
|
||||
|
||||
style = style_info->styles[META_STYLE_ELEMENT_BUTTON];
|
||||
get_padding_and_border (style, &border);
|
||||
scale_border (&border, layout->title_scale);
|
||||
layout->button_width += border.left + border.right;
|
||||
layout->button_height += border.top + border.bottom;
|
||||
get_padding_and_border (style, &layout->button_border);
|
||||
scale_border (&layout->button_border, layout->title_scale);
|
||||
|
||||
style = style_info->styles[META_STYLE_ELEMENT_IMAGE];
|
||||
get_padding_and_border (style, &border);
|
||||
scale_border (&border, layout->title_scale);
|
||||
layout->button_width += border.left + border.right;
|
||||
layout->button_height += border.top + border.bottom;
|
||||
|
||||
layout->button_border.left += border.left;
|
||||
layout->button_border.right += border.right;
|
||||
layout->button_border.top += border.top;
|
||||
layout->button_border.bottom += border.bottom;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -373,6 +358,7 @@ meta_frame_layout_calc_geometry (MetaFrameLayout *layout,
|
||||
int button_y;
|
||||
int title_right_edge;
|
||||
int width, height;
|
||||
int content_width, content_height;
|
||||
int button_width, button_height;
|
||||
int min_size_for_rounding;
|
||||
|
||||
@ -394,6 +380,12 @@ meta_frame_layout_calc_geometry (MetaFrameLayout *layout,
|
||||
|
||||
fgeom->borders = borders;
|
||||
|
||||
fgeom->content_border = layout->frame_border;
|
||||
fgeom->content_border.left += layout->titlebar_border.left;
|
||||
fgeom->content_border.right += layout->titlebar_border.right;
|
||||
fgeom->content_border.top += layout->titlebar_border.top;
|
||||
fgeom->content_border.bottom += layout->titlebar_border.bottom;
|
||||
|
||||
width = client_width + borders.total.left + borders.total.right;
|
||||
|
||||
height = borders.total.top + borders.total.bottom;
|
||||
@ -403,13 +395,15 @@ meta_frame_layout_calc_geometry (MetaFrameLayout *layout,
|
||||
fgeom->width = width;
|
||||
fgeom->height = height;
|
||||
|
||||
fgeom->top_titlebar_edge = layout->title_border.top;
|
||||
fgeom->bottom_titlebar_edge = layout->title_border.bottom;
|
||||
fgeom->left_titlebar_edge = layout->left_titlebar_edge;
|
||||
fgeom->right_titlebar_edge = layout->right_titlebar_edge;
|
||||
content_width = width -
|
||||
(fgeom->content_border.left + borders.invisible.left) -
|
||||
(fgeom->content_border.right + borders.invisible.right);
|
||||
content_height = borders.visible.top - fgeom->content_border.top - fgeom->content_border.bottom;
|
||||
|
||||
button_width = layout->button_width;
|
||||
button_height = layout->button_height;
|
||||
button_width = layout->icon_size +
|
||||
layout->button_border.left + layout->button_border.right;
|
||||
button_height = layout->icon_size +
|
||||
layout->button_border.top + layout->button_border.bottom;
|
||||
|
||||
/* FIXME all this code sort of pretends that duplicate buttons
|
||||
* with the same function are allowed, but that breaks the
|
||||
@ -464,9 +458,6 @@ meta_frame_layout_calc_geometry (MetaFrameLayout *layout,
|
||||
while (n_left > 0 || n_right > 0)
|
||||
{
|
||||
int space_used_by_buttons;
|
||||
int space_available;
|
||||
|
||||
space_available = fgeom->width - layout->left_titlebar_edge - layout->right_titlebar_edge;
|
||||
|
||||
space_used_by_buttons = 0;
|
||||
|
||||
@ -478,7 +469,7 @@ meta_frame_layout_calc_geometry (MetaFrameLayout *layout,
|
||||
space_used_by_buttons += (button_width * 0.75) * n_right_spacers;
|
||||
space_used_by_buttons += layout->titlebar_spacing * MAX (n_right - 1, 0);
|
||||
|
||||
if (space_used_by_buttons <= space_available)
|
||||
if (space_used_by_buttons <= content_width)
|
||||
break; /* Everything fits, bail out */
|
||||
|
||||
/* First try to remove separators */
|
||||
@ -542,11 +533,11 @@ meta_frame_layout_calc_geometry (MetaFrameLayout *layout,
|
||||
fgeom->n_right_buttons = n_right;
|
||||
|
||||
/* center buttons vertically */
|
||||
button_y = (borders.visible.top -
|
||||
(button_height + layout->button_border.top + layout->button_border.bottom)) / 2 + layout->button_border.top + borders.invisible.top;
|
||||
button_y = fgeom->content_border.top + borders.invisible.top +
|
||||
(content_height - button_height) / 2;
|
||||
|
||||
/* right edge of farthest-right button */
|
||||
x = width - layout->right_titlebar_edge - borders.invisible.right;
|
||||
x = width - fgeom->content_border.right - borders.invisible.right;
|
||||
|
||||
i = n_right - 1;
|
||||
while (i >= 0)
|
||||
@ -575,7 +566,7 @@ meta_frame_layout_calc_geometry (MetaFrameLayout *layout,
|
||||
rect->clickable.height = button_height + button_y;
|
||||
|
||||
if (i == n_right - 1)
|
||||
rect->clickable.width += layout->right_titlebar_edge + layout->right_width;
|
||||
rect->clickable.width += fgeom->content_border.right;
|
||||
|
||||
}
|
||||
else
|
||||
@ -590,12 +581,12 @@ meta_frame_layout_calc_geometry (MetaFrameLayout *layout,
|
||||
}
|
||||
|
||||
/* save right edge of titlebar for later use */
|
||||
title_right_edge = x - layout->title_border.right;
|
||||
title_right_edge = x;
|
||||
|
||||
/* Now x changes to be position from the left and we go through
|
||||
* the left-side buttons
|
||||
*/
|
||||
x = layout->left_titlebar_edge + borders.invisible.left;
|
||||
x = fgeom->content_border.left + borders.invisible.left;
|
||||
for (i = 0; i < n_left; i++)
|
||||
{
|
||||
MetaButtonSpace *rect;
|
||||
@ -633,13 +624,12 @@ meta_frame_layout_calc_geometry (MetaFrameLayout *layout,
|
||||
x += (button_width * 0.75);
|
||||
}
|
||||
|
||||
/* We always fill as much vertical space as possible with title rect,
|
||||
* rather than centering it like the buttons
|
||||
*/
|
||||
fgeom->title_rect.x = x + layout->title_border.left;
|
||||
fgeom->title_rect.y = layout->title_border.top + borders.invisible.top;
|
||||
/* Center vertically in the available content area */
|
||||
fgeom->title_rect.x = x;
|
||||
fgeom->title_rect.y = fgeom->content_border.top + borders.invisible.top +
|
||||
(content_height - text_height) / 2;
|
||||
fgeom->title_rect.width = title_right_edge - fgeom->title_rect.x;
|
||||
fgeom->title_rect.height = borders.visible.top - layout->title_border.top - layout->title_border.bottom;
|
||||
fgeom->title_rect.height = text_height;
|
||||
|
||||
/* Nuke title if it won't fit */
|
||||
if (fgeom->title_rect.width < 0 ||
|
||||
|
Loading…
Reference in New Issue
Block a user