autofullscreen maximized windows with no decorations



Hi all,

we wish to use Metacity as the default window manager in Sugar and
have found a problem that is not clear how to solve.

The lines in the link below will fullscreen all windows that have no
decorations and are maximized:

http://git.gnome.org/cgit/metacity/tree/src/core/constraints.c#n424

In Sugar's case, most windows will be maximized and won't have
decorations, but we don't want them to be put automatically in
fullscreen mode because in fullscreen mode Sugar activities display a
different UI (the toolbar on the top is hidden and the canvas fills
the whole screen).

Also, we have a panel/dock that slides into the screen and should also
appear over maximized windows.

I will appreciate any feedback about what can we do here and, as a
proof of concept, I'm attaching a patch that adds a CLI switch for
disabling automatic fullscreening.

I can also open a ticket if you think this can be considered as a
valid bug or feature request.

Thanks,

Tomeu
From 118c8dc33376ba80dc7652392e5b30da9c102d77 Mon Sep 17 00:00:00 2001
From: Tomeu Vizoso <tomeu sugarlabs org>
Date: Fri, 19 Jun 2009 17:30:37 +0200
Subject: [PATCH] Add a switch to disable autofullscreen'ing maximized windows without decorations

---
 src/core/constraints.c |    4 +++-
 src/core/main.c        |   10 ++++++++++
 src/core/prefs.c       |   17 +++++++++++++++++
 src/include/prefs.h    |    6 +++++-
 4 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/src/core/constraints.c b/src/core/constraints.c
index 800b293..a060d20 100644
--- a/src/core/constraints.c
+++ b/src/core/constraints.c
@@ -27,6 +27,7 @@
 #include "constraints.h"
 #include "workspace.h"
 #include "place.h"
+#include "prefs.h"
 
 #include <stdlib.h>
 #include <math.h>
@@ -424,7 +425,8 @@ setup_constraint_info (ConstraintInfo      *info,
   /* Workaround braindead legacy apps that don't know how to
    * fullscreen themselves properly.
    */
-  if (meta_rectangle_equal (new, &xinerama_info->rect) &&
+  if (meta_prefs_get_force_fullscreen() &&
+      meta_rectangle_equal (new, &xinerama_info->rect) &&
       window->has_fullscreen_func &&
       !window->fullscreen)
     {
diff --git a/src/core/main.c b/src/core/main.c
index 6c36f10..a36a396 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -233,6 +233,7 @@ typedef struct
   gboolean sync;
   gboolean composite;
   gboolean no_composite;
+  gboolean no_force_fullscreen;
 } MetaArguments;
 
 #ifdef HAVE_COMPOSITE_EXTENSIONS
@@ -314,6 +315,12 @@ meta_parse_options (int *argc, char ***argv,
       N_("Turn compositing off"),
       NULL
     },
+    {
+      "no-force-fullscreen", 0, COMPOSITE_OPTS_FLAGS, G_OPTION_ARG_NONE,
+      &my_args.no_force_fullscreen,
+      N_("Don't make fullscreen windows that are maximized and have no decorations"),
+      NULL
+    },
     {NULL}
   };
   GOptionContext *ctx;
@@ -584,6 +591,9 @@ main (int argc, char **argv)
   if (meta_args.composite || meta_args.no_composite)
     meta_prefs_set_compositing_manager (meta_args.composite);
 
+  if (meta_args.no_force_fullscreen)
+    meta_prefs_set_force_fullscreen (FALSE);
+
   if (!meta_display_open ())
     meta_exit (META_EXIT_ERROR);
   
diff --git a/src/core/prefs.c b/src/core/prefs.c
index 1f4fe41..6e41b3c 100644
--- a/src/core/prefs.c
+++ b/src/core/prefs.c
@@ -95,6 +95,7 @@ static char *cursor_theme = NULL;
 static int   cursor_size = 24;
 static gboolean compositing_manager = FALSE;
 static gboolean resize_with_right_button = FALSE;
+static gboolean force_fullscreen = TRUE;
 
 static MetaVisualBellType visual_bell_type = META_VISUAL_BELL_FULLSCREEN_FLASH;
 static MetaButtonLayout button_layout;
@@ -1751,6 +1752,9 @@ meta_preference_to_string (MetaPreference pref)
 
     case META_PREF_RESIZE_WITH_RIGHT_BUTTON:
       return "RESIZE_WITH_RIGHT_BUTTON";
+
+    case META_PREF_FORCE_FULLSCREEN:
+      return "FORCE_FULLSCREEN";
     }
 
   return "(unknown)";
@@ -2737,6 +2741,12 @@ meta_prefs_get_mouse_button_menu (void)
   return resize_with_right_button ? 2: 3;
 }
 
+gboolean
+meta_prefs_get_force_fullscreen (void)
+{
+  return force_fullscreen;
+}
+
 void
 meta_prefs_set_compositing_manager (gboolean whether)
 {
@@ -2797,3 +2807,10 @@ init_button_layout(void)
 };
 
 #endif
+
+void
+meta_prefs_set_force_fullscreen (gboolean whether)
+{
+  force_fullscreen = whether;
+}
+
diff --git a/src/include/prefs.h b/src/include/prefs.h
index 2f1ce8e..a4193ff 100644
--- a/src/include/prefs.h
+++ b/src/include/prefs.h
@@ -59,7 +59,8 @@ typedef enum
   META_PREF_CURSOR_THEME,
   META_PREF_CURSOR_SIZE,
   META_PREF_COMPOSITING_MANAGER,
-  META_PREF_RESIZE_WITH_RIGHT_BUTTON
+  META_PREF_RESIZE_WITH_RIGHT_BUTTON,
+  META_PREF_FORCE_FULLSCREEN
 } MetaPreference;
 
 typedef void (* MetaPrefsChangedFunc) (MetaPreference pref,
@@ -114,6 +115,7 @@ void        meta_prefs_change_workspace_name (int         i,
 const char* meta_prefs_get_cursor_theme      (void);
 int         meta_prefs_get_cursor_size       (void);
 gboolean    meta_prefs_get_compositing_manager (void);
+gboolean    meta_prefs_get_force_fullscreen  (void);
 
 /**
  * Sets whether the compositor is turned on.
@@ -122,6 +124,8 @@ gboolean    meta_prefs_get_compositing_manager (void);
  */
 void meta_prefs_set_compositing_manager (gboolean whether);
 
+void meta_prefs_set_force_fullscreen (gboolean whether);
+
 /* XXX FIXME This should be x-macroed, but isn't yet because it would be
  * difficult (or perhaps impossible) to add the suffixes using the current
  * system.  It needs some more thought, perhaps after the current system
-- 
1.5.6.3



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]