window decorations use "unmanaged" widgets now.

This commit is contained in:
Dana Jansens 2002-12-01 11:45:55 +00:00
parent fac1a6581b
commit fb3848450e
7 changed files with 177 additions and 299 deletions

View file

@ -371,6 +371,7 @@ void OtkWidget::adjustVert(void)
void OtkWidget::update(void) void OtkWidget::update(void)
{ {
if (_dirty) { if (_dirty) {
if (! _unmanaged)
adjust(); adjust();
render(); render();
XClearWindow(OBDisplay::display, _window); XClearWindow(OBDisplay::display, _window);

View file

@ -103,6 +103,8 @@ public:
{ return _event_dispatcher; } { return _event_dispatcher; }
void setEventDispatcher(OtkEventDispatcher *disp); void setEventDispatcher(OtkEventDispatcher *disp);
void unmanaged(void) { _unmanaged = true; }
protected: protected:
bool _dirty; bool _dirty;
@ -146,6 +148,8 @@ private:
bool _fixed_width; bool _fixed_width;
bool _fixed_height; bool _fixed_height;
bool _unmanaged;
OtkEventDispatcher *_event_dispatcher; OtkEventDispatcher *_event_dispatcher;
OtkApplication *_application; OtkApplication *_application;
}; };

View file

@ -10,52 +10,53 @@ extern "C" {
#endif // SHAPE #endif // SHAPE
} }
#include "openbox.hh"
#include "frame.hh" #include "frame.hh"
#include "client.hh" #include "client.hh"
#include "otk/display.hh" #include "otk/display.hh"
#include <string> #include <string>
#include <iostream> // TEMP
namespace ob { namespace ob {
OBFrame::OBFrame(OBClient *client, const otk::Style *style) OBFrame::OBFrame(OBClient *client, otk::Style *style)
: _client(client), : otk::OtkWidget(Openbox::instance, style),
_screen(otk::OBDisplay::screenInfo(client->screen())) _client(client),
_screen(otk::OBDisplay::screenInfo(client->screen())),
_titlebar(this),
_button_close(&_titlebar),
_button_iconify(&_titlebar),
_button_max(&_titlebar),
_button_stick(&_titlebar),
_label(&_titlebar),
_handle(this),
_grip_left(&_handle),
_grip_right(&_handle),
_decorations(client->decorations())
{ {
assert(client); assert(client);
assert(style); assert(style);
_decorations = client->decorations(); unmanaged();
_titlebar.unmanaged();
_button_close.unmanaged();
_button_iconify.unmanaged();
_button_max.unmanaged();
_button_stick.unmanaged();
_label.unmanaged();
_handle.unmanaged();
_grip_left.unmanaged();
_grip_right.unmanaged();
// create the base frame parent window _button_close.setText("X");
_window = createFrame(); _button_iconify.setText("I");
assert(_window); _button_max.setText("M");
_button_stick.setText("C");
// create all of the style element child windows _label.setText(_client->title());
_titlebar = createChild(_window, 0);
assert(_titlebar);
_button_iconify = createChild(_titlebar, 0);
assert(_button_iconify);
_button_max = createChild(_titlebar, 0);
assert(_button_max);
_button_stick = createChild(_titlebar, 0);
assert(_button_stick);
_button_close = createChild(_titlebar, 0);
assert(_button_close);
_label = createChild(_titlebar, 0);
assert(_label);
XMapSubwindows(otk::OBDisplay::display, _titlebar);
_handle = createChild(_window, 0);
assert(_handle);
_grip_left = createChild(_handle, 0);
assert(_grip_left);
_grip_right = createChild(_handle, 0);
assert(_grip_right);
XMapSubwindows(otk::OBDisplay::display, _handle);
_style = 0; _style = 0;
loadStyle(style); setStyle(style);
grabClient(); grabClient();
} }
@ -63,123 +64,113 @@ OBFrame::OBFrame(OBClient *client, const otk::Style *style)
OBFrame::~OBFrame() OBFrame::~OBFrame()
{ {
XDestroyWindow(otk::OBDisplay::display, _button_iconify);
XDestroyWindow(otk::OBDisplay::display, _button_max);
XDestroyWindow(otk::OBDisplay::display, _button_stick);
XDestroyWindow(otk::OBDisplay::display, _button_close);
XDestroyWindow(otk::OBDisplay::display, _label);
XDestroyWindow(otk::OBDisplay::display, _titlebar);
XDestroyWindow(otk::OBDisplay::display, _grip_left);
XDestroyWindow(otk::OBDisplay::display, _grip_right);
XDestroyWindow(otk::OBDisplay::display, _handle);
releaseClient(false); releaseClient(false);
XDestroyWindow(otk::OBDisplay::display, _window);
} }
void OBFrame::loadStyle(const otk::Style *style) void OBFrame::setStyle(otk::Style *style)
{ {
assert(style); assert(style);
otk::OtkWidget::setStyle(style);
// if a style was previously set, then 'replace' is true, cause we're // if a style was previously set, then 'replace' is true, cause we're
// replacing a style // replacing a style
bool replace = (_style); bool replace = (_style);
if (replace) { if (replace) {
// XXX: do shit here whatever // XXX: do shit here whatever
// XXX: save the position based on gravity
} }
_style = style; _style = style;
XSetWindowBorderWidth(otk::OBDisplay::display, _window, XSetWindowBorder(otk::OBDisplay::display, getWindow(),
_style->getBorderWidth()); _style->getBorderColor()->pixel());
XSetWindowBorder(otk::OBDisplay::display, _window, XSetWindowBorder(otk::OBDisplay::display, _titlebar.getWindow(),
_style->getBorderColor().pixel()); _style->getBorderColor()->pixel());
XSetWindowBorderWidth(otk::OBDisplay::display, _titlebar, XSetWindowBorder(otk::OBDisplay::display, _grip_left.getWindow(),
_style->getBorderWidth()); _style->getBorderColor()->pixel());
XSetWindowBorder(otk::OBDisplay::display, _titlebar, XSetWindowBorder(otk::OBDisplay::display, _grip_right.getWindow(),
_style->getBorderColor().pixel()); _style->getBorderColor()->pixel());
XSetWindowBorderWidth(otk::OBDisplay::display, _grip_left, XSetWindowBorder(otk::OBDisplay::display, _handle.getWindow(),
_style->getBorderWidth()); _style->getBorderColor()->pixel());
XSetWindowBorder(otk::OBDisplay::display, _grip_left,
_style->getBorderColor().pixel());
XSetWindowBorderWidth(otk::OBDisplay::display, _grip_right,
_style->getBorderWidth());
XSetWindowBorder(otk::OBDisplay::display, _grip_right,
_style->getBorderColor().pixel());
XSetWindowBorderWidth(otk::OBDisplay::display, _handle,
_style->getBorderWidth());
XSetWindowBorder(otk::OBDisplay::display, _handle,
_style->getBorderColor().pixel());
// XXX: if (focused) // XXX: if (focused)
XSetWindowBackground(otk::OBDisplay::display, _window, XSetWindowBackground(otk::OBDisplay::display, getWindow(),
_style->getFrameFocus().color().pixel()); _style->getFrameFocus()->color().pixel());
// XXX: else // XXX: else
// XXX: XSetWindowBackground(otk::OBDisplay::display, _window, // XXX: XSetWindowBackground(otk::OBDisplay::display, _window,
// XXX: _style->getFrameUnfocus().color().pixel()); // XXX: _style->getFrameUnfocus().color().pixel());
// if !replace, then update() will get called after the client is grabbed! // if !replace, then adjust() will get called after the client is grabbed!
if (replace) { if (replace)
update(); adjust(); // size/position everything
// XXX: make everything redraw
}
} }
void OBFrame::update() void OBFrame::adjust()
{ {
// XXX: only if not overridden or something!!! MORE LOGIC HERE!! // XXX: only if not overridden or something!!! MORE LOGIC HERE!!
_decorations = _client->decorations(); _decorations = _client->decorations();
_decorations = 0xffffffff;
int width; // the width of the client window and the border around it int width; // the width of the client window and the border around it
int bwidth; // width to make borders
if (_decorations & OBClient::Decor_Border) { if (_decorations & OBClient::Decor_Border) {
bwidth = _style->getBorderWidth();
_size.left = _size.top = _size.bottom = _size.right = _size.left = _size.top = _size.bottom = _size.right =
_style->getFrameWidth(); _style->getFrameWidth();
width = _client->area().width() + _style->getFrameWidth() * 2; width = _client->area().width() + _style->getFrameWidth() * 2;
} else { } else {
bwidth = 0;
_size.left = _size.top = _size.bottom = _size.right = 0; _size.left = _size.top = _size.bottom = _size.right = 0;
width = _client->area().width(); width = _client->area().width();
} }
XSetWindowBorderWidth(otk::OBDisplay::display, getWindow(), bwidth);
XSetWindowBorderWidth(otk::OBDisplay::display, _titlebar.getWindow(),
bwidth);
XSetWindowBorderWidth(otk::OBDisplay::display, _grip_left.getWindow(),
bwidth);
XSetWindowBorderWidth(otk::OBDisplay::display, _grip_right.getWindow(),
bwidth);
XSetWindowBorderWidth(otk::OBDisplay::display, _handle.getWindow(), bwidth);
if (_decorations & OBClient::Decor_Titlebar) { if (_decorations & OBClient::Decor_Titlebar) {
// set the titlebar size // set the titlebar size
_titlebar_area.setRect(-_style->getBorderWidth(), _titlebar.setGeometry(-bwidth,
-_style->getBorderWidth(), -bwidth,
width, width,
(_style->getFont().height() + (_style->getFont().height() +
_style->getBevelWidth() * 2)); _style->getBevelWidth() * 2));
_size.top += _titlebar_area.height() + _style->getBorderWidth(); _size.top += _titlebar.height() + bwidth;
// set the label size // set the label size
_label_area.setRect(0, _style->getBevelWidth(), _label.setGeometry(0, _style->getBevelWidth(),
width, _style->getFont().height()); width, _style->getFont().height());
// set the buttons sizes // set the buttons sizes
if (_decorations & OBClient::Decor_Iconify) if (_decorations & OBClient::Decor_Iconify)
_button_iconify_area.setRect(0, _style->getBevelWidth() + 1, _button_iconify.setGeometry(0, _style->getBevelWidth() + 1,
_label_area.height() - 2, _label.height() - 2,
_label_area.height() - 2); _label.height() - 2);
if (_decorations & OBClient::Decor_Maximize) if (_decorations & OBClient::Decor_Maximize)
_button_max_area.setRect(0, _style->getBevelWidth() + 1, _button_max.setGeometry(0, _style->getBevelWidth() + 1,
_label_area.height() - 2, _label.height() - 2,
_label_area.height() - 2); _label.height() - 2);
if (_decorations & OBClient::Decor_Sticky) if (_decorations & OBClient::Decor_Sticky)
_button_stick_area.setRect(0, _style->getBevelWidth() + 1, _button_stick.setGeometry(0, _style->getBevelWidth() + 1,
_label_area.height() - 2, _label.height() - 2,
_label_area.height() - 2); _label.height() - 2);
if (_decorations & OBClient::Decor_Close) if (_decorations & OBClient::Decor_Close)
_button_close_area.setRect(0, _style->getBevelWidth() + 1, _button_close.setGeometry(0, _style->getBevelWidth() + 1,
_label_area.height() - 2, _label.height() - 2,
_label_area.height() - 2); _label.height() - 2);
// separation between titlebar elements // separation between titlebar elements
const int sep = _style->getBevelWidth() + 1; const int sep = _style->getBevelWidth() + 1;
std::string layout = "ILMC"; // XXX: get this from somewhere std::string layout = "SLIMC"; // XXX: get this from somewhere
// XXX: it is REQUIRED that by this point, the string only has one of each // XXX: it is REQUIRED that by this point, the string only has one of each
// possible letter, all of the letters are valid, and L exists somewhere in // possible letter, all of the letters are valid, and L exists somewhere in
// the string! // the string!
@ -188,175 +179,119 @@ void OBFrame::update()
// that the ONE LABEL!! // that the ONE LABEL!!
// adds an extra sep so that there's a space on either side of the // adds an extra sep so that there's a space on either side of the
// titlebar.. note: x = sep, below. // titlebar.. note: x = sep, below.
_label_area.setWidth(_label_area.width() - _label.setWidth(_label.width() -
((_button_iconify_area.width() + sep) * ((_button_iconify.width() + sep) *
(layout.size() - 1) + sep)); (layout.size() - 1) + sep * 2));
int x = sep; int x = sep;
for (int i = 0, len = layout.size(); i < len; ++i) { for (int i = 0, len = layout.size(); i < len; ++i) {
otk::Rect *area;
switch (layout[i]) { switch (layout[i]) {
case 'I': case 'I':
if (!(_decorations & OBClient::Decor_Iconify)) _button_iconify.move(x, _button_iconify.getRect().y());
continue; // skip it x += _button_iconify.width();
area = &_button_iconify_area;
break; break;
case 'L': case 'L':
area = &_label_area; _label.move(x, _label.getRect().y());
x += _label.width();
break; break;
case 'M': case 'M':
if (!(_decorations & OBClient::Decor_Maximize)) _button_max.move(x, _button_max.getRect().y());
continue; // skip it x += _button_max.width();
area = &_button_max_area;
break; break;
case 'S': case 'S':
if (!(_decorations & OBClient::Decor_Sticky)) _button_stick.move(x, _button_stick.getRect().y());
continue; // skip it x += _button_stick.width();
area = &_button_stick_area;
break; break;
case 'C': case 'C':
if (!(_decorations & OBClient::Decor_Close)) _button_close.move(x, _button_close.getRect().y());
continue; // skip it x += _button_close.width();
area = &_button_close_area;
break; break;
default: default:
assert(false); // the layout string is invalid! assert(false); // the layout string is invalid!
continue; // just to fuck with g++
} }
area->setX(x); x += sep;
x += sep + area->width();
} }
} }
if (_decorations & OBClient::Decor_Handle) { if (_decorations & OBClient::Decor_Handle) {
_handle_area.setRect(-_style->getBorderWidth(), _handle.setGeometry(-bwidth,
_size.top + _client->area().height() + _size.top + _client->area().height() +
_style->getFrameWidth(), _style->getFrameWidth(),
width, _style->getHandleWidth()); width, _style->getHandleWidth());
_grip_left_area.setRect(-_style->getBorderWidth(), _grip_left.setGeometry(-bwidth,
-_style->getBorderWidth(), -bwidth,
// XXX: get a Point class in otk and use that for
// the 'buttons size' since theyre all the same
_button_iconify.width() * 2,
_handle.height());
_grip_right.setGeometry(((_handle.getRect().right() + 1) -
_button_iconify.width() * 2),
-bwidth,
// XXX: get a Point class in otk and use that for // XXX: get a Point class in otk and use that for
// the 'buttons size' since theyre all the same // the 'buttons size' since theyre all the same
_button_iconify_area.width() * 2, _button_iconify.width() * 2,
_handle_area.height()); _handle.height());
_grip_right_area.setRect(((_handle_area.right() + 1) - _size.bottom += _handle.height() + bwidth;
_button_iconify_area.width() * 2),
-_style->getBorderWidth(),
// XXX: get a Point class in otk and use that for
// the 'buttons size' since theyre all the same
_button_iconify_area.width() * 2,
_handle_area.height());
_size.bottom += _handle_area.height() + _style->getBorderWidth();
} }
// position/size all the windows // position/size all the windows
XResizeWindow(otk::OBDisplay::display, _window, resize(_size.left + _size.right + _client->area().width(),
_size.left + _size.right + _client->area().width(), _size.top + _size.bottom + _client->area().height());
_size.top + _size.bottom + _client->area().height());
XMoveWindow(otk::OBDisplay::display, _client->window(), XMoveWindow(otk::OBDisplay::display, _client->window(),
_size.left, _size.top); _size.left, _size.top);
if (_decorations & OBClient::Decor_Titlebar) {
XMoveResizeWindow(otk::OBDisplay::display, _titlebar,
_titlebar_area.x(), _titlebar_area.y(),
_titlebar_area.width(), _titlebar_area.height());
XMoveResizeWindow(otk::OBDisplay::display, _label,
_label_area.x(), _label_area.y(),
_label_area.width(), _label_area.height());
if (_decorations & OBClient::Decor_Iconify)
XMoveResizeWindow(otk::OBDisplay::display, _button_iconify,
_button_iconify_area.x(), _button_iconify_area.y(),
_button_iconify_area.width(),
_button_iconify_area.height());
if (_decorations & OBClient::Decor_Maximize)
XMoveResizeWindow(otk::OBDisplay::display, _button_max,
_button_max_area.x(), _button_max_area.y(),
_button_max_area.width(),
_button_max_area.height());
if (_decorations & OBClient::Decor_Sticky)
XMoveResizeWindow(otk::OBDisplay::display, _button_stick,
_button_stick_area.x(), _button_stick_area.y(),
_button_stick_area.width(),
_button_stick_area.height());
if (_decorations & OBClient::Decor_Close)
XMoveResizeWindow(otk::OBDisplay::display, _button_close,
_button_close_area.x(), _button_close_area.y(),
_button_close_area.width(),
_button_close_area.height());
}
if (_decorations & OBClient::Decor_Handle) {
XMoveResizeWindow(otk::OBDisplay::display, _handle,
_handle_area.x(), _handle_area.y(),
_handle_area.width(), _handle_area.height());
XMoveResizeWindow(otk::OBDisplay::display, _grip_left,
_grip_left_area.x(), _grip_left_area.y(),
_grip_left_area.width(), _grip_left_area.height());
XMoveResizeWindow(otk::OBDisplay::display, _grip_right,
_grip_right_area.x(), _grip_right_area.y(),
_grip_right_area.width(), _grip_right_area.height());
}
// map/unmap all the windows // map/unmap all the windows
if (_decorations & OBClient::Decor_Titlebar) { if (_decorations & OBClient::Decor_Titlebar) {
XMapWindow(otk::OBDisplay::display, _label); _label.show();
if (_decorations & OBClient::Decor_Iconify) if (_decorations & OBClient::Decor_Iconify)
XMapWindow(otk::OBDisplay::display, _button_iconify); _button_iconify.show();
else else
XUnmapWindow(otk::OBDisplay::display, _button_iconify); _button_iconify.hide();
if (_decorations & OBClient::Decor_Maximize) if (_decorations & OBClient::Decor_Maximize)
XMapWindow(otk::OBDisplay::display, _button_max); _button_max.show();
else else
XUnmapWindow(otk::OBDisplay::display, _button_max); _button_max.hide();
if (_decorations & OBClient::Decor_Sticky) if (_decorations & OBClient::Decor_Sticky)
XMapWindow(otk::OBDisplay::display, _button_stick); _button_stick.show();
else else
XUnmapWindow(otk::OBDisplay::display, _button_stick); _button_stick.hide();
if (_decorations & OBClient::Decor_Close) if (_decorations & OBClient::Decor_Close)
XMapWindow(otk::OBDisplay::display, _button_close); _button_close.show();
else else
XUnmapWindow(otk::OBDisplay::display, _button_close); _button_close.hide();
XMapWindow(otk::OBDisplay::display, _titlebar); _titlebar.show();
} else { } else {
XUnmapWindow(otk::OBDisplay::display, _titlebar); _titlebar.hide(true);
XUnmapWindow(otk::OBDisplay::display, _label);
XUnmapWindow(otk::OBDisplay::display, _button_iconify);
XUnmapWindow(otk::OBDisplay::display, _button_max);
XUnmapWindow(otk::OBDisplay::display, _button_stick);
XUnmapWindow(otk::OBDisplay::display, _button_close);
} }
if (_decorations & OBClient::Decor_Handle) { if (_decorations & OBClient::Decor_Handle)
XMapWindow(otk::OBDisplay::display, _grip_left); _handle.show(true);
XMapWindow(otk::OBDisplay::display, _grip_right); else
XMapWindow(otk::OBDisplay::display, _handle); _handle.hide(true);
} else {
XUnmapWindow(otk::OBDisplay::display, _handle);
XUnmapWindow(otk::OBDisplay::display, _grip_left);
XUnmapWindow(otk::OBDisplay::display, _grip_right);
}
// XXX: more is gunna have to happen here // XXX: more is gunna have to happen here
updateShape(); adjustShape();
update();
} }
void OBFrame::updateShape() void OBFrame::adjustShape()
{ {
#ifdef SHAPE #ifdef SHAPE
if (!_client->shaped()) { if (!_client->shaped()) {
// clear the shape on the frame window // clear the shape on the frame window
XShapeCombineMask(otk::OBDisplay::display, _window, ShapeBounding, XShapeCombineMask(otk::OBDisplay::display, getWindow(), ShapeBounding,
_size.left, _size.left,
_size.top, _size.top,
None, ShapeSet); None, ShapeSet);
} else { } else {
// make the frame's shape match the clients // make the frame's shape match the clients
XShapeCombineShape(otk::OBDisplay::display, _window, ShapeBounding, XShapeCombineShape(otk::OBDisplay::display, getWindow(), ShapeBounding,
_size.left, _size.left,
_size.top, _size.top,
_client->window(), ShapeBounding, ShapeSet); _client->window(), ShapeBounding, ShapeSet);
@ -381,7 +316,7 @@ void OBFrame::updateShape()
++num; ++num;
}*/ }*/
XShapeCombineRectangles(otk::OBDisplay::display, _window, XShapeCombineRectangles(otk::OBDisplay::display, getWindow(),
ShapeBounding, 0, 0, xrect, num, ShapeBounding, 0, 0, xrect, num,
ShapeUnion, Unsorted); ShapeUnion, Unsorted);
} }
@ -396,7 +331,7 @@ void OBFrame::grabClient()
//XSelectInput(otk::OBDisplay::display, _window, SubstructureRedirectMask); //XSelectInput(otk::OBDisplay::display, _window, SubstructureRedirectMask);
// reparent the client to the frame // reparent the client to the frame
XReparentWindow(otk::OBDisplay::display, _client->window(), _window, 0, 0); XReparentWindow(otk::OBDisplay::display, _client->window(), getWindow(), 0, 0);
_client->ignore_unmaps++; _client->ignore_unmaps++;
// raise the client above the frame // raise the client above the frame
@ -404,7 +339,7 @@ void OBFrame::grabClient()
// map the client so it maps when the frame does // map the client so it maps when the frame does
XMapWindow(otk::OBDisplay::display, _client->window()); XMapWindow(otk::OBDisplay::display, _client->window());
update(); adjust();
} }

View file

@ -14,6 +14,10 @@ extern "C" {
#include "otk/rect.hh" #include "otk/rect.hh"
#include "otk/screeninfo.hh" #include "otk/screeninfo.hh"
#include "otk/style.hh" #include "otk/style.hh"
#include "otk/widget.hh"
#include "otk/button.hh"
#include "otk/focuswidget.hh"
#include "otk/focuslabel.hh"
#include <string> #include <string>
@ -22,46 +26,27 @@ namespace ob {
//! Holds and decorates a frame around an OBClient (client window) //! Holds and decorates a frame around an OBClient (client window)
/*! /*!
*/ */
class OBFrame { class OBFrame : public otk::OtkWidget {
private: private:
OBClient *_client; OBClient *_client;
const otk::ScreenInfo *_screen; const otk::ScreenInfo *_screen;
//! The style to use for size and display the decorations //! The style to use for size and display the decorations
const otk::Style *_style; otk::Style *_style;
//! The window id of the base frame window
Window _window;
//! The size of the frame on each side of the client window //! The size of the frame on each side of the client window
otk::Strut _size; otk::Strut _size;
// decoration windows // decoration windows
Window _titlebar; otk::OtkFocusWidget _titlebar;
otk::Rect _titlebar_area; otk::OtkButton _button_close;
otk::OtkButton _button_iconify;
Window _button_close; otk::OtkButton _button_max;
otk::Rect _button_close_area; otk::OtkButton _button_stick;
otk::OtkFocusLabel _label;
Window _button_iconify; otk::OtkFocusWidget _handle;
otk::Rect _button_iconify_area; otk::OtkButton _grip_left;
otk::OtkButton _grip_right;
Window _button_max;
otk::Rect _button_max_area;
Window _button_stick;
otk::Rect _button_stick_area;
Window _label;
otk::Rect _label_area;
Window _handle;
otk::Rect _handle_area;
Window _grip_left;
otk::Rect _grip_left_area;
Window _grip_right;
otk::Rect _grip_right_area;
//! The decorations to display on the window. //! The decorations to display on the window.
/*! /*!
@ -89,31 +74,17 @@ public:
@param client The client window which will be decorated by the new OBFrame @param client The client window which will be decorated by the new OBFrame
@param style The style to use to decorate the frame @param style The style to use to decorate the frame
*/ */
OBFrame(OBClient *client, const otk::Style *style); OBFrame(OBClient *client, otk::Style *style);
//! Destroys the OBFrame object //! Destroys the OBFrame object
virtual ~OBFrame(); virtual ~OBFrame();
//! Load a style to decorate the frame with //! Set the style to decorate the frame with
void loadStyle(const otk::Style *style); virtual void setStyle(otk::Style *style);
//! Update the frame to match the client //! Update the frame to match the client
void update(); void adjust();
//! Shape the frame window to the client window //! Shape the frame window to the client window
void updateShape(); void adjustShape();
//! Returns the frame's most-parent window, which is a child of the root
//! window
inline Window window() const { return _window; }
inline Window titlebar() const { return _titlebar; }
inline Window label() const { return _label; }
inline Window buttonIconify() const { return _button_iconify; }
inline Window buttonMax() const { return _button_max; }
inline Window buttonStick() const { return _button_stick; }
inline Window buttonClose() const { return _button_close; }
inline Window handle() const { return _handle; }
inline Window gripLeft() const { return _grip_left; }
inline Window gripRight() const { return _grip_right; }
}; };
} }

View file

@ -74,6 +74,8 @@ void Openbox::signalHandler(int signal)
Openbox::Openbox(int argc, char **argv) Openbox::Openbox(int argc, char **argv)
: otk::OtkEventDispatcher(),
otk::OtkEventHandler()
{ {
struct sigaction action; struct sigaction action;
@ -244,14 +246,8 @@ void Openbox::showHelp()
void Openbox::eventLoop() void Openbox::eventLoop()
{ {
while (!_doshutdown) { while (!_doshutdown) {
if (XPending(otk::OBDisplay::display)) { dispatchEvents(); // from OtkEventDispatcher
XEvent e; _timermanager.fire();
XNextEvent(otk::OBDisplay::display, &e);
//process_event(&e);
_xeventhandler.handle(e);
} else {
_timermanager.fire();
}
} }
} }

View file

@ -22,7 +22,8 @@ extern "C" {
#include "otk/timerqueuemanager.hh" #include "otk/timerqueuemanager.hh"
#include "otk/property.hh" #include "otk/property.hh"
#include "otk/configuration.hh" #include "otk/configuration.hh"
#include "xeventhandler.hh" #include "otk/eventdispatcher.hh"
#include "otk/eventhandler.hh"
#include "client.hh" #include "client.hh"
namespace ob { namespace ob {
@ -39,7 +40,7 @@ class OBScreen;
not exit until the window manager is ready to be destroyed. Destruction of not exit until the window manager is ready to be destroyed. Destruction of
the Openbox class instance will shutdown the window manager. the Openbox class instance will shutdown the window manager.
*/ */
class Openbox class Openbox : public otk::OtkEventDispatcher, public otk::OtkEventHandler
{ {
public: public:
//! The single instance of the Openbox class for the application. //! The single instance of the Openbox class for the application.
@ -102,9 +103,6 @@ private:
*/ */
otk::OBTimerQueueManager _timermanager; otk::OBTimerQueueManager _timermanager;
//! The class which will handle raw XEvents
OBXEventHandler _xeventhandler;
//! Cached atoms on the display //! Cached atoms on the display
/*! /*!
This is a pointer because the OBProperty class uses otk::OBDisplay::display This is a pointer because the OBProperty class uses otk::OBDisplay::display

View file

@ -365,25 +365,12 @@ void OBScreen::manageWindow(Window window)
client->frame = new OBFrame(client, &_style); client->frame = new OBFrame(client, &_style);
// XXX: if on the current desktop.. // XXX: if on the current desktop..
XMapWindow(otk::OBDisplay::display, client->frame->window()); client->frame->show();
// XXX: handle any requested states such as shaded/maximized // XXX: handle any requested states such as shaded/maximized
otk::OBDisplay::ungrab(); otk::OBDisplay::ungrab();
// add all the client's windows as event handlers for the client
Openbox::instance->addClient(window, client);
Openbox::instance->addClient(client->frame->window(), client);
Openbox::instance->addClient(client->frame->titlebar(), client);
Openbox::instance->addClient(client->frame->buttonIconify(), client);
Openbox::instance->addClient(client->frame->buttonMax(), client);
Openbox::instance->addClient(client->frame->buttonStick(), client);
Openbox::instance->addClient(client->frame->buttonClose(), client);
Openbox::instance->addClient(client->frame->label(), client);
Openbox::instance->addClient(client->frame->handle(), client);
Openbox::instance->addClient(client->frame->gripLeft(), client);
Openbox::instance->addClient(client->frame->gripRight(), client);
// add to the screen's list // add to the screen's list
_clients.push_back(client); _clients.push_back(client);
// update the root properties // update the root properties
@ -403,26 +390,12 @@ void OBScreen::unmanageWindow(OBClient *client)
// we dont want events no more // we dont want events no more
XSelectInput(otk::OBDisplay::display, client->window(), NoEventMask); XSelectInput(otk::OBDisplay::display, client->window(), NoEventMask);
XUnmapWindow(otk::OBDisplay::display, frame->window()); frame->hide();
// we dont want a border on the client // we dont want a border on the client
XSetWindowBorderWidth(otk::OBDisplay::display, client->window(), XSetWindowBorderWidth(otk::OBDisplay::display, client->window(),
client->borderWidth()); client->borderWidth());
// remove the client class from the search list
Openbox::instance->removeClient(client->window());
// remove the frame's decor elements as event handlers for the client
Openbox::instance->removeClient(frame->window());
Openbox::instance->removeClient(frame->titlebar());
Openbox::instance->removeClient(frame->buttonIconify());
Openbox::instance->removeClient(frame->buttonMax());
Openbox::instance->removeClient(frame->buttonStick());
Openbox::instance->removeClient(frame->buttonClose());
Openbox::instance->removeClient(frame->label());
Openbox::instance->removeClient(frame->handle());
Openbox::instance->removeClient(frame->gripLeft());
Openbox::instance->removeClient(frame->gripRight());
delete client->frame; delete client->frame;
client->frame = 0; client->frame = 0;