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
This commit is contained in:
Owen W. Taylor
2010-11-04 12:11:54 -04:00
parent fc2ba0afbe
commit 4fbe547f16
5 changed files with 26 additions and 6 deletions

View File

@@ -131,7 +131,11 @@ meta_core_get (Display *xdisplay,
break; break;
case META_WINDOW_MODAL_DIALOG: 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; break;
case META_WINDOW_MENU: case META_WINDOW_MENU:
@@ -164,7 +168,7 @@ meta_core_get (Display *xdisplay,
/* can't add border if undecorated */ /* can't add border if undecorated */
*((MetaFrameType*)answer) = META_FRAME_TYPE_LAST; *((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 */ /* override base frame type */
*((MetaFrameType*)answer) = META_FRAME_TYPE_BORDER; *((MetaFrameType*)answer) = META_FRAME_TYPE_BORDER;

View File

@@ -195,6 +195,7 @@ typedef enum
META_FRAME_TYPE_UTILITY, META_FRAME_TYPE_UTILITY,
META_FRAME_TYPE_MENU, META_FRAME_TYPE_MENU,
META_FRAME_TYPE_BORDER, META_FRAME_TYPE_BORDER,
META_FRAME_TYPE_ATTACHED,
META_FRAME_TYPE_LAST META_FRAME_TYPE_LAST
} MetaFrameType; } MetaFrameType;

View File

@@ -38,7 +38,7 @@
* look out for. * look out for.
*/ */
#define THEME_MAJOR_VERSION 3 #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 THEME_VERSION (1000 * THEME_MAJOR_VERSION + THEME_MINOR_VERSION)
#define METACITY_THEME_FILENAME_FORMAT "metacity-theme-%d.xml" #define METACITY_THEME_FILENAME_FORMAT "metacity-theme-%d.xml"
@@ -1257,7 +1257,8 @@ parse_toplevel_element (GMarkupParseContext *context,
type = meta_frame_type_from_string (type_name); 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, set_error (error, context, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE,
_("Unknown type \"%s\" on <%s> element"), _("Unknown type \"%s\" on <%s> element"),

View File

@@ -407,6 +407,10 @@ get_window_contents (MetaFrameType type,
case META_FRAME_TYPE_BORDER: case META_FRAME_TYPE_BORDER:
*title = _("Border"); *title = _("Border");
return border_only_contents (); return border_only_contents ();
case META_FRAME_TYPE_ATTACHED:
*title = _("Attached Modal Dialog");
return dialog_contents ();
case META_FRAME_TYPE_LAST: case META_FRAME_TYPE_LAST:
g_assert_not_reached (); g_assert_not_reached ();
@@ -454,6 +458,9 @@ get_window_flags (MetaFrameType type)
case META_FRAME_TYPE_BORDER: case META_FRAME_TYPE_BORDER:
break; break;
case META_FRAME_TYPE_ATTACHED:
break;
case META_FRAME_TYPE_LAST: case META_FRAME_TYPE_LAST:
g_assert_not_reached (); g_assert_not_reached ();

View File

@@ -4992,7 +4992,7 @@ meta_theme_validate (MetaTheme *theme,
} }
for (i = 0; i < (int)META_FRAME_TYPE_LAST; i++) 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, 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"), _("No frame style set for window type \"%s\" in theme \"%s\", add a <window type=\"%s\" style_set=\"whatever\"/> element"),
@@ -5074,7 +5074,10 @@ theme_get_style (MetaTheme *theme,
style_set = theme->style_sets_by_type[type]; 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. * but this fallback code is here in case I take that out.
*/ */
if (style_set == NULL) if (style_set == NULL)
@@ -6004,6 +6007,8 @@ meta_frame_type_from_string (const char *str)
return META_FRAME_TYPE_MENU; return META_FRAME_TYPE_MENU;
else if (strcmp ("border", str) == 0) else if (strcmp ("border", str) == 0)
return META_FRAME_TYPE_BORDER; return META_FRAME_TYPE_BORDER;
else if (strcmp ("attached", str) == 0)
return META_FRAME_TYPE_ATTACHED;
#if 0 #if 0
else if (strcmp ("toolbar", str) == 0) else if (strcmp ("toolbar", str) == 0)
return META_FRAME_TYPE_TOOLBAR; return META_FRAME_TYPE_TOOLBAR;
@@ -6029,6 +6034,8 @@ meta_frame_type_to_string (MetaFrameType type)
return "menu"; return "menu";
case META_FRAME_TYPE_BORDER: case META_FRAME_TYPE_BORDER:
return "border"; return "border";
case META_FRAME_TYPE_ATTACHED:
return "attached";
#if 0 #if 0
case META_FRAME_TYPE_TOOLBAR: case META_FRAME_TYPE_TOOLBAR:
return "toolbar"; return "toolbar";