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 ¬ify); 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