put in some kind of distinctive frame for UTILITY, though it's ugly. Also

2002-02-09  Havoc Pennington  <hp@pobox.com>

	* src/themes/Atlanta/metacity-theme-1.xml: put in some kind of
	distinctive frame for UTILITY, though it's ugly. Also put in the
	borderless look for maximized windows.

	* src/stack.c (compute_layer): put splash screen in the splash
	layer

	* src/stack.h (enum): create a splash screen layer

	* src/place.c (meta_window_place): center splashscreen, and fix a
	typo in the centering code

	* src/window.c (recalc_window_features): disable most features on
	splash screens

	* src/screen.c (set_supported_hint): add UTILITY and SPLASHSCREEN
	hints

	* src/window.c: add UTILITY, SPLASHSCREEN implementation

	* src/window.h (enum): add UTILITY, SPLASHSCREEN types

	* src/theme-parser.c (parse_toplevel_element): parser support
	for has_title attribute

	* src/theme.c (meta_frame_layout_get_borders): handle a has_title
	field in the layout, for utility windows that don't display a
	title (would be better to be able to shrink the title text,
	but that's kind of tricky to implement :-/)
This commit is contained in:
Havoc Pennington 2002-02-09 06:54:44 +00:00 committed by Havoc Pennington
parent 844a8ac13f
commit 116fc5546f
15 changed files with 172 additions and 26 deletions

View File

@ -1,3 +1,35 @@
2002-02-09 Havoc Pennington <hp@pobox.com>
* src/themes/Atlanta/metacity-theme-1.xml: put in some kind of
distinctive frame for UTILITY, though it's ugly. Also put in the
borderless look for maximized windows.
* src/stack.c (compute_layer): put splash screen in the splash
layer
* src/stack.h (enum): create a splash screen layer
* src/place.c (meta_window_place): center splashscreen, and fix a
typo in the centering code
* src/window.c (recalc_window_features): disable most features on
splash screens
* src/screen.c (set_supported_hint): add UTILITY and SPLASHSCREEN
hints
* src/window.c: add UTILITY, SPLASHSCREEN implementation
* src/window.h (enum): add UTILITY, SPLASHSCREEN types
* src/theme-parser.c (parse_toplevel_element): parser support
for has_title attribute
* src/theme.c (meta_frame_layout_get_borders): handle a has_title
field in the layout, for utility windows that don't display a
title (would be better to be able to shrink the title text,
but that's kind of tricky to implement :-/)
2002-02-08 Havoc Pennington <hp@pobox.com> 2002-02-08 Havoc Pennington <hp@pobox.com>
* src/screen.c (set_supported_hint): add _NET_WM_STATE_HIDDEN * src/screen.c (set_supported_hint): add _NET_WM_STATE_HIDDEN

View File

@ -91,9 +91,14 @@ meta_core_get_frame_type (Display *xdisplay,
return META_FRAME_TYPE_MENU; return META_FRAME_TYPE_MENU;
break; break;
case META_WINDOW_UTILITY:
return META_FRAME_TYPE_UTILITY;
break;
case META_WINDOW_DESKTOP: case META_WINDOW_DESKTOP:
case META_WINDOW_DOCK: case META_WINDOW_DOCK:
case META_WINDOW_TOOLBAR: case META_WINDOW_TOOLBAR:
case META_WINDOW_SPLASHSCREEN:
/* No frame */ /* No frame */
return META_FRAME_TYPE_LAST; return META_FRAME_TYPE_LAST;
break; break;

View File

@ -144,7 +144,9 @@ meta_display_open (const char *name)
"_WIN_HINTS", "_WIN_HINTS",
"_METACITY_RELOAD_THEME_MESSAGE", "_METACITY_RELOAD_THEME_MESSAGE",
"_METACITY_SET_KEYBINDINGS_MESSAGE", "_METACITY_SET_KEYBINDINGS_MESSAGE",
"_NET_WM_STATE_HIDDEN" "_NET_WM_STATE_HIDDEN",
"_NET_WM_WINDOW_TYPE_UTILITY",
"_NET_WM_WINDOW_TYPE_SPLASHSCREEN"
}; };
Atom atoms[G_N_ELEMENTS(atom_names)]; Atom atoms[G_N_ELEMENTS(atom_names)];
@ -243,6 +245,8 @@ meta_display_open (const char *name)
display->atom_metacity_reload_theme_message = atoms[47]; display->atom_metacity_reload_theme_message = atoms[47];
display->atom_metacity_set_keybindings_message = atoms[48]; display->atom_metacity_set_keybindings_message = atoms[48];
display->atom_net_wm_state_hidden = atoms[49]; display->atom_net_wm_state_hidden = atoms[49];
display->atom_net_wm_window_type_utility = atoms[50];
display->atom_net_wm_window_type_splashscreen = atoms[51];
/* Offscreen unmapped window used for _NET_SUPPORTING_WM_CHECK, /* Offscreen unmapped window used for _NET_SUPPORTING_WM_CHECK,
* created in screen_new * created in screen_new

View File

@ -109,6 +109,8 @@ struct _MetaDisplay
Atom atom_metacity_reload_theme_message; Atom atom_metacity_reload_theme_message;
Atom atom_metacity_set_keybindings_message; Atom atom_metacity_set_keybindings_message;
Atom atom_net_wm_state_hidden; Atom atom_net_wm_state_hidden;
Atom atom_net_wm_window_type_utility;
Atom atom_net_wm_window_type_splashscreen;
/* This is the actual window from focus events, /* This is the actual window from focus events,
* not the one we last set * not the one we last set

View File

@ -253,7 +253,8 @@ meta_window_place (MetaWindow *window,
} }
if (window->type == META_WINDOW_DIALOG || if (window->type == META_WINDOW_DIALOG ||
window->type == META_WINDOW_MODAL_DIALOG) window->type == META_WINDOW_MODAL_DIALOG ||
window->type == META_WINDOW_SPLASHSCREEN)
{ {
/* Center on screen */ /* Center on screen */
int w, h; int w, h;
@ -263,7 +264,7 @@ meta_window_place (MetaWindow *window,
h = window->screen->height; h = window->screen->height;
x = (w - window->rect.width) / 2; x = (w - window->rect.width) / 2;
y = (y - window->rect.height) / 2; y = (h - window->rect.height) / 2;
meta_topic (META_DEBUG_PLACEMENT, "Centered window %s on screen\n", meta_topic (META_DEBUG_PLACEMENT, "Centered window %s on screen\n",
window->desc); window->desc);

View File

@ -78,7 +78,7 @@ set_wm_check_hint (MetaScreen *screen)
static int static int
set_supported_hint (MetaScreen *screen) set_supported_hint (MetaScreen *screen)
{ {
#define N_SUPPORTED 24 #define N_SUPPORTED 26
#define N_WIN_SUPPORTED 1 #define N_WIN_SUPPORTED 1
Atom atoms[N_SUPPORTED]; Atom atoms[N_SUPPORTED];
@ -106,6 +106,8 @@ set_supported_hint (MetaScreen *screen)
atoms[21] = screen->display->atom_net_wm_icon; atoms[21] = screen->display->atom_net_wm_icon;
atoms[22] = screen->display->atom_net_wm_moveresize; atoms[22] = screen->display->atom_net_wm_moveresize;
atoms[23] = screen->display->atom_net_wm_state_hidden; atoms[23] = screen->display->atom_net_wm_state_hidden;
atoms[24] = screen->display->atom_net_wm_window_type_utility;
atoms[25] = screen->display->atom_net_wm_window_type_splashscreen;
XChangeProperty (screen->display->xdisplay, screen->xroot, XChangeProperty (screen->display->xdisplay, screen->xroot,
screen->display->atom_net_supported, screen->display->atom_net_supported,

View File

@ -588,6 +588,12 @@ window_type_to_string (MetaWindowType type)
case META_WINDOW_MENU: case META_WINDOW_MENU:
return "menu"; return "menu";
break; break;
case META_WINDOW_SPLASHSCREEN:
return "splashscreen";
break;
case META_WINDOW_UTILITY:
return "utility";
break;
} }
return ""; return "";
@ -610,6 +616,10 @@ window_type_from_string (const char *str)
return META_WINDOW_TOOLBAR; return META_WINDOW_TOOLBAR;
else if (strcmp (str, "menu") == 0) else if (strcmp (str, "menu") == 0)
return META_WINDOW_MENU; return META_WINDOW_MENU;
else if (strcmp (str, "utility") == 0)
return META_WINDOW_UTILITY;
else if (strcmp (str, "splashscreen") == 0)
return META_WINDOW_SPLASHSCREEN;
else else
return META_WINDOW_NORMAL; return META_WINDOW_NORMAL;
} }

View File

@ -270,6 +270,10 @@ compute_layer (MetaWindow *window)
window->layer = META_LAYER_NORMAL; window->layer = META_LAYER_NORMAL;
break; break;
case META_WINDOW_SPLASHSCREEN:
window->layer = META_LAYER_SPLASH;
break;
default: default:
window->layer = META_LAYER_NORMAL; window->layer = META_LAYER_NORMAL;
break; break;

View File

@ -38,7 +38,8 @@ typedef enum
META_LAYER_TOP = 3, META_LAYER_TOP = 3,
META_LAYER_DOCK = 4, META_LAYER_DOCK = 4,
META_LAYER_FULLSCREEN = 5, META_LAYER_FULLSCREEN = 5,
META_LAYER_LAST = 6 META_LAYER_SPLASH = 6,
META_LAYER_LAST = 7
} MetaStackLayer; } MetaStackLayer;
struct _MetaStack struct _MetaStack

