From: "Rodolfo García Peñas (kix)" <[email protected]>

The variable workspace_count, that contains the number of workspaces
is moved to the global workspace properties.

Now the screen is not needed to know the workspace_count.
---
 src/appicon.c    |    7 +++---
 src/dock.c       |   17 +++++++-------
 src/event.c      |    9 ++++----
 src/moveres.c    |   19 ++++++++-------
 src/screen.h     |    2 --
 src/session.c    |   13 ++++++-----
 src/startup.c    |    3 ++-
 src/window.c     |   21 +++++++++--------
 src/winmenu.c    |    4 ++--
 src/winspector.c |    9 ++++----
 src/wmspec.c     |   19 +++++++--------
 src/workspace.c  |   68 +++++++++++++++++++++++++++---------------------------
 src/workspace.h  |    1 +
 13 files changed, 101 insertions(+), 91 deletions(-)

diff --git a/src/appicon.c b/src/appicon.c
index a6b8609..26457f2 100644
--- a/src/appicon.c
+++ b/src/appicon.c
@@ -64,6 +64,7 @@
 extern Cursor wCursor[WCUR_LAST];
 extern WDDomain *WDWindowAttributes;
 extern XContext wWinContext;
+extern wks_info wks_nfo;
 
 #define MOD_MASK       wPreferences.modifier_mask
 #define ICON_SIZE      wPreferences.icon_size
