1 #ifndef WORKSPACES_H
2 #define WORKSPACES_H
3 
4 enum {
5     AllWorkspaces = -1,
6     WorkspaceInvalid = -1,
7     OldMaxWorkspaces = 20,
8     NewMaxWorkspaces = 1000,
9 };
10 
11 class Workspace {
12     char* str;
13 
14 public:
15     const YAction active;
16     const YAction moveto;
17     class YFrameWindow* focused;
18 
Workspace(const char * name)19     Workspace(const char* name) :
20         str(newstr(name)),
21         focused(nullptr)
22     { }
~Workspace()23     ~Workspace() { delete[] str; }
24 
25     char*& operator *() { return str; }
26     operator const char*() const { return str; }
27 };
28 
29 extern class Workspaces {
30     YObjectArray<Workspace> list;
31     YStringArray spares;
32 
33 public:
count()34     int count() const {
35         return list.getCount();
36     }
37 
add(const char * name)38     bool add(const char* name) {
39         int size = count();
40         if (name && size < NewMaxWorkspaces) {
41             Workspace* work = new Workspace(name);
42             if (work) {
43                 list.append(work);
44             }
45         }
46         return 1 + size == count();
47     }
48 
drop()49     bool drop() {
50         int last = count() - 1;
51         if (0 <= last) {
52             spare(last, *list[last]);
53             list.shrink(last);
54         }
55         return last == count();
56     }
57 
58     Workspace& operator[](int index) const {
59         return *list[index];
60     }
61 
reset()62     void reset() {
63         list.clear();
64         spares.clear();
65     };
66 
spare(int index,const char * name)67     void spare(int index, const char* name) {
68         if (inrange(index, 0, NewMaxWorkspaces - 1)) {
69             if (index >= spares.getCount())
70                 spares.extend(1 + index);
71             spares.replace(index, name);
72         }
73     }
74 
spare(int index)75     const char* spare(int index) {
76         return inrange(index, 0, spares.getCount() - 1)
77              ? spares[index] : nullptr;
78     }
79 
80     Workspaces& operator+(const char* name) {
81         add(name);
82         return *this;
83     }
84 } workspaces;
85 
86 extern struct WorkspacesCount {
87     operator int() const { return workspaces.count(); }
operatorWorkspacesCount88     int operator ()() const { return workspaces.count(); }
89 } workspaceCount;
90 
91 extern struct WorkspacesNames {
92     const char* operator[](int index) const { return workspaces[index]; }
operatorWorkspacesNames93     const char* operator()(int index) const { return workspaces[index]; }
94 } workspaceNames;
95 
96 extern struct WorkspacesActive {
97     YAction operator[](int index) const { return workspaces[index].active; }
98 } workspaceActionActivate;
99 
100 extern struct WorkspacesMoveTo {
101     YAction operator[](int index) const { return workspaces[index].moveto; }
102 } workspaceActionMoveTo;
103 
104 #endif
105 
106 // vim: set sw=4 ts=4 et:
107