X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fscreen.hh;h=4eb81d4aebd0b222beebf963f1fd48701ea543eb;hb=b18959e1bda52f807f62c95772c69ce3005215a7;hp=57a03b0b2979d15c89fff63c409c9afc57eb90c1;hpb=7bf96a9123a9f6b29a4c6168f7391db72f374f8a;p=chaz%2Fopenbox diff --git a/src/screen.hh b/src/screen.hh index 57a03b0b..4eb81d4a 100644 --- a/src/screen.hh +++ b/src/screen.hh @@ -1,340 +1,238 @@ // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- -// Screen.hh for Blackbox - an X11 Window manager -// Copyright (c) 2001 - 2002 Sean 'Shaleh' Perry -// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net) -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. - -#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 "otk/strut.hh" +#include "otk/rect.hh" +#include "otk/screeninfo.hh" +#include "otk/eventhandler.hh" +#include "otk/property.hh" +#include "otk/ustring.hh" + +#include #include -#include - -#include "color.hh" -#include "texture.hh" -#include "image.hh" -#include "timer.hh" -#include "workspace.hh" -#include "blackbox.hh" - -class Slit; // forward reference -class BFont; -class XAtom; -struct Strut; - -enum TextJustify { LeftJustify = 1, RightJustify, CenterJustify }; - -#ifdef BITMAPBUTTONS -struct PixmapMask { - Pixmap mask; - unsigned int w, h; -}; -#endif // BITMAPBUTTONS -struct WindowStyle { - BColor l_text_focus, l_text_unfocus, b_pic_focus, - b_pic_unfocus; - BTexture f_focus, f_unfocus, t_focus, t_unfocus, l_focus, l_unfocus, - h_focus, h_unfocus, b_focus, b_unfocus, b_pressed, b_pressed_focus, - b_pressed_unfocus, g_focus, g_unfocus; +namespace ob { -#ifdef BITMAPBUTTONS - PixmapMask close_button, max_button, icon_button, stick_button; -#endif // BITMAPBUTTONS - BFont *font; +class Client; - TextJustify justify; +struct DesktopLayout { + enum Corner { TopLeft, TopRight, BottomRight, BottomLeft }; + enum Direction { Horizontal, Vertical }; - void doJustify(const std::string &text, int &start_pos, - unsigned int max_length, unsigned int modifier) const; + Direction orientation; + Corner start_corner; + unsigned int rows; + unsigned int columns; }; -class BScreen : public ScreenInfo { +//! 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: - bool root_colormap_installed, managed, geom_visible; - GC opGC; - Pixmap geom_pixmap; - Window geom_window; - - Blackbox *blackbox; - BImageControl *image_control; - Configuration *config; - XAtom *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; - - Rect usableArea; -#ifdef XINERAMA - RectList xineramaUsableArea; -#endif // XINERAMA - - typedef std::list StrutList; - StrutList strutList; - typedef std::vector WorkspaceList; - WorkspaceList workspacesList; + //! Was %Openbox able to manage the screen? + bool _managed; - struct screen_resource { - WindowStyle wstyle; + //! The number of the screen on the X server + int _number; - 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; - - BColor border_color; - - unsigned int workspaces; - int placement_policy, - snap_threshold, row_direction, col_direction, root_scroll, - resistance_size; - - unsigned int handle_width, bevel_width, frame_width, border_width, - resize_zones; - - std::string strftime_format; - - } resource; - std::string screenstr; - - BScreen(const BScreen&); - BScreen& operator=(const BScreen&); - -#ifdef BITMAPBUTTONS - void readDatabaseMask(const std::string &rname, - PixmapMask &pixmapMask, - const Configuration &style); -#endif // BITMAPBUTTONS + //! Information about this screen + const otk::ScreenInfo *_info; - BTexture readDatabaseTexture(const std::string &rname, - const std::string &default_color, - const Configuration &style, - bool allowNoTexture = false); - BColor readDatabaseColor(const std::string &rname, - const std::string &default_color, - const Configuration &style); - BFont *readDatabaseFont(const std::string &rbasename, - const Configuration &style); - - void LoadStyle(void); - - void updateWorkArea(void); + //! 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); public: - // XXX: temporary - void updateNetizenWorkspaceCount(); - void updateNetizenWindowFocus(); +#ifndef SWIG + //! Constructs a new Screen object + Screen(int screen); + //! Destroys the Screen object + virtual ~Screen(); +#endif + + inline int number() const { return _number; } - - enum { WindowNoSnap = 0, WindowSnap, WindowResistance }; - enum { RowSmartPlacement = 1, ColSmartPlacement, CascadePlacement, - UnderMousePlacement, ClickMousePlacement, LeftRight, RightLeft, - TopBottom, BottomTop, IgnoreShaded, IgnoreMaximized }; - enum { RoundBullet = 1, TriangleBullet, SquareBullet, NoBullet }; - 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); - - 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 BColor *getBorderColor(void) { return &resource.border_color; } - inline BImageControl *getImageControl(void) { return image_control; } - - Workspace *getWorkspace(unsigned int index) const; - - inline Workspace *getCurrentWorkspace(void) { return current_workspace; } - - inline unsigned int getHandleWidth(void) const - { return resource.handle_width; } - inline unsigned int getBevelWidth(void) const - { return resource.bevel_width; } - inline unsigned int getFrameWidth(void) const - { return resource.frame_width; } - inline unsigned int getBorderWidth(void) const - { return resource.border_width; } - 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); - - 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 WindowStyle *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 Rect& availableArea(void) const; -#ifdef XINERAMA - const RectList& allAvailableAreas(void) const; -#endif // XINERAMA - void updateAvailableArea(void); - void addStrut(Strut *strut); - void removeStrut(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