View File

@ -656,11 +656,14 @@ parse_toplevel_element (GMarkupParseContext *context,
{ {
const char *name = NULL; const char *name = NULL;
const char *parent = NULL; const char *parent = NULL;
const char *has_title = NULL;
gboolean has_title_val;
MetaFrameLayout *parent_layout; MetaFrameLayout *parent_layout;
if (!locate_attributes (context, element_name, attribute_names, attribute_values, if (!locate_attributes (context, element_name, attribute_names, attribute_values,
error, error,
"name", &name, "parent", &parent, "name", &name, "parent", &parent,
"has_title", &has_title,
NULL)) NULL))
return; return;
@ -672,6 +675,10 @@ parse_toplevel_element (GMarkupParseContext *context,
return; return;
} }
has_title_val = TRUE;
if (has_title && !parse_boolean (has_title, &has_title_val, context, error))
return;
if (meta_theme_lookup_layout (info->theme, name)) if (meta_theme_lookup_layout (info->theme, name))
{ {
set_error (error, context, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, set_error (error, context, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE,
@ -700,6 +707,9 @@ parse_toplevel_element (GMarkupParseContext *context,
else else
info->layout = meta_frame_layout_new (); info->layout = meta_frame_layout_new ();
if (has_title) /* only if explicit, otherwise inherit */
info->layout->has_title = has_title_val;
meta_theme_insert_layout (info->theme, name, info->layout); meta_theme_insert_layout (info->theme, name, info->layout);
push_state (info, STATE_FRAME_GEOMETRY); push_state (info, STATE_FRAME_GEOMETRY);

View File

@ -333,6 +333,8 @@ meta_frame_layout_new (void)
layout->button_width = -1; layout->button_width = -1;
layout->button_height = -1; layout->button_height = -1;
layout->has_title = TRUE;
init_border (&layout->button_border); init_border (&layout->button_border);
return layout; return layout;
@ -474,6 +476,9 @@ meta_frame_layout_get_borders (const MetaFrameLayout *layout,
g_return_if_fail (left_width != NULL); g_return_if_fail (left_width != NULL);
g_return_if_fail (right_width != NULL); g_return_if_fail (right_width != NULL);
if (!layout->has_title)
text_height = 0;
buttons_height = layout->button_height + buttons_height = layout->button_height +
layout->button_border.top + layout->button_border.bottom; layout->button_border.top + layout->button_border.bottom;
title_height = text_height + title_height = text_height +

View File

@ -78,6 +78,9 @@ struct _MetaFrameLayout
/* Space around buttons */ /* Space around buttons */
GtkBorder button_border; GtkBorder button_border;
/* Whether title text will be displayed */
guint has_title : 1;
}; };

View File

@ -23,11 +23,24 @@
<!-- strip borders off the normal geometry --> <!-- strip borders off the normal geometry -->
<frame_geometry name="normal_borderless" parent="normal"> <frame_geometry name="normal_borderless" parent="normal">
<distance name="left_width" value="0"/> <distance name="left_width" value="4"/>
<distance name="right_width" value="0"/> <distance name="right_width" value="4"/>
<distance name="bottom_height" value="0"/> <distance name="bottom_height" value="5"/>
<distance name="left_titlebar_edge" value="0"/> <distance name="left_titlebar_edge" value="4"/>
<distance name="right_titlebar_edge" value="0"/> <distance name="right_titlebar_edge" value="4"/>
</frame_geometry>
<frame_geometry name="utility" has_title="false">
<distance name="left_width" value="3"/>
<distance name="right_width" value="3"/>
<distance name="bottom_height" value="4"/>
<distance name="left_titlebar_edge" value="3"/>
<distance name="right_titlebar_edge" value="3"/>
<distance name="button_width" value="11"/>
<distance name="button_height" value="11"/>
<distance name="title_vertical_pad" value="11"/>
<border name="title_border" left="3" right="4" top="3" bottom="3"/>
<border name="button_border" left="0" right="0" top="1" bottom="1"/>
</frame_geometry> </frame_geometry>
<!-- define constants --> <!-- define constants -->
@ -136,19 +149,30 @@
x1="1" y1="height-2" x2="width-2" y2="height-2"/> x1="1" y1="height-2" x2="width-2" y2="height-2"/>
</draw_ops> </draw_ops>
<draw_ops name="focus_background"> <draw_ops name="blank">
<include name="outer_bevel"/> <!-- nothing -->
</draw_ops>
<draw_ops name="focus_outline">
<rectangle color="#000000" <rectangle color="#000000"
x="left_width-1" y="top_height-1" x="left_width-1" y="top_height-1"
width="width-left_width-right_width+1" width="width-left_width-right_width+1"
height="height-top_height-bottom_height+1"/> height="height-top_height-bottom_height+1"/>
</draw_ops> </draw_ops>
<draw_ops name="focus_background">
<include name="outer_bevel"/>
<include name="focus_outline"/>
</draw_ops>
<draw_ops name="title_gradient"> <draw_ops name="title_gradient">
<gradient type="diagonal" x="0" y="0" width="width-SpacerWidth" height="height"> <gradient type="diagonal" x="0" y="0" width="width-SpacerWidth" height="height">
<color value="blend/gtk:bg[NORMAL]/gtk:bg[SELECTED]/0.6"/> <color value="blend/gtk:bg[NORMAL]/gtk:bg[SELECTED]/0.6"/>
<color value="gtk:bg[SELECTED]"/> <color value="gtk:bg[SELECTED]"/>
</gradient> </gradient>
</draw_ops>
<draw_ops name="title_spacer">
<gtk_vline state="normal" x="width+1-SpacerWidth/2" <gtk_vline state="normal" x="width+1-SpacerWidth/2"
y1="(height-SpacerHeight)/2" y1="(height-SpacerHeight)/2"
y2="height - (height-SpacerHeight)/2"/> y2="height - (height-SpacerHeight)/2"/>
@ -175,14 +199,25 @@
</draw_ops> </draw_ops>
<draw_ops name="title_normal"> <draw_ops name="title_normal">
<include name="title_spacer"/>
<include name="title_text"/> <include name="title_text"/>
</draw_ops> </draw_ops>
<draw_ops name="title_focused"> <draw_ops name="title_focused">
<include name="title_gradient"/> <include name="title_gradient"/>
<include name="title_spacer"/>
<include name="title_text_focused"/> <include name="title_text_focused"/>
</draw_ops> </draw_ops>
<draw_ops name="title_utility">
<include name="title_spacer"/>
</draw_ops>
<draw_ops name="title_utility_focused">
<include name="title_gradient"/>
<include name="title_spacer"/>
</draw_ops>
<frame_style name="normal_unfocused" geometry="normal"> <frame_style name="normal_unfocused" geometry="normal">
<piece position="entire_background" draw_ops="outer_bevel"/> <piece position="entire_background" draw_ops="outer_bevel"/>
<piece position="title" draw_ops="title_normal"/> <piece position="title" draw_ops="title_normal"/>
@ -203,16 +238,25 @@
<piece position="title" draw_ops="title_focused"/> <piece position="title" draw_ops="title_focused"/>
</frame_style> </frame_style>
<frame_style name="maximized_unfocused" parent="normal_unfocused"> <frame_style name="maximized_unfocused" geometry="normal_borderless" parent="normal_unfocused">
<piece position="entire_background" draw_ops="blank"/>
<button function="maximize" state="normal" draw_ops="restore_button"/> <button function="maximize" state="normal" draw_ops="restore_button"/>
<button function="maximize" state="pressed" draw_ops="restore_button_pressed"/> <button function="maximize" state="pressed" draw_ops="restore_button_pressed"/>
</frame_style> </frame_style>
<frame_style name="maximized_focused" parent="normal_focused"> <frame_style name="maximized_focused" geometry="normal_borderless" parent="normal_focused">
<piece position="entire_background" draw_ops="focus_outline"/>
<button function="maximize" state="normal" draw_ops="restore_button"/> <button function="maximize" state="normal" draw_ops="restore_button"/>
<button function="maximize" state="pressed" draw_ops="restore_button_pressed"/> <button function="maximize" state="pressed" draw_ops="restore_button_pressed"/>
</frame_style> </frame_style>
<frame_style name="utility_unfocused" geometry="utility" parent="normal_unfocused">
<piece position="title" draw_ops="title_utility"/>
</frame_style>
<frame_style name="utility_focused" geometry="utility" parent="normal_focused">
<piece position="title" draw_ops="title_utility_focused"/>
</frame_style>
<frame_style_set name="normal"> <frame_style_set name="normal">
<frame focus="yes" state="normal" resize="both" style="normal_focused"/> <frame focus="yes" state="normal" resize="both" style="normal_focused"/>
@ -225,11 +269,23 @@
<frame focus="no" state="maximized_and_shaded" style="maximized_unfocused"/> <frame focus="no" state="maximized_and_shaded" style="maximized_unfocused"/>
</frame_style_set> </frame_style_set>
<frame_style_set name="utility" parent="normal">
<frame focus="yes" state="normal" resize="both" style="utility_focused"/>
<frame focus="no" state="normal" resize="both" style="utility_unfocused"/>
<!-- this is a bunch of crack since utility windows shouldn't be maximized -->
<frame focus="yes" state="maximized" style="utility_focused"/>
<frame focus="no" state="maximized" style="utility_unfocused"/>
<frame focus="yes" state="shaded" style="utility_focused"/>
<frame focus="no" state="shaded" style="utility_unfocused"/>
<frame focus="yes" state="maximized_and_shaded" style="utility_focused"/>
<frame focus="no" state="maximized_and_shaded" style="utility_unfocused"/>
</frame_style_set>
<window type="normal" style_set="normal"/> <window type="normal" style_set="normal"/>
<window type="dialog" style_set="normal"/> <window type="dialog" style_set="normal"/>
<window type="modal_dialog" style_set="normal"/> <window type="modal_dialog" style_set="normal"/>
<window type="menu" style_set="normal"/> <window type="menu" style_set="normal"/>
<window type="utility" style_set="normal"/> <window type="utility" style_set="utility"/>
<menu_icon function="close" state="normal" draw_ops="close_button"/> <menu_icon function="close" state="normal" draw_ops="close_button"/>
<menu_icon function="maximize" state="normal" draw_ops="maximize_button"/> <menu_icon function="maximize" state="normal" draw_ops="maximize_button"/>

View File

@ -526,7 +526,8 @@ meta_window_new (MetaDisplay *display, Window xwindow,
if (window->type == META_WINDOW_DESKTOP || if (window->type == META_WINDOW_DESKTOP ||
window->type == META_WINDOW_DOCK || window->type == META_WINDOW_DOCK ||
window->type == META_WINDOW_TOOLBAR || window->type == META_WINDOW_TOOLBAR ||
window->type == META_WINDOW_MENU) window->type == META_WINDOW_MENU ||
window->type == META_WINDOW_UTILITY)
{ {
if (window->size_hints.flags & PPosition) if (window->size_hints.flags & PPosition)
{ {
@ -2645,7 +2646,8 @@ meta_window_configure_request (MetaWindow *window,
window->type == META_WINDOW_DOCK || window->type == META_WINDOW_DOCK ||
window->type == META_WINDOW_TOOLBAR || window->type == META_WINDOW_TOOLBAR ||
window->type == META_WINDOW_MENU || window->type == META_WINDOW_MENU ||
window->type == META_WINDOW_NORMAL) && window->type == META_WINDOW_NORMAL ||
window->type == META_WINDOW_UTILITY) &&
(window->size_hints.flags & PPosition)) || (window->size_hints.flags & PPosition)) ||
(window->size_hints.flags & USPosition)) (window->size_hints.flags & USPosition))
{ {
@ -2666,7 +2668,8 @@ meta_window_configure_request (MetaWindow *window,
window->type == META_WINDOW_DOCK || window->type == META_WINDOW_DOCK ||
window->type == META_WINDOW_TOOLBAR || window->type == META_WINDOW_TOOLBAR ||
window->type == META_WINDOW_MENU || window->type == META_WINDOW_MENU ||
window->type == META_WINDOW_NORMAL) window->type == META_WINDOW_NORMAL ||
window->type == META_WINDOW_UTILITY)
{ {
if (event->xconfigurerequest.value_mask & CWWidth) if (event->xconfigurerequest.value_mask & CWWidth)
width = event->xconfigurerequest.width; width = event->xconfigurerequest.width;
@ -4135,13 +4138,14 @@ update_net_wm_type (MetaWindow *window)
/* We break as soon as we find one we recognize, /* We break as soon as we find one we recognize,
* supposed to prefer those near the front of the list * supposed to prefer those near the front of the list
*/ */
/* FIXME modal dialog (? see if it's in spec), utility, splashscreen */
if (atoms[i] == window->display->atom_net_wm_window_type_desktop || if (atoms[i] == window->display->atom_net_wm_window_type_desktop ||
atoms[i] == window->display->atom_net_wm_window_type_dock || atoms[i] == window->display->atom_net_wm_window_type_dock ||
atoms[i] == window->display->atom_net_wm_window_type_toolbar || atoms[i] == window->display->atom_net_wm_window_type_toolbar ||
atoms[i] == window->display->atom_net_wm_window_type_menu || atoms[i] == window->display->atom_net_wm_window_type_menu ||
atoms[i] == window->display->atom_net_wm_window_type_dialog || atoms[i] == window->display->atom_net_wm_window_type_dialog ||
atoms[i] == window->display->atom_net_wm_window_type_normal) atoms[i] == window->display->atom_net_wm_window_type_normal ||
atoms[i] == window->display->atom_net_wm_window_type_utility ||
atoms[i] == window->display->atom_net_wm_window_type_splashscreen)
{ {
window->type_atom = atoms[i]; window->type_atom = atoms[i];
break; break;
@ -4974,8 +4978,13 @@ recalc_window_type (MetaWindow *window)
window->type = META_WINDOW_DIALOG; window->type = META_WINDOW_DIALOG;
else if (window->type_atom == window->display->atom_net_wm_window_type_normal) else if (window->type_atom == window->display->atom_net_wm_window_type_normal)
window->type = META_WINDOW_NORMAL; window->type = META_WINDOW_NORMAL;
else if (window->type_atom == window->display->atom_net_wm_window_type_utility)
window->type = META_WINDOW_UTILITY;
else if (window->type_atom == window->display->atom_net_wm_window_type_splashscreen)
window->type = META_WINDOW_SPLASHSCREEN;
else else
meta_bug ("Set a type atom for %s that wasn't handled in recalc_window_type\n"); meta_bug ("Set a type atom for %s that wasn't handled in recalc_window_type\n",
window->desc);
} }
else if (window->xtransient_for != None) else if (window->xtransient_for != None)
{ {
@ -5026,7 +5035,8 @@ recalc_window_features (MetaWindow *window)
/* Semantic category overrides the MWM hints */ /* Semantic category overrides the MWM hints */
if (window->type == META_WINDOW_DESKTOP || if (window->type == META_WINDOW_DESKTOP ||
window->type == META_WINDOW_DOCK) window->type == META_WINDOW_DOCK ||
window->type == META_WINDOW_SPLASHSCREEN)
{ {
window->decorated = FALSE; window->decorated = FALSE;
window->has_close_func = FALSE; window->has_close_func = FALSE;

View File

@ -37,8 +37,9 @@ typedef enum
META_WINDOW_DIALOG, META_WINDOW_DIALOG,
META_WINDOW_MODAL_DIALOG, META_WINDOW_MODAL_DIALOG,
META_WINDOW_TOOLBAR, META_WINDOW_TOOLBAR,
META_WINDOW_MENU META_WINDOW_MENU,
/* FIXME add UTILITY, SPLASHSCREEN */ META_WINDOW_UTILITY,
META_WINDOW_SPLASHSCREEN
} MetaWindowType; } MetaWindowType;
struct _MetaWindow struct _MetaWindow