Type_Dialog,
Type_Normal };
- enum MwmFlags { Functions = 1 << 0,
- Decorations = 1 << 1 };
+ enum MwmFlags { MwmFlag_Functions = 1 << 0,
+ MwmFlag_Decorations = 1 << 1 };
enum MwmFunctions { MwmFunc_All = 1 << 0,
MwmFunc_Resize = 1 << 1,
MwmFunc_Move = 1 << 2,
MwmFunc_Iconify = 1 << 3,
- MwmFunc_Maximize = 1 << 4,
- MwmFunc_Close = 1 << 5 };
+ MwmFunc_Maximize = 1 << 4
+ //MwmFunc_Close = 1 << 5
+ };
- enum MemDecorations { MemDecor_All = 1 << 0,
- MemDecor_Border = 1 << 1,
- MemDecor_Handle = 1 << 2,
- MemDecor_Title = 1 << 3,
- //MemDecor_Menu = 1 << 4,
- MemDecor_Iconify = 1 << 5,
- MemDecor_Maximize = 1 << 6 };
+ enum MemDecorations { MwmDecor_All = 1 << 0,
+ MwmDecor_Border = 1 << 1,
+ MwmDecor_Handle = 1 << 2,
+ MwmDecor_Title = 1 << 3,
+ //MwmDecor_Menu = 1 << 4,
+ MwmDecor_Iconify = 1 << 5,
+ MwmDecor_Maximize = 1 << 6 };
+
+ // the things the user can do to the client window
+ enum Function { Func_Resize = 1 << 0,
+ Func_Move = 1 << 1,
+ Func_Iconify = 1 << 2,
+ Func_Maximize = 1 << 3,
+ Func_Close = 1 << 4 };
+ typedef unsigned char FunctionFlags;
+
+ // the decorations the client window wants to be displayed on it
+ enum Decoration { Decor_Titlebar = 1 << 0,
+ Decor_Handle = 1 << 1,
+ Decor_Border = 1 << 2,
+ Decor_Iconify = 1 << 3,
+ Decor_Maximize = 1 << 4,
+ Decor_Close = 1 << 5 };
+ typedef unsigned char DecorationFlags;
// this structure only contains 3 elements... the Motif 2.0 structure
// contains 5... we only need the first 3... so that is all we will define
typedef struct MwmHints {
- static const int elements = 3;
+ static const unsigned int elements = 3;
unsigned long flags;
unsigned long functions;
unsigned long decorations;
};
private:
+ //! The actual window that this class is wrapping up
Window _window;
//! The id of the group the window belongs to
- XID _group;
+ Window _group;
// XXX: transient_for, transients
//! The desktop on which the window resides (0xffffffff for all desktops)
- unsigned int _desktop;
+ unsigned long _desktop;
//! Normal window title
- std::string _title;
+ std::string _title; // XXX: Have to keep track if this string is Utf8 or not
//! Window title when iconifiged
std::string _icon_title;
//! Position and size of the window (relative to the root window)
otk::Rect _area;
+ //! Width of the border on the window.
+ /*!
+ The window manager will set this to 0 while the window is being managed,
+ but needs to restore it afterwards, so it is saved here.
+ */
+ int _border_width;
+
// size bounds
// if min > max, then the window is not resizable
int _min_x, _min_y; // minumum size
//! The state of the window, one of WithdrawnState, IconicState, or
//! NormalState
- long _state;
+ long _wmstate;
+ //! Was the window's position requested by the application? if not, we should
+ //! place the window ourselves when it first appears
+ bool _positioned;
+
//! Can the window receive input focus?
bool _can_focus;
//! Urgency flag
//! The window should be on top of other windows of the same type
bool _floating;
- // XXX: motif decoration hints!
+ //! A bitmask of values in the OBClient::Decoration enum
+ /*!
+ The values in the variable are the decorations that the client wants to be
+ displayed around it.
+ */
+ DecorationFlags _decorations;
+
+ //! A bitmask of values in the OBClient::Function enum
+ /*!
+ The values in the variable specify the ways in which the user is allowed to
+ modify this window.
+ */
+ FunctionFlags _functions;
+
+ void getDesktop();
+ void getType();
+ void getMwmHints();
+ void getArea();
+ void getState();
+ void getShaped();
void setWMState(long state);
void setDesktop(long desktop);
void setState(StateAction action, long data1, long data2);
-
+
+ void updateProtocols();
void updateNormalHints();
void updateWMHints();
+ // XXX: updateTransientFor();
void updateTitle();
void updateClass();
inline Window window() const { return _window; }
inline WindowType type() const { return _type; }
- inline unsigned int desktop() const { return _desktop; }
+ inline unsigned long desktop() const { return _desktop; }
inline const std::string &title() const { return _title; }
inline const std::string &iconTitle() const { return _title; }
inline const std::string &appName() const { return _app_name; }
inline bool focusNotify() const { return _focus_notify; }
inline bool shaped() const { return _shaped; }
inline int gravity() const { return _gravity; }
+ inline bool positionRequested() const { return _positioned; }
+ inline DecorationFlags decorations() const { return _decorations; }
+ inline FunctionFlags funtions() const { return _functions; }
// states
inline bool modal() const { return _modal; }
inline bool fullscreen() const { return _fullscreen; }
inline bool floating() const { return _floating; }
+ inline int borderWidth() const { return _border_width; }
inline int minX() const { return _min_x; }
inline int minY() const { return _min_y; }
inline int maxX() const { return _max_x; }
void update(const XPropertyEvent &e);
void update(const XClientMessageEvent &e);
+
+ void setArea(const otk::Rect &area);
};
}