xoblite™ / Blackbox for Windows bb5 | RC6 preview | 0.25.2.14
http://xoblite.net/
Workspaces Class Reference

#include <Workspaces.h>

Public Types

typedef vector< string > WorkspaceNamesVector
 
typedef vector< string > StickyListVector
 

Public Member Functions

 Workspaces (HINSTANCE hMainInstance)
 
 ~Workspaces ()
 
void PreviousWorkspace ()
 
void NextWorkspace ()
 
void LastWorkspace ()
 
void SwitchToWorkspace (int workspace)
 
void NewWorkspace ()
 
void RemoveLastWorkspace ()
 
void UpdateWorkspaceNames ()
 
int GetWorkspaceByWindow (HWND window)
 
int GetWorkspaceByRect (RECT r)
 
void GatherWindows ()
 
void MoveWindowToWorkspace (HWND window, int workspace)
 
void MoveWindowToPreviousWorkspace (HWND window)
 
void MoveWindowToNextWorkspace (HWND window)
 

Public Attributes

HINSTANCE hWorkspacesInstance
 
HWND hWorkspacesWnd
 
WorkspaceNamesVector workspaceNames
 
StickyListVector stickyList
 
int ScreenWidth
 
int ScreenHeight
 
HDWP dwp
 

Friends

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 
BOOL CALLBACK EnumWindowsProc (HWND hwnd, LPARAM lParam)
 

Member Typedef Documentation

◆ WorkspaceNamesVector

typedef vector<string> Workspaces::WorkspaceNamesVector

◆ StickyListVector

typedef vector<string> Workspaces::StickyListVector

Constructor & Destructor Documentation

◆ Workspaces()

Workspaces::Workspaces ( HINSTANCE hMainInstance)
55{
57
58 ScreenWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
59 ScreenHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN);
60
62
63 //====================
64
65 // Register window class...
66 WNDCLASS wc;
67 ZeroMemory(&wc,sizeof(wc));
68 wc.hInstance = hWorkspacesInstance;
69 wc.lpfnWndProc = WndProc; // Window procedure
70 wc.lpszClassName = szWorkspacesName; // Window class name
71
72 if (!RegisterClass(&wc))
73 {
74 MessageBox(0, "Error registering workspaces window class!", szWorkspacesName, MB_OK);
75 Log("Workspaces", "Error registering window class!");
76 return;
77 }
78
79 // Create workspaces handling window...
80 hWorkspacesWnd = CreateWindowEx(
81 WS_EX_TOOLWINDOW | WS_EX_NOACTIVATE, // window style
82 szWorkspacesName, // window class
83 NULL, // window name
84 0, // window parameters
85 0, // x position
86 0, // y position
87 0, // window width
88 0, // window height
89 GetBBWnd(), // owner window
90 NULL, // no menu
91 hWorkspacesInstance, // hInstance
92 NULL // no window creation data
93 );
94
95 if (!hWorkspacesWnd)
96 {
97 UnregisterClass(szWorkspacesName, hWorkspacesInstance); // Unregister window class
98 MessageBox(0, "Error creating workspaces window!", szWorkspacesName, MB_OK);
99 Log("Workspaces", "Error creating window!");
100 return;
101 }
102
103 //====================
104
105 // Subscribe to Blackbox messages applicable to workspaces handling...
107
109}
void MakeSticky(HWND window)
Definition BBApi.cpp:2965
void Log(LPCSTR des, LPCSTR line)
Definition BBApi.cpp:638
HWND GetBBWnd()
Definition BBApi.cpp:128
#define BB_REGISTERMESSAGE
Definition BBApi.h:142
HINSTANCE hMainInstance
Definition Blackbox.cpp:61
int workspacesMessageSubscription[]
Definition Workspaces.cpp:50
const char szWorkspacesName[]
Definition Workspaces.cpp:39
HINSTANCE hWorkspacesInstance
Definition Workspaces.h:73
void UpdateWorkspaceNames()
Definition Workspaces.cpp:493
int ScreenHeight
Definition Workspaces.h:81
HWND hWorkspacesWnd
Definition Workspaces.h:74
int ScreenWidth
Definition Workspaces.h:81
friend LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
Definition Workspaces.cpp:128

