summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen W. Taylor <[email protected]>2014-09-27 17:06:36 +0300
committerVictor Kareh <[email protected]>2018-08-28 09:38:37 -0400
commitc9c3f858e28edf0856a263941007401923adbabd (patch)
tree702b2c5d7a41d8ea9b72ef5d2c11ad8116bab136
parent37fecf49392eb10ada1f4bf481d6ad6be56891dd (diff)
downloadmarco-c9c3f858e28edf0856a263941007401923adbabd.tar.bz2
marco-c9c3f858e28edf0856a263941007401923adbabd.tar.xz
Add frame type for attached modal dialogs
Add a new frame type META_FRAME_TYPE_ATTACHED which is used for attached modal dialogs. The theme format version is bumped to 3.2, and attached windows can have borders defined in a metacity-theme-3.xml as: <window version=">= 3.2" type="attached" style_set="[name]"/> If no style is defined for "attached", drawing will fall back to the "border" type. https://bugzilla.gnome.org/show_bug.cgi?id=592382 NOTE: Patch copied from mutter and adapted for metacity.
-rw-r--r--doc/theme-format.txt8
-rw-r--r--src/core/core.c8
-rw-r--r--src/include/common.h1
-rw-r--r--src/ui/theme-parser.c5
-rw-r--r--src/ui/theme-viewer.c7
-rw-r--r--src/ui/theme.c11
6 files changed, 34 insertions, 6 deletions
diff --git a/doc/theme-format.txt b/doc/theme-format.txt
index bd6004d4..541998d0 100644
--- a/doc/theme-format.txt
+++ b/doc/theme-format.txt
@@ -22,6 +22,14 @@ This document has separate sections for each format version. You may
want to read the document in reverse order, since the base features
are discussed under version 1.
+New Features in Theme Format Version 3.2
+========================================
+
+A new window type 'attached' is added for modal dialogs which are
+attached to their parent window. (When the attach_modal_dialogs preference
+is turned on.) If no style is defined for the 'attached' window type,
+the 'border' window type will be used instead.
+
New Features in Theme Format Version 3.1
========================================
diff --git a/src/core/core.c b/src/core/core.c
index 4ba62db7..535a3820 100644
--- a/src/core/core.c
+++ b/src/core/core.c
@@ -131,7 +131,11 @@ meta_core_get (Display *xdisplay,
break;
case META_WINDOW_MODAL_DIALOG:
- base_type = META_FRAME_TYPE_MODAL_DIALOG;
+ if (meta_prefs_get_attach_modal_dialogs () &&
+ meta_window_get_transient_for (window) != NULL)
+ base_type = META_FRAME_TYPE_ATTACHED;
+ else
+ base_type = META_FRAME_TYPE_MODAL_DIALOG;
break;
case META_WINDOW_MENU:
@@ -157,7 +161,7 @@ meta_core_get (Display *xdisplay,
/* can't add border if undecorated */
*((MetaFrameType*)answer) = META_FRAME_TYPE_LAST;
}
- else if (window->border_only)
+ else if (window->border_only && base_type != META_FRAME_TYPE_ATTACHED)
{
/* override base frame type */
*((MetaFrameType*)answer) = META_FRAME_TYPE_BORDER;
diff --git a/src/include/common.h b/src/include/common.h
index fd7de17c..6e94c7a0 100644
--- a/src/include/common.h
+++ b/src/include/common.h
@@ -208,6 +208,7 @@ typedef enum
META_FRAME_TYPE_UTILITY,
META_FRAME_TYPE_MENU,
META_FRAME_TYPE_BORDER,
+ META_FRAME_TYPE_ATTACHED,
META_FRAME_TYPE_LAST
} MetaFrameType;
diff --git a/src/ui/theme-parser.c b/src/ui/theme-parser.c
index 38c1e664..e3c044f9 100644
--- a/src/ui/theme-parser.c
+++ b/src/ui/theme-parser.c
@@ -38,7 +38,7 @@
* look out for.
*/
#define THEME_MAJOR_VERSION 3
-#define THEME_MINOR_VERSION 1
+#define THEME_MINOR_VERSION 2
#define THEME_VERSION (1000 * THEME_MAJOR_VERSION + THEME_MINOR_VERSION)
#define MARCO_THEME_FILENAME_FORMAT "metacity-theme-%d.xml"
@@ -1277,7 +1277,8 @@ parse_toplevel_element (GMarkupParseContext *context,
type = meta_frame_type_from_string (type_name);
- if (type == META_FRAME_TYPE_LAST)
+ if (type == META_FRAME_TYPE_LAST ||
+ (type == META_FRAME_TYPE_ATTACHED && peek_required_version (info) < 3002))
{
set_error (error, context, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE,
_("Unknown type \"%s\" on <%s> element"),
diff --git a/src/ui/theme-viewer.c b/src/ui/theme-viewer.c
index e6e4e097..65df34fa 100644
--- a/src/ui/theme-viewer.c
+++ b/src/ui/theme-viewer.c
@@ -427,6 +427,10 @@ get_window_contents (MetaFrameType type,
*title = _("Border");
return border_only_contents ();
+ case META_FRAME_TYPE_ATTACHED:
+ *title = _("Attached Modal Dialog");
+ return dialog_contents ();
+
case META_FRAME_TYPE_LAST:
g_assert_not_reached ();
break;
@@ -474,6 +478,9 @@ get_window_flags (MetaFrameType type)
case META_FRAME_TYPE_BORDER:
break;
+ case META_FRAME_TYPE_ATTACHED:
+ break;
+
case META_FRAME_TYPE_LAST:
g_assert_not_reached ();
break;
diff --git a/src/ui/theme.c b/src/ui/theme.c
index 4385b7c6..667e60ff 100644
--- a/src/ui/theme.c
+++ b/src/ui/theme.c
@@ -5193,7 +5193,7 @@ meta_theme_validate (MetaTheme *theme,
}
for (i = 0; i < (int)META_FRAME_TYPE_LAST; i++)
- if (theme->style_sets_by_type[i] == NULL)
+ if (i != (int)META_FRAME_TYPE_ATTACHED && theme->style_sets_by_type[i] == NULL)
{
g_set_error (error, META_THEME_ERROR, META_THEME_ERROR_FAILED,
_("No frame style set for window type \"%s\" in theme \"%s\", add a <window type=\"%s\" style_set=\"whatever\"/> element"),
@@ -5271,7 +5271,10 @@ theme_get_style (MetaTheme *theme,
style_set = theme->style_sets_by_type[type];
- /* Right now the parser forces a style set for all types,
+ if (style_set == NULL && type == META_FRAME_TYPE_ATTACHED)
+ style_set = theme->style_sets_by_type[META_FRAME_TYPE_BORDER];
+
+ /* Right now the parser forces a style set for all other types,
* but this fallback code is here in case I take that out.
*/
if (style_set == NULL)
@@ -6229,6 +6232,8 @@ meta_frame_type_from_string (const char *str)
return META_FRAME_TYPE_MENU;
else if (strcmp ("border", str) == 0)
return META_FRAME_TYPE_BORDER;
+ else if (strcmp ("attached", str) == 0)
+ return META_FRAME_TYPE_ATTACHED;
#if 0
else if (strcmp ("toolbar", str) == 0)
return META_FRAME_TYPE_TOOLBAR;
@@ -6254,6 +6259,8 @@ meta_frame_type_to_string (MetaFrameType type)
return "menu";
case META_FRAME_TYPE_BORDER:
return "border";
+ case META_FRAME_TYPE_ATTACHED:
+ return "attached";
#if 0
case META_FRAME_TYPE_TOOLBAR:
return "toolbar";