all repos — openbox @ 6bad7e676ad841ffce8e2a05f0d8538f149454ea

openbox fork - make it a bit more like ryudo

src/frame.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
// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
#ifndef   __frame_hh
#define   __frame_hh

/*! @file frame.hh
*/

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

#include "client.hh"
#include "backgroundwidget.hh"
#include "labelwidget.hh"
#include "buttonwidget.hh"
#include "otk/strut.hh"
#include "otk/rect.hh"
#include "otk/screeninfo.hh"
#include "otk/style.hh"
#include "otk/widget.hh"

#include <string>

namespace ob {

//! Holds and decorates a frame around an OBClient (client window)
/*!
  The frame is responsible for calling XSelectInput on the client window's new
  parent with the SubstructureRedirectMask so that structure events for the
  client are sent to the window manager.
*/
class OBFrame : public otk::OtkWidget, public OBWidget {
public:

  //! The event mask to grab on frame windows
  static const long event_mask = EnterWindowMask | LeaveWindowMask;
   
private:
  OBClient *_client;
  const otk::ScreenInfo *_screen;

  //! The style to use for size and display the decorations
  otk::Style *_style;

  //! The size of the frame on each side of the client window
  otk::Strut _size;

  //! The size of the frame on each side of the client window inside the border
  otk::Strut _innersize;

  // decoration windows
  OBBackgroundWidget  _plate;   // sits entirely under the client window
  OBBackgroundWidget  _titlebar;
  OBButtonWidget      _button_close;
  OBButtonWidget      _button_iconify;
  OBButtonWidget      _button_max;
  OBButtonWidget      _button_stick;
  OBLabelWidget       _label;
  OBBackgroundWidget  _handle;
  OBButtonWidget      _grip_left;
  OBButtonWidget      _grip_right;

  //! The decorations to display on the window.
  /*!
    This is by default the same value as in the OBClient::decorations, but it
    is duplicated here so that it can be overridden per-window by the user.
  */
  OBClient::DecorationFlags _decorations;

public:
  //! Constructs an OBFrame object, and reparents the client to itself
  /*!
    @param client The client window which will be decorated by the new OBFrame
    @param style The style to use to decorate the frame
  */
  OBFrame(OBClient *client, otk::Style *style);
  //! Destroys the OBFrame object
  virtual ~OBFrame();

  //! Set the style to decorate the frame with
  virtual void setStyle(otk::Style *style);

  //! Empty overridden method to prevent automatic alignment of children
  virtual void adjust();
  
  //! Displays focused decorations
  virtual void focus();
  //! Displays unfocused decorations
  virtual void unfocus();

  void setTitle(const std::string &text);
 
  //! Reparents the client window from the root window onto the frame
  void grabClient();
  //! Reparents the client window back to the root window
  /*!
    This is not to be called if the client has already reparented itself.
  */
  void releaseClient();

  //! Update the frame's size to match the client
  void adjustSize();
  //! Update the frame's position to match the client
  void adjustPosition();
  //! Shape the frame window to the client window
  void adjustShape();

  //! Applies gravity to the client's position to find where the frame should
  //! be positioned.
  /*!
    @return The proper coordinates for the frame, based on the client.
  */
  void clientGravity(int &x, int &y);

  //! Reversly applies gravity to the frame's position to find where the client
  //! should be positioned.
  /*!
    @return The proper coordinates for the client, based on the frame.
  */
  void frameGravity(int &x, int &y);

  //! Gets the window id of the frame's "plate" subelement
  inline Window plate() const { return _plate.window(); }
  //! Gets the window id of the frame's "titlebar" subelement
  inline Window titlebar() const { return _titlebar.window(); }
  //! Gets the window id of the frame's "label" subelement
  inline Window label() const { return _label.window(); }
  //! Gets the window id of the frame's "close button" subelement
  inline Window button_close() const { return _button_close.window(); }
  //! Gets the window id of the frame's "iconify button" subelement
  inline Window button_iconify() const { return _button_iconify.window(); }
  //! Gets the window id of the frame's "maximize button" subelement
  inline Window button_max() const { return _button_max.window(); }
  //! Gets the window id of the frame's "sticky button" subelement
  inline Window button_stick() const { return _button_stick.window(); }
  //! Gets the window id of the frame's "handle" subelement
  inline Window handle() const { return _handle.window(); }
  //! Gets the window id of the frame's "left grip" subelement
  inline Window grip_left() const { return _grip_left.window(); }
  //! Gets the window id of the frame's "right grip" subelement
  inline Window grip_right() const { return _grip_right.window(); }

};

}

#endif // __frame_hh