all repos — openbox @ 3762f3c88f4d84697df37c0a3bdc733e7bee6e45

openbox fork - make it a bit more like ryudo

pretty sure all frame elements are placed correctly now
Dana Jansens danakj@orodu.net
commit

3762f3c88f4d84697df37c0a3bdc733e7bee6e45

parent

6e2593cadc9a755d0e08facb7df0459a786e692b

3 files changed, 70 insertions(+), 48 deletions(-)

jump to
M otk/style.hhotk/style.hh

@@ -89,6 +89,8 @@ inline unsigned int getBorderWidth(void) const { return border_width; }

inline const BFont *getFont() const { return font; } + inline const BColor &getBorderColor() const { return border_color; } + inline void setImageControl(BImageControl *c) { image_control = c; } inline void setScreenNumber(unsigned int scr) { screen_number = scr; }
M src/frame.ccsrc/frame.cc

@@ -27,9 +27,6 @@ assert(style);

_decorations = client->decorations(); - _style = 0; - loadStyle(style); - // create the base frame parent window _window = createFrame(); assert(_window);

@@ -57,23 +54,28 @@ _grip_right = createChild(_handle, 0);

assert(_grip_right); XMapSubwindows(otk::OBDisplay::display, _handle); + _style = 0; + loadStyle(style); + grabClient(); } OBFrame::~OBFrame() { - releaseClient(false); - - XDestroyWindow(otk::OBDisplay::display, _titlebar); 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, _handle); + XDestroyWindow(otk::OBDisplay::display, _titlebar); XDestroyWindow(otk::OBDisplay::display, _grip_left); XDestroyWindow(otk::OBDisplay::display, _grip_right); + XDestroyWindow(otk::OBDisplay::display, _handle); + + releaseClient(false); + + XDestroyWindow(otk::OBDisplay::display, _window); }

@@ -83,7 +85,6 @@ assert(style);

// if a style was previously set, then 'replace' is true, cause we're // replacing a style - // NOTE: if this is false, then DO NOT DO SHIT WITH _window, it doesnt exist bool replace = (_style); if (replace) {

@@ -92,12 +93,31 @@ }

_style = style; + XSetWindowBorderWidth(otk::OBDisplay::display, _window, + _style->getBorderWidth()); + XSetWindowBorder(otk::OBDisplay::display, _window, + _style->getBorderColor().pixel()); + XSetWindowBorderWidth(otk::OBDisplay::display, _titlebar, + _style->getBorderWidth()); + XSetWindowBorder(otk::OBDisplay::display, _titlebar, + _style->getBorderColor().pixel()); + XSetWindowBorderWidth(otk::OBDisplay::display, _grip_left, + _style->getBorderWidth()); + 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()); + + // if !replace, then update() will get called after the client is grabbed! if (replace) { update(); - XSetWindowBorderWidth(otk::OBDisplay::display, _window, - _style->getBorderWidth()); - // XXX: make everything redraw } }

@@ -112,7 +132,7 @@ int width; // the width of the client window and the border around it