◆ ~Workspaces()

Workspaces::~Workspaces ( )
114{
116
117 // Unsubscribe to previously subscribed Blackbox messages...
119
120 DestroyWindow(hWorkspacesWnd); // Destroy window...
121 UnregisterClass(szWorkspacesName, hWorkspacesInstance); // Unregister window class...
122
123 workspaceNames.clear();
124}
#define BB_UNREGISTERMESSAGE
Definition BBApi.h:143
void GatherWindows()
Definition Workspaces.cpp:561
WorkspaceNamesVector workspaceNames
Definition Workspaces.h:77

Member Function Documentation

◆ PreviousWorkspace()

void Workspaces::PreviousWorkspace ( )
360{
361 int workspace;
362 if (pSettings->currentWorkspace > 0) workspace = pSettings->currentWorkspace - 1;
363 else workspace = pSettings->numberOfWorkspaces - 1;
364 SwitchToWorkspace(workspace);
365}
Settings * pSettings
Definition Blackbox.cpp:46
int currentWorkspace
Definition Settings.h:372
int numberOfWorkspaces
Definition Settings.h:306
void SwitchToWorkspace(int workspace)
Definition Workspaces.cpp:389

◆ NextWorkspace()

void Workspaces::NextWorkspace ( )
370{
371 int workspace;
373 else workspace = 0;
374 SwitchToWorkspace(workspace);
375}

◆ LastWorkspace()

void Workspaces::LastWorkspace ( )
380{
382}
int lastWorkspace
Definition Settings.h:373

◆ SwitchToWorkspace()

void Workspaces::SwitchToWorkspace ( int workspace)
390{
391 if ((workspace != pSettings->currentWorkspace) && (workspace >= 0) && (workspace < pSettings->numberOfWorkspaces))
392 {
394
395 dwp = BeginDeferWindowPos(0);
396 EnumWindows(EnumWindowsProc, (LPARAM)addH);
397 EndDeferWindowPos(dwp);
398
400 pSettings->currentWorkspace = workspace;
401
404
406 {
408 _beginthread(ExecuteRootCommand, 0, NULL);
409 }
410
411 if (!pSettings->accessLock)
412 {
413 // Update the toolbar... (including workspace label, taskbar if applicable, etc)
415 }
416 }
417}
Desktop * pDesktop
Definition Blackbox.cpp:37
Toolbar * pToolbar
Definition Blackbox.cpp:48
void ExecuteRootCommand(void *)
Definition Blackbox.cpp:1519
void PlaySoundFX(int sound)
Definition Sounds.cpp:40
@ SFX_WORKSPACE_CHANGE
Definition Sounds.h:49
void UpdateDesktopWindow()
Definition Desktop.cpp:315
bool wallpaperPerWorkspaceSemaphore
Definition Settings.h:311
bool accessLock
Definition Settings.h:370
bool wallpaperPerWorkspace
Definition Settings.h:310
void UpdatePosition()
Definition Toolbar.cpp:1941
HDWP dwp
Definition Workspaces.h:82
friend BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
Definition Workspaces.cpp:296

◆ NewWorkspace()

void Workspaces::NewWorkspace ( )
425{
426 // Note:
427 // "Workspace 254" is used as a wildcard to e.g. list tasks on all workspaces
428 // "Workspace 255" is used for minimized tasks
429 if (pSettings->numberOfWorkspaces == 253) return; // -> We've reached the theoretical maximum number of workspaces... ;)
430
433
434 if (pTaskbar)
435 {
437 }
438 if (pToolbar)
439 {
440 // Update the toolbar... (including workspace label, taskbar if applicable, etc)
443 }
444 if (pDesktop) pDesktop->UpdateDesktopWindow(); // Update the number of workspace indicators on the desktop...
445
447}
void WriteInt(LPCSTR fp, LPCSTR keyword, int value)
Definition BBApi.cpp:3144
Taskbar * pTaskbar
Definition Blackbox.cpp:47
#define TASKBAR_MODE_HIDDEN
Definition Settings.h:42
char xobrcDefaultFile[MAX_LINE_LENGTH]
Definition Settings.h:406
int taskbarMode
Definition Settings.h:215
bool cachedTaskButtonsExist
Definition Taskbar.h:122
bool cachedBitmapsExist
Definition Toolbar.h:132

