[mutter] theme: Add tiled_left/tiled_right frame states
- From: Florian Müllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] theme: Add tiled_left/tiled_right frame states
- Date: Wed, 5 Jan 2011 16:39:31 +0000 (UTC)
commit ed99d12e8b5fbc6aac720b55d0e1715d6988e111
Author: Florian Müllner <fmuellner gnome org>
Date: Wed Dec 8 02:16:35 2010 +0100
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
doc/theme-format.txt | 4 +++
src/core/frame.c | 6 ++++
src/core/window-private.h | 4 +++
src/include/common.h | 4 ++-
src/ui/theme-parser.c | 47 +++++++++++++++++++++++++++++++++
src/ui/theme-private.h | 8 +++++
src/ui/theme.c | 64 +++++++++++++++++++++++++++++++++++++++++++-
7 files changed, 134 insertions(+), 3 deletions(-)
---
diff --git a/doc/theme-format.txt b/doc/theme-format.txt
index fbf5699..52e4099 100644
--- a/doc/theme-format.txt
+++ b/doc/theme-format.txt
@@ -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
========================================
diff --git a/src/core/frame.c b/src/core/frame.c
index 074d2cf..2951aa4 100644
--- a/src/core/frame.c
+++ b/src/core/frame.c
@@ -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;
diff --git a/src/core/window-private.h b/src/core/window-private.h
index 0c6276e..07f6fd2 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -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) && \
diff --git a/src/include/common.h b/src/include/common.h
index dbc8eee..f71c5f6 100644
--- a/src/include/common.h
+++ b/src/include/common.h
@@ -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
diff --git a/src/ui/theme-parser.c b/src/ui/theme-parser.c
index 5456f1c..559aafd 100644
--- a/src/ui/theme-parser.c
+++ b/src/ui/theme-parser.c
@@ -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;
diff --git a/src/ui/theme-private.h b/src/ui/theme-private.h
index 775641a..78f6549 100644
--- a/src/ui/theme-private.h
+++ b/src/ui/theme-private.h
@@ -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];
};
/**
diff --git a/src/ui/theme.c b/src/ui/theme.c
index 87ebede..ad17910 100644
--- a/src/ui/theme.c
+++ b/src/ui/theme.c
@@ -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;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]