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
|
// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
#ifndef __screen_hh
#define __screen_hh
/*! @file screen.hh
@brief OBScreen manages a single screen
*/
extern "C" {
#include <X11/Xlib.h>
}
#include "rootwindow.hh"
#include "otk/image.hh"
#include "otk/strut.hh"
#include "otk/rect.hh"
#include "otk/style.hh"
#include "otk/configuration.hh" // TEMPORARY
#include <string>
namespace ob {
class OBClient;
class OBRootWindow;
//! Manages a single screen
/*!
*/
class OBScreen {
public:
//! Holds a list of OBClient objects
typedef std::list<OBClient*> ClientList;
//! Holds a list of otk::Strut objects
typedef std::list<otk::Strut*> StrutList;
static const unsigned long event_mask = ColormapChangeMask |
EnterWindowMask |
LeaveWindowMask |
PropertyChangeMask |
SubstructureNotifyMask |
SubstructureRedirectMask |
ButtonPressMask |
ButtonReleaseMask;
enum StackLayer {
Layer_Icon, // 0 - iconified windows, in any order at all
Layer_Desktop, // 1 - desktop windows
Layer_Below, // 2 - normal windows w/ below
Layer_Normal, // 3 - normal windows
Layer_Above, // 4 - normal windows w/ above
Layer_Top, // 5 - always-on-top-windows (docks?)
Layer_Fullscreen, // 6 - fullscreeen windows
Layer_Internal, // 7 - openbox windows/menus
NUM_LAYERS
};
//! All managed clients on the screen (in order of being mapped)
ClientList clients;
private:
//! 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;
//! The Image Control used for rendering on the screen
otk::BImageControl *_image_control;
//! The style with which to render on the screen
otk::Style _style;
//! The screen's root window
OBRootWindow _root;
//! Is the root colormap currently installed?
bool _root_cmap_installed;
//! Area usable for placement etc (total - struts)
otk::Rect _area;
//! Areas of the screen reserved by applications
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
ClientList _stacking;
//! Calculate the OBScreen::_area member
void calcArea();
//! Set the list of supported NETWM atoms on the root window
void setSupportedAtoms();
//! Set the client list on the root window
/*!
Sets the _NET_CLIENT_LIST root window property.<br>
Also calls OBScreen::updateStackingList.
*/
void setClientList();
//! Set the client stacking list on the root window
/*!
Set the _NET_CLIENT_LIST_STACKING root window property.
*/
void setStackingList();
//! Set the work area hint on the root window
/*!
Set the _NET_WORKAREA root window property.
*/
void setWorkArea();
public:
#ifndef SWIG
//! Constructs a new OBScreen object
OBScreen(int screen);
//! Destroys the OBScreen object
virtual ~OBScreen();
#endif
inline int number() const { return _number; }
//! 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; }
//! Returns the Image Control used for rendering on the screen
inline otk::BImageControl *imageControl() { return _image_control; }
//! Returns the area of the screen not reserved by applications' Struts
inline const otk::Rect &area() const { return _area; }
//! Returns the style in use on the screen
inline const otk::Style *style() const { return &_style; }
//! An offscreen window which gets focus when nothing else has it
inline Window focuswindow() const { return _focuswindow; }
//! Adds a window's strut to the screen's list of reserved spaces
void addStrut(otk::Strut *strut);
//! Removes a window's strut from the screen's list of reserved spaces
void removeStrut(otk::Strut *strut);
//! 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.
*/
void unmanageWindow(OBClient *client);
//! Raises/Lowers a client window above/below all others in its stacking
//! layer
void restack(bool raise, OBClient *client);
};
}
#endif// __screen_hh
|