]> Dogcows Code - chaz/openbox/blobdiff - src/screen.hh
speed up workspace switching by causing the minimal number of expose events (none...
[chaz/openbox] / src / screen.hh
index 53fdffdd2c21e79938d32b6a4591428554267a35..20ba0a63243f9349325b4f523df7e39cfddaceb3 100644 (file)
 // -*- 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 <shaleh@debian.org>
-// 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 <X11/Xlib.h>
-
-#ifdef    TIME_WITH_SYS_TIME
-#  include <sys/time.h>
-#  include <time.h>
-#else // !TIME_WITH_SYS_TIME
-#  ifdef    HAVE_SYS_TIME_H
-#    include <sys/time.h>
-#  else // !HAVE_SYS_TIME_H
-#    include <time.h>
-#  endif // HAVE_SYS_TIME_H
-#endif // TIME_WITH_SYS_TIME
 }
 
-#include <list>
-#include <vector>
-
-#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;
+#include "otk/strut.hh"
+#include "otk/rect.hh"
+#include "otk/screeninfo.hh"
+#include "otk/eventhandler.hh"
+#include "otk/property.hh"
+#include "otk/ustring.hh"
 
-#ifdef    BITMAPBUTTONS
-  PixmapMask close_button, max_button, icon_button, stick_button;
-#endif // BITMAPBUTTONS
-  BFont *font;
-
-  TextJustify justify;
-
-  void doJustify(const std::string &text, int &start_pos,
-                 unsigned int max_length, unsigned int modifier) const;
-};
+#include <string>
+#include <list>
 
-struct ToolbarStyle {
-  BColor l_text, w_text, c_text, b_pic;
-  BTexture toolbar, label, window, button, pressed, clock;
+namespace ob {
 
-#ifdef    BITMAPBUTTONS
-  PixmapMask left_button, right_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 MenuStyle {
-  BColor t_text, f_text, h_text, d_text;
-  BTexture title, frame, hilite;
-  
-#ifdef    BITMAPBUTTONS
-  PixmapMask bullet_image, tick_image;
-#endif // BITMAPBUTTONS
+//! Manages a single screen
+/*!
+*/
+class Screen : public otk::EventHandler {
+public:
+  //! Holds a list of otk::Strut objects
+  typedef std::vector<otk::Strut> StrutList;
+  //! Holds a list of otk::Rect objects
+  typedef std::vector<otk::Rect> 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<Client*> clients;
   
-  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<Rootmenu*> RootmenuList;
-  RootmenuList rootmenuList;
-
-  typedef std::list<Netizen*> NetizenList;
-  NetizenList netizenList;
-  BlackboxWindowList iconList, windowList;
-
-  typedef std::vector<Window> 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<Strut*> StrutList;
-  StrutList strutList;
-  typedef std::vector<Workspace*> 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);
+  //! Was %Openbox able to manage the screen?
+  bool _managed;
+
+  //! The number of the screen on the X server
+  int _number;
+
+  //! 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
+  std::list<Client*> _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.<br>
+    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:
-  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; }
+
+  //!  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.<br>
+    1) raiseWindow can be called after changing a Client's stack layer, and
+       the list will be reorganized properly.<br>
+    2) raiseWindow guarantees that XRestackWindows() will <i>always</i> 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
This page took 0.03659 seconds and 4 git commands to generate.