mirror of
https://github.com/brl/mutter.git
synced 2024-11-21 15:40:41 -05:00
theme: Add tiled_left/tiled_right frame states
It may be desirable for theme authors to treat side-by-side tiled windows differently, for instance to give the edge-touching border a width of 0, so add additional frame states for tiled windows. https://bugzilla.gnome.org/show_bug.cgi?id=637330
This commit is contained in:
parent
0a2bb1b71c
commit
ed99d12e8b
@ -28,6 +28,10 @@ New Features in Theme Format Version 3.3
|
||||
Add two additional button background functions - left_single_background and
|
||||
right_single_background - for button groups with just a single button.
|
||||
|
||||
There are now additional frame states to style left/right tiled windows
|
||||
differently ("tiled_left", "tiled_right", "tiled_left_and_shaded",
|
||||
"tiled_right_and_shaded").
|
||||
|
||||
New Features in Theme Format Version 3.2
|
||||
========================================
|
||||
|
||||
|
@ -291,6 +291,12 @@ meta_frame_get_flags (MetaFrame *frame)
|
||||
if (META_WINDOW_MAXIMIZED (frame->window))
|
||||
flags |= META_FRAME_MAXIMIZED;
|
||||
|
||||
if (META_WINDOW_TILED_LEFT (frame->window))
|
||||
flags |= META_FRAME_TILED_LEFT;
|
||||
|
||||
if (META_WINDOW_TILED_RIGHT (frame->window))
|
||||
flags |= META_FRAME_TILED_RIGHT;
|
||||
|
||||
if (frame->window->fullscreen)
|
||||
flags |= META_FRAME_FULLSCREEN;
|
||||
|
||||
|
@ -413,6 +413,10 @@ struct _MetaWindowClass
|
||||
#define META_WINDOW_TILED_SIDE_BY_SIDE(w) ((w)->maximized_vertically && \
|
||||
!(w)->maximized_horizontally && \
|
||||
(w)->tile_mode != META_TILE_NONE)
|
||||
#define META_WINDOW_TILED_LEFT(w) (META_WINDOW_TILED_SIDE_BY_SIDE(w) && \
|
||||
(w)->tile_mode == META_TILE_LEFT)
|
||||
#define META_WINDOW_TILED_RIGHT(w) (META_WINDOW_TILED_SIDE_BY_SIDE(w) && \
|
||||
(w)->tile_mode == META_TILE_RIGHT)
|
||||
#define META_WINDOW_ALLOWS_MOVE(w) ((w)->has_move_func && !(w)->fullscreen)
|
||||
#define META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS(w) ((w)->has_resize_func && !META_WINDOW_MAXIMIZED (w) && !META_WINDOW_TILED_SIDE_BY_SIDE(w) && !(w)->fullscreen && !(w)->shaded)
|
||||
#define META_WINDOW_ALLOWS_RESIZE(w) (META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS (w) && \
|
||||
|
@ -47,7 +47,9 @@ typedef enum
|
||||
META_FRAME_ALLOWS_MOVE = 1 << 11,
|
||||
META_FRAME_FULLSCREEN = 1 << 12,
|
||||
META_FRAME_IS_FLASHING = 1 << 13,
|
||||
META_FRAME_ABOVE = 1 << 14
|
||||
META_FRAME_ABOVE = 1 << 14,
|
||||
META_FRAME_TILED_LEFT = 1 << 15,
|
||||
META_FRAME_TILED_RIGHT = 1 << 16
|
||||
} MetaFrameFlags;
|
||||
|
||||
typedef enum
|
||||
|
@ -3190,6 +3190,31 @@ parse_style_set_element (GMarkupParseContext *context,
|
||||
meta_frame_style_ref (frame_style);
|
||||
info->style_set->maximized_styles[frame_focus] = frame_style;
|
||||
break;
|
||||
case META_FRAME_STATE_TILED_LEFT:
|
||||
if (info->style_set->tiled_left_styles[frame_focus])
|
||||
{
|
||||
set_error (error, context, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE,
|
||||
_("Style has already been specified for state %s focus %s"),
|
||||
state, focus);
|
||||
return;
|
||||
}
|
||||
meta_frame_style_ref (frame_style);
|
||||
info->style_set->tiled_left_styles[frame_focus] = frame_style;
|
||||
break;
|
||||
case META_FRAME_STATE_TILED_RIGHT:
|
||||
if (info->style_set->tiled_right_styles[frame_focus])
|
||||
{
|
||||
set_error (error, context, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE,
|
||||
_("Style has already been specified for state %s focus %s"),
|
||||
state, focus);
|
||||
return;
|
||||
}
|
||||
meta_frame_style_ref (frame_style);
|
||||
info->style_set->tiled_right_styles[frame_focus] = frame_style;
|
||||
break;
|
||||
meta_frame_style_ref (frame_style);
|
||||
info->style_set->tiled_right_styles[frame_focus] = frame_style;
|
||||
break;
|
||||
case META_FRAME_STATE_SHADED:
|
||||
if (info->style_set->shaded_styles[frame_resize][frame_focus])
|
||||
{
|
||||
@ -3212,6 +3237,28 @@ parse_style_set_element (GMarkupParseContext *context,
|
||||
meta_frame_style_ref (frame_style);
|
||||
info->style_set->maximized_and_shaded_styles[frame_focus] = frame_style;
|
||||
break;
|
||||
case META_FRAME_STATE_TILED_LEFT_AND_SHADED:
|
||||
if (info->style_set->tiled_left_and_shaded_styles[frame_focus])
|
||||
{
|
||||
set_error (error, context, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE,
|
||||
_("Style has already been specified for state %s focus %s"),
|
||||
state, focus);
|
||||
return;
|
||||
}
|
||||
meta_frame_style_ref (frame_style);
|
||||
info->style_set->tiled_left_and_shaded_styles[frame_focus] = frame_style;
|
||||
break;
|
||||
case META_FRAME_STATE_TILED_RIGHT_AND_SHADED:
|
||||
if (info->style_set->tiled_right_and_shaded_styles[frame_focus])
|
||||
{
|
||||
set_error (error, context, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE,
|
||||
_("Style has already been specified for state %s focus %s"),
|
||||
state, focus);
|
||||
return;
|
||||
}
|
||||
meta_frame_style_ref (frame_style);
|
||||
info->style_set->tiled_right_and_shaded_styles[frame_focus] = frame_style;
|
||||
break;
|
||||
case META_FRAME_STATE_LAST:
|
||||
g_assert_not_reached ();
|
||||
break;
|
||||
|
@ -776,8 +776,12 @@ typedef enum
|
||||
{
|
||||
META_FRAME_STATE_NORMAL,
|
||||
META_FRAME_STATE_MAXIMIZED,
|
||||
META_FRAME_STATE_TILED_LEFT,
|
||||
META_FRAME_STATE_TILED_RIGHT,
|
||||
META_FRAME_STATE_SHADED,
|
||||
META_FRAME_STATE_MAXIMIZED_AND_SHADED,
|
||||
META_FRAME_STATE_TILED_LEFT_AND_SHADED,
|
||||
META_FRAME_STATE_TILED_RIGHT_AND_SHADED,
|
||||
META_FRAME_STATE_LAST
|
||||
} MetaFrameState;
|
||||
|
||||
@ -814,8 +818,12 @@ struct _MetaFrameStyleSet
|
||||
MetaFrameStyleSet *parent;
|
||||
MetaFrameStyle *normal_styles[META_FRAME_RESIZE_LAST][META_FRAME_FOCUS_LAST];
|
||||
MetaFrameStyle *maximized_styles[META_FRAME_FOCUS_LAST];
|
||||
MetaFrameStyle *tiled_left_styles[META_FRAME_FOCUS_LAST];
|
||||
MetaFrameStyle *tiled_right_styles[META_FRAME_FOCUS_LAST];
|
||||
MetaFrameStyle *shaded_styles[META_FRAME_RESIZE_LAST][META_FRAME_FOCUS_LAST];
|
||||
MetaFrameStyle *maximized_and_shaded_styles[META_FRAME_FOCUS_LAST];
|
||||
MetaFrameStyle *tiled_left_and_shaded_styles[META_FRAME_FOCUS_LAST];
|
||||
MetaFrameStyle *tiled_right_and_shaded_styles[META_FRAME_FOCUS_LAST];
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -873,7 +873,9 @@ meta_frame_layout_calc_geometry (const MetaFrameLayout *layout,
|
||||
rect->visible.width = button_width;
|
||||
rect->visible.height = button_height;
|
||||
|
||||
if (flags & META_FRAME_MAXIMIZED)
|
||||
if (flags & META_FRAME_MAXIMIZED ||
|
||||
flags & META_FRAME_TILED_LEFT ||
|
||||
flags & META_FRAME_TILED_RIGHT)
|
||||
{
|
||||
rect->clickable.x = rect->visible.x;
|
||||
rect->clickable.y = 0;
|
||||
@ -4780,7 +4782,11 @@ meta_frame_style_set_unref (MetaFrameStyleSet *style_set)
|
||||
}
|
||||
|
||||
free_focus_styles (style_set->maximized_styles);
|
||||
free_focus_styles (style_set->tiled_left_styles);
|
||||
free_focus_styles (style_set->tiled_right_styles);
|
||||
free_focus_styles (style_set->maximized_and_shaded_styles);
|
||||
free_focus_styles (style_set->tiled_left_and_shaded_styles);
|
||||
free_focus_styles (style_set->tiled_right_and_shaded_styles);
|
||||
|
||||
if (style_set->parent)
|
||||
meta_frame_style_set_unref (style_set->parent);
|
||||
@ -4832,9 +4838,21 @@ get_style (MetaFrameStyleSet *style_set,
|
||||
case META_FRAME_STATE_MAXIMIZED:
|
||||
styles = style_set->maximized_styles;
|
||||
break;
|
||||
case META_FRAME_STATE_TILED_LEFT:
|
||||
styles = style_set->tiled_left_styles;
|
||||
break;
|
||||
case META_FRAME_STATE_TILED_RIGHT:
|
||||
styles = style_set->tiled_right_styles;
|
||||
break;
|
||||
case META_FRAME_STATE_MAXIMIZED_AND_SHADED:
|
||||
styles = style_set->maximized_and_shaded_styles;
|
||||
break;
|
||||
case META_FRAME_STATE_TILED_LEFT_AND_SHADED:
|
||||
styles = style_set->tiled_left_and_shaded_styles;
|
||||
break;
|
||||
case META_FRAME_STATE_TILED_RIGHT_AND_SHADED:
|
||||
styles = style_set->tiled_right_and_shaded_styles;
|
||||
break;
|
||||
case META_FRAME_STATE_NORMAL:
|
||||
case META_FRAME_STATE_SHADED:
|
||||
case META_FRAME_STATE_LAST:
|
||||
@ -4844,6 +4862,19 @@ get_style (MetaFrameStyleSet *style_set,
|
||||
|
||||
style = styles[focus];
|
||||
|
||||
/* Tiled states are optional, try falling back to non-tiled states */
|
||||
if (style == NULL)
|
||||
{
|
||||
if (state == META_FRAME_STATE_TILED_LEFT ||
|
||||
state == META_FRAME_STATE_TILED_RIGHT)
|
||||
style = get_style (style_set, META_FRAME_STATE_NORMAL,
|
||||
resize, focus);
|
||||
else if (state == META_FRAME_STATE_TILED_LEFT_AND_SHADED ||
|
||||
state == META_FRAME_STATE_TILED_RIGHT_AND_SHADED)
|
||||
style = get_style (style_set, META_FRAME_STATE_SHADED,
|
||||
resize, focus);
|
||||
}
|
||||
|
||||
/* Try parent if we failed here */
|
||||
if (style == NULL && style_set->parent)
|
||||
style = get_style (style_set->parent, state, resize, focus);
|
||||
@ -5206,7 +5237,8 @@ theme_get_style (MetaTheme *theme,
|
||||
if (style_set == NULL)
|
||||
return NULL;
|
||||
|
||||
switch (flags & (META_FRAME_MAXIMIZED | META_FRAME_SHADED))
|
||||
switch (flags & (META_FRAME_MAXIMIZED | META_FRAME_SHADED |
|
||||
META_FRAME_TILED_LEFT | META_FRAME_TILED_RIGHT))
|
||||
{
|
||||
case 0:
|
||||
state = META_FRAME_STATE_NORMAL;
|
||||
@ -5214,12 +5246,24 @@ theme_get_style (MetaTheme *theme,
|
||||
case META_FRAME_MAXIMIZED:
|
||||
state = META_FRAME_STATE_MAXIMIZED;
|
||||
break;
|
||||
case META_FRAME_TILED_LEFT:
|
||||
state = META_FRAME_STATE_TILED_LEFT;
|
||||
break;
|
||||
case META_FRAME_TILED_RIGHT:
|
||||
state = META_FRAME_STATE_TILED_RIGHT;
|
||||
break;
|
||||
case META_FRAME_SHADED:
|
||||
state = META_FRAME_STATE_SHADED;
|
||||
break;
|
||||
case (META_FRAME_MAXIMIZED | META_FRAME_SHADED):
|
||||
state = META_FRAME_STATE_MAXIMIZED_AND_SHADED;
|
||||
break;
|
||||
case (META_FRAME_TILED_LEFT | META_FRAME_SHADED):
|
||||
state = META_FRAME_STATE_TILED_LEFT_AND_SHADED;
|
||||
break;
|
||||
case (META_FRAME_TILED_RIGHT | META_FRAME_SHADED):
|
||||
state = META_FRAME_STATE_TILED_RIGHT_AND_SHADED;
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
state = META_FRAME_STATE_LAST; /* compiler */
|
||||
@ -6031,10 +6075,18 @@ meta_frame_state_from_string (const char *str)
|
||||
return META_FRAME_STATE_NORMAL;
|
||||
else if (strcmp ("maximized", str) == 0)
|
||||
return META_FRAME_STATE_MAXIMIZED;
|
||||
else if (strcmp ("tiled_left", str) == 0)
|
||||
return META_FRAME_STATE_TILED_LEFT;
|
||||
else if (strcmp ("tiled_right", str) == 0)
|
||||
return META_FRAME_STATE_TILED_RIGHT;
|
||||
else if (strcmp ("shaded", str) == 0)
|
||||
return META_FRAME_STATE_SHADED;
|
||||
else if (strcmp ("maximized_and_shaded", str) == 0)
|
||||
return META_FRAME_STATE_MAXIMIZED_AND_SHADED;
|
||||
else if (strcmp ("tiled_left_and_shaded", str) == 0)
|
||||
return META_FRAME_STATE_TILED_LEFT_AND_SHADED;
|
||||
else if (strcmp ("tiled_right_and_shaded", str) == 0)
|
||||
return META_FRAME_STATE_TILED_RIGHT_AND_SHADED;
|
||||
else
|
||||
return META_FRAME_STATE_LAST;
|
||||
}
|
||||
@ -6048,10 +6100,18 @@ meta_frame_state_to_string (MetaFrameState state)
|
||||
return "normal";
|
||||
case META_FRAME_STATE_MAXIMIZED:
|
||||
return "maximized";
|
||||
case META_FRAME_STATE_TILED_LEFT:
|
||||
return "tiled_left";
|
||||
case META_FRAME_STATE_TILED_RIGHT:
|
||||
return "tiled_right";
|
||||
case META_FRAME_STATE_SHADED:
|
||||
return "shaded";
|
||||
case META_FRAME_STATE_MAXIMIZED_AND_SHADED:
|
||||
return "maximized_and_shaded";
|
||||
case META_FRAME_STATE_TILED_LEFT_AND_SHADED:
|
||||
return "tiled_left_and_shaded";
|
||||
case META_FRAME_STATE_TILED_RIGHT_AND_SHADED:
|
||||
return "tiled_right_and_shaded";
|
||||
case META_FRAME_STATE_LAST:
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user