1 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- 2 // Screen.hh for Blackbox - an X11 Window manager 3 // Copyright (c) 2001 - 2005 Sean 'Shaleh' Perry <shaleh@debian.org> 4 // Copyright (c) 1997 - 2000, 2002 - 2005 5 // Bradley T Hughes <bhughes at trolltech.com> 6 // 7 // Permission is hereby granted, free of charge, to any person obtaining a 8 // copy of this software and associated documentation files (the "Software"), 9 // to deal in the Software without restriction, including without limitation 10 // the rights to use, copy, modify, merge, publish, distribute, sublicense, 11 // and/or sell copies of the Software, and to permit persons to whom the 12 // Software is furnished to do so, subject to the following conditions: 13 // 14 // The above copyright notice and this permission notice shall be included in 15 // all copies or substantial portions of the Software. 16 // 17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23 // DEALINGS IN THE SOFTWARE. 24 25 #ifndef __Screen_hh 26 #define __Screen_hh 27 28 #include "StackingList.hh" 29 #include "blackbox.hh" 30 31 #include <Display.hh> 32 #include <EWMH.hh> 33 #include <EventHandler.hh> 34 35 #include <stdio.h> 36 37 #include <list> 38 #include <vector> 39 40 // forward declarations 41 class BlackboxWindow; 42 class Configmenu; 43 class Iconmenu; 44 class Rootmenu; 45 class Slit; 46 class Slitmenu; 47 class Toolbar; 48 class Toolbarmenu; 49 class Windowmenu; 50 class Workspace; 51 class Workspacemenu; 52 53 namespace bt { 54 class ScreenInfo; 55 } 56 57 58 class BScreen : public bt::NoCopy, public bt::EventHandler { 59 private: 60 bool managed, geom_visible; 61 Pixmap geom_pixmap; 62 Window geom_window; 63 Window empty_window; 64 Window no_focus_window; 65 66 const bt::ScreenInfo& screen_info; 67 Blackbox *_blackbox; 68 Configmenu *configmenu; 69 Iconmenu *_iconmenu; 70 Rootmenu *_rootmenu; 71 Slitmenu *_slitmenu; 72 Toolbarmenu *_toolbarmenu; 73 Windowmenu *_windowmenu; 74 Workspacemenu *_workspacemenu; 75 76 BlackboxWindowList windowList; 77 StackingList _stackingList; 78 unsigned int current_workspace; 79 80 Slit *_slit; 81 Toolbar *_toolbar; 82 83 unsigned int geom_w, geom_h; 84 85 bt::Rect usableArea; 86 87 typedef std::list<bt::EWMH::Strut*> StrutList; 88 StrutList strutList; 89 typedef std::vector<Workspace*> WorkspaceList; 90 WorkspaceList workspacesList; 91 92 ScreenResource& _resource; 93 94 void updateGeomWindow(void); 95 96 bool parseMenuFile(FILE *file, Rootmenu *menu); 97 98 void InitMenu(void); 99 void LoadStyle(void); 100 101 void manageWindow(Window w); 102 void unmanageWindow(BlackboxWindow *win); 103 bool focusFallback(const BlackboxWindow *win); 104 105 void placeWindow(BlackboxWindow *win); 106 bool cascadePlacement(bt::Rect& win, const bt::Rect& avail); 107 bool centerPlacement(bt::Rect &win, const bt::Rect &avail); 108 bool smartPlacement(unsigned int workspace, bt::Rect& win, 109 const bt::Rect& avail); 110 unsigned int cascade_x, cascade_y; 111 112 void updateAvailableArea(void); 113 void updateWorkareaHint(void) const; 114 115 public: 116 enum { Restart = 1, RestartOther, Exit, Shutdown, Execute, Reconfigure, 117 SetStyle }; 118 119 BScreen(Blackbox *bb, unsigned int scrn); 120 ~BScreen(void); 121 isScreenManaged(void) const122 inline bool isScreenManaged(void) const 123 { return managed; } 124 noFocusWindow() const125 inline Window noFocusWindow() const 126 { return no_focus_window; } 127 128 // information about the screen screenInfo(void) const129 inline const bt::ScreenInfo &screenInfo(void) const 130 { return screen_info; } screenNumber(void) const131 inline unsigned int screenNumber(void) const 132 { return screen_info.screenNumber(); } 133 resource(void)134 inline ScreenResource& resource(void) 135 { return _resource; } saveResource(void)136 inline void saveResource(void) 137 { _blackbox->resource().save(*_blackbox); } 138 blackbox(void) const139 inline Blackbox *blackbox(void) const 140 { return _blackbox; } 141 rootmenu(void) const142 inline Rootmenu *rootmenu(void) const 143 { return _rootmenu; } workspacemenu(void) const144 inline Workspacemenu *workspacemenu(void) const 145 { return _workspacemenu; } iconmenu(void) const146 inline Iconmenu *iconmenu(void) const 147 { return _iconmenu; } slitmenu(void) const148 inline Slitmenu *slitmenu(void) const 149 { return _slitmenu; } toolbarmenu(void) const150 inline Toolbarmenu *toolbarmenu(void) const 151 { return _toolbarmenu; } 152 153 Windowmenu *windowmenu(BlackboxWindow *win); 154 slit(void) const155 inline Slit *slit(void) const 156 { return _slit; } 157 void createSlit(void); 158 void destroySlit(void); 159 toolbar(void) const160 inline Toolbar *toolbar(void) const 161 { return _toolbar; } 162 void createToolbar(void); 163 void destroyToolbar(void); 164 165 Workspace *findWorkspace(unsigned int index) const; 166 workspaceCount(void) const167 inline unsigned int workspaceCount(void) const 168 { return workspacesList.size(); } currentWorkspace(void) const169 inline unsigned int currentWorkspace(void) const 170 { return current_workspace; } 171 void setCurrentWorkspace(unsigned int id); 172 void nextWorkspace(void); 173 void prevWorkspace(void); 174 175 const bt::Rect& availableArea(void); 176 void addStrut(bt::EWMH::Strut *strut); 177 void removeStrut(bt::EWMH::Strut *strut); 178 void updateStrut(void); 179 180 void updateClientListHint(void) const; 181 void updateClientListStackingHint(void) const; 182 void updateDesktopNamesHint(void) const; 183 void readDesktopNames(void); 184 185 void addWorkspace(void); 186 void removeLastWorkspace(void); 187 188 void addWindow(Window w); 189 void releaseWindow(BlackboxWindow *win); 190 BlackboxWindow* window(unsigned int workspace, unsigned int id); 191 192 void raiseWindow(StackEntity *entity); 193 void lowerWindow(StackEntity *entity); 194 stackingList()195 inline StackingList &stackingList() 196 { return _stackingList; } 197 void restackWindows(void); 198 199 void addIcon(BlackboxWindow *win); 200 void removeIcon(BlackboxWindow *win); 201 BlackboxWindow *icon(unsigned int id); 202 203 void nextFocus(void); 204 void prevFocus(void); 205 void raiseFocus(void); 206 207 void propagateWindowName(const BlackboxWindow * const win); 208 209 void reconfigure(void); 210 void toggleFocusModel(FocusModel model); 211 void rereadMenu(void); 212 void shutdown(void); 213 214 enum GeometryType { Position, Size }; 215 void showGeometry(GeometryType type, const bt::Rect &rect); 216 void hideGeometry(void); 217 218 void clientMessageEvent(const XClientMessageEvent * const event); 219 void buttonPressEvent(const XButtonEvent * const event); 220 void propertyNotifyEvent(const XPropertyEvent * const event); 221 void unmapNotifyEvent(const XUnmapEvent * const event); 222 }; 223 224 #endif // __Screen_hh 225