1 #ifndef WMMGR_H
2 #define WMMGR_H
3 
4 #include "WinMgr.h"
5 #include "ylist.h"
6 #include "ymsgbox.h"
7 #include "ypopup.h"
8 #include "workspaces.h"
9 
10 extern YAction layerActionSet[WinLayerCount];
11 
12 class YStringList;
13 class YWindowManager;
14 class YFrameClient;
15 class YFrameWindow;
16 class YSMListener;
17 class SwitchWindow;
18 class MiniIcon;
19 class DockApp;
20 class IApp;
21 
22 class EdgeSwitch: public YDndWindow, public YTimerListener {
23 public:
24     EdgeSwitch(YWindowManager *manager, int delta, bool vertical);
25     virtual ~EdgeSwitch();
26 
27     virtual void handleCrossing(const XCrossingEvent &crossing);
28     virtual bool handleTimer(YTimer *t);
29     virtual void handleDNDEnter();
30     virtual void handleDNDLeave();
31     void setGeometry();
32 private:
33     YWindowManager *fManager;
34     Cursor fCursor;
35     int fDelta;
36     bool fVert;
37 
38     lazy<YTimer> fEdgeSwitchTimer;
39 };
40 
41 class YProxyWindow: public YWindow {
42 public:
43     YProxyWindow(YWindow *parent);
44     virtual ~YProxyWindow();
45 
46     virtual void handleButton(const XButtonEvent &button);
47 };
48 
49 class YArrange {
50 public:
YArrange(YFrameWindow ** w,int n)51     YArrange(YFrameWindow** w, int n) : win(w), count(n) { }
discard()52     void discard() { delete[] win; win = nullptr; count = 0; }
size()53     int size() const { return count; }
begin()54     YFrameWindow** begin() const { return win; }
end()55     YFrameWindow** end() const { return win + count; }
56     YFrameWindow* operator[](int index) const { return win[index]; }
57     operator bool() const { return win && count; }
58 private:
59     YFrameWindow** win;
60     int count;
61 };
62 
63 class YWindowManager:
64     private YDesktop,
65     private YMsgBoxListener,
66     private YTimerListener,
67     public YPopDownListener
68 {
69 public:
70     YWindowManager(
71         IApp *app,
72         YActionListener *wmActionListener,
73         YSMListener *smListener,
74         YWindow *parent,
75         Window win = 0);
76 
77     virtual ~YWindowManager();
78 
79     virtual void grabKeys();
80 
81     virtual void handleButton(const XButtonEvent &button);
82     virtual void handleClick(const XButtonEvent &up, int count);
83     virtual bool handleKey(const XKeyEvent &key);
84 
85     virtual void handleConfigure(const XConfigureEvent &configure);
86     virtual void handleConfigureRequest(const XConfigureRequestEvent &configureRequest);
87     virtual void handleMapRequest(const XMapRequestEvent &mapRequest);
88     virtual void handleUnmapNotify(const XUnmapEvent &unmap);
89     virtual void handleClientMessage(const XClientMessageEvent &message);
90     virtual void handleProperty(const XPropertyEvent &property);
91     virtual void handleFocus(const XFocusChangeEvent &focus);
92 #ifdef CONFIG_XRANDR
93     virtual void handleRRScreenChangeNotify(const XRRScreenChangeNotifyEvent &xrrsc);
94     virtual void handleRRNotify(const XRRNotifyEvent &notify);
95 #endif
96     virtual void handleMsgBox(YMsgBox *msgbox, int operation);
97     virtual void handlePopDown(YPopupWindow* popup);
98     virtual bool handleTimer(YTimer* timer);
99 
100     void manageClients();
101     void unmanageClients();
102     void grabServer();
103     void ungrabServer();
104 
105     Window findWindow(char const* resource);
106     Window findWindow(Window root, char const* resource, int maxdepth);
107     bool matchWindow(Window win, char const* resource);
108 
109     YFrameWindow *findFrame(Window win);
110     YFrameClient *findClient(Window win);
111     void manageClient(YFrameClient* client, bool mapClient = false);
112     void unmanageClient(YFrameClient *client);
113     void destroyedClient(Window win);
114     void mapClient(Window win);
115 
116     void setFocus(YFrameWindow *f, bool canWarp = false, bool reorder = true);
getFocus()117     YFrameWindow *getFocus() { return fFocusWin; }
118 
119     void installColormap(Colormap cmap);
120     void setColormapWindow(YFrameWindow *frame);
colormapWindow()121     YFrameWindow *colormapWindow() { return fColormapWindow; }
122 
123     void removeClientFrame(YFrameWindow *frame);
124 
125     void updateScreenSize(XEvent *event);
126     void getWorkArea(int *mx, int *my, int *Mx, int *My);
127     void getWorkArea(const YFrameWindow *frame, int *mx, int *my, int *Mx, int *My, int xiscreen = -1);
128     void getWorkAreaSize(YFrameWindow *frame, int *Mw,int *Mh);
129 
130     int calcCoverage(bool down, YFrameWindow *frame, int x, int y, int w, int h);
131     void tryCover(bool down, YFrameWindow *frame, int x, int y, int w, int h,
132                   int& px, int& py, int& cover, int mx, int my, int Mx, int My);
133     bool getSmartPlace(bool down, YFrameWindow *frame, int &x, int &y, int w, int h, int xiscreen);
134     void getNewPosition(YFrameWindow *frame, int &x, int &y, int w, int h, int xiscreen);
135     void placeWindow(YFrameWindow *frame, int x, int y, int cw, int ch, bool newClient, bool &canActivate);
136 
137     YFrameWindow *top(long layer) const;
138     void setTop(long layer, YFrameWindow *top);
139     YFrameWindow *bottom(long layer) const;
140     void setBottom(long layer, YFrameWindow *bottom);
bottomWindow()141     YWindow* bottomWindow() const { return fBottom; }
142 
143     YFrameWindow *topLayer(long layer = WinLayerCount - 1);
144     YFrameWindow *bottomLayer(long layer = 0);
145 
146     bool setAbove(YFrameWindow* frame, YFrameWindow* above);
147     bool setBelow(YFrameWindow* frame, YFrameWindow* below);
148     void removeLayeredFrame(YFrameWindow *);
149     void appendCreatedFrame(YFrameWindow *f);
150     void removeCreatedFrame(YFrameWindow *f);
151 
focusedIterator()152     YFrameIter focusedIterator() { return fFocusedOrder.iterator(); }
focusedReverseIterator()153     YFrameIter focusedReverseIterator() { return fFocusedOrder.reverseIterator(); }
focusedCount()154     int focusedCount() const { return fFocusedOrder.count(); }
155     void insertFocusFrame(YFrameWindow* frame, bool focused);
156     void removeFocusFrame(YFrameWindow* frame);
157     void lowerFocusFrame(YFrameWindow* frame);
158     void raiseFocusFrame(YFrameWindow* frame);
159 
160     void restackWindows();
161     void focusTopWindow();
162     YFrameWindow *getFrameUnderMouse(long workspace = AllWorkspaces);
163     YFrameWindow *getLastFocus(bool skipAllWorkspaces = false, long workspace = AllWorkspaces);
164     void focusLastWindow();
165     bool focusTop(YFrameWindow *f);
166     void updateClientList();
167     void updateUserTime(const UserTime& userTime);
168 
169     int windowCount(long workspace);
170     void popupWindowListMenu(YWindow *owner, int x, int y);
171 
172     void initWorkspaces();
173 
activeWorkspace()174     int activeWorkspace() const { return int(fActiveWorkspace); }
lastWorkspace()175     int lastWorkspace() const { return int(fLastWorkspace); }
176     void activateWorkspace(long workspace);
177 
178     void appendNewWorkspaces(long extra);
179     void removeLastWorkspaces(long minus);
180     void updateWorkspaces(bool increase);
181 
182     void setShowingDesktop();
183     void setShowingDesktop(bool setting);
184 
185     void updateTaskBarNames();
186     void updateMoveMenu();
187 
188     bool readCurrentDesktop(long &workspace);
189     void setDesktopGeometry();
190     bool compareDesktopNames(const YStringList& list);
191     bool readDesktopLayout();
192     void readDesktopNames(bool init, bool net);
193     bool readNetDesktopNames(YStringList& list);
194     bool readWinDesktopNames(YStringList& list);
195     void setWinDesktopNames(long count);
196     void setNetDesktopNames(long count);
197     void setDesktopNames(long count);
198     void setDesktopNames();
199     void setDesktopCount();
200     void setDesktopViewport();
201 
202     void announceWorkArea();
203     void setWorkspace(int workspace);
204     void updateWorkArea();
205     bool updateWorkAreaInner();
206     void debugWorkArea(const char* prefix);
207     void workAreaUpdated();
208     void resizeWindows();
209 
210     void getIconPosition(MiniIcon* iw, int *iconX, int *iconY);
211 
212     void wmCloseSession();
213     void exitAfterLastClient(bool shuttingDown);
214     void checkLogout();
215 
216     virtual void resetColormap(bool active);
217 
218     void switchFocusTo(YFrameWindow *frame, bool reorderFocus = true);
219     void switchFocusFrom(YFrameWindow *frame);
220     void notifyActive(YFrameWindow *frame);
221 
222     void popupStartMenu(YWindow *owner);
223     void popupWindowListMenu(YWindow *owner);
224 
225     void switchToWorkspace(long nw, bool takeCurrent);
226     void switchToPrevWorkspace(bool takeCurrent);
227     void switchToNextWorkspace(bool takeCurrent);
228     void switchToLastWorkspace(bool takeCurrent);
229 
230     void tilePlace(YFrameWindow *w, int tx, int ty, int tw, int th);
231     void tileWindows(YArrange arrange, bool vertical);
232     void smartPlace(YArrange arrange);
233     void getCascadePlace(YFrameWindow *frame, int &lastX, int &lastY, int &x, int &y, int w, int h);
234     void cascadePlace(YArrange arrange);
235     void setWindows(YArrange arrange, YAction action);
236 
237     YArrange getWindowsToArrange(bool sticky = false, bool skipNonMinimizable = false);
238 
239     bool saveArrange(YArrange arrange);
240     void undoArrange();
241     void arrangeIcons();
242     void tileWindows(bool vertical);
243     void arrangeWindows();
244     void actionWindows(YAction action);
245     void toggleDesktop();
246     void cascadeWindows();
247 
248     bool haveClients();
249     void setupRootProxy();
250     void setKeyboard(mstring keyboard);
251     void setKeyboard(int configIndex);
252     mstring getKeyboard();
253     void updateKeyboard(int configIndex);
254     void reflectKeyboard(int configIndex, mstring keyboard);
255     void kbLayout();
256 
257     void updateFullscreenLayer();
258     void updateFullscreenLayerEnable(bool enable);
259     int getSwitchScreen();
260 
261     static void doWMAction(WMAction action, bool putback = false);
lockFocus()262     void lockFocus() {
263         //MSG(("lockFocus %d", lockFocusCount));
264         lockFocusCount++;
265     }
unlockFocus()266     void unlockFocus() {
267         lockFocusCount--;
268         //MSG(("unlockFocus %d", lockFocusCount));
269     }
focusLocked()270     bool focusLocked() { return lockFocusCount != 0; }
lockWorkArea()271     void lockWorkArea() { ++fWorkAreaLock; }
unlockWorkArea()272     void unlockWorkArea() {
273         if (0 == --fWorkAreaLock && fWorkAreaUpdate)
274             updateWorkArea();
275     }
requestWorkAreaUpdate()276     void requestWorkAreaUpdate() { ++fWorkAreaUpdate; }
277 
lockRestack()278     void lockRestack() { fRestackLock++; }
unlockRestack()279     void unlockRestack() {
280         if (0 == --fRestackLock && fRestackUpdate) {
281             fRestackUpdate = 0;
282             restackWindows();
283         }
284     }
285 
286     enum WMState { wmSTARTUP, wmRUNNING, wmSHUTDOWN };
287 
wmState()288     WMState wmState() const { return fWmState; }
isStartup()289     bool isStartup() const { return fWmState == wmSTARTUP; }
isRunning()290     bool isRunning() const { return fWmState == wmRUNNING; }
notRunning()291     bool notRunning() const { return fWmState != wmRUNNING; }
fullscreenEnabled()292     bool fullscreenEnabled() { return fFullscreenEnabled; }
setFullscreenEnabled(bool enable)293     void setFullscreenEnabled(bool enable) { fFullscreenEnabled = enable; }
lastUserTime()294     const UserTime& lastUserTime() const { return fLastUserTime; }
295 
296     struct DesktopLayout {
297         int orient;
298         int columns;
299         int rows;
300         int corner;
DesktopLayoutDesktopLayout301         DesktopLayout(int o, int c, int r, int k) :
302             orient(o), columns(c), rows(r), corner(k) { }
303     };
304 
layout()305     const DesktopLayout& layout() const { return fLayout; }
306     bool handleSwitchWorkspaceKey(const XKeyEvent& key, KeySym k, unsigned vm);
307 
308     bool switchWindowVisible() const;
309     SwitchWindow* getSwitchWindow();
310 
311 private:
312     struct WindowPosState {
313         int x, y, w, h;
314         long state;
315         YFrameWindow *frame;
316     };
317 
318     YFrameClient* allocateClient(Window win, bool mapClient);
319     YFrameWindow* allocateFrame(YFrameClient* client);
320     void updateArea(long workspace, int screen_number, int l, int t, int r, int b);
321     bool handleWMKey(const XKeyEvent &key, KeySym k, unsigned vm);
322     void setWmState(WMState newWmState);
323     void refresh();
324 
325     IApp *app;
326     YActionListener *wmActionListener;
327     YSMListener *smActionListener;
328     Window fActiveWindow;
329     YFrameWindow *fFocusWin;
330     YLayeredList fLayers[WinLayerCount];
331     YCreatedList fCreationOrder;  // frame creation order
332     YFocusedList fFocusedOrder;   // focus order: old -> now
333 
334     long fActiveWorkspace;
335     long fLastWorkspace;
336     YFrameWindow *fColormapWindow;
337 
338     long fWorkAreaWorkspaceCount;
339     int fWorkAreaScreenCount;
340     struct WorkAreaRect {
341         int fMinX, fMinY, fMaxX, fMaxY;
342         bool operator!=(const WorkAreaRect& o) const {
343             return fMinX != o.fMinX || fMinY != o.fMinY
344                 || fMaxX != o.fMaxX || fMaxY != o.fMaxY;
345         }
displacedWorkAreaRect346         bool displaced(const WorkAreaRect& o) const {
347             return fMinX != o.fMinX || fMinY != o.fMinY;
348         }
resizedWorkAreaRect349         bool resized(const WorkAreaRect& o) const {
350             return fMaxX != o.fMaxX || fMaxY != o.fMaxY;
351         }
352         void operator=(const DesktopScreenInfo& o) {
353             fMaxX = o.width + (fMinX = o.x_org);
354             fMaxY = o.height + (fMinY = o.y_org);
355         }
widthWorkAreaRect356         int width() const { return fMaxX - fMinX; }
heightWorkAreaRect357         int height() const { return fMaxY - fMinY; }
YRectWorkAreaRect358         operator YRect() const {
359             return YRect(fMinX, fMinY, width(), height());
360         }
361     } **fWorkArea;
362 
363     YObjectArray<EdgeSwitch> edges;
364     bool fShuttingDown;
365     int fArrangeCount;
366     WindowPosState *fArrangeInfo;
367     YProxyWindow *rootProxy;
368     YWindow *fTopWin;
369     YWindow *fBottom;
370     int fCascadeX;
371     int fCascadeY;
372     int fIconColumn;
373     int fIconRow;
374     int lockFocusCount;
375     int fWorkAreaLock;
376     int fWorkAreaUpdate;
377     int fRestackLock;
378     int fRestackUpdate;
379     int fServerGrabCount;
380     bool fFullscreenEnabled;
381 
382     WMState fWmState;
383     UserTime fLastUserTime;
384     bool fShowingDesktop;
385     bool fCreatedUpdated;
386     bool fLayeredUpdated;
387 
388     DesktopLayout fLayout;
389     mstring fCurrentKeyboard;
390     int fDefaultKeyboard;
391     SwitchWindow* fSwitchWindow;
392     lazy<YTimer> fSwitchDownTimer;
393     lazy<YTimer> fLayoutTimer;
394     DockApp* fDockApp;
395 };
396 
397 extern YWindowManager *manager;
398 
399 class YRestackLock {
400 public:
YRestackLock()401     YRestackLock() { manager->lockRestack(); }
~YRestackLock()402     ~YRestackLock() { manager->unlockRestack(); }
403 };
404 
405 void dumpZorder(const char *oper, YFrameWindow *w, YFrameWindow *a = nullptr);
406 
407 extern Atom _XA_WIN_ICONS;
408 extern Atom _XA_WIN_LAYER;
409 extern Atom _XA_WIN_PROTOCOLS;
410 extern Atom _XA_WIN_TRAY;
411 
412 extern Atom _XA_WM_CLIENT_LEADER;
413 extern Atom _XA_WM_CLIENT_MACHINE;
414 extern Atom _XA_WM_WINDOW_ROLE;
415 
416 extern Atom _XA_ICEWM_ACTION;
417 extern Atom _XA_ICEWM_GUIEVENT;
418 extern Atom _XA_ICEWM_HINT;
419 extern Atom _XA_ICEWM_FONT_PATH;
420 extern Atom _XA_XROOTPMAP_ID;
421 extern Atom _XA_XROOTCOLOR_PIXEL;
422 
423 /// _SET would be nice to have
424 #define _NET_WM_STATE_REMOVE 0
425 #define _NET_WM_STATE_ADD 1
426 #define _NET_WM_STATE_TOGGLE 2
427 
428 #define _NET_WM_MOVERESIZE_SIZE_TOPLEFT      0
429 #define _NET_WM_MOVERESIZE_SIZE_TOP          1
430 #define _NET_WM_MOVERESIZE_SIZE_TOPRIGHT     2
431 #define _NET_WM_MOVERESIZE_SIZE_RIGHT        3
432 #define _NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT  4
433 #define _NET_WM_MOVERESIZE_SIZE_BOTTOM       5
434 #define _NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT   6
435 #define _NET_WM_MOVERESIZE_SIZE_LEFT         7
436 #define _NET_WM_MOVERESIZE_MOVE              8 /* Movement only */
437 #define _NET_WM_MOVERESIZE_SIZE_KEYBOARD     9
438 #define _NET_WM_MOVERESIZE_MOVE_KEYBOARD    10
439 #define _NET_WM_MOVERESIZE_CANCEL           11
440 
441 #define _NET_WM_ORIENTATION_HORZ    0
442 #define _NET_WM_ORIENTATION_VERT    1
443 #define _NET_WM_TOPLEFT     0
444 #define _NET_WM_TOPRIGHT    1
445 #define _NET_WM_BOTTOMRIGHT 2
446 #define _NET_WM_BOTTOMLEFT  3
447 
448 
449 extern Atom _XA_NET_ACTIVE_WINDOW;                  // OK
450 extern Atom _XA_NET_CLIENT_LIST;                    // OK
451 extern Atom _XA_NET_CLIENT_LIST_STACKING;           // OK
452 extern Atom _XA_NET_CLOSE_WINDOW;                   // OK
453 extern Atom _XA_NET_CURRENT_DESKTOP;                // OK
454 extern Atom _XA_NET_DESKTOP_GEOMETRY;               // OK
455 extern Atom _XA_NET_DESKTOP_LAYOUT;                 // OK
456 extern Atom _XA_NET_DESKTOP_NAMES;                  //*OK
457 extern Atom _XA_NET_DESKTOP_VIEWPORT;               // OK (trivial)
458 extern Atom _XA_NET_FRAME_EXTENTS;                  // OK
459 extern Atom _XA_NET_MOVERESIZE_WINDOW;              //*OK
460 extern Atom _XA_NET_NUMBER_OF_DESKTOPS;             //*OK
461 extern Atom _XA_NET_PROPERTIES;                     // N/A (obsolete)
462 extern Atom _XA_NET_REQUEST_FRAME_EXTENTS;          // OK
463 extern Atom _XA_NET_RESTACK_WINDOW;                 // OK
464 extern Atom _XA_NET_SHOWING_DESKTOP;                // OK
465 extern Atom _XA_NET_STARTUP_ID;                     // OK
466 extern Atom _XA_NET_STARTUP_INFO;                   // TODO
467 extern Atom _XA_NET_STARTUP_INFO_BEGIN;             // TODO
468 extern Atom _XA_NET_SUPPORTED;                      // OK
469 extern Atom _XA_NET_SUPPORTING_WM_CHECK;            // OK
470 extern Atom _XA_NET_SYSTEM_TRAY_MESSAGE_DATA;       // OK
471 extern Atom _XA_NET_SYSTEM_TRAY_OPCODE;             // OK
472 extern Atom _XA_NET_SYSTEM_TRAY_ORIENTATION;        // TODO
473 extern Atom _XA_NET_SYSTEM_TRAY_VISUAL;             // TODO
474 extern Atom _XA_NET_VIRTUAL_ROOTS;                  // N/A
475 extern Atom _XA_NET_WM_ACTION_ABOVE;                // OK
476 extern Atom _XA_NET_WM_ACTION_BELOW;                // OK
477 extern Atom _XA_NET_WM_ACTION_CHANGE_DESKTOP;       // OK
478 extern Atom _XA_NET_WM_ACTION_CLOSE;                // OK
479 extern Atom _XA_NET_WM_ACTION_FULLSCREEN;           // OK
480 extern Atom _XA_NET_WM_ACTION_MAXIMIZE_HORZ;        // OK
481 extern Atom _XA_NET_WM_ACTION_MAXIMIZE_VERT;        // OK
482 extern Atom _XA_NET_WM_ACTION_MINIMIZE;             // OK
483 extern Atom _XA_NET_WM_ACTION_MOVE;                 // OK
484 extern Atom _XA_NET_WM_ACTION_RESIZE;               // OK
485 extern Atom _XA_NET_WM_ACTION_SHADE;                // OK
486 extern Atom _XA_NET_WM_ACTION_STICK;                // OK
487 extern Atom _XA_NET_WM_ALLOWED_ACTIONS;             // OK
488 extern Atom _XA_NET_WM_BYPASS_COMPOSITOR;           // N/A
489 extern Atom _XA_NET_WM_DESKTOP;                     // OK
490 extern Atom _XA_NET_WM_FULL_PLACEMENT;              // OK
491 extern Atom _XA_NET_WM_FULLSCREEN_MONITORS;         // OK
492 extern Atom _XA_NET_WM_HANDLED_ICONS;               // TODO -> toggle minimizeToDesktop
493 extern Atom _XA_NET_WM_ICON_GEOMETRY;               // N/A
494 extern Atom _XA_NET_WM_ICON_NAME;                   // OK
495 extern Atom _XA_NET_WM_ICON;                        // OK
496 extern Atom _XA_NET_WM_MOVERESIZE;                  //*OK
497 extern Atom _XA_NET_WM_NAME;                        // OK
498 extern Atom _XA_NET_WM_OPAQUE_REGION;               // TODO
499 extern Atom _XA_NET_WM_PID;                         // OK (trivial)
500 extern Atom _XA_NET_WM_PING;                        // OK
501 extern Atom _XA_NET_WM_STATE;                       // OK
502 extern Atom _XA_NET_WM_STATE_ABOVE;                 // OK
503 extern Atom _XA_NET_WM_STATE_BELOW;                 // OK
504 extern Atom _XA_NET_WM_STATE_DEMANDS_ATTENTION;     // OK
505 extern Atom _XA_NET_WM_STATE_FOCUSED;               // OK
506 extern Atom _XA_NET_WM_STATE_FULLSCREEN;            // OK
507 extern Atom _XA_NET_WM_STATE_HIDDEN;                // OK
508 extern Atom _XA_NET_WM_STATE_MAXIMIZED_HORZ;        // OK
509 extern Atom _XA_NET_WM_STATE_MAXIMIZED_VERT;        // OK
510 extern Atom _XA_NET_WM_STATE_MODAL;                 // OK (state only)
511 extern Atom _XA_NET_WM_STATE_SHADED;                // OK
512 extern Atom _XA_NET_WM_STATE_SKIP_PAGER;            // OK (trivial)
513 extern Atom _XA_NET_WM_STATE_SKIP_TASKBAR;          // OK
514 extern Atom _XA_NET_WM_STATE_STICKY;                // OK (trivial)
515 extern Atom _XA_NET_WM_STRUT;                       // OK
516 extern Atom _XA_NET_WM_STRUT_PARTIAL;               // OK (minimal)
517 extern Atom _XA_NET_WM_SYNC_REQUEST;                // TODO
518 extern Atom _XA_NET_WM_SYNC_REQUEST_COUNTER;        // TODO
519 extern Atom _XA_NET_WM_USER_TIME;                   // OK
520 extern Atom _XA_NET_WM_USER_TIME_WINDOW;            // OK
521 extern Atom _XA_NET_WM_VISIBLE_ICON_NAME;           // OK
522 extern Atom _XA_NET_WM_VISIBLE_NAME;                // OK
523 extern Atom _XA_NET_WORKAREA;                       // OK
524 
525 // TODO extra:
526 // original geometry of maximized window
527 //
528 
529 /* KDE specific */
530 extern Atom _XA_KWM_DOCKWINDOW;
531 extern Atom _XA_KWM_WIN_ICON;
532 
533 extern Atom _XA_KDE_NET_SYSTEM_TRAY_WINDOWS;
534 extern Atom _XA_KDE_NET_WM_FRAME_STRUT;
535 extern Atom _XA_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR;
536 extern Atom _XA_KDE_NET_WM_WINDOW_TYPE_OVERRIDE;
537 extern Atom _XA_KDE_SPLASH_PROGRESS;
538 extern Atom _XA_KDE_WM_CHANGE_STATE;
539 
540 extern Atom XA_IcewmWinOptHint;
541 
542 #endif
543 
544 // vim: set sw=4 ts=4 et:
545