kwo pushed a commit to branch master. http://git.enlightenment.org/e16/e16.git/commit/?id=d511dd782cdf195f0ae8ccb95566db032ff44616
commit d511dd782cdf195f0ae8ccb95566db032ff44616 Author: Kim Woelders <[email protected]> Date: Mon May 4 11:21:04 2020 +0200 groups: Rework group configuration saving - No longer just store groups that are referenced by snaps Makes to logic somewhat simpler. - Only and always write group configuration when changed Previously we updated the group configuration way too often (on any snap change). --- src/groups.c | 80 +++++++++++++++++++++++++++++++++++++++--------------------- src/groups.h | 6 ++--- src/snaps.c | 9 ++++--- 3 files changed, 60 insertions(+), 35 deletions(-) diff --git a/src/groups.c b/src/groups.c index a731ae19..4e6c50b4 100644 --- a/src/groups.c +++ b/src/groups.c @@ -64,7 +64,8 @@ struct _group { EWin **members; int num_members; GroupConfig cfg; - char save; /* Used in snapshot - must save */ + char keep; /* Don't destroy when empty */ + char used; /* Don't discard when saving */ }; static LIST_HEAD(group_list); @@ -78,6 +79,8 @@ static struct { Group *current; } Mode_groups; +static void _GroupsSave(void); + int GroupsGetSwapmove(void) { @@ -85,7 +88,7 @@ GroupsGetSwapmove(void) } static Group * -_GroupCreate(int gid) +_GroupCreate(int gid, int cfg_update) { Group *g; @@ -116,11 +119,14 @@ _GroupCreate(int gid) Dprintf("%s: grp=%p gid=%d\n", __func__, g, g->index); + if (cfg_update) + _GroupsSave(); + return g; } static void -_GroupDestroy(Group * g) +_GroupDestroy(Group * g, int cfg_update) { if (!g) return; @@ -134,6 +140,9 @@ _GroupDestroy(Group * g) Efree(g->members); Efree(g); + + if (cfg_update) + _GroupsSave(); } static int @@ -156,14 +165,13 @@ GroupGetMembers(const Group * g, int *num) } int -GroupRemember(Group * g) +GroupGetIndex(const Group * g) { - g->save = 1; return g->index; } void -GroupRememberByGid(int gid) +GroupSetUsed(int gid) { Group *g; @@ -171,7 +179,7 @@ GroupRememberByGid(int gid) if (!g) return; - g->save = 1; + g->used = 1; } int @@ -310,10 +318,10 @@ _GroupEwinRemove(Group * g, EWin * ewin, int snap_update) if (g->num_members > 0) g->members = EREALLOC(EWin *, g->members, g->num_members); - else if (g->save) + else if (g->keep) EFREE_NULL(g->members); else - _GroupDestroy(g); + _GroupDestroy(g, snap_update); /* and remove the group from the groups that the window is in */ ewin->num_groups--; @@ -327,8 +335,6 @@ _GroupEwinRemove(Group * g, EWin * ewin, int snap_update) if (snap_update) SnapshotEwinUpdate(ewin, SNAP_USE_GROUPS); - - GroupsSave(); } static void @@ -341,13 +347,13 @@ _GroupDelete(Group * g) Dprintf("%s: gid=%d\n", __func__, g->index); - g->save = 1; + g->keep = 1; while (g->num_members > 0) { ewin = g->members[0]; _GroupEwinRemove(g, ewin, 1); } - _GroupDestroy(g); + _GroupDestroy(g, 1); } Group ** @@ -432,7 +438,7 @@ GroupsEwinAdd(EWin * ewin, const int *pgid, int ngid) if (!g) { /* This should not happen, but may if group/snap configs are corrupted */ - g = _GroupCreate(gid); + g = _GroupCreate(gid, 1); } _GroupEwinAdd(g, ewin, 0); } @@ -559,16 +565,13 @@ _EwinGroupsShowHide(EWin * ewin, int group_index, char onoff) #endif /* USE_GROUP_SHOWHIDE */ -void -GroupsSave(void) +static void +_GroupsSave(void) { Group *g; FILE *f; char s[1024]; - if (LIST_IS_EMPTY(&group_list)) - return; - Dprintf("%s\n", __func__); Esnprintf(s, sizeof(s), "%s.groups", EGetSavePrefix()); @@ -578,9 +581,6 @@ GroupsSave(void) LIST_FOR_EACH(Group, &group_list, g) { - if (!g->save) - continue; - fprintf(f, "NEW: %i\n", g->index); fprintf(f, "ICONIFY: %i\n", g->cfg.iconify); fprintf(f, "KILL: %i\n", g->cfg.kill); @@ -594,6 +594,30 @@ GroupsSave(void) fclose(f); } +void +GroupsPrune(void) +{ + Group *g, *tmp; + int pruned; + + pruned = 0; + + LIST_FOR_EACH_SAFE(Group, &group_list, g, tmp) + { + if (g->used) + continue; + if (g->members) + continue; + _GroupDestroy(g, 0); + pruned += 1; + } + + Dprintf("%s: Pruned=%d\n", __func__, pruned); + + if (pruned) + _GroupsSave(); +} + static int _GroupsLoad(FILE * fs) { @@ -612,7 +636,7 @@ _GroupsLoad(FILE * fs) if (!strcmp(ss, "NEW:")) { - g = _GroupCreate(ii); + g = _GroupCreate(ii, 0); continue; } if (!g) @@ -701,8 +725,6 @@ _DlgApplyGroupChoose(Dialog * d, int val __UNUSED__, void *data __UNUSED__) default: break; } - - GroupsSave(); } static void @@ -870,7 +892,7 @@ _DlgApplyGroups(Dialog * d, int val __UNUSED__, void *data __UNUSED__) ewin->groups[i]->cfg = dd->cfgs[i]; } - autosave(); + _GroupsSave(); } static void @@ -1215,7 +1237,7 @@ IPC_GroupOps(const char *params) if (!strcmp(operation, "start")) { - group = _GroupCreate(-1); + group = _GroupCreate(-1, 1); Mode_groups.current = group; _GroupEwinAdd(group, ewin, 1); IpcPrintf("start %8x\n", win); @@ -1248,7 +1270,6 @@ IPC_GroupOps(const char *params) IpcPrintf("Error: no such operation: %s\n", operation); return; } - GroupsSave(); } static void @@ -1375,6 +1396,9 @@ IPC_Group(const char *params) IpcPrintf("%s: on\n", operation); else if (onoff == 0) IpcPrintf("%s: off\n", operation); + + if (onoff >= 0) + _GroupsSave(); } static void diff --git a/src/groups.h b/src/groups.h index 6d7c35b0..d17c53ea 100644 --- a/src/groups.h +++ b/src/groups.h @@ -42,14 +42,14 @@ EWin **ListWinGroupMembersForEwin(const EWin * ewin, int action, /* groups.c */ int GroupMatchAction(const Group * g, int action); -int GroupRemember(Group * g); -void GroupRememberByGid(int gid); +int GroupGetIndex(const Group * g); +void GroupSetUsed(int gid); EWin *const *GroupGetMembers(const Group * g, int *num); Group *EwinsInGroup(const EWin * ewin1, const EWin * ewin2); void GroupsEwinAdd(EWin * ewin, const int *pgid, int ngid); void GroupsEwinRemove(EWin * ewin); void GroupsLoad(void); -void GroupsSave(void); +void GroupsPrune(void); Group **GroupsGetList(int *pnum); int GroupsGetSwapmove(void); diff --git a/src/snaps.c b/src/snaps.c index 2b434775..42b5e4de 100644 --- a/src/snaps.c +++ b/src/snaps.c @@ -418,7 +418,7 @@ _SnapUpdateEwinGroups(Snapshot * sn, const EWin * ewin, char onoff) EFREE_SET(sn->groups, EMALLOC(int, ewin2->num_groups)); for (j = 0; j < ewin2->num_groups; j++) - sn->groups[j] = GroupRemember(ewin2->groups[j]); + sn->groups[j] = GroupGetIndex(ewin2->groups[j]); } else { @@ -1155,8 +1155,6 @@ SnapshotsSaveReal(void) if (!isfile(buf)) Alert(_("Error saving snaps file")); - GroupsSave(); - done: TIMER_DEL(ss_timer); } @@ -1359,7 +1357,7 @@ _SnapshotsLoad(FILE * fs) sn->num_groups++; sn->groups = EREALLOC(int, sn->groups, sn->num_groups); sn->groups[sn->num_groups - 1] = a; - GroupRememberByGid(a); + GroupSetUsed(a); } } #if USE_COMPOSITE @@ -1396,6 +1394,9 @@ SnapshotsLoad(void) Esnprintf(s, sizeof(s), "%s.snapshots", EGetSavePrefix()); ConfigFileLoad(s, NULL, _SnapshotsLoad, 0); + + /* Remove groups not referenced by snapshots */ + GroupsPrune(); } /* make a client window conform to snapshot info */ --
