X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fscreen.hh;h=2f0260831ca90a32183de2c212077238ac9eff14;hb=d2a1ecb1b50902d262a74e347203a36a961e1d92;hp=53fdffdd2c21e79938d32b6a4591428554267a35;hpb=db451d95bf97b8a8e995f031ac98da50606fd3a0;p=chaz%2Fopenbox diff --git a/src/screen.hh b/src/screen.hh index 53fdffdd..2f026083 100644 --- a/src/screen.hh +++ b/src/screen.hh @@ -1,432 +1,237 @@ // -*- 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 "config.hh" +#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 "configmenu.hh" -#include "iconmenu.hh" -#include "netizen.hh" -#include "rootmenu.hh" -#include "timer.hh" -#include "workspace.hh" -#include "workspacemenu.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; }; -struct ToolbarStyle { - BColor l_text, w_text, c_text, b_pic; - BTexture toolbar, label, window, button, pressed, clock; - -#ifdef BITMAPBUTTONS - PixmapMask left_button, right_button; -#endif // BITMAPBUTTONS +//! 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; + + //! All managed clients on the screen (in order of being mapped) + std::list clients; - BFont *font; +private: + //! Was %Openbox able to manage the screen? + bool _managed; - TextJustify justify; + //! The number of the screen on the X server + int _number; - void doJustify(const std::string &text, int &start_pos, - unsigned int max_length, unsigned int modifier) const; -}; + //! Information about this screen + const otk::ScreenInfo *_info; -struct MenuStyle { - BColor t_text, f_text, h_text, d_text; - BTexture title, frame, hilite; + //! Configuration options from the user scripts + Config _config; -#ifdef BITMAPBUTTONS - PixmapMask bullet_image, tick_image; -#endif // BITMAPBUTTONS - - BFont *t_font, *f_font; - - TextJustify t_justify, f_justify; - int bullet, bullet_pos; -}; + //! 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 + std::list _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); -class BScreen : public ScreenInfo { -private: - bool root_colormap_installed, managed, geom_visible; - GC opGC; - Pixmap geom_pixmap; - Window geom_window; - - Blackbox *blackbox; - BImageControl *image_control; - Configmenu *configmenu; - Iconmenu *iconmenu; - Rootmenu *rootmenu; - Configuration *config; - XAtom *xatom; - - typedef std::list RootmenuList; - RootmenuList rootmenuList; - - typedef std::list NetizenList; - NetizenList netizenList; - BlackboxWindowList iconList, windowList; - - typedef std::vector WindowList; - WindowList specialWindowList, desktopWindowList, systrayWindowList; - - Slit *slit; - Toolbar *toolbar; - Workspace *current_workspace; - Workspacemenu *workspacemenu; - - 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; - - struct screen_resource { - WindowStyle wstyle; - ToolbarStyle tstyle; - MenuStyle mstyle; - - bool sloppy_focus, auto_raise, auto_edge_balance, ordered_dither, - opaque_move, full_max, focus_new, focus_last, click_raise, - allow_scroll_lock, hide_toolbar, 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 toolbar_placement, toolbar_width_percent, placement_policy, - snap_threshold, row_direction, col_direction, root_scroll, - resistance_size; - - unsigned int handle_width, bevel_width, frame_width, border_width, - resize_zones; - - unsigned int root_menu_button, workspace_menu_button; - -#ifdef HAVE_STRFTIME - std::string strftime_format; -#else // !HAVE_STRFTIME - bool clock24hour; - int date_format; -#endif // HAVE_STRFTIME - - } resource; - std::string screenstr; - - BScreen(const BScreen&); - BScreen& operator=(const BScreen&); - - bool parseMenuFile(FILE *file, Rootmenu *menu); - -#ifdef BITMAPBUTTONS - void readDatabaseMask(const std::string &rname, - PixmapMask &pixmapMask, - const Configuration &style); -#endif // BITMAPBUTTONS - - 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 InitMenu(void); - void LoadStyle(void); - - void updateWorkArea(void); public: - 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 bool doHideToolbar(void) const { return resource.hide_toolbar; } - 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 unsigned int rootMenuButton(void) const - { return resource.root_menu_button; } - inline unsigned int workspaceMenuButton(void) const - { return resource.workspace_menu_button; } - - 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; } - inline Rootmenu *getRootmenu(void) { return rootmenu; } - - inline Slit *getSlit(void) { return slit; } - inline Toolbar *getToolbar(void) { return toolbar; } - - Workspace *getWorkspace(unsigned int index) const; - - inline Workspace *getCurrentWorkspace(void) { return current_workspace; } - - inline Workspacemenu *getWorkspacemenu(void) { return workspacemenu; } - - 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); + //! Constructs a new Screen object + Screen(int screen); + //! Destroys the Screen object + virtual ~Screen(); + + 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 saveHideToolbar(bool h); - 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); - void saveRootMenuButton(unsigned int b); - void saveWorkspaceMenuButton(unsigned int b); - inline void iconUpdate(void) { iconmenu->update(); } - -#ifdef HAVE_STRFTIME - inline const char *getStrftimeFormat(void) - { return resource.strftime_format.c_str(); } - void saveStrftimeFormat(const std::string& format); -#else // !HAVE_STRFTIME - inline int getDateFormat(void) { return resource.date_format; } - inline void saveDateFormat(int f); - inline bool isClock24Hour(void) { return resource.clock24hour; } - inline void saveClock24Hour(bool c); -#endif // HAVE_STRFTIME - - inline WindowStyle *getWindowStyle(void) { return &resource.wstyle; } - inline MenuStyle *getMenuStyle(void) { return &resource.mstyle; } - inline ToolbarStyle *getToolbarStyle(void) { return &resource.tstyle; } - - 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 addNetizen(Netizen *n); - void removeNetizen(Window w); - - 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 rereadMenu(void); - void shutdown(void); - void showPosition(int x, int y); - void showGeometry(unsigned int gx, unsigned int gy); - void hideGeometry(void); - - void showWorkspaceMenu(int x, int y); - void showRootMenu(int x, int y); - - void buttonPressEvent(const XButtonEvent *xbutton); - void propertyNotifyEvent(const XPropertyEvent *pe); - - void updateNetizenCurrentWorkspace(void); - void updateNetizenWorkspaceCount(void); - void updateNetizenWindowFocus(void); - void updateNetizenWindowAdd(Window w, unsigned long p); - void updateNetizenWindowDel(Window w); - void updateNetizenConfigNotify(XEvent *e); - void updateNetizenWindowRaise(Window w); - void updateNetizenWindowLower(Window w); + //! 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; } + + //! Returns the config options set by the user scripts + Config& config() { return _config; } + + //! 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; + + //! Gives the layout of how the desktops are being displayed, the number of + //! rows and columns etc. + 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); + + const otk::Property::StringVect& desktopNames() const + { return _desktop_names; } + + 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