I noticed that if a maximised application is fullscreened (e.g. use F11
in firefox), fvwm forgets that it was maximised when fullscreen mode is exited.

The below patch fixes this for me.

-Graham

Index: ChangeLog
===================================================================
RCS file: /home/cvs/fvwm/fvwm/ChangeLog,v
retrieving revision 1.3136
diff -u -r1.3136 ChangeLog
--- ChangeLog   19 Dec 2010 22:16:23 -0000      1.3136
+++ ChangeLog   12 Jan 2011 02:27:00 -0000
@@ -1,3 +1,16 @@
+2011-01-12  Graham Gower <[email protected]>
+       * fvwm/fvwm.h:
+       * fvwm/window_flags.h:
+       Add window flag 'was_maximized' to track maximized state when
+       toggling fullscreen.
+
+       * fvwm/ewmh.h:
+       * fvwm/ewmh.c (EWMH_fullscreen):
+       (EWMH_unfullscreen):
+       * fvwm/ewmh_events.c (ewmh_WMStateFullScreen):
+       Save maximization state prior to entering fullscreen and restore it
+       when exiting fullscreen.
+
 2010-12-19  Thomas Adam  <[email protected]>
        * fvwm/builtins.c (CMD_CursorMove):
        Honour EdgeScroll settings to not flip pages when EdgeScroll is
Index: fvwm/ewmh.c
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/ewmh.c,v
retrieving revision 1.79
diff -u -r1.79 ewmh.c
--- fvwm/ewmh.c 28 Aug 2009 11:24:28 -0000      1.79
+++ fvwm/ewmh.c 12 Jan 2011 02:27:01 -0000
@@ -1970,6 +1970,14 @@
        }
        if (cmd[0] != 0)
        {
+               if (IS_MAXIMIZED(fw))
+               {
+                       SET_WAS_MAXIMIZED(fw, True);
+               }
+               else
+               {
+                       SET_WAS_MAXIMIZED(fw, False);
+               }
                SET_DISABLE_CONSTRAIN_SIZE_FULLSCREEN(fw, 1);
                execute_function_override_window(NULL, NULL, cmd, 0, fw);
                SET_DISABLE_CONSTRAIN_SIZE_FULLSCREEN(fw, 0);
@@ -1977,3 +1985,22 @@
 
        return;
 }
+
+void EWMH_unfullscreen(FvwmWindow *fw)
+{
+       SET_EWMH_FULLSCREEN(fw, False);
+       apply_decor_change(fw);
+
+       if (WAS_MAXIMIZED(fw))
+       {
+               execute_function_override_window(
+                               NULL, NULL, "Maximize on", 0, fw);
+       }
+       else
+       {
+               execute_function_override_window(
+                               NULL, NULL, "Maximize off", 0, fw);
+       }
+
+       return;
+}
Index: fvwm/ewmh.h
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/ewmh.h,v
retrieving revision 1.30
diff -u -r1.30 ewmh.h
--- fvwm/ewmh.h 13 Jan 2007 15:07:14 -0000      1.30
+++ fvwm/ewmh.h 12 Jan 2011 02:27:01 -0000
@@ -76,5 +76,6 @@
        FvwmWindow *fw, XEvent *ev, window_style *style, unsigned long any);
 void EWMH_SetDesktopNames(void);
 void EWMH_fullscreen(FvwmWindow *fw);
+void EWMH_unfullscreen(FvwmWindow *fw);
 
 #endif /* _EWMH_ */
Index: fvwm/ewmh_events.c
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/ewmh_events.c,v
retrieving revision 1.64
diff -u -r1.64 ewmh_events.c
--- fvwm/ewmh_events.c  30 Dec 2008 13:32:40 -0000      1.64
+++ fvwm/ewmh_events.c  12 Jan 2011 02:27:01 -0000
@@ -612,10 +612,7 @@
                                SET_HAS_EWMH_INIT_FULLSCREEN_STATE(
                                        fw, EWMH_STATE_NO_HINT);
                        }
-                       /* unmaximize will restore is_ewmh_fullscreen,
-                        * layer and apply_decor_change */
-                       execute_function_override_window(
-                               NULL, NULL, "Maximize off", 0, fw);
+                       EWMH_unfullscreen(fw);
                }
                if ((IS_EWMH_FULLSCREEN(fw) &&
                     !DO_EWMH_USE_STACKING_HINTS(fw)) ||
Index: fvwm/fvwm.h
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/fvwm.h,v
retrieving revision 1.261
diff -u -r1.261 fvwm.h
--- fvwm/fvwm.h 2 Aug 2009 15:04:08 -0000       1.261
+++ fvwm/fvwm.h 12 Jan 2011 02:27:01 -0000
@@ -335,6 +335,8 @@
        unsigned is_map_pending : 1;
        /* is the window maximized? */
        unsigned is_maximized : 1;
+       /* was the window maximized before fullscreen? */
+       unsigned was_maximized: 1;
        /* Set if the client changes its WM_NAME. The source of twm contains
         * an explanation why we need this information. */
        unsigned is_name_changed : 1;
Index: fvwm/window_flags.h
===================================================================
RCS file: /home/cvs/fvwm/fvwm/fvwm/window_flags.h,v
retrieving revision 1.89
diff -u -r1.89 window_flags.h
--- fvwm/window_flags.h 21 Dec 2006 16:38:58 -0000      1.89
+++ fvwm/window_flags.h 12 Jan 2011 02:27:01 -0000
@@ -440,6 +440,10 @@
        (fw)->flags.is_maximized = !!(x)
 #define SETM_MAXIMIZED(fw,x) \
        (fw)->flag_mask.is_maximized = !!(x)
+#define WAS_MAXIMIZED(fw) \
+       ((fw)->flags.was_maximized)
+#define SET_WAS_MAXIMIZED(fw,x) \
+       (fw)->flags.was_maximized = !!(x)
 #define IS_NAME_CHANGED(fw) \
        ((fw)->flags.is_name_changed)
 #define SET_NAME_CHANGED(fw,x) \

Reply via email to