all repos — openbox @ d363f720a6b0d1c361bc2022d0e5fcd5a75fd04d

openbox fork - make it a bit more like ryudo

src/client.hh (raw)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
#ifndef   __client_hh
#define   __client_hh

extern "C" {
#include <X11/Xlib.h>
}

#include <string>

#include "otk/strut.hh"
#include "otk/rect.hh"

namespace ob {

class OBClient {
public:
  enum Max { Max_None,
             Max_Horz,
             Max_Vert,
             Max_Full };

  enum WindowType { Type_Desktop,
                    Type_Dock,
                    Type_Toolbar,
                    Type_Menu,
                    Type_Utility,
                    Type_Splash,
                    Type_Dialog,
                    Type_Normal };

  enum MwmFlags { Functions   = 1 << 0,
                  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 };

  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 };

  // 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;
    unsigned long flags;
    unsigned long functions;
    unsigned long decorations;
  };

  enum StateAction { State_Remove = 0, // _NET_WM_STATE_REMOVE
                     State_Add,        // _NET_WM_STATE_ADD
                     State_Toggle      // _NET_WM_STATE_TOGGLE
  };

private:
  Window   _window;

  //! The id of the group the window belongs to
  XID       _group;

  // XXX: transient_for, transients

  //! The desktop on which the window resides (0xffffffff for all desktops)
  unsigned int _desktop;

  //! Normal window title
  std::string  _title;
  //! Window title when iconifiged
  std::string  _icon_title;

  //! The application that created the window
  std::string  _app_name;
  //! The class of the window, can used for grouping
  std::string  _app_class;

  //! The type of window (what its function is)
  WindowType   _type;

  //! Position and size of the window (relative to the root window)
  otk::Rect    _area;

  // size bounds
  // if min > max, then the window is not resizable
  int _min_x, _min_y; // minumum size
  int _max_x, _max_y; // maximum size
  int _inc_x, _inc_y; // resize increments
  int _base_x, _base_y; // base size

  //! Where to place the decorated window in relation to the undecorated window
  int _gravity;

  //! The state of the window, one of WithdrawnState, IconicState, or
  //! NormalState
  long _state;

  //! Can the window receive input focus?
  bool _can_focus;
  //! Urgency flag
  bool _urgent;
  //! Notify the window when it receives focus?
  bool _focus_notify;

  //! The window uses shape extension to be non-rectangular?
  bool _shaped;

  //! The window is modal, so it must be processed before any windows it is
  //! related to can be focused
  bool _modal;
  //! Only the window's titlebar is displayed
  bool _shaded;
  //! The window is iconified
  bool _iconic;
  //! The window is maximized to fill the screen vertically
  bool _max_vert;
  //! The window is maximized to fill the screen horizontally
  bool _max_horz;
  //! The window is a 'fullscreen' window, and should be on top of all others
  bool _fullscreen;
  //! The window should be on top of other windows of the same type
  bool _floating;

  // XXX: motif decoration hints!

  void setWMState(long state);
  void setDesktop(long desktop);
  void setState(StateAction action, long data1, long data2);
  
  void updateNormalHints();
  void updateWMHints();
  void updateTitle();
  void updateClass();

public:
  OBClient(Window window);
  virtual ~OBClient();

  inline Window window() const { return _window; }

  inline WindowType type() const { return _type; }
  inline unsigned int 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 const std::string &appClass() const { return _app_class; }
  inline bool canFocus() const { return _can_focus; }
  inline bool urgent() const { return _urgent; }
  inline bool focusNotify() const { return _focus_notify; }
  inline bool shaped() const { return _shaped; }
  inline int gravity() const { return _gravity; }

  // states
  inline bool modal() const { return _modal; }
  inline bool shaded() const { return _shaded; }
  inline bool iconic() const { return _iconic; }
  inline bool maxVert() const { return _max_vert; }
  inline bool maxHorz() const { return _max_horz; }
  inline bool fullscreen() const { return _fullscreen; }
  inline bool floating() const { return _floating; }

  inline int minX() const { return _min_x; }
  inline int minY() const { return _min_y; }
  inline int maxX() const { return _max_x; }
  inline int maxY() const { return _max_y; }
  inline int incrementX() const { return _inc_x; }
  inline int incrementY() const { return _inc_y; }
  inline int baseX() const { return _base_x; }
  inline int baseY() const { return _base_y; }

  inline const otk::Rect &area() const { return _area; }

  void update(const XPropertyEvent &e);
  void update(const XClientMessageEvent &e);
};

}

#endif // __client_hh