From f1fef40f0d59a854ca759e3cb7d3e6b99ac8f648 Mon Sep 17 00:00:00 2001 From: David Maciejak Date: Tue, 21 Feb 2023 21:40:59 +0800 Subject: [PATCH] Make window maximize state persistent Window maximize state is not persistent between windowmaker sessions. This patch is updating the save and restore workspace state functions to update the state in the WMSTATE file. --- src/session.c | 15 +++++++++++++-- src/window.c | 5 ++++- src/window.h | 2 +- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/session.c b/src/session.c index 0bcec147..2c55fa2a 100644 --- a/src/session.c +++ b/src/session.c @@ -93,6 +93,7 @@ static WMPropList *sHost; static WMPropList *sWorkspace; static WMPropList *sShaded; static WMPropList *sMiniaturized; +static WMPropList *sMaximized; static WMPropList *sHidden; static WMPropList *sGeometry; static WMPropList *sShortcutMask; @@ -112,6 +113,7 @@ static void make_keys(void) sWorkspace = WMCreatePLString("Workspace"); sShaded = WMCreatePLString("Shaded"); sMiniaturized = WMCreatePLString("Miniaturized"); + sMaximized = WMCreatePLString("Maximized"); sHidden = WMCreatePLString("Hidden"); sGeometry = WMCreatePLString("Geometry"); sDock = WMCreatePLString("Dock"); @@ -174,7 +176,7 @@ static WMPropList *makeWindowState(WWindow * wwin, WApplication * wapp) unsigned mask; char *class, *instance, *command = NULL, buffer[512]; WMPropList *win_state, *cmd, *name, *workspace; - WMPropList *shaded, *miniaturized, *hidden, *geometry; + WMPropList *shaded, *miniaturized, *maximized, *hidden, *geometry; WMPropList *dock, *shortcut; if (wwin->orig_main_window != None && wwin->orig_main_window != wwin->client_win) @@ -207,6 +209,8 @@ static WMPropList *makeWindowState(WWindow * wwin, WApplication * wapp) shaded = wwin->flags.shaded ? sYes : sNo; miniaturized = wwin->flags.miniaturized ? sYes : sNo; + snprintf(buffer, sizeof(buffer), "%i", wwin->flags.maximized); + maximized = WMCreatePLString(buffer); hidden = wwin->flags.hidden ? sYes : sNo; snprintf(buffer, sizeof(buffer), "%ix%i+%i+%i", wwin->client.width, wwin->client.height, wwin->frame_x, wwin->frame_y); @@ -226,6 +230,7 @@ static WMPropList *makeWindowState(WWindow * wwin, WApplication * wapp) sWorkspace, workspace, sShaded, shaded, sMiniaturized, miniaturized, + sMaximized, maximized, sHidden, hidden, sShortcutMask, shortcut, sGeometry, geometry, NULL); @@ -380,7 +385,7 @@ static WSavedState *getWindowState(WScreen * scr, WMPropList * win_state) WSavedState *state = wmalloc(sizeof(WSavedState)); WMPropList *value; char *tmp; - unsigned mask; + unsigned mask, maxf; int i; state->workspace = -1; @@ -408,6 +413,12 @@ static WSavedState *getWindowState(WScreen * scr, WMPropList * win_state) if (value != NULL) state->miniaturized = getBool(value); + value = WMGetFromPLDictionary(win_state, sMaximized); + if (value != NULL) { + maxf = getInt(value); + state->maximized = maxf; + } + value = WMGetFromPLDictionary(win_state, sHidden); if (value != NULL) state->hidden = getBool(value); diff --git a/src/window.c b/src/window.c index ef85f3d4..0d12cd5b 100644 --- a/src/window.c +++ b/src/window.c @@ -919,6 +919,9 @@ WWindow *wManageWindow(WScreen *scr, Window window) if (win_state->state->miniaturized > 0 && !WFLAGP(wwin, no_miniaturizable)) wwin->flags.miniaturized = win_state->state->miniaturized; + if (win_state->state->maximized > 0) + wwin->flags.maximized = win_state->state->maximized; + if (!IS_OMNIPRESENT(wwin)) { int w = wDefaultGetStartWorkspace(scr, wwin->wm_instance, wwin->wm_class); @@ -2694,7 +2697,7 @@ void wWindowUpdateGNUstepAttr(WWindow * wwin, GNUstepWMAttributes * attr) } WMagicNumber wWindowAddSavedState(const char *instance, const char *class, - const char *command, pid_t pid, WSavedState * state) + const char *command, pid_t pid, WSavedState *state) { WWindowState *wstate; diff --git a/src/window.h b/src/window.h index a19101fb..7a916497 100644 --- a/src/window.h +++ b/src/window.h @@ -309,9 +309,9 @@ typedef struct WWindow { typedef struct WSavedState { int workspace; int miniaturized; + int maximized; int shaded; int hidden; - int maximized; int x; /* original geometry of the */ int y; /* window if it's maximized */ unsigned int w;