X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fscreen.hh;h=543e216cb05974e1b1310922d0c040e7d67a9b6e;hb=9e0ae7ecee94a0cc467d90926428fdc84f9a0339;hp=53fdffdd2c21e79938d32b6a4591428554267a35;hpb=db451d95bf97b8a8e995f031ac98da50606fd3a0;p=chaz%2Fopenbox diff --git a/src/screen.hh b/src/screen.hh index 53fdffdd..543e216c 100644 --- a/src/screen.hh +++ b/src/screen.hh @@ -1,432 +1,141 @@ // -*- 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 OBScreen 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 "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 }; +#include "rootwindow.hh" +#include "otk/image.hh" +#include "otk/strut.hh" +#include "otk/rect.hh" +#include "otk/style.hh" +#include "otk/configuration.hh" // TEMPORARY -#ifdef BITMAPBUTTONS -struct PixmapMask { - Pixmap mask; - unsigned int w, h; -}; -#endif // BITMAPBUTTONS +#include -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 OBClient; +class OBRootWindow; - TextJustify justify; +//! Manages a single screen +/*! +*/ +class OBScreen { +public: + //! Holds a list of OBClient objects + typedef std::list ClientList; + //! Holds a list of otk::Strut objects + typedef std::list StrutList; + + static const unsigned long event_mask = ColormapChangeMask | + EnterWindowMask | + LeaveWindowMask | + PropertyChangeMask | + SubstructureNotifyMask | + SubstructureRedirectMask | + ButtonPressMask | + ButtonReleaseMask; - void doJustify(const std::string &text, int &start_pos, - unsigned int max_length, unsigned int modifier) const; -}; +private: + //! Was %Openbox able to manage the screen? + bool _managed; -struct ToolbarStyle { - BColor l_text, w_text, c_text, b_pic; - BTexture toolbar, label, window, button, pressed, clock; + //! The number of the screen on the X server + int _number; -#ifdef BITMAPBUTTONS - PixmapMask left_button, right_button; -#endif // BITMAPBUTTONS + //! Information about this screen + const otk::ScreenInfo *_info; - BFont *font; + //! The Image Control used for rendering on the screen + otk::BImageControl *_image_control; - TextJustify justify; + //! The style with which to render on the screen + otk::Style _style; - void doJustify(const std::string &text, int &start_pos, - unsigned int max_length, unsigned int modifier) const; -}; - -struct MenuStyle { - BColor t_text, f_text, h_text, d_text; - BTexture title, frame, hilite; + OBRootWindow _root; -#ifdef BITMAPBUTTONS - PixmapMask bullet_image, tick_image; -#endif // BITMAPBUTTONS - - BFont *t_font, *f_font; - - TextJustify t_justify, f_justify; - int bullet, bullet_pos; -}; - -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 + //! Is the root colormap currently installed? + bool _root_cmap_installed; + + //! All managed clients on the screen + ClientList _clients; + + //! Area usable for placement etc (total - struts) + otk::Rect _area; + + //! Areas of the screen reserved by applications + StrutList _struts; + + + //! Calculate the OBScreen::_area member + void calcArea(); + //! Set the client list on the root window + /*! + Sets the _NET_CLIENT_LIST root window property.
+ Also calls OBScreen::updateStackingList. + */ + void setClientList(); + //! Set the client stacking list on the root window + /*! + Set the _NET_CLIENT_LIST_STACKING root window property. + */ + void setStackingList(); + //! Set the work area hint on the root window + /*! + Set the _NET_WORKAREA root window property. + */ + void setWorkArea(); - 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); - - 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); + //! Constructs a new OBScreen object + OBScreen(int screen, const otk::Configuration &config); + //! Destroys the OBScreen object + virtual ~OBScreen(); + + //! 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 Image Control used for rendering on the screen + inline otk::BImageControl *imageControl() { return _image_control; } + //! Returns the area of the screen not reserved by applications' Struts + inline const otk::Rect &area() const { return _area; } + //! Returns the style in use on the screen + inline const otk::Style *style() const { return &_style; } + + + //! Adds a window's strut to the screen's list of reserved spaces + void addStrut(otk::Strut *strut); + //! Removes a window's strut from the screen's list of reserved spaces + void removeStrut(otk::Strut *strut); + + //! Loads a new style on the screen + void loadStyle(const otk::Configuration &config); + + //! 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. + */ + void unmanageWindow(OBClient *client); }; +} -#endif // __Screen_hh +#endif// __screen_hh