]> Dogcows Code - chaz/openbox/blobdiff - src/client.hh
add 'grab_server' for grabbing .. the .. server!
[chaz/openbox] / src / client.hh
index c8110a3f70e75661926412e374a7f3ce0dac998a..382ab1df01794e33adaf1d7dc59dca931858a7fa 100644 (file)
@@ -7,8 +7,7 @@
   property changes on the window and some client messages
 */
 
-#include "widgetbase.hh"
-#include "otk/point.hh"
+#include "screen.hh"
 #include "otk/strut.hh"
 #include "otk/rect.hh"
 #include "otk/eventhandler.hh"
@@ -28,6 +27,12 @@ extern "C" {
 namespace ob {
 
 class Frame;
+class Screen;
+
+struct Icon {
+  unsigned long w, h;
+  unsigned long *data;
+};
 
 //! The MWM Hints as retrieved from the window property
 /*!
@@ -54,7 +59,7 @@ struct MwmHints {
   class' member variables and call whatever is nessary to complete the
   change (such as causing a redraw of the titlebar after the title is changed).
 */
-class Client : public otk::EventHandler, public WidgetBase {
+class Client : public otk::EventHandler {
 public:
 
   //! The frame window which decorates around the client window
@@ -136,22 +141,17 @@ public:
   enum Decoration { Decor_Titlebar    = 1 << 0, //!< Display a titlebar
                     Decor_Handle      = 1 << 1, //!< Display a handle (bottom)
                     Decor_Border      = 1 << 2, //!< Display a border
-                    Decor_Iconify     = 1 << 3, //!< Display an iconify button
-                    Decor_Maximize    = 1 << 4, //!< Display a maximize button
+                    Decor_Icon        = 1 << 3, //!< Display the window's icon
+                    Decor_Iconify     = 1 << 4, //!< Display an iconify button
+                    Decor_Maximize    = 1 << 5, //!< Display a maximize button
                     //! Display a button to toggle the window's placement on
                     //! all desktops
-                    Decor_AllDesktops = 1 << 5,
-                    Decor_Close       = 1 << 6  //!< Display a close button
+                    Decor_AllDesktops = 1 << 6,
+                    Decor_Close       = 1 << 7  //!< Display a close button
   };
   //! Holds a bitmask of Client::Decoration values
   typedef unsigned char DecorationFlags;
 
-  //! Possible actions that can be made with the _NET_WM_STATE client message
-  enum StateAction { State_Remove = 0, //!< _NET_WM_STATE_REMOVE
-                     State_Add,        //!< _NET_WM_STATE_ADD
-                     State_Toggle      //!< _NET_WM_STATE_TOGGLE
-  };
-
   //! The event mask to grab on client windows
   static const long event_mask = PropertyChangeMask | FocusChangeMask |
                                  StructureNotifyMask;
@@ -164,10 +164,6 @@ public:
   static const long no_propagate_mask = ButtonPressMask | ButtonReleaseMask |
                                         ButtonMotionMask;
 
-  //! The desktop value which indicated the window is iconified and not on any
-  //! desktop
-  static const long ICONIC_DESKTOP = 0xfffffffe;
-
   //! The number of unmap events to ignore on the window
   int ignore_unmaps;
   
@@ -188,7 +184,7 @@ private:
   Client::List _transients;
 
   //! The desktop on which the window resides (0xffffffff for all desktops)
-  long _desktop;
+  unsigned int _desktop;
 
   //! Normal window title
   otk::ustring  _title;
@@ -227,7 +223,7 @@ private:
     For example, with xterms, this value it the number of characters being
     displayed in the terminal, instead of the number of pixels.
   */
-  otk::Point   _logical_size;
+  otk::Size   _logical_size;
 
   //! Width of the border on the window.
   /*!
@@ -236,24 +232,35 @@ private:
   */
   int _border_width;
 
+  //! The minimum aspect ratio the client window can be sized to.
+  /*!
+    A value of 0 means this is ignored.
+  */
+  float _min_ratio;
+  //! The maximum aspect ratio the client window can be sized to.
+  /*!
+    A value of 0 means this is ignored.
+  */
+  float _max_ratio;
+  
   //! The minimum size of the client window
   /*!
     If the min is > the max, then the window is not resizable
   */
-  otk::Point _min_size;
+  otk::Size _min_size;
   //! The maximum size of the client window
   /*!
     If the min is > the max, then the window is not resizable
   */
-  otk::Point _max_size;
+  otk::Size _max_size;
   //! The size of increments to resize the client window by
-  otk::Point _size_inc;
+  otk::Size _size_inc;
   //! The base size of the client window
   /*!
     This value should be subtracted from the window's actual size when
     displaying its size to the user, or working with its min/max size
   */
-  otk::Point _base_size;
+  otk::Size _base_size;
 
   //! Window decoration and functionality hints
   MwmHints _mwmhints;
@@ -306,6 +313,8 @@ private:
   //! The window should be underneath other windows of the same type
   bool _below;
 
+  //! The layer in which the window will be stacked, windows in lower layers
+  //! are always below windows in higher layers.
   StackLayer _layer;
 
   //! A bitmask of values in the Client::Decoration enum
@@ -315,6 +324,12 @@ private:
   */
   DecorationFlags _decorations;
 
+  //! A bitmask of values in the Client::Decoration enum.
+  /*!
+    Specifies the decorations that should NOT be displayed on the client.
+  */
+  DecorationFlags _disabled_decorations;
+
   //! A bitmask of values in the Client::Function enum
   /*!
     The values in the variable specify the ways in which the user is allowed to
@@ -322,6 +337,14 @@ private:
   */
   FunctionFlags _functions;
 
+  //! Icons for the client as specified on the client window
+  Icon *_icons;
+  //! The number of icons in _icons
+  int _nicons;
+
+  Pixmap _pixmap_icon;
+  Pixmap _pixmap_icon_mask;
+
   //! Retrieves the window's initial gravity
   void getGravity();
   //! Retrieves the desktop hint's value and sets Client::_desktop
@@ -356,14 +379,10 @@ private:
     Client::applyStartupState is used to do the same things during the mapping
     process.
   */
-  void setState(StateAction action, long data1, long data2);
+  void setState(Atom action, long data1, long data2);
 
   //! Sends the window to the specified desktop
-  /*!
-    A window is iconified by sending it to the ICONIC_DESKTOP, and restored
-    by sending it to any other valid desktop.
-  */
-  void setDesktop(long desktop);
+  void setDesktop(unsigned int desktop);
   
   //! Calculates the stacking layer for the client window
   void calcLayer();
@@ -390,6 +409,10 @@ private:
   void updateStrut();
   //! Updates the window's transient status, and any parents of it
   void updateTransientFor();
+  //! Updates the window's icons
+  void updateIcons();
+  //! Updates the window's kwm icon
+  void updateKwmIcon();
 
   //! Change the client's state hints to match the class' data
   void changeState();
@@ -406,6 +429,14 @@ private:
   */
   void shade(bool shade);
 
+  //! Recursively searches the client 'tree' for a modal client, always skips
+  //! the topmost node (the window you're starting with).
+  Client *Client::searchModalTree(Client *node, Client *skip);
+
+  //! Recursively searches the client 'tree' for a focused client, always skips
+  //! the topmost node (the window you're starting with).
+  Client *Client::searchFocusTree(Client *node, Client *skip);
+
   //! Fires the urgent callbacks which lets the user do what they want with
   //! urgent windows
   void fireUrgent();
@@ -414,21 +445,52 @@ private:
   /*!
     @param fs true if the window should be made fullscreen; false if it should
               be returned to normal state.
+    @param savearea true to have the client's current size and position saved;
+                    otherwise, they are not. You should not save when mapping a
+                    new window that is set to fullscreen. This has no effect
+                    when restoring a window from fullscreen.
+  */
+  void fullscreen(bool fs, bool savearea = true);
+
+  //! Iconifies or uniconifies the client window
+  /*!
+    @param iconic true if the window should be iconified; false if it should be
+                  restored.
+    @param curdesk If iconic is false, then this determines if the window will
+                   be uniconified to the current viewable desktop (true) or to
+                   its previous desktop (false)
   */
-  void fullscreen(bool fs);
+  void iconify(bool iconic, bool curdesk = true);
+
+  //! Maximize or unmaximize the client window
+  /*!
+    @param max true if the window should be maximized; false if it should be
+               returned to normal size.
+    @param dir 0 to set both horz and vert, 1 to set horz, 2 to set vert.
+    @param savearea true to have the client's current size and position saved;
+                    otherwise, they are not. You should not save when mapping a
+                    new window that is set to fullscreen. This has no effect
+                    when unmaximizing a window.
+  */
+  void maximize(bool max, int dir, bool savearea = true);
 
   //! Internal version of the Client::move function
   /*!
     @param x The X coordinate to move to.
     @param y The Y coordinate to move to.
+    @param final true if this is the final move, false if there are more move
+                 events coming. The client is not notified of the move when
+                 final is false.
   */
-  void internal_move(int x, int y);
+  void internal_move(int x, int y, bool final = true);
   //! Internal version of the Client::resize function
   /*!
     This also maintains things like the client's minsize, and size increments.
     @param anchor The corner to keep in the same position when resizing.
     @param w The width component of the new size for the client.
     @param h The height component of the new size for the client.
+    @param user Specifies whether this is a user-requested change or a
+                program requested change.
     @param x An optional X coordinate to which the window will be moved
              after resizing.
     @param y An optional Y coordinate to which the window will be moved
@@ -437,19 +499,32 @@ private:
     no effect. When they are specified, the anchor is ignored.
   */
   void internal_resize(Corner anchor, int w, int h,
-                       int x = INT_MIN, int y = INT_MIN);
+                       bool user = true, int x = INT_MIN, int y = INT_MIN);
+
+  //! Removes or reapplies the client's border to its window
+  /*!
+    Used when managing and unmanaging a window.
+    @param addborder true if adding the border to the client; false if removing
+                     from the client
+  */
+  void toggleClientBorder(bool addborder);
 
+  //! Applies the states requested when the window mapped
+  /*!
+    This should be called only once, during the window mapping process. It
+    applies things like maximized, and fullscreen.
+  */
+  void applyStartupState();
+  
 public:
-#ifndef SWIG
   //! Constructs a new Client object around a specified window id
   /*!
-BB    @param window The window id that the Client class should handle
+    @param window The window id that the Client class should handle
     @param screen The screen on which the window resides
   */
   Client(int screen, Window window);
   //! Destroys the Client object
   virtual ~Client();
-#endif
 
   //! Returns the screen on which the clien resides
   inline int screen() const { return _screen; }
@@ -474,7 +549,7 @@ BB    @param window The window id that the Client class should handle
     This value is a 0-based index.<br>
     A value of 0xffffffff indicates that the window exists on all desktops.
   */
-  inline long desktop() const { return _desktop; }
+  inline unsigned int desktop() const { return _desktop; }
   //! Returns the window's title
   inline const otk::ustring &title() const { return _title; }
   //! Returns the window's title when it is iconified
@@ -494,6 +569,8 @@ BB    @param window The window id that the Client class should handle
   inline bool urgent() const { return _urgent; }
   //! Returns if the window wants to be notified when it receives focus
   inline bool focusNotify() const { return _focus_notify; }
+  //! Returns if the window is the focused window
+  inline bool focused() const { return _focused; }
   //! Returns if the window uses the Shape extension
   inline bool shaped() const { return _shaped; }
   //! Returns the window's gravity
@@ -514,8 +591,12 @@ BB    @param window The window id that the Client class should handle
   //! Returns the decorations that the client window wishes to be displayed on
   //! it
   inline DecorationFlags decorations() const { return _decorations; }
+  //! Returns the decorations that the user has requested to be disabled on the
+  //! client
+  inline DecorationFlags disabledDecorations() const
+    { return _disabled_decorations; }
   //! Returns the functions that the user can perform on the window
-  inline FunctionFlags funtions() const { return _functions; }
+  inline FunctionFlags functions() const { return _functions; }
 
   //! Return the client this window is transient for
   inline Client *transientFor() const { return _transient_for; }
@@ -526,6 +607,10 @@ BB    @param window The window id that the Client class should handle
     focus while it exists/remains modal.
   */
   inline bool modal() const { return _modal; }
+  //! The window should not be displayed by pagers
+  inline bool skipPager() const { return _skip_pager; }
+  //! The window should not be displayed by taskbars
+  inline bool skipTaskbar() const { return _skip_taskbar; } 
   //! Returns if the window is shaded
   /*!
     When the window is shaded, only its titlebar is visible.
@@ -546,33 +631,57 @@ BB    @param window The window id that the Client class should handle
   //! Returns the window's stacking layer
   inline StackLayer layer() const { return _layer; }
 
-  //! Applies the states requested when the window mapped
+  //! Returns the logical size of the window
   /*!
-    This should be called only once, during the window mapping process. It
-    applies things like maximized, and fullscreen.
-  */
-  void applyStartupState();
-  
-  //! Removes or reapplies the client's border to its window
-  /*!
-    Used when managing and unmanaging a window.
-    @param addborder true if adding the border to the client; false if removing
-                     from the client
+    The "logical" size of the window is refers to the user's perception of the
+    size of the window, and is the value that should be displayed to the user.
+    For example, with xterms, this value it the number of characters being
+    displayed in the terminal, instead of the number of pixels.
   */
-  void toggleClientBorder(bool addborder);
+  const otk::Size &logicalSize() const { return _logical_size; }
 
   //! Returns the position and size of the client relative to the root window
+  /*!
+    Note that this value is *not* the size and position of the window's
+    frame, though the position will often line up.<br>
+    If you want the frame's area, use Frame::area() instead.
+  */
   inline const otk::Rect &area() const { return _area; }
 
   //! Returns the client's strut definition
   inline const otk::Strut &strut() const { return _strut; }
 
-  //! Move the client window
+  //! Returns an icon for the window
+  /*!
+    The icon chosen will be the smallest icon available that is still bigger or
+    equal to the specified Size.<br>
+    If none that meet the requirements is found, the largest icon that is
+    smaller than the specified size will be returned.
+  */
+  const Icon *icon(const otk::Size &s) const;
+
+  //! Returns the pixmap for the pixmap icon specified on the window (or None)
+  /*!
+    The icon given by Client::icon should take precedence over this icon/mask.
+  */
+  Pixmap pixmapIcon() const { return _pixmap_icon; }
+  //! Returns the mask for the pixmap icon specified on the window (or None)
   /*!
+    The icon given by Client::icon should take precedence over this icon/mask.
+  */
+  Pixmap pixmapIconMask() const { return _pixmap_icon_mask; }
+  
+  //! Move the window (actually, its frame) to a position.
+  /*!
+    This moves the window so that the top-left corner of its frame will be at
+    the position specified.
     @param x The X coordinate to move to.
     @param y The Y coordinate to move to.
+    @param final true if this is the final move, false if there are more move
+                 events coming. The client is not notified of the move when
+                 final is false.
   */
-  void move(int x, int y);
+  void move(int x, int y, bool final = true);
   
   //! Resizes the client window, anchoring it in a given corner
   /*!
@@ -583,12 +692,51 @@ BB    @param window The window id that the Client class should handle
   */
   void resize(Corner anchor, int w, int h);
 
+  //! Reapplies the maximized state to the window
+  /*!
+    Use this to make the window readjust its maximized size to new
+    surroundings (struts, etc).
+  */
+  void remaximize();
+
+  //! Shows the window if it should be shown, or hides it
+  /*!
+    Used when changing desktops, the window's state, etc.
+  */
+  void showhide();
+  
+  //! Choose a mask of decorations to not display on the client
+  /*!
+    Pass a value of 0 to the function to turn all decorations back on. Note
+    that you cannot add decorations to a window with this, you can only remove
+    decorations that would otherwise have been displayed.
+    @param flags The mask of values from Client::Decoration to specify which
+                 decorations should not be displayed.
+  */
+  void disableDecorations(DecorationFlags flags);
+  
+  //! Return a modal child of the client window
+  /*!
+    @return A modal child of the client window, or 0 if none was found.
+  */
+  Client *findModalChild();
+
   //! Attempt to focus the client window
   bool focus();
 
   //! Remove focus from the client window
   void unfocus() const;
 
+  //! Validate client, by making sure no Destroy or Unmap events exist in
+  //! the event queue for the window.
+  /*!
+    @return true if the client is valid; false if the client has already
+            been unmapped/destroyed, and so is invalid.
+  */
+  bool validate() const;
+
+  void installColormap(bool install) const;
+  
   virtual void focusHandler(const XFocusChangeEvent &e);
   virtual void unfocusHandler(const XFocusChangeEvent &e);
   virtual void propertyHandler(const XPropertyEvent &e);
@@ -600,7 +748,10 @@ BB    @param window The window id that the Client class should handle
   virtual void mapRequestHandler(const XMapRequestEvent &e);
 #if defined(SHAPE)
   virtual void shapeHandler(const XShapeEvent &e);
-#endif // SHAPE 
+#endif // SHAPE
+
+  friend void Screen::manageWindow(Window);
+  friend void Screen::unmanageWindow(Client *);
 };
 
 }
This page took 0.034947 seconds and 4 git commands to generate.