all repos — openbox @ 06a80ce2c7a189e26063d5e4e475ca500778aba5

openbox fork - make it a bit more like ryudo

src/screen.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
// -*- 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 "otk/image.hh"
#include "otk/strut.hh"
#include "otk/rect.hh"
#include "otk/point.hh"
#include "otk/style.hh"
#include "otk/configuration.hh" // TEMPORARY

#include <string>

namespace ob {

class OBClient;

//! Manages a single screen
/*!
*/
class OBScreen {
public:
  //! Holds a list of OBClient objects
  typedef std::vector<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;

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;

  //! Is the root colormap currently installed?
  bool _root_cmap_installed;

  //! The dimentions of the screen
  otk::Point _size;

  //! All managed clients on the screen
  ClientList _clients;

  //! Area usable for placement etc (total - struts)
  otk::Rect _area;

  //! Areas of the screen reserved by applications
  StrutList _struts;


  //! Manage any pre-existing windows on the screen
  void manageExisting();
  //! Calculate the OBScreen::_area member
  void calcArea();
  //! 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:
  //! Constructs a new OBScreen object
  OBScreen(int screen, const otk::Configuration &config);
  //! Destroys the OBScreen object
  virtual ~OBScreen();

  //! Returns the Image Control used for rendering on the screen
  inline otk::BImageControl *imageControl() { return _image_control; }
  //! Returns the dimentions of the screen
  inline const otk::Point &size() const { return _size; }
  //! 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; }


  //! 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);

  //! Loads a new style on the screen
  void loadStyle(const otk::Configuration &config);

  //! 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);
};

}

#endif// __screen_hh