Skip to content

Commit

Permalink
Add frame type for attached modal dialogs
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
owtaylor authored and vkareh committed Aug 28, 2018
1 parent 37fecf4 commit c9c3f85
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 6 deletions.
8 changes: 8 additions & 0 deletions doc/theme-format.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
========================================

Expand Down
8 changes: 6 additions & 2 deletions src/core/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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;
Expand Down
1 change: 1 addition & 0 deletions src/include/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
5 changes: 3 additions & 2 deletions src/ui/theme-parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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"),
Expand Down
7 changes: 7 additions & 0 deletions src/ui/theme-viewer.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
11 changes: 9 additions & 2 deletions src/ui/theme.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand All @@ -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";
Expand Down

0 comments on commit c9c3f85

Please sign in to comment.