@@ -866,7 +867,7 @@ Bool wHandleAppIconMove(WAppIcon *aicon, XEvent *event)
 
                        if (omnipresent && !showed_all_clips) {
                                int i;
-                               for (i = 0; i < scr->workspace_count; i++) {
+                               for (i = 0; i < wks_nfo.workspace_count; i++) {
                                        if (i == scr->current_workspace)
                                                continue;
                                        
wDockShowIcons(scr->workspaces[i]->clip);
@@ -1071,7 +1072,7 @@ Bool wHandleAppIconMove(WAppIcon *aicon, XEvent *event)
                        }
                        if (showed_all_clips) {
                                int i;
-                               for (i = 0; i < scr->workspace_count; i++) {
+                               for (i = 0; i < wks_nfo.workspace_count; i++) {
                                        if (i == scr->current_workspace)
                                                continue;
                                        
wDockHideIcons(scr->workspaces[i]->clip);
@@ -1153,7 +1154,7 @@ static void create_appicon_from_dock(WWindow *wwin, 
WApplication *wapp, Window m
        /* check clips */
        if (!wapp->app_icon) {
                int i;
-               for (i = 0; i < scr->workspace_count; i++) {
+               for (i = 0; i < wks_nfo.workspace_count; i++) {
                        WDock *dock = scr->workspaces[i]->clip;
                        if (dock)
                                wapp->app_icon = findDockIconFor(dock, 
main_window);
diff --git a/src/dock.c b/src/dock.c
index 69bebde..60c8910 100644
--- a/src/dock.c
+++ b/src/dock.c
@@ -68,6 +68,7 @@
 /**** Global variables ****/
 extern Cursor wCursor[WCUR_LAST];
 extern XContext wWinContext;
+extern wks_info wks_nfo;
 
 #define MOD_MASK wPreferences.modifier_mask
 #define ICON_SIZE wPreferences.icon_size
@@ -598,7 +599,7 @@ static void toggleAutoAttractCallback(WMenu *menu, 
WMenuEntry *entry)
        } else if (dock->type == WM_DRAWER) {
                /* check if at least one clip already auto attracts icons */
                int i, ask_for_confirmation = False;
-               for (i = 0; i < scr->workspace_count; i++) {
+               for (i = 0; i < wks_nfo.workspace_count; i++) {
                        if (scr->workspaces[ i ]->clip->attract_icons) {
                                ask_for_confirmation = True;
                                break;
@@ -624,10 +625,10 @@ static void toggleAutoAttractCallback(WMenu *menu, 
WMenuEntry *entry)
                        /* The newly auto-attracting dock is a drawer: disable 
any clip and 
                         * previously attracting drawer */
                        int i;
-                       for (i = 0; i < scr->workspace_count; i++) {
+                       for (i = 0; i < wks_nfo.workspace_count; i++)
                                scr->workspaces[ i ]->clip->attract_icons = 
False;
                                /* dock menu will be updated later, when opened 
*/
-                       }
+
                        if (scr->attracting_drawer != NULL)
                                scr->attracting_drawer->attract_icons = False;
                        scr->attracting_drawer = dock;
@@ -945,7 +946,7 @@ static void updateWorkspaceMenu(WMenu *menu, WAppIcon *icon)
        if (!menu || !icon)
                return;
 
-       for (i = 0; i < scr->workspace_count; i++) {
+       for (i = 0; i < wks_nfo.workspace_count; i++) {
                if (i < menu->entry_no) {
                        if (strcmp(menu->entries[i]->text, 
scr->workspaces[i]->name) != 0) {
                                wfree(menu->entries[i]->text);
@@ -2580,7 +2581,7 @@ Bool wDockSnapIcon(WDock *dock, WAppIcon *icon, int 
req_x, int req_y, int *ret_x
                int start, stop, k;
 
                start = icon->omnipresent ? 0 : scr->current_workspace;
-               stop = icon->omnipresent ? scr->workspace_count : start + 1;
+               stop = icon->omnipresent ? wks_nfo.workspace_count : start + 1;
 
                aicon = NULL;
                for (k = start; k < stop; k++) {
@@ -3899,7 +3900,7 @@ static void handleClipChangeWorkspace(WScreen *scr, 
XEvent *event)
        new_ws = wPreferences.ws_advance || (event->xbutton.state & 
ControlMask);
 
        if (direction == CLIP_FORWARD) {
-               if (scr->current_workspace < scr->workspace_count - 1)
+               if (scr->current_workspace < wks_nfo.workspace_count - 1)
                        wWorkspaceChange(scr, scr->current_workspace + 1);
                else if (new_ws && scr->current_workspace < MAX_WORKSPACES - 1)
                        wWorkspaceChange(scr, scr->current_workspace + 1);
@@ -3909,7 +3910,7 @@ static void handleClipChangeWorkspace(WScreen *scr, 
XEvent *event)
                if (scr->current_workspace > 0)
                        wWorkspaceChange(scr, scr->current_workspace - 1);
                else if (scr->current_workspace == 0 && wPreferences.ws_cycle)
-                       wWorkspaceChange(scr, scr->workspace_count - 1);
+                       wWorkspaceChange(scr, wks_nfo.workspace_count - 1);
        }
 
        wClipIconPaint(scr->clip_icon);
@@ -4152,7 +4153,7 @@ static Bool iconCanBeOmnipresent(WAppIcon *aicon)
        WAppIcon *btn;
        int i, j;
 
-       for (i = 0; i < scr->workspace_count; i++) {
+       for (i = 0; i < wks_nfo.workspace_count; i++) {
                clip = scr->workspaces[i]->clip;
 
                if (clip == aicon->dock)
diff --git a/src/event.c b/src/event.c
index 95b437b..481dc55 100644
--- a/src/event.c
+++ b/src/event.c
@@ -84,6 +84,7 @@ extern Cursor wCursor[WCUR_LAST];
 
 extern WShortKey wKeyBindings[WKBD_LAST];
 extern int wScreenCount;
+extern wks_info wks_nfo;
 extern Time LastTimestamp;
 extern Time LastFocusChange;
 
@@ -1585,7 +1586,7 @@ static void handleKeyPress(XEvent * event)
        case WKBD_WORKSPACE1 ... WKBD_WORKSPACE10:
                widx = command - WKBD_WORKSPACE1;
                i = (scr->current_workspace / 10) * 10 + widx;
-               if (wPreferences.ws_advance || i < scr->workspace_count)
+               if (wPreferences.ws_advance || i < wks_nfo.workspace_count)
                        wWorkspaceChange(scr, i);
                break;
 
@@ -1602,7 +1603,7 @@ static void handleKeyPress(XEvent * event)
        case WKBD_MOVE_WORKSPACE1 ... WKBD_MOVE_WORKSPACE10:
                widx = command - WKBD_MOVE_WORKSPACE1;
                i = (scr->current_workspace / 10) * 10 + widx;
-               if (wwin && (wPreferences.ws_advance || i < 
scr->workspace_count))
+               if (wwin && (wPreferences.ws_advance || i < 
wks_nfo.workspace_count))
                        wWindowChangeWorkspace(wwin, i);
                break;
 
@@ -1629,7 +1630,7 @@ static void handleKeyPress(XEvent * event)
                                column = scr->current_workspace % 10;
 
                                if (command == WKBD_MOVE_NEXTWSLAYER) {
-                                       if ((row + 1) * 10 < 
scr->workspace_count)
+                                       if ((row + 1) * 10 < 
wks_nfo.workspace_count)
                                                wWindowChangeWorkspace(wwin, 
column + (row + 1) * 10);
                                } else {
                                        if (row > 0)
@@ -1749,7 +1750,7 @@ static void handleKeyPress(XEvent * event)
                        column = scr->current_workspace % 10;
 
                        if (command == WKBD_NEXTWSLAYER) {
-                               if ((row + 1) * 10 < scr->workspace_count)
+                               if ((row + 1) * 10 < wks_nfo.workspace_count)
                                        wWorkspaceChange(scr, column + (row + 
1) * 10);
                        } else {
                                if (row > 0)
diff --git a/src/moveres.c b/src/moveres.c
index 26b8cf9..b0026b5 100644
--- a/src/moveres.c
+++ b/src/moveres.c
@@ -62,6 +62,7 @@
 
 /****** Global Variables ******/
 extern Cursor wCursor[WCUR_LAST];
+extern wks_info wks_nfo;
 
 /*
  *----------------------------------------------------------------------
@@ -847,15 +848,15 @@ static Bool checkWorkspaceChange(WWindow * wwin, MoveData 
* data, Bool opaqueMov
 
                } else if (scr->current_workspace == 0 && 
wPreferences.ws_cycle) {
 
-                       crossWorkspace(scr, wwin, opaqueMove, 
scr->workspace_count - 1, True);
+                       crossWorkspace(scr, wwin, opaqueMove, 
wks_nfo.workspace_count - 1, True);
                        changed = True;
                        data->rubCount = 0;
                }
        } else if (data->mouseX >= scr->scr_width - 2) {
 
-               if (scr->current_workspace == scr->workspace_count - 1) {
+               if (scr->current_workspace == wks_nfo.workspace_count - 1) {
 
-                       if (wPreferences.ws_cycle || scr->workspace_count == 
MAX_WORKSPACES) {
+                       if (wPreferences.ws_cycle || wks_nfo.workspace_count == 
MAX_WORKSPACES) {
 
                                crossWorkspace(scr, wwin, opaqueMove, 0, False);
                                changed = True;
@@ -884,7 +885,7 @@ static Bool checkWorkspaceChange(WWindow * wwin, MoveData * 
data, Bool opaqueMov
                                changed = True;
                                data->rubCount = 0;
                        }
-               } else if (scr->current_workspace < scr->workspace_count) {
+               } else if (scr->current_workspace < wks_nfo.workspace_count) {
 
                        /* go to next workspace */
                        crossWorkspace(scr, wwin, opaqueMove, 
scr->current_workspace + 1, False);
@@ -1397,15 +1398,17 @@ int wKeyboardMoveResizeWindow(WWindow * wwin)
                                if (wPreferences.ws_cycle) {
                                        if (src_x + off_x + ww < 20) {
                                                if (!scr->current_workspace) {
-                                                       wWorkspaceChange(scr, 
scr->workspace_count - 1);
-                                               } else
+                                                       wWorkspaceChange(scr, 
wks_nfo.workspace_count - 1);
+                                               } else {
                                                        wWorkspaceChange(scr, 
scr->current_workspace - 1);
+                                               }
                                                off_x += scr_width;
                                        } else if (src_x + off_x + 20 > 
scr_width) {
-                                               if (scr->current_workspace == 
scr->workspace_count - 1) {
+                                               if (scr->current_workspace == 
wks_nfo.workspace_count - 1) {
                                                        wWorkspaceChange(scr, 
0);
-                                               } else
+                                               } else {
                                                        wWorkspaceChange(scr, 
scr->current_workspace + 1);
+                                               }
                                                off_x -= scr_width;
                                        }
                                } else {
diff --git a/src/screen.h b/src/screen.h
index 02694ec..4ac9a96 100644
--- a/src/screen.h
+++ b/src/screen.h
@@ -121,8 +121,6 @@ typedef struct _WScreen {
 
     int window_count;                 /* number of windows in window_list */
 
-    int workspace_count;              /* number of workspaces */
-
     struct WWorkspace **workspaces;    /* workspace array */
 
     int current_workspace;            /* current workspace number */
diff --git a/src/session.c b/src/session.c
index c4ba5af..131339f 100644
--- a/src/session.c
+++ b/src/session.c
@@ -90,6 +90,7 @@
 extern Atom _XA_WM_SAVE_YOURSELF;
 
 extern Time LastTimestamp;
+extern wks_info wks_nfo;
 
 static WMPropList *sApplications = NULL;
 static WMPropList *sCommand;
@@ -243,10 +244,10 @@ static WMPropList *makeWindowState(WWindow * wwin, 
WApplication * wapp)
                        }
                        if (name == NULL) // Try the clips
                        {
-                               for (i = 0; i < scr->workspace_count; i++)
+                               for (i = 0; i < wks_nfo.workspace_count; i++)
                                        if (scr->workspaces[i]->clip == 
wapp->app_icon->dock)
                                                break;
-                               if (i < scr->workspace_count)
+                               if (i < wks_nfo.workspace_count)
                                        name = scr->workspaces[i]->name;
                        }
                        if (name == NULL) // Try the drawers
@@ -389,7 +390,7 @@ static WSavedState *getWindowState(WScreen * scr, 
WMPropList * win_state)
                tmp = WMGetFromPLString(value);
                if (sscanf(tmp, "%i", &state->workspace) != 1) {
                        state->workspace = -1;
-                       for (i = 0; i < scr->workspace_count; i++) {
+                       for (i = 0; i < wks_nfo.workspace_count; i++) {
                                if (strcmp(scr->workspaces[i]->name, tmp) == 0) 
{
                                        state->workspace = i;
                                        break;
@@ -478,7 +479,7 @@ void wSessionRestoreState(WScreen *scr)
                                }
                                if (dock == NULL) // Try the clips
                                {
-                                       for (j = 0; j < scr->workspace_count; 
j++) {
+                                       for (j = 0; j < 
wks_nfo.workspace_count; j++) {
                                                if 
(strcmp(scr->workspaces[j]->name, tmp) == 0) {
                                                        dock = 
scr->workspaces[j]->clip;
                                                        break;
@@ -500,7 +501,7 @@ void wSessionRestoreState(WScreen *scr)
                        } else {
                                if (n == 0) {
                                        dock = scr->dock;
-                               } else if (n > 0 && n <= scr->workspace_count) {
+                               } else if (n > 0 && n <= 
wks_nfo.workspace_count) {
                                        dock = scr->workspaces[n - 1]->clip;
                                }
                        }
@@ -563,6 +564,6 @@ void wSessionRestoreLastWorkspace(WScreen * scr)
        /* Get the workspace number for the workspace name */
        w = wGetWorkspaceNumber(scr, value);
 
-       if (w != scr->current_workspace && w < scr->workspace_count)
+       if (w != scr->current_workspace && w < wks_nfo.workspace_count)
                wWorkspaceChange(scr, w);
 }
diff --git a/src/startup.c b/src/startup.c
index c39ecaf..1158eee 100644
--- a/src/startup.c
+++ b/src/startup.c
@@ -90,6 +90,7 @@ extern WDDomain *WDRootMenu;
 extern WDDomain *WDWindowAttributes;
 extern WShortKey wKeyBindings[WKBD_LAST];
 extern int wScreenCount;
+extern wks_info wks_nfo;
 
 #ifdef SHAPE
 extern Bool wShapeSupported;
@@ -752,7 +753,7 @@ void StartUp(Bool defaultScreenOnly)
                        /* auto-launch apps in clip */
                        if (!wPreferences.flags.noclip) {
                                int i;
-                               for (i = 0; i < wScreen[j]->workspace_count; 
i++) {
+                               for (i = 0; i < wks_nfo.workspace_count; i++) {
                                        if (wScreen[j]->workspaces[i]->clip) {
                                                wScreen[j]->last_dock = 
wScreen[j]->workspaces[i]->clip;
                                                
wDockDoAutoLaunch(wScreen[j]->workspaces[i]->clip, i);
diff --git a/src/window.c b/src/window.c
index a5de8a9..443182d 100644
--- a/src/window.c
+++ b/src/window.c
@@ -74,6 +74,7 @@
 
 /****** Global Variables ******/
 extern WShortKey wKeyBindings[WKBD_LAST];
+extern wks_info wks_nfo;
 
 #ifdef SHAPE
 extern Bool wShapeSupported;
@@ -388,7 +389,7 @@ void wWindowSetupInitialAttributes(WWindow *wwin, int 
*level, int *workspace)
                }
 
                if (tmp_workspace >= 0)
-                       *workspace = tmp_workspace % scr->workspace_count;
+                       *workspace = tmp_workspace % wks_nfo.workspace_count;
        }
 
        /*
@@ -851,9 +852,9 @@ WWindow *wManageWindow(WScreen *scr, Window window)
                if (!IS_OMNIPRESENT(wwin)) {
                        int w = wDefaultGetStartWorkspace(scr, 
wwin->wm_instance,
                                                          wwin->wm_class);
-                       if (w < 0 || w >= scr->workspace_count) {
+                       if (w < 0 || w >= wks_nfo.workspace_count) {
                                workspace = win_state->state->workspace;
-                               if (workspace >= scr->workspace_count)
+                               if (workspace >= wks_nfo.workspace_count)
                                        workspace = scr->current_workspace;
                        } else {
                                workspace = w;
@@ -922,14 +923,14 @@ WWindow *wManageWindow(WScreen *scr, Window window)
 
        /* set workspace on which the window starts */
        if (workspace >= 0) {
-               if (workspace > scr->workspace_count - 1)
-                       workspace = workspace % scr->workspace_count;
+               if (workspace > wks_nfo.workspace_count - 1)
+                       workspace = workspace % wks_nfo.workspace_count;
        } else {
                int w;
 
                w = wDefaultGetStartWorkspace(scr, wwin->wm_instance, 
wwin->wm_class);
 
-               if (w >= 0 && w < scr->workspace_count && 
!(IS_OMNIPRESENT(wwin))) {
+               if (w >= 0 && w < wks_nfo.workspace_count && 
!(IS_OMNIPRESENT(wwin))) {
                        workspace = w;
                } else {
                        if (wPreferences.open_transients_with_parent && 
transientOwner)
@@ -1876,7 +1877,7 @@ void wWindowChangeWorkspace(WWindow *wwin, int workspace)
        WApplication *wapp;
        int unmap = 0;
 
-       if (workspace >= scr->workspace_count || workspace < 0 || workspace == 
wwin->frame->workspace)
+       if (workspace >= wks_nfo.workspace_count || workspace < 0 || workspace 
== wwin->frame->workspace)
                return;
 
        if (workspace != scr->current_workspace) {
@@ -1929,17 +1930,17 @@ void wWindowChangeWorkspaceRelative(WWindow *wwin, int 
amount)
                if (w >= 0) {
                        wWindowChangeWorkspace(wwin, w);
                } else if (wPreferences.ws_cycle) {
-                       wWindowChangeWorkspace(wwin, scr->workspace_count + w);
+                       wWindowChangeWorkspace(wwin, wks_nfo.workspace_count + 
w);
                }
        } else if (amount > 0) {
-               if (w < scr->workspace_count) {
+               if (w < wks_nfo.workspace_count) {
                        wWindowChangeWorkspace(wwin, w);
                } else if (wPreferences.ws_advance) {
                        int workspace = WMIN(w, MAX_WORKSPACES - 1);
                        wWorkspaceMake(scr, workspace);
                        wWindowChangeWorkspace(wwin, workspace);
                } else if (wPreferences.ws_cycle) {
-                       wWindowChangeWorkspace(wwin, w % scr->workspace_count);
+                       wWindowChangeWorkspace(wwin, w % 
wks_nfo.workspace_count);
                }
        }
 }
diff --git a/src/winmenu.c b/src/winmenu.c
index a8a7bb8..fa232e4 100644
--- a/src/winmenu.c
+++ b/src/winmenu.c
@@ -74,7 +74,7 @@ extern Atom _XA_WM_DELETE_WINDOW;
 extern Atom _XA_GNUSTEP_WM_MINIATURIZE_WINDOW;
 
 extern WShortKey wKeyBindings[WKBD_LAST];
-
+extern wks_info wks_nfo;
 
 static void updateOptionsMenu(WMenu * menu, WWindow * wwin);
 
@@ -223,7 +223,7 @@ static void updateWorkspaceMenu(WMenu * menu)
        WMenuEntry *entry;
        int i;
 
-       for (i = 0; i < scr->workspace_count; i++) {
+       for (i = 0; i < wks_nfo.workspace_count; i++) {
                if (i < menu->entry_no) {
 
                        entry = menu->entries[i];
diff --git a/src/winspector.c b/src/winspector.c
index fedc013..d2e480e 100644
--- a/src/winspector.c
+++ b/src/winspector.c
@@ -116,6 +116,7 @@ typedef struct InspectorPanel {
 
 extern Cursor wCursor[WCUR_LAST];
 extern WDDomain *WDWindowAttributes;
+extern wks_info wks_nfo;
 
 static InspectorPanel *panelList = NULL;
 static WMPropList *ANoTitlebar = NULL;
@@ -495,7 +496,7 @@ static void saveSettings(WMButton *button, InspectorPanel 
*panel)
        }
 
        i = WMGetPopUpButtonSelectedItem(panel->wsP) - 1;
-       if (i >= 0 && i < panel->frame->screen_ptr->workspace_count) {
+       if (i >= 0 && i < wks_nfo.workspace_count) {
                value = 
WMCreatePLString(panel->frame->screen_ptr->workspaces[i]->name);
                different |= insertAttribute(dict, winDic, AStartWorkspace, 
value, flags);
                WMReleasePropList(value);
@@ -933,7 +934,7 @@ static void revertSettings(WMButton *button, InspectorPanel 
*panel)
 
        n = wDefaultGetStartWorkspace(wwin->screen_ptr, wm_instance, wm_class);
 
-       if (n >= 0 && n < wwin->screen_ptr->workspace_count)
+       if (n >= 0 && n < wks_nfo.workspace_count)
                WMSetPopUpButtonSelectedItem(panel->wsP, n + 1);
        else
                WMSetPopUpButtonSelectedItem(panel->wsP, 0);
@@ -1530,11 +1531,11 @@ static void create_tab_icon_workspace(WWindow *wwin, 
InspectorPanel *panel, int
        WMResizeWidget(panel->wsP, PWIDTH - (2 * 15) - (2 * 20), 20);
        WMAddPopUpButtonItem(panel->wsP, _("Nowhere in particular"));
 
-       for (i = 0; i < wwin->screen_ptr->workspace_count; i++)
+       for (i = 0; i < wks_nfo.workspace_count; i++)
                WMAddPopUpButtonItem(panel->wsP, scr->workspaces[i]->name);
 
        i = wDefaultGetStartWorkspace(wwin->screen_ptr, wwin->wm_instance, 
wwin->wm_class);
-       if (i >= 0 && i <= wwin->screen_ptr->workspace_count)
+       if (i >= 0 && i <= wks_nfo.workspace_count)
                WMSetPopUpButtonSelectedItem(panel->wsP, i + 1);
        else
                WMSetPopUpButtonSelectedItem(panel->wsP, 0);
diff --git a/src/wmspec.c b/src/wmspec.c
index e71265b..b19175f 100644
--- a/src/wmspec.c
+++ b/src/wmspec.c
@@ -53,6 +53,7 @@
 /* Global variables */
 extern Atom _XA_WM_DELETE_WINDOW;
 extern Time LastTimestamp;
+extern wks_info wks_nfo;
 
 /* Root Window Properties */
 static Atom net_supported;
@@ -318,16 +319,16 @@ void wNETWMUpdateDesktop(WScreen *scr)
        long *views, sizes[2];
        int count, i;
 
-       if (scr->workspace_count == 0)
+       if (wks_nfo.workspace_count == 0)
                return;
 
-       count = scr->workspace_count * 2;
+       count = wks_nfo.workspace_count * 2;
        views = wmalloc(sizeof(long) * count);
        /*memset(views, 0, sizeof(long) * count); */
        sizes[0] = scr->scr_width;
        sizes[1] = scr->scr_height;
 
-       for (i = 0; i < scr->workspace_count; i++) {
+       for (i = 0; i < wks_nfo.workspace_count; i++) {
                views[2 * i + 0] = 0;
                views[2 * i + 1] = 0;
        }
@@ -739,7 +740,7 @@ static void updateWorkspaceCount(WScreen *scr)
 {                              /* changeable */
        long count;
 
-       count = scr->workspace_count;
+       count = wks_nfo.workspace_count;
 
        XChangeProperty(dpy, scr->root_win, net_number_of_desktops, XA_CARDINAL,
                        32, PropModeReplace, (unsigned char *)&count, 1);
@@ -762,7 +763,7 @@ static void updateWorkspaceNames(WScreen *scr)
 
        pos = buf;
        len = 0;
-       for (i = 0; i < scr->workspace_count; i++) {
+       for (i = 0; i < wks_nfo.workspace_count; i++) {
                curr_size = strlen(scr->workspaces[i]->name);
                strcpy(pos, scr->workspaces[i]->name);
                pos += (curr_size + 1);
@@ -1355,13 +1356,13 @@ Bool wNETWMProcessClientMessage(XClientMessageEvent 
*event)
                        long value;
 
                        value = event->data.l[0];
-                       if (value > scr->workspace_count) {
-                               wWorkspaceMake(scr, value - 
scr->workspace_count);
-                       } else if (value < scr->workspace_count) {
+                       if (value > wks_nfo.workspace_count) {
+                               wWorkspaceMake(scr, value - 
wks_nfo.workspace_count);
+                       } else if (value < wks_nfo.workspace_count) {
                                int i;
                                Bool rebuild = False;
 
-                               for (i = scr->workspace_count - 1; i >= value; 
i--) {
+                               for (i = wks_nfo.workspace_count - 1; i >= 
value; i--) {
                                        if (!wWorkspaceDelete(scr, i)) {
                                                rebuild = True;
                                                break;
diff --git a/src/workspace.c b/src/workspace.c
index 1776b27..662a919 100644
--- a/src/workspace.c
+++ b/src/workspace.c
@@ -90,8 +90,8 @@ int wWorkspaceNew(WScreen *scr)
        WWorkspace *wspace, **list;
        int i;
 
-       if (scr->workspace_count < MAX_WORKSPACES) {
-               scr->workspace_count++;
+       if (wks_nfo.workspace_count < MAX_WORKSPACES) {
+               wks_nfo.workspace_count++;
 
                wspace = wmalloc(sizeof(WWorkspace));
                wspace->name = NULL;
@@ -99,15 +99,15 @@ int wWorkspaceNew(WScreen *scr)
 
                if (!wspace->name) {
                        wspace->name = wmalloc(strlen(_("Workspace %i")) + 8);
-                       sprintf(wspace->name, _("Workspace %i"), 
scr->workspace_count);
+                       sprintf(wspace->name, _("Workspace %i"), 
wks_nfo.workspace_count);
                }
 
                if (!wPreferences.flags.noclip)
                        wspace->clip = wDockCreate(scr, WM_CLIP, NULL);
 
-               list = wmalloc(sizeof(WWorkspace *) * scr->workspace_count);
+               list = wmalloc(sizeof(WWorkspace *) * wks_nfo.workspace_count);
 
-               for (i = 0; i < scr->workspace_count - 1; i++)
+               for (i = 0; i < wks_nfo.workspace_count - 1; i++)
                        list[i] = scr->workspaces[i];
 
                list[i] = wspace;
@@ -119,10 +119,10 @@ int wWorkspaceNew(WScreen *scr)
                wWorkspaceMenuUpdate(scr, scr->workspace_menu);
                wWorkspaceMenuUpdate(scr, scr->clip_ws_menu);
                wNETWMUpdateDesktop(scr);
-               WMPostNotificationName(WMNWorkspaceCreated, scr, (void 
*)(uintptr_t) (scr->workspace_count - 1));
+               WMPostNotificationName(WMNWorkspaceCreated, scr, (void 
*)(uintptr_t) (wks_nfo.workspace_count - 1));
                XFlush(dpy);
 
-               return scr->workspace_count - 1;
+               return wks_nfo.workspace_count - 1;
        }
 
        return -1;
@@ -150,9 +150,9 @@ Bool wWorkspaceDelete(WScreen * scr, int workspace)
                scr->workspaces[workspace]->clip = NULL;
        }
 
-       list = wmalloc(sizeof(WWorkspace *) * (scr->workspace_count - 1));
+       list = wmalloc(sizeof(WWorkspace *) * (wks_nfo.workspace_count - 1));
        j = 0;
-       for (i = 0; i < scr->workspace_count; i++) {
+       for (i = 0; i < wks_nfo.workspace_count; i++) {
                if (i != workspace) {
                        list[j++] = scr->workspaces[i];
                } else {
@@ -164,7 +164,7 @@ Bool wWorkspaceDelete(WScreen * scr, int workspace)
        wfree(scr->workspaces);
        scr->workspaces = list;
 
-       scr->workspace_count--;
+       wks_nfo.workspace_count--;
 
        /* update menu */
        wWorkspaceMenuUpdate(scr, scr->workspace_menu);
@@ -176,7 +176,7 @@ Bool wWorkspaceDelete(WScreen * scr, int workspace)
                WMenu *menu = scr->workspace_submenu;
 
                i = menu->entry_no;
-               while (i > scr->workspace_count)
+               while (i > wks_nfo.workspace_count)
                        wMenuRemoveItem(menu, --i);
                wMenuRealize(menu);
        }
@@ -185,16 +185,16 @@ Bool wWorkspaceDelete(WScreen * scr, int workspace)
                WMenu *menu = scr->clip_submenu;
 
                i = menu->entry_no;
-               while (i > scr->workspace_count)
+               while (i > wks_nfo.workspace_count)
                        wMenuRemoveItem(menu, --i);
                wMenuRealize(menu);
        }
        wNETWMUpdateDesktop(scr);
-       WMPostNotificationName(WMNWorkspaceDestroyed, scr, (void *)(uintptr_t) 
(scr->workspace_count - 1));
+       WMPostNotificationName(WMNWorkspaceDestroyed, scr, (void *)(uintptr_t) 
(wks_nfo.workspace_count - 1));
 
-       if (scr->current_workspace >= scr->workspace_count)
-               wWorkspaceChange(scr, scr->workspace_count - 1);
-       if (scr->last_workspace >= scr->workspace_count)
+       if (scr->current_workspace >= wks_nfo.workspace_count)
+               wWorkspaceChange(scr, wks_nfo.workspace_count - 1);
+       if (scr->last_workspace >= wks_nfo.workspace_count)
                scr->last_workspace = 0;
 
        return True;
@@ -261,7 +261,7 @@ static void showWorkspaceName(WScreen * scr, int workspace)
        int xx, yy;
 #endif
 
-       if (wPreferences.workspace_name_display_position == WD_NONE || 
scr->workspace_count < 2) {
+       if (wPreferences.workspace_name_display_position == WD_NONE || 
wks_nfo.workspace_count < 2) {
                return;
        }
 
@@ -455,15 +455,15 @@ void wWorkspaceRelativeChange(WScreen * scr, int amount)
                if (w >= 0) {
                        wWorkspaceChange(scr, w);
                } else if (wPreferences.ws_cycle) {
-                       wWorkspaceChange(scr, scr->workspace_count + w);
+                       wWorkspaceChange(scr, wks_nfo.workspace_count + w);
                }
        } else if (amount > 0) {
-               if (w < scr->workspace_count) {
+               if (w < wks_nfo.workspace_count) {
                        wWorkspaceChange(scr, w);
                } else if (wPreferences.ws_advance) {
                        wWorkspaceChange(scr, WMIN(w, MAX_WORKSPACES - 1));
                } else if (wPreferences.ws_cycle) {
-                       wWorkspaceChange(scr, w % scr->workspace_count);
+                       wWorkspaceChange(scr, w % wks_nfo.workspace_count);
                }
        }
 }
@@ -479,8 +479,8 @@ void wWorkspaceForceChange(WScreen * scr, int workspace)
 
        SendHelperMessage(scr, 'C', workspace + 1, NULL);
 
-       if (workspace > scr->workspace_count - 1) {
-               wWorkspaceMake(scr, workspace - scr->workspace_count + 1);
+       if (workspace > wks_nfo.workspace_count - 1) {
+               wWorkspaceMake(scr, workspace - wks_nfo.workspace_count + 1);
        }
 
        wClipUpdateForWorkspaceChange(scr, workspace);
@@ -653,7 +653,7 @@ static void lastWSCommand(WMenu * menu, WMenuEntry * entry)
 
 static void deleteWSCommand(WMenu * menu, WMenuEntry * entry)
 {
-       wWorkspaceDelete(menu->frame->screen_ptr, 
menu->frame->screen_ptr->workspace_count - 1);
+       wWorkspaceDelete(menu->frame->screen_ptr, wks_nfo.workspace_count - 1);
 }
 
 static void newWSCommand(WMenu *menu, WMenuEntry *foo)
@@ -672,7 +672,7 @@ void wWorkspaceRename(WScreen *scr, int workspace, const 
char *name)
        char buf[MAX_WORKSPACENAME_WIDTH + 1];
        char *tmp;
 
-       if (workspace >= scr->workspace_count)
+       if (workspace >= wks_nfo.workspace_count)
                return;
 
        /* trim white spaces */
@@ -754,9 +754,9 @@ void wWorkspaceMenuUpdate(WScreen * scr, WMenu * menu)
        if (!menu)
                return;
 
-       if (menu->entry_no < scr->workspace_count + MC_WORKSPACE1) {
+       if (menu->entry_no < wks_nfo.workspace_count + MC_WORKSPACE1) {
                /* new workspace(s) added */
-               i = scr->workspace_count - (menu->entry_no - MC_WORKSPACE1);
+               i = wks_nfo.workspace_count - (menu->entry_no - MC_WORKSPACE1);
                ws = menu->entry_no - MC_WORKSPACE1;
                while (i > 0) {
                        wstrlcpy(title, scr->workspaces[ws]->name, 
MAX_WORKSPACENAME_WIDTH);
@@ -768,14 +768,14 @@ void wWorkspaceMenuUpdate(WScreen * scr, WMenu * menu)
                        i--;
                        ws++;
                }
-       } else if (menu->entry_no > scr->workspace_count + MC_WORKSPACE1) {
+       } else if (menu->entry_no > wks_nfo.workspace_count + MC_WORKSPACE1) {
                /* removed workspace(s) */
-               for (i = menu->entry_no - 1; i >= scr->workspace_count + 
MC_WORKSPACE1; i--) {
+               for (i = menu->entry_no - 1; i >= wks_nfo.workspace_count + 
MC_WORKSPACE1; i--) {
                        wMenuRemoveItem(menu, i);
                }
        }
 
-       for (i = 0; i < scr->workspace_count; i++) {
+       for (i = 0; i < wks_nfo.workspace_count; i++) {
                /* workspace shortcut labels */
                if (i / 10 == scr->current_workspace / 10)
                        menu->entries[i + MC_WORKSPACE1]->rtext = 
GetShortcutKey(wKeyBindings[WKBD_WORKSPACE1 + (i % 10)]);
@@ -788,14 +788,14 @@ void wWorkspaceMenuUpdate(WScreen * scr, WMenu * menu)
        wMenuRealize(menu);
 
        /* don't let user destroy current workspace */
-       if (scr->current_workspace == scr->workspace_count - 1) {
+       if (scr->current_workspace == wks_nfo.workspace_count - 1) {
                wMenuSetEnabled(menu, MC_DESTROY_LAST, False);
        } else {
                wMenuSetEnabled(menu, MC_DESTROY_LAST, True);
        }
 
        /* back to last workspace */
-       if (scr->workspace_count && scr->last_workspace != 
scr->current_workspace)
+       if (wks_nfo.workspace_count && scr->last_workspace != 
scr->current_workspace)
                wMenuSetEnabled(menu, MC_LAST_USED, True);
        else
                wMenuSetEnabled(menu, MC_LAST_USED, False);
@@ -817,7 +817,7 @@ void wWorkspaceSaveState(WScreen * scr, WMPropList * 
old_state)
 
        old_wks_state = WMGetFromPLDictionary(old_state, dWorkspaces);
        parr = WMCreatePLArray(NULL);
-       for (i = 0; i < scr->workspace_count; i++) {
+       for (i = 0; i < wks_nfo.workspace_count; i++) {
                pstr = WMCreatePLString(scr->workspaces[i]->name);
                wks_state = WMCreatePLDictionary(dName, pstr, NULL);
                WMReleasePropList(pstr);
@@ -861,7 +861,7 @@ void wWorkspaceRestoreState(WScreen *scr)
                else
                        pstr = wks_state;
 
-               if (i >= scr->workspace_count)
+               if (i >= wks_nfo.workspace_count)
                        wWorkspaceNew(scr);
 
                if (scr->workspace_menu) {
@@ -929,7 +929,7 @@ int wGetWorkspaceNumber(WScreen *scr, const char *value)
 
        if (sscanf(value, "%i", &w) != 1) {
                w = -1;
-               for (i = 0; i < scr->workspace_count; i++) {
+               for (i = 0; i < wks_nfo.workspace_count; i++) {
                        if (strcmp(scr->workspaces[i]->name, value) == 0) {
                                w = i;
                                break;
diff --git a/src/workspace.h b/src/workspace.h
index 55c7aaf..28d3727 100644
--- a/src/workspace.h
+++ b/src/workspace.h
@@ -23,6 +23,7 @@
 #define WMWORKSPACE_H_
 
 typedef struct wks_info {
+       int workspace_count;            /* number of workspaces */
        WMFont *workspace_name_font;
 } wks_info;
 
-- 
1.7.10.4


-- 
To unsubscribe, send mail to [email protected].

Reply via email to