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