◆ RemoveLastWorkspace()

void Workspaces::RemoveLastWorkspace ( )
452{
454 {
456 {
458 }
459
462
463 if (pTaskbar)
464 {
465 for (int i = 0; i < (int)pTaskbar->taskList.size(); i++)
466 {
467 if (!CheckSticky(pTaskbar->taskList[i]->hwnd))
468 {
469 if (pTaskbar->taskList[i]->workspace > (pSettings->numberOfWorkspaces - 1)) pTaskbar->taskList[i]->workspace = pSettings->numberOfWorkspaces - 1;
470 }
471 }
472
474 }
475 if (pToolbar)
476 {
477 // Update the toolbar... (including workspace label, taskbar if applicable, etc)
480 }
481 if (pDesktop) pDesktop->UpdateDesktopWindow(); // Update the number of workspace indicators on the desktop...
482 }
483
485}
bool CheckSticky(HWND window)
Definition BBApi.cpp:2994
vector< taskListItem * > taskList
Definition Taskbar.h:148

◆ UpdateWorkspaceNames()

void Workspaces::UpdateWorkspaceNames ( )
494{
495 workspaceNames.clear();
496 char buffer[MAX_LINE_LENGTH], szBuffer[MAX_PATH];
497 strcpy(buffer, pSettings->workspaceNames);
498
499 for (int i = 0; i < pSettings->numberOfWorkspaces; i++)
500 {
501 strcpy(buffer, Tokenize(buffer, szBuffer, ","));
502 if (!strcmp(szBuffer,"")) sprintf(szBuffer, "Workspace #%d", i+1); // -> Default if no name configured
503 workspaceNames.push_back(string(szBuffer));
504 }
505}
LPSTR Tokenize(LPCSTR string, LPSTR buf, LPSTR delims)
Definition BBApi.cpp:273
#define MAX_LINE_LENGTH
Definition BBApi.h:64
char workspaceNames[MAX_LINE_LENGTH]
Definition Settings.h:307

◆ GetWorkspaceByWindow()

int Workspaces::GetWorkspaceByWindow ( HWND window)
513{
514 if (!window || IsIconic(window)) return 255;
515
516 if (pTaskbar)
517 {
518 int i = pTaskbar->FindTask(window);
519 if (i >= 0) return pTaskbar->taskList[i]->workspace;
520 }
521
522 // Use legacy GetWorkspaceByRect() based mechanism as fallback... (see below)
523 RECT r;
524 GetWindowRect(window, &r);
525 return (GetWorkspaceByRect(r));
526}
int FindTask(HWND window)
Definition Taskbar.cpp:255
int GetWorkspaceByRect(RECT r)
Definition Workspaces.cpp:530

◆ GetWorkspaceByRect()

int Workspaces::GetWorkspaceByRect ( RECT r)
531{
534 int workspace;
535 RECT tempRect, workspaceRect;
536
537 workspaceRect.left = workspaceRect.top = 0;
538 workspaceRect.right = ScreenWidth;
539 workspaceRect.bottom = ScreenHeight;
540
541 if (IntersectRect(&tempRect, &r, &workspaceRect)) return pSettings->currentWorkspace;
542
543 r.left += offsetX * (ScreenWidth + 10);
544 r.top += offsetY * (ScreenHeight + 10);
545
546 offsetX = ((r.left + 10) / (ScreenWidth + 10));
547 offsetY = ((r.top + 10) / (ScreenHeight + 10));
548
549 workspace = (offsetY * pSettings->numberOfWorkspaces) + offsetX;
550
551 if (workspace < 0 || workspace > pSettings->numberOfWorkspaces) workspace = pSettings->currentWorkspace;
552
553 return workspace;
554}

◆ GatherWindows()

