]> Dogcows Code - chaz/openbox/blobdiff - src/client.hh
add 'grab_server' for grabbing .. the .. server!
[chaz/openbox] / src / client.hh
index 6b44706ee4f299920cf05e172ebb9ac72726c2e1..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.
   /*!
@@ -251,20 +247,20 @@ private:
   /*!
     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;
@@ -317,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
@@ -339,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
@@ -373,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();
@@ -407,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();
@@ -423,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();
@@ -433,9 +447,20 @@ private:
               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.
+                    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, bool savearea);
+  void iconify(bool iconic, bool curdesk = true);
 
   //! Maximize or unmaximize the client window
   /*!
@@ -444,16 +469,20 @@ private:
     @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.
+                    new window that is set to fullscreen. This has no effect
+                    when unmaximizing a window.
   */
-  void maximize(bool max, int dir, bool savearea);
+  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.
@@ -469,20 +498,33 @@ private:
     The x and y coordinates must both be sepcified together, or they will have
     no effect. When they are specified, the anchor is ignored.
   */
-  void internal_resize(Corner anchor, int w, int h, bool user = true,
-                       int x = INT_MIN, int y = INT_MIN);
+  void internal_resize(Corner anchor, int w, int h,
+                       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; }
@@ -507,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
@@ -527,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
@@ -552,7 +596,7 @@ BB    @param window The window id that the Client class should handle
   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; }
@@ -567,7 +611,7 @@ BB    @param window The window id that the Client class should handle
   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
 //! Returns if the window is shaded
   /*!
     When the window is shaded, only its titlebar is visible.
   */
@@ -594,37 +638,50 @@ BB    @param window The window id that the Client class should handle
     For example, with xterms, this value it the number of characters being
     displayed in the terminal, instead of the number of pixels.
   */
-  const otk::Point &logicalSize() const { return _logical_size; }
+  const otk::Size &logicalSize() const { return _logical_size; }
 
-  //! 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();
-  
-  //! Removes or reapplies the client's border to its window
+  //! Returns the position and size of the client relative to the root window
   /*!
-    Used when managing and unmanaging a window.
-    @param addborder true if adding the border to the client; false if removing
-                     from the client
+    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.
   */
-  void toggleClientBorder(bool addborder);
-
-  //! Returns the position and size of the client relative to the root window
   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 bool framepos True if the frame should be moved to the position
-                instead of the client. This makes it ignore the gravity.
+    @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, bool framepos = false);
+  void move(int x, int y, bool final = true);
   
   //! Resizes the client window, anchoring it in a given corner
   /*!
@@ -641,6 +698,12 @@ BB    @param window The window id that the Client class should handle
     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
   /*!
@@ -652,6 +715,12 @@ BB    @param window The window id that the Client class should handle
   */
   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();
 
@@ -666,6 +735,8 @@ BB    @param window The window id that the Client class should handle
   */
   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);
@@ -677,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.030584 seconds and 4 git commands to generate.