diff --git a/src/core/constraints.c b/src/core/constraints.c index 6ceb336ac..bf12133f8 100644 --- a/src/core/constraints.c +++ b/src/core/constraints.c @@ -439,9 +439,13 @@ setup_constraint_info (ConstraintInfo *info, monitor_info->number); /* Workaround braindead legacy apps that don't know how to - * fullscreen themselves properly. + * fullscreen themselves properly - don't get fooled by + * windows which hide their titlebar when maximized; that's + * not the same as fullscreen, even if there are no struts + * making the workarea smaller than the monitor. */ if (meta_prefs_get_force_fullscreen() && + !window->hide_titlebar_when_maximized && meta_rectangle_equal (new, &monitor_info->rect) && window->has_fullscreen_func && !window->fullscreen) diff --git a/src/core/window-private.h b/src/core/window-private.h index de1c35204..535fcdb22 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -105,6 +105,7 @@ struct _MetaWindow char *dbus_unique_name; char *dbus_object_path; + int hide_titlebar_when_maximized; int net_wm_pid; Window xtransient_for; diff --git a/src/core/window-props.c b/src/core/window-props.c index 63e0607c7..f73c26fb1 100644 --- a/src/core/window-props.c +++ b/src/core/window-props.c @@ -1589,6 +1589,34 @@ reload_gtk_theme_variant (MetaWindow *window, } } +static void +reload_gtk_hide_titlebar_when_maximized (MetaWindow *window, + MetaPropValue *value, + gboolean initial) +{ + gboolean requested_value = FALSE; + gboolean current_value = window->hide_titlebar_when_maximized; + + if (value->type != META_PROP_VALUE_INVALID) + { + requested_value = ((int) value->v.cardinal == 1); + meta_verbose ("Request to hide titlebar for window %s.\n", window->desc); + } + + if (requested_value == current_value) + return; + + window->hide_titlebar_when_maximized = requested_value; + + if (META_WINDOW_MAXIMIZED (window)) + { + meta_window_queue (window, META_QUEUE_MOVE_RESIZE); + + if (window->frame) + meta_ui_update_frame_style (window->screen->ui, window->frame->xwindow); + } +} + static void reload_dbus_application_id (MetaWindow *window, MetaPropValue *value, @@ -1708,6 +1736,7 @@ meta_display_init_window_prop_hooks (MetaDisplay *display) { display->atom__MOTIF_WM_HINTS, META_PROP_VALUE_MOTIF_HINTS, reload_mwm_hints, TRUE, FALSE }, { XA_WM_TRANSIENT_FOR, META_PROP_VALUE_WINDOW, reload_transient_for, TRUE, FALSE }, { display->atom__GTK_THEME_VARIANT, META_PROP_VALUE_UTF8, reload_gtk_theme_variant, TRUE, FALSE }, + { display->atom__GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED, META_PROP_VALUE_CARDINAL, reload_gtk_hide_titlebar_when_maximized, TRUE, FALSE }, { display->atom__DBUS_APPLICATION_ID, META_PROP_VALUE_UTF8, reload_dbus_application_id, TRUE, FALSE }, { display->atom__DBUS_UNIQUE_NAME, META_PROP_VALUE_UTF8, reload_dbus_unique_name, TRUE, FALSE }, { display->atom__DBUS_OBJECT_PATH, META_PROP_VALUE_UTF8, reload_dbus_object_path, TRUE, FALSE }, diff --git a/src/core/window.c b/src/core/window.c index 12e3f0136..378b49b57 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -10539,7 +10539,8 @@ meta_window_get_frame_type (MetaWindow *window) /* can't add border if undecorated */ return META_FRAME_TYPE_LAST; } - else if (window->border_only && base_type != META_FRAME_TYPE_ATTACHED) + else if ((window->border_only && base_type != META_FRAME_TYPE_ATTACHED) || + (window->hide_titlebar_when_maximized && META_WINDOW_MAXIMIZED (window))) { /* override base frame type */ return META_FRAME_TYPE_BORDER; diff --git a/src/meta/atomnames.h b/src/meta/atomnames.h index 268c0978b..aa33ab7a6 100644 --- a/src/meta/atomnames.h +++ b/src/meta/atomnames.h @@ -59,6 +59,7 @@ item(_MUTTER_SET_KEYBINDINGS_MESSAGE) item(_MUTTER_TOGGLE_VERBOSE) item(_MUTTER_HINTS) item(_GTK_THEME_VARIANT) +item(_GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED) item(_DBUS_APPLICATION_ID) item(_DBUS_UNIQUE_NAME) item(_DBUS_OBJECT_PATH)