void Workspaces::GatherWindows ( )
562{
563 dwp = BeginDeferWindowPos(0);
564 EnumWindows(EnumWindowsProc, (LPARAM)-1);
565 EndDeferWindowPos(dwp);
566
567 if (pTaskbar)
568 {
569 for (int i = 0; i < (int)pTaskbar->taskList.size(); i++)
570 {
571 if (!CheckSticky(pTaskbar->taskList[i]->hwnd)) pTaskbar->taskList[i]->workspace = pSettings->currentWorkspace;
572 }
573 }
574
575 if (!pSettings->accessLock)
576 {
577 // Update the toolbar... (including workspace label, taskbar if applicable, etc)
579 }
580}

◆ MoveWindowToWorkspace()

void Workspaces::MoveWindowToWorkspace ( HWND window,
int workspace )
589{
590 if (CheckSticky(window)) return;
591 if ((workspace < 0) || (workspace >= pSettings->numberOfWorkspaces)) return;
592
594// BBSwitchToThisWindow(window, FALSE);
595 BringWindowToTop(window);
596
597 MakeSticky(window);
598 SwitchToWorkspace(workspace);
599 RemoveSticky(window);
600
601 if (pTaskbar)
602 {
603 int i = pTaskbar->FindTask(window);
604 if (i >= 0) pTaskbar->taskList[i]->workspace = workspace;
605 }
606
607 if (!pSettings->accessLock)
608 {
609 // Do we need to update the toolbar?
611 {
614 }
615 }
616}
void RemoveSticky(HWND window)
Definition BBApi.cpp:2978
bool taskbarCurrentOnly
Definition Settings.h:219
int GetWorkspaceByWindow(HWND window)
Definition Workspaces.cpp:512

◆ MoveWindowToPreviousWorkspace()

void Workspaces::MoveWindowToPreviousWorkspace ( HWND window)
621{
622 int workspace;
623 if (pSettings->currentWorkspace == 0) workspace = pSettings->numberOfWorkspaces - 1;
624 else workspace = pSettings->currentWorkspace - 1;
625 MoveWindowToWorkspace(window, workspace);
626}
void MoveWindowToWorkspace(HWND window, int workspace)
Definition Workspaces.cpp:588

◆ MoveWindowToNextWorkspace()

void Workspaces::MoveWindowToNextWorkspace ( HWND window)
631{
632 int workspace;
633 if (pSettings->currentWorkspace == (pSettings->numberOfWorkspaces - 1)) workspace = 0;
634 else workspace = pSettings->currentWorkspace + 1;
635 MoveWindowToWorkspace(window, workspace);
636}

Friends And Related Symbol Documentation

◆ WndProc

