From: "Rodolfo García Peñas (kix)" <k...@kix.es> The code to restore the Clip is moved to a standalone function. The code is the same, and some variables are provided as arguments. --- src/workspace.c | 105 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 59 insertions(+), 46 deletions(-)
diff --git a/src/workspace.c b/src/workspace.c index dcbe6e8..e917a69 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -67,6 +67,8 @@ extern WShortKey wKeyBindings[WKBD_LAST]; static WMPropList *dWorkspaces = NULL; static WMPropList *dClip, *dName; +static void update_workspace_clip(WScreen *scr, int workspace, WMPropList *wks_state); + static void make_keys(void) { if (dWorkspaces != NULL) @@ -847,9 +849,9 @@ void wWorkspaceSaveState(WScreen * scr, WMPropList * old_state) void wWorkspaceRestoreState(WScreen *scr) { - WMPropList *parr, *pstr, *wks_state, *clip_state; + WMPropList *parr, *pstr, *wks_state; WMenu *menu = NULL; - int i, j; + int i; make_keys(); @@ -883,51 +885,8 @@ void wWorkspaceRestoreState(WScreen *scr) wfree(scr->workspaces[i]->name); scr->workspaces[i]->name = wstrdup(WMGetFromPLString(pstr)); - if (!wPreferences.flags.noclip) { - int added_omnipresent_icons = 0; - - clip_state = WMGetFromPLDictionary(wks_state, dClip); - if (scr->workspaces[i]->clip) - wDockDestroy(scr->workspaces[i]->clip); - - scr->workspaces[i]->clip = wDockRestoreState(scr, clip_state, WM_CLIP); - if (i > 0) - wDockHideIcons(scr->workspaces[i]->clip); - /* We set the global icons here, because scr->workspaces[i]->clip - * was not valid in wDockRestoreState(). - * There we only set icon->omnipresent to know which icons we - * need to set here. - */ - for (j = 0; j < scr->workspaces[i]->clip->max_icons; j++) { - WAppIcon *aicon = scr->workspaces[i]->clip->icon_array[j]; - int k; - - if (!aicon || !aicon->omnipresent) - continue; - aicon->omnipresent = 0; - if (wClipMakeIconOmnipresent(aicon, True) != WO_SUCCESS) - continue; - if (i == 0) - continue; - - /* Move this appicon from workspace i to workspace 0 */ - scr->workspaces[i]->clip->icon_array[j] = NULL; - scr->workspaces[i]->clip->icon_count--; - - added_omnipresent_icons++; - /* If there are too many omnipresent appicons, we are in trouble */ - assert(scr->workspaces[0]->clip->icon_count + added_omnipresent_icons - <= scr->workspaces[0]->clip->max_icons); - /* Find first free spot on workspace 0 */ - for (k = 0; k < scr->workspaces[0]->clip->max_icons; k++) - if (scr->workspaces[0]->clip->icon_array[k] == NULL) - break; - scr->workspaces[0]->clip->icon_array[k] = aicon; - aicon->dock = scr->workspaces[0]->clip; - } - scr->workspaces[0]->clip->icon_count += added_omnipresent_icons; - } + update_workspace_clip(scr, i, wks_state); WMPostNotificationName(WMNWorkspaceNameChanged, scr, (void *)(uintptr_t) i); } @@ -952,3 +911,57 @@ int wGetWorkspaceNumber(WScreen * scr, char * value) return w; } + +static void update_workspace_clip(WScreen *scr, int workspace, WMPropList *wks_state) +{ + WAppIcon *aicon; + WMPropList *clip_state; + int added_omnipresent_icons = 0, j, k; + + if (wPreferences.flags.noclip) + return; + + clip_state = WMGetFromPLDictionary(wks_state, dClip); + if (scr->workspaces[workspace]->clip) + wDockDestroy(scr->workspaces[workspace]->clip); + + scr->workspaces[workspace]->clip = wDockRestoreState(scr, clip_state, WM_CLIP); + if (workspace > 0) + wDockHideIcons(scr->workspaces[workspace]->clip); + + /* We set the global icons here, because scr->workspaces[i]->clip + * was not valid in wDockRestoreState(). + * There we only set icon->omnipresent to know which icons we + * need to set here. + */ + for (j = 0; j < scr->workspaces[workspace]->clip->max_icons; j++) { + aicon = scr->workspaces[workspace]->clip->icon_array[j]; + if (!aicon || !aicon->omnipresent) + continue; + + aicon->omnipresent = 0; + if (wClipMakeIconOmnipresent(aicon, True) != WO_SUCCESS) + continue; + + if (workspace == 0) + continue; + + /* Move this appicon from workspace i to workspace 0 */ + scr->workspaces[workspace]->clip->icon_array[j] = NULL; + scr->workspaces[workspace]->clip->icon_count--; + + added_omnipresent_icons++; + /* If there are too many omnipresent appicons, we are in trouble */ + assert(scr->workspaces[0]->clip->icon_count + added_omnipresent_icons + <= scr->workspaces[0]->clip->max_icons); + /* Find first free spot on workspace 0 */ + for (k = 0; k < scr->workspaces[0]->clip->max_icons; k++) + if (scr->workspaces[0]->clip->icon_array[k] == NULL) + break; + + scr->workspaces[0]->clip->icon_array[k] = aicon; + aicon->dock = scr->workspaces[0]->clip; + } + + scr->workspaces[0]->clip->icon_count += added_omnipresent_icons; +} -- 1.7.10.4 -- To unsubscribe, send mail to wmaker-dev-unsubscr...@lists.windowmaker.org.