From c9c3f858e28edf0856a263941007401923adbabd Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Sat, 27 Sep 2014 17:06:36 +0300 Subject: 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: 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. --- doc/theme-format.txt | 8 ++++++++ src/core/core.c | 8 ++++++-- src/include/common.h | 1 + src/ui/theme-parser.c | 5 +++-- src/ui/theme-viewer.c | 7 +++++++ src/ui/theme.c | 11 +++++++++-- 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 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"; -- cgit v1.2.1