LRESULT CALLBACK WndProc ( HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam )
friend
129{
130 switch (message)
131 {
132 //====================
133
134 case BB_RECONFIGURE:
135 {
137 }
138 break;
139
140 //====================
141
142 case BB_SWITCHTON:
143 {
144 pWorkspaces->SwitchToWorkspace((int)wParam);
145 break;
146 }
147
148 //====================
149
150 case BB_ACTIVETASK:
151 {
152 // Change workspaces automatically when the active task changes? (e.g. via Alt+Tab)
154 }
155
156 //====================
157
158 case BB_LISTDESKTOPS:
159 {
160 DesktopInfo deskInfo;
161 ZeroMemory(&deskInfo, sizeof(deskInfo));
162 for (int i = 0; i < pSettings->numberOfWorkspaces; i++)
163 {
164 deskInfo.isCurrent = (pSettings->currentWorkspace == i);
165 deskInfo.number = i;
166
167 if (pWorkspaces->workspaceNames[i] == "null")
168 {
169 sprintf(deskInfo.name, "Workspace %d", i + 1);
170 }
171 else
172 {
173 strcpy(deskInfo.name, pWorkspaces->workspaceNames[i].c_str());
174 }
175
176 SendMessage((HWND)wParam, BB_DESKTOPINFO, 0, (LPARAM) &deskInfo);
177 }
178 break;
179 }
180
181 //====================
182
183 case BB_BRINGTOFRONT:
184 {
185 // Change window focus via message... (+ change workspace if needed)
186 int n = pWorkspaces->GetWorkspaceByWindow((HWND)lParam);
188// BBSwitchToThisWindow((HWND)lParam, FALSE);
189 BringWindowToTop((HWND)lParam);
190 break;
191 }
192
193 //====================
194
195 case BB_WORKSPACE:
196 {
197 switch (wParam)
198 {
199 case 0: // "BBWS_PreviousWorkspace"
201 break;
202 case 1: // "BBWS_NextWorkspace"
204 break;
205 case 2: // "BBWS_NewWorkspace"
207 break;
208 case 3: // "BBWS_RemoveLastWorkspace"
210 break;
211 case 4: // "BBWS_SWITCHTODESK"
212 pWorkspaces->SwitchToWorkspace((int)lParam);
213 break;
214 case 5: // "BBWS_GATHERWINDOWS"
216 break;
217 case 6: // "BBWS_MOVEWINDOWLEFT"
219 break;
220 case 7: // "BBWS_MOVEWINDOWRIGHT"
222 break;
223 case 8: // "BBWS_PREVWINDOW"
224 if (pTaskbar) pTaskbar->PreviousTask(!(bool)lParam, false);
225 break;
226 case 9: // "BBWS_NEXTWINDOW"
227 if (pTaskbar) pTaskbar->NextTask(!(bool)lParam, false);
228 break;
229 case 10: // "BBWS_LastWorkspace"
231 break;
232
233 //====================
234
235 // Below: Misc stuff included for for basic compatibility
236 // with the bb(C)Lean(Mod)(Zero) modified BBApi...
238 case BBWS_MAKESTICKY:
239 case BBWS_CLEARSTICKY:
240 case BBWS_TOGGLEONTOP:
241 {
242 HWND hwnd = (HWND)lParam;
243 if (hwnd == NULL)
244 {
245 if (pTaskbar) hwnd = pTaskbar->GetActiveWindow();
246 if (hwnd == NULL) hwnd = GetForegroundWindow();
247 }
248
249 if (message == BBWS_TOGGLESTICKY)
250 {
251 if (CheckSticky(hwnd)) RemoveSticky(hwnd);
252 else MakeSticky(hwnd);
253 }
254 else if (message == BBWS_MAKESTICKY) MakeSticky(hwnd);
255 else if (message == BBWS_CLEARSTICKY) RemoveSticky(hwnd);
256 else if (message == BBWS_TOGGLEONTOP)
257 {
258 LONG_PTR windowIsOnTop = GetWindowLongPtr(hwnd, GWL_EXSTYLE);
259 if (windowIsOnTop & WS_EX_TOPMOST) SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
260 else SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
261 }
262 }
263 break;
264
265 //====================
266
267 default:
268 break; // Note: Breaking as default avoids unintended behaviour if receiving unknown wParam, e.g. ones defined by the bb(C)Lean(Mod)(Zero) modified BBApi...
269 }
270 }
271 break;
272
273 //====================
274
275 case WM_DISPLAYCHANGE:
276 {
277 pWorkspaces->ScreenWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
278 pWorkspaces->ScreenHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN);
279 }
280
281 //====================
282
283 default:
284 return DefWindowProc(hwnd,message,wParam,lParam);
285 }
286 return 0;
287}
Workspaces * pWorkspaces
Definition Blackbox.cpp:51
#define BBWS_CLEARSTICKY
Definition BBApi.h:717
#define BB_ACTIVETASK
Definition BBApi.h:198
#define BBWS_MAKESTICKY
Definition BBApi.h:716
#define BBWS_TOGGLESTICKY
Definition BBApi.h:715
#define BB_RECONFIGURE
Definition BBApi.h:147
#define BBWS_TOGGLEONTOP
Definition BBApi.h:718
#define BB_WORKSPACE
Definition BBApi.h:183
#define BB_BRINGTOFRONT
Definition BBApi.h:182
#define BB_DESKTOPINFO
Definition BBApi.h:179
#define BB_SWITCHTON
Definition BBApi.h:181
#define BB_LISTDESKTOPS
Definition BBApi.h:180
bool isCurrent
Definition BBApi.h:647
char name[32]
Definition BBApi.h:646
int number
Definition BBApi.h:648
bool followActive
Definition Settings.h:309
HWND GetActiveWindow()
Definition Taskbar.cpp:413
void NextTask(bool currentWorkspaceOnly, bool visibleOnly)
Definition Taskbar.cpp:1589
void PreviousTask(bool currentWorkspaceOnly, bool visibleOnly)
Definition Taskbar.cpp:1648
void NewWorkspace()
Definition Workspaces.cpp:424
void LastWorkspace()
Definition Workspaces.cpp:379
void RemoveLastWorkspace()
Definition Workspaces.cpp:451
void MoveWindowToNextWorkspace(HWND window)
Definition Workspaces.cpp:630
void NextWorkspace()
Definition Workspaces.cpp:369
void MoveWindowToPreviousWorkspace(HWND window)
Definition Workspaces.cpp:620
void PreviousWorkspace()
Definition Workspaces.cpp:359

