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) \
