all repos — openbox @ cee305244662d352a7ad5ab7ae22f6221c064d3d

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

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

  inline const otk::Style *style() const { return &_style; }
};

}

#endif// __screen_hh