◆ EnumWindowsProc

BOOL CALLBACK EnumWindowsProc ( HWND hwnd,
LPARAM lParam )
friend
297{
298 // Perform a few window validation checks...
299 // (nb. the taskbar already performs many such checks for its tasks prior to adding them, so we leverage that here too)
300 if (!IsOnTaskbar(hwnd)) return true;
301 if (CheckSticky(hwnd)) return true;
302 if (GetWindowLong(hwnd, GWLP_USERDATA) == magicDWord) return true; // For legacy backwards compatibility only (iirc this was used by the earliest bb4win sticky windows implementations)
303
304 // Disregard Rainmeter widgets... (i.e. exclude them from the Workspaces handling altogether to avoid possible conflicts)
305 char temp[MAX_LINE_LENGTH];
306 GetClassName(hwnd, temp, MAX_LINE_LENGTH);
307 if (!_stricmp(temp, "RainmeterMeterWindow")) return true;
308
309 //====================
310
311 RECT r;
312 GetWindowRect(hwnd, &r);
313
314 int addH = (int)lParam;
315 if (addH == -1)
316 {
317 int screenWidth = pWorkspaces->ScreenWidth;
318 int windowWidth = abs(r.right - r.left);
319
320 // Initial x/width position calculation...
321 if (r.left > screenWidth)
322 {
323 r.left %= (screenWidth + 10);
324 if (r.left > screenWidth) r.left -= (screenWidth + 10);
325 r.right = r.left + windowWidth;
326 }
327 else if (r.left < -10)
328 {
329 r.left %= (screenWidth + 10);
330 while (r.left < -10) r.left += (screenWidth + 10);
331 r.right = r.left + windowWidth;
332 }
333 }
334 else
335 {
336 r.left -= addH;
337 r.right -= addH;
338 }
339
340 HDWP hdwp = DeferWindowPos(pWorkspaces->dwp, hwnd, NULL, r.left, r.top, r.right-r.left, r.bottom-r.top, SWP_NOZORDER|SWP_NOACTIVATE);
341 if (hdwp != NULL) pWorkspaces->dwp = hdwp;
342/*
343 else if (pSettings->debugLogging)
344 {
345 char title[MAX_LINE_LENGTH], msg[MAX_LINE_LENGTH];
346 GetWindowText(hwnd, title, MAX_LINE_LENGTH);
347 sprintf(msg, "Workspaces -> DeferWindowPos() failed! -> %s", title);
348 SendMessage(GetBBWnd(), BB_CONSOLEMESSAGE, (WPARAM)CONSOLE_ERROR_MESSAGE, (LPARAM)msg);
349 }
350*/
351 return true;
352}
bool IsOnTaskbar(HWND hwnd)
Definition BBApi.cpp:3262
const long magicDWord
Definition Workspaces.cpp:294

Member Data Documentation

◆ hWorkspacesInstance

HINSTANCE Workspaces::hWorkspacesInstance

◆ hWorkspacesWnd

HWND Workspaces::hWorkspacesWnd

◆ workspaceNames

WorkspaceNamesVector Workspaces::workspaceNames

◆ stickyList

StickyListVector Workspaces::stickyList

◆ ScreenWidth

int Workspaces::ScreenWidth

◆ ScreenHeight

int Workspaces::ScreenHeight

◆ dwp

HDWP Workspaces::dwp