X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fscreen.hh;h=4eb81d4aebd0b222beebf963f1fd48701ea543eb;hb=b18959e1bda52f807f62c95772c69ce3005215a7;hp=f0bc33d5d4f906b9f360d3baff04c38fa07bcd1f;hpb=37be3ef9249b452b8edec25a441aefff80c2d4b8;p=chaz%2Fopenbox diff --git a/src/screen.hh b/src/screen.hh index f0bc33d5..4eb81d4a 100644 --- a/src/screen.hh +++ b/src/screen.hh @@ -1,268 +1,238 @@ // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- -#ifndef __Screen_hh -#define __Screen_hh +#ifndef __screen_hh +#define __screen_hh + +/*! @file screen.hh + @brief Screen manages a single screen +*/ extern "C" { #include - -#ifdef TIME_WITH_SYS_TIME -# include -# include -#else // !TIME_WITH_SYS_TIME -# ifdef HAVE_SYS_TIME_H -# include -# else // !HAVE_SYS_TIME_H -# include -# endif // HAVE_SYS_TIME_H -#endif // TIME_WITH_SYS_TIME } -#include -#include - -#include "otk/color.hh" -#include "otk/font.hh" -#include "otk/texture.hh" -#include "otk/image.hh" #include "otk/strut.hh" +#include "otk/rect.hh" +#include "otk/screeninfo.hh" +#include "otk/eventhandler.hh" #include "otk/property.hh" -#include "otk/configuration.hh" -#include "otk/style.hh" -#include "timer.hh" -#include "workspace.hh" -#include "blackbox.hh" - -namespace ob { - -class BScreen : public otk::ScreenInfo { -private: - bool root_colormap_installed, managed, geom_visible; - GC opGC; - Pixmap geom_pixmap; - Window geom_window; - - Blackbox *blackbox; - otk::BImageControl *image_control; - otk::Configuration *config; - otk::OBProperty *xatom; - - BlackboxWindowList iconList, windowList; - - typedef std::vector WindowList; - WindowList specialWindowList, desktopWindowList, systrayWindowList; - - Workspace *current_workspace; - - unsigned int geom_w, geom_h; - unsigned long event_mask; +#include "otk/ustring.hh" - otk::Rect usableArea; -#ifdef XINERAMA - RectList xineramaUsableArea; -#endif // XINERAMA - - typedef std::list StrutList; - StrutList strutList; - typedef std::vector WorkspaceList; - WorkspaceList workspacesList; - - struct screen_resource { - otk::Style wstyle; - - bool sloppy_focus, auto_raise, auto_edge_balance, ordered_dither, - opaque_move, full_max, focus_new, focus_last, click_raise, - allow_scroll_lock, window_corner_snap, aa_fonts, - ignore_shaded, ignore_maximized, workspace_warping, shadow_fonts; - - int snap_to_windows, snap_to_edges; - unsigned int snap_offset; +#include +#include - unsigned int workspaces; - int placement_policy, - snap_threshold, row_direction, col_direction, root_scroll, - resistance_size; +namespace ob { - unsigned int resize_zones; +class Client; - std::string strftime_format; +struct DesktopLayout { + enum Corner { TopLeft, TopRight, BottomRight, BottomLeft }; + enum Direction { Horizontal, Vertical }; - } resource; - std::string screenstr; + Direction orientation; + Corner start_corner; + unsigned int rows; + unsigned int columns; +}; - BScreen(const BScreen&); - BScreen& operator=(const BScreen&); +//! Manages a single screen +/*! +*/ +class Screen : public otk::EventHandler { +public: + //! Holds a list of otk::Strut objects + typedef std::vector StrutList; + //! Holds a list of otk::Rect objects + typedef std::vector RectList; + + static const unsigned long event_mask = ColormapChangeMask | + EnterWindowMask | + LeaveWindowMask | + PropertyChangeMask | + SubstructureNotifyMask | + SubstructureRedirectMask | + ButtonPressMask | + ButtonReleaseMask; + + //! Holds a list of Clients + typedef std::list ClientList; + //! All managed clients on the screen (in order of being mapped) + ClientList clients; + +private: + //! Was %Openbox able to manage the screen? + bool _managed; - void updateWorkArea(void); + //! The number of the screen on the X server + int _number; -public: - // XXX: temporary - void updateNetizenWorkspaceCount(); - void updateNetizenWindowFocus(); + //! Information about this screen + const otk::ScreenInfo *_info; + //! Area usable for placement etc (total - struts), one per desktop, + //! plus one extra for windows on all desktops + RectList _area; + + //! Combined strut from all of the clients' struts, one per desktop, + //! plus one extra for windows on all desktops + StrutList _struts; + + //! An offscreen window which gets focus when nothing else has it + Window _focuswindow; + + //! An offscreen window which shows that a NETWM compliant window manager is + //! running + Window _supportwindow; + + //! A list of all managed clients on the screen, in their stacking order + ClientList _stacking; + + //! The desktop currently being displayed + unsigned int _desktop; + + //! The number of desktops + unsigned int _num_desktops; + + //! The names of all desktops + otk::Property::StringVect _desktop_names; + + //! The layout of the desktops as specified by an EWMH compliant pager + DesktopLayout _layout; + + //! True when the window manager is in 'showing desktop' mode + bool _showing_desktop; + + //! Calculate the Screen::_area member + void calcArea(); + //! Set the list of supported NETWM atoms on the root window + void changeSupportedAtoms(); + //! Set the client list on the root window + /*! + Sets the _NET_CLIENT_LIST root window property.
+ Also calls Screen::updateStackingList. + */ + void changeClientList(); + //! Set the client stacking list on the root window + /*! + Set the _NET_CLIENT_LIST_STACKING root window property. + */ + void changeStackingList(); + //! Set the work area hint on the root window + /*! + Set the _NET_WORKAREA root window property. + */ + void changeWorkArea(); + + //! Get desktop names from the root window property + void updateDesktopNames(); + + //! Gets the layout of the desktops from the root window property + void updateDesktopLayout(); + + //! Changes to the specified desktop, displaying windows on it and hiding + //! windows on the others. + /*! + @param desktop The number of the desktop to switch to (starts from 0). + If the desktop is out of valid range, it is ignored. + */ + void changeDesktop(unsigned int desktop); + + //! Changes the number of desktops. + /*! + @param num The number of desktops that should exist. This value must be + greater than 0 or it will be ignored. + */ + void changeNumDesktops(unsigned int num); - enum { WindowNoSnap = 0, WindowSnap, WindowResistance }; - enum { RowSmartPlacement = 1, ColSmartPlacement, CascadePlacement, - UnderMousePlacement, ClickMousePlacement, LeftRight, RightLeft, - TopBottom, BottomTop, IgnoreShaded, IgnoreMaximized }; - enum { Restart = 1, RestartOther, Exit, Shutdown, Execute, Reconfigure, - WindowShade, WindowIconify, WindowMaximize, WindowClose, WindowRaise, - WindowLower, WindowStick, WindowKill, SetStyle }; - enum FocusModel { SloppyFocus, ClickToFocus }; - enum RootScrollDirection { NoScroll = 0, NormalScroll, ReverseScroll }; - - BScreen(Blackbox *bb, unsigned int scrn); - ~BScreen(void); - - void LoadStyle(void); - - inline bool isSloppyFocus(void) const { return resource.sloppy_focus; } - inline bool isRootColormapInstalled(void) const - { return root_colormap_installed; } - inline bool doAutoRaise(void) const { return resource.auto_raise; } - inline bool doClickRaise(void) const { return resource.click_raise; } - inline bool isScreenManaged(void) const { return managed; } - inline bool doShadowFonts(void) const { return resource.shadow_fonts; } - inline bool doAAFonts(void) const { return resource.aa_fonts; } - inline bool doImageDither(void) const { return image_control->doDither(); } - inline bool doOrderedDither(void) const { return resource.ordered_dither; } - inline bool doOpaqueMove(void) const { return resource.opaque_move; } - inline bool doFullMax(void) const { return resource.full_max; } - inline bool doFocusNew(void) const { return resource.focus_new; } - inline bool doFocusLast(void) const { return resource.focus_last; } - inline int getWindowToWindowSnap(void) const - { return resource.snap_to_windows; } - inline int getWindowToEdgeSnap(void) const - { return resource.snap_to_edges; } - inline bool getWindowCornerSnap(void) const - { return resource.window_corner_snap; } - inline bool allowScrollLock(void) const { return resource.allow_scroll_lock; } - inline bool doWorkspaceWarping(void) const - { return resource.workspace_warping; } - inline int rootScrollDirection(void) const { return resource.root_scroll; } - - inline const GC &getOpGC(void) const { return opGC; } - - inline Blackbox *getBlackbox(void) { return blackbox; } - inline otk::BColor *getBorderColor(void) { - return &resource.wstyle.border_color; - } - inline otk::BImageControl *getImageControl(void) { return image_control; } - - Workspace *getWorkspace(unsigned int index) const; - - inline Workspace *getCurrentWorkspace(void) { return current_workspace; } - - inline unsigned int getResizeZones(void) const - { return resource.resize_zones; } - inline bool getPlaceIgnoreShaded(void) const - { return resource.ignore_shaded; } - inline bool getPlaceIgnoreMaximized(void) const - { return resource.ignore_maximized; } - - inline unsigned int getCurrentWorkspaceID(void) const - { return current_workspace->getID(); } - inline unsigned int getWorkspaceCount(void) const - { return workspacesList.size(); } - inline unsigned int getIconCount(void) const { return iconList.size(); } - inline unsigned int getNumberOfWorkspaces(void) const - { return resource.workspaces; } - inline int getPlacementPolicy(void) const - { return resource.placement_policy; } - inline int getSnapOffset(void) const - { return resource.snap_offset; } - inline int getSnapThreshold(void) const - { return resource.snap_threshold; } - inline int getResistanceSize(void) const - { return resource.resistance_size; } - inline int getRowPlacementDirection(void) const - { return resource.row_direction; } - inline int getColPlacementDirection(void) const - { return resource.col_direction; } - - void changeWorkspaceCount(unsigned int new_count); +public: +#ifndef SWIG + //! Constructs a new Screen object + Screen(int screen); + //! Destroys the Screen object + virtual ~Screen(); +#endif + + inline int number() const { return _number; } - inline void setRootColormapInstalled(bool r) { root_colormap_installed = r; } - void saveSloppyFocus(bool s); - void saveAutoRaise(bool a); - void saveClickRaise(bool c); - void saveWorkspaces(unsigned int w); - void savePlacementPolicy(int p); - void saveRowPlacementDirection(int d); - void saveColPlacementDirection(int d); - void saveSnapThreshold(int t); - void saveSnapOffset(int o); - void saveResistanceSize(int s); - void saveImageDither(bool d); - void saveShadowFonts(bool f); - void saveAAFonts(bool f); - void saveOpaqueMove(bool o); - void saveFullMax(bool f); - void saveFocusNew(bool f); - void saveFocusLast(bool f); - void saveWindowToEdgeSnap(int s); - void saveWindowToWindowSnap(int s); - void saveWindowCornerSnap(bool s); - void saveResizeZones(unsigned int z); - void savePlaceIgnoreShaded(bool i); - void savePlaceIgnoreMaximized(bool i); - void saveAllowScrollLock(bool a); - void saveWorkspaceWarping(bool w); - void saveRootScrollDirection(int d); - - inline const char *getStrftimeFormat(void) - { return resource.strftime_format.c_str(); } - void saveStrftimeFormat(const std::string& format); - - inline otk::Style *getWindowStyle(void) { return &resource.wstyle; } - - BlackboxWindow *getIcon(unsigned int index); - - // allAvailableAreas should be used whenever possible instead of this function - // as then Xinerama will work correctly. - const otk::Rect& availableArea(void) const; -#ifdef XINERAMA - const RectList& allAvailableAreas(void) const; -#endif // XINERAMA - void updateAvailableArea(void); - void addStrut(otk::Strut *strut); - void removeStrut(otk::Strut *strut); - - unsigned int addWorkspace(void); - unsigned int removeLastWorkspace(void); - void changeWorkspaceID(unsigned int id); - void saveWorkspaceNames(void); - - void addSystrayWindow(Window window); - void removeSystrayWindow(Window window); - - void addIcon(BlackboxWindow *w); - void removeIcon(BlackboxWindow *w); - - void updateClientList(void); - void updateStackingList(void); - void manageWindow(Window w); - void unmanageWindow(BlackboxWindow *w, bool remap); - void raiseWindows(Window *workspace_stack, unsigned int num); - void lowerWindows(Window *workspace_stack, unsigned int num); - void reassociateWindow(BlackboxWindow *w, unsigned int wkspc_id, - bool ignore_sticky); - void propagateWindowName(const BlackboxWindow *bw); - void prevFocus(void) const; - void nextFocus(void) const; - void raiseFocus(void) const; - void load_rc(void); - void save_rc(void); - void reconfigure(void); - void toggleFocusModel(FocusModel model); - void shutdown(void); - void showPosition(int x, int y); - void showGeometry(unsigned int gx, unsigned int gy); - void hideGeometry(void); - - void buttonPressEvent(const XButtonEvent *xbutton); - void propertyNotifyEvent(const XPropertyEvent *pe); + //! Returns if the screen was successfully managed + /*! + If this is false, then the screen should be deleted and should NOT be + used. + */ + inline bool managed() const { return _managed; } + //! An offscreen window which gets focus when nothing else has it + inline Window focuswindow() const { return _focuswindow; } + //! Returns the desktop being displayed + inline unsigned int desktop() const { return _desktop; } + //! Returns the number of desktops + inline unsigned int numDesktops() const { return _num_desktops; } + //! When true, the desktop is being shown and all clients are hidden + inline bool showingDesktop() const { return _showing_desktop; } + + //! Returns the area of the screen not reserved by applications' Struts + /*! + @param desktop The desktop number of the area to retrieve for. A value of + 0xffffffff will return an area that combines all struts + on all desktops. + */ + const otk::Rect& area(unsigned int desktop) const; + + const DesktopLayout& desktopLayout() const { return _layout; } + + //! Shows and focuses the desktop and hides all the client windows, or + //! returns to the normal state, showing client windows. + void showDesktop(bool show); + + //! Update's the screen's combined strut of all the clients. + /*! + Clients should call this whenever they change their strut. + */ + void updateStruts(); + + //! Manage any pre-existing windows on the screen + void manageExisting(); + //! Manage a client window + /*! + This gives the window a frame, reparents it, selects events on it, etc. + */ + void manageWindow(Window window); + //! Unmanage a client + /*! + This removes the window's frame, reparents it to root, unselects events on + it, etc. + @param client The client to unmanage + */ + void unmanageWindow(Client *client); + + //! Raises a client window above all others in its stacking layer + /*! + raiseWindow has a couple of constraints that lowerWindow does not.
+ 1) raiseWindow can be called after changing a Client's stack layer, and + the list will be reorganized properly.
+ 2) raiseWindow guarantees that XRestackWindows() will always be + called for the specified client. + */ + void raiseWindow(Client *client); + + //! Lowers a client window below all others in its stacking layer + void lowerWindow(Client *client); + + //! Sets the name of a desktop by changing the root window property + /*! + @param i The index of the desktop to set the name for (starts at 0) + @param name The name to set for the desktop + If the index is too large, it is simply ignored. + */ + void setDesktopName(unsigned int i, const otk::ustring &name); + + otk::ustring desktopName(unsigned int i) const; + + void installColormap(bool install) const; + + virtual void propertyHandler(const XPropertyEvent &e); + virtual void clientMessageHandler(const XClientMessageEvent &e); + virtual void mapRequestHandler(const XMapRequestEvent &e); }; } -#endif // __Screen_hh +#endif// __screen_hh