if (_decorations & OBClient::Decor_Border) { _size.left = _size.top = _size.bottom = _size.right = - _style->getBorderWidth() + _style->getFrameWidth(); + _style->getFrameWidth(); width = _client->area().width() + _style->getFrameWidth() * 2; } else { _size.left = _size.top = _size.bottom = _size.right = 0;

@@ -120,15 +140,17 @@ width = _client->area().width();

} if (_decorations & OBClient::Decor_Titlebar) { - _titlebar_area.setRect(0, 0, width, + // set the titlebar size + _titlebar_area.setRect(-_style->getBorderWidth(), + -_style->getBorderWidth(), + width, (_style->getFont()->height() + - _style->getFrameWidth() * 2)); + _style->getBevelWidth() * 2)); _size.top += _titlebar_area.height() + _style->getBorderWidth(); // set the label size _label_area.setRect(0, _style->getBevelWidth(), - width, (_titlebar_area.height() - - _style->getBevelWidth() * 2)); + width, _style->getFont()->height()); // set the buttons sizes if (_decorations & OBClient::Decor_Iconify) _button_iconify_area.setRect(0, _style->getBevelWidth() + 1,

@@ -187,30 +209,30 @@ assert(false); // the layout string is invalid!

continue; // just to fuck with g++ } area->setX(x); + if (layout[i] != 'L') + _label_area.setWidth(_label_area.width() - area->width()); x += sep + area->width(); } } if (_decorations & OBClient::Decor_Handle) { - _handle_area.setRect(0, _size.top + _client->area().height() + - _style->getBorderWidth(), + _handle_area.setRect(-_style->getBorderWidth(), + _size.top + _client->area().height(), width, _style->getHandleWidth()); - _grip_left_area.setRect(0, - _handle_area.y() + _handle_area.height() + - _style->getBorderWidth(), + _grip_left_area.setRect(-_style->getBorderWidth(), + -_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()); _grip_right_area.setRect(((_handle_area.right() + 1) - _button_iconify_area.width() * 2), - _handle_area.y() + _handle_area.height() + - _style->getBorderWidth(), + -_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() * 2; + _size.bottom += _handle_area.height() + _style->getBorderWidth(); }

@@ -266,9 +288,6 @@ }

// map/unmap all the windows if (_decorations & OBClient::Decor_Titlebar) { - XMapWindow(otk::OBDisplay::display, _titlebar); - XSetWindowBorder(otk::OBDisplay::display, _titlebar, - _style->getBorderWidth()); XMapWindow(otk::OBDisplay::display, _label); if (_decorations & OBClient::Decor_Iconify) XMapWindow(otk::OBDisplay::display, _button_iconify);

@@ -286,6 +305,7 @@ if (_decorations & OBClient::Decor_Close)

XMapWindow(otk::OBDisplay::display, _button_close); else XUnmapWindow(otk::OBDisplay::display, _button_close); + XMapWindow(otk::OBDisplay::display, _titlebar); } else { XUnmapWindow(otk::OBDisplay::display, _titlebar); XUnmapWindow(otk::OBDisplay::display, _label);

@@ -296,15 +316,9 @@ XUnmapWindow(otk::OBDisplay::display, _button_close);

} if (_decorations & OBClient::Decor_Handle) { - XMapWindow(otk::OBDisplay::display, _handle); - XSetWindowBorder(otk::OBDisplay::display, _handle, - _style->getBorderWidth()); XMapWindow(otk::OBDisplay::display, _grip_left); - XSetWindowBorder(otk::OBDisplay::display, _grip_left, - _style->getBorderWidth()); XMapWindow(otk::OBDisplay::display, _grip_right); - XSetWindowBorder(otk::OBDisplay::display, _grip_right, - _style->getBorderWidth()); + XMapWindow(otk::OBDisplay::display, _handle); } else { XUnmapWindow(otk::OBDisplay::display, _handle); XUnmapWindow(otk::OBDisplay::display, _grip_left);

@@ -424,9 +438,11 @@ create_mask |= CWCursor;

attrib_create.cursor = cursor; } - return XCreateWindow(otk::OBDisplay::display, parent, 0, 0, 1, 1, 0, - _screen->getDepth(), InputOutput, _screen->getVisual(), - create_mask, &attrib_create); + Window w = XCreateWindow(otk::OBDisplay::display, parent, 0, 0, 1, 1, 0, + _screen->getDepth(), InputOutput, + _screen->getVisual(), create_mask, &attrib_create); + XRaiseWindow(otk::OBDisplay::display, w); // raise above the parent + return w; }

@@ -447,7 +463,7 @@ window's frame.

*/ return XCreateWindow(otk::OBDisplay::display, _screen->getRootWindow(), - 0, 0, 1, 1, _style->getBorderWidth(), + 0, 0, 1, 1, 0, _screen->getDepth(), InputOutput, _screen->getVisual(), create_mask, &attrib_create); }
M src/xeventhandler.ccsrc/xeventhandler.cc

@@ -156,16 +156,6 @@ CWEventMask|CWDontPropagate, &attrib_set);

// create the OBClient class, which gets all of the hints on the window Openbox::instance->addClient(window, client = new OBClient(screen, window)); - // add all the client's decoration windows as event handlers for the 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); // we dont want a border on the client XSetWindowBorderWidth(otk::OBDisplay::display, window, 0);

@@ -182,7 +172,20 @@ // XXX: store a style somewheres cooler!!

otk::Style *style = ((Blackbox*)Openbox::instance)-> searchScreen(RootWindow(otk::OBDisplay::display, screen))-> getWindowStyle(); + // create the decoration frame for the client window client->frame = new OBFrame(client, style); + + // add all the client's decoration windows as event handlers for the 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); // XXX: if on the current desktop.. XMapWindow(otk::OBDisplay::display, client->frame->window());

@@ -212,6 +215,7 @@

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