make shape work with the titlebar and handle
This commit is contained in:
parent
ee896d9d66
commit
861c829ee1
2 changed files with 41 additions and 35 deletions
69
src/frame.cc
69
src/frame.cc
|
@ -139,9 +139,8 @@ void OBFrame::adjust()
|
||||||
cbwidth = _style->getFrameWidth();
|
cbwidth = _style->getFrameWidth();
|
||||||
} else
|
} else
|
||||||
bwidth = cbwidth = 0;
|
bwidth = cbwidth = 0;
|
||||||
// inside this function _size is the size EXCLUDING the outer border
|
_innersize.left = _innersize.top = _innersize.bottom = _innersize.right =
|
||||||
// at the end of this function it becomes the size INCLUDING the outer border
|
cbwidth;
|
||||||
_size.left = _size.top = _size.bottom = _size.right = cbwidth;
|
|
||||||
width = _client->area().width() + cbwidth * 2;
|
width = _client->area().width() + cbwidth * 2;
|
||||||
|
|
||||||
XSetWindowBorderWidth(otk::OBDisplay::display, _plate.getWindow(), cbwidth);
|
XSetWindowBorderWidth(otk::OBDisplay::display, _plate.getWindow(), cbwidth);
|
||||||
|
@ -162,7 +161,7 @@ void OBFrame::adjust()
|
||||||
width,
|
width,
|
||||||
(_style->getFont().height() +
|
(_style->getFont().height() +
|
||||||
_style->getBevelWidth() * 2));
|
_style->getBevelWidth() * 2));
|
||||||
_size.top += _titlebar.height() + bwidth;
|
_innersize.top += _titlebar.height() + bwidth;
|
||||||
|
|
||||||
// set the label size
|
// set the label size
|
||||||
_label.setGeometry(0, _style->getBevelWidth(),
|
_label.setGeometry(0, _style->getBevelWidth(),
|
||||||
|
@ -232,7 +231,7 @@ void OBFrame::adjust()
|
||||||
|
|
||||||
if (_decorations & OBClient::Decor_Handle) {
|
if (_decorations & OBClient::Decor_Handle) {
|
||||||
_handle.setGeometry(-bwidth,
|
_handle.setGeometry(-bwidth,
|
||||||
_size.top + _client->area().height() + cbwidth,
|
_innersize.top + _client->area().height() + cbwidth,
|
||||||
width, _style->getHandleWidth());
|
width, _style->getHandleWidth());
|
||||||
_grip_left.setGeometry(-bwidth,
|
_grip_left.setGeometry(-bwidth,
|
||||||
-bwidth,
|
-bwidth,
|
||||||
|
@ -247,16 +246,16 @@ void OBFrame::adjust()
|
||||||
// the 'buttons size' since theyre all the same
|
// the 'buttons size' since theyre all the same
|
||||||
_button_iconify.width() * 2,
|
_button_iconify.width() * 2,
|
||||||
_handle.height());
|
_handle.height());
|
||||||
_size.bottom += _handle.height() + bwidth;
|
_innersize.bottom += _handle.height() + bwidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// position/size all the windows
|
// position/size all the windows
|
||||||
|
|
||||||
resize(_size.left + _size.right + _client->area().width(),
|
resize(_innersize.left + _innersize.right + _client->area().width(),
|
||||||
_size.top + _size.bottom + _client->area().height());
|
_innersize.top + _innersize.bottom + _client->area().height());
|
||||||
|
|
||||||
_plate.setGeometry(_size.left - cbwidth, _size.top - cbwidth,
|
_plate.setGeometry(_innersize.left - cbwidth, _innersize.top - cbwidth,
|
||||||
_client->area().width(), _client->area().height());
|
_client->area().width(), _client->area().height());
|
||||||
|
|
||||||
// map/unmap all the windows
|
// map/unmap all the windows
|
||||||
|
@ -288,15 +287,13 @@ void OBFrame::adjust()
|
||||||
else
|
else
|
||||||
_handle.hide(true);
|
_handle.hide(true);
|
||||||
|
|
||||||
// inside this function _size is the size EXCLUDING the outer border
|
|
||||||
// at the end of this function it becomes the size INCLUDING the outer border
|
|
||||||
_size.left += bwidth;
|
|
||||||
_size.right += bwidth;
|
|
||||||
_size.top += bwidth;
|
|
||||||
_size.bottom += bwidth;
|
|
||||||
|
|
||||||
// XXX: more is gunna have to happen here
|
// XXX: more is gunna have to happen here
|
||||||
|
|
||||||
|
_size.left = _innersize.left + bwidth;
|
||||||
|
_size.right = _innersize.right + bwidth;
|
||||||
|
_size.top = _innersize.top + bwidth;
|
||||||
|
_size.bottom = _innersize.bottom + bwidth;
|
||||||
|
|
||||||
adjustShape();
|
adjustShape();
|
||||||
|
|
||||||
update();
|
update();
|
||||||
|
@ -306,38 +303,40 @@ void OBFrame::adjust()
|
||||||
void OBFrame::adjustShape()
|
void OBFrame::adjustShape()
|
||||||
{
|
{
|
||||||
#ifdef SHAPE
|
#ifdef SHAPE
|
||||||
|
int bwidth = (_decorations & OBClient::Decor_Border) ?
|
||||||
|
_style->getBorderWidth() : 0;
|
||||||
|
|
||||||
if (!_client->shaped()) {
|
if (!_client->shaped()) {
|
||||||
// clear the shape on the frame window
|
// clear the shape on the frame window
|
||||||
XShapeCombineMask(otk::OBDisplay::display, getWindow(), ShapeBounding,
|
XShapeCombineMask(otk::OBDisplay::display, getWindow(), ShapeBounding,
|
||||||
_size.left,
|
_innersize.left,
|
||||||
_size.top,
|
_innersize.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, getWindow(), ShapeBounding,
|
XShapeCombineShape(otk::OBDisplay::display, getWindow(), ShapeBounding,
|
||||||
_size.left,
|
_innersize.left,
|
||||||
_size.top,
|
_innersize.top,
|
||||||
_client->window(), ShapeBounding, ShapeSet);
|
_client->window(), ShapeBounding, ShapeSet);
|
||||||
|
|
||||||
int num = 0;
|
int num = 0;
|
||||||
XRectangle xrect[2];
|
XRectangle xrect[2];
|
||||||
|
|
||||||
/*
|
if (_decorations & OBClient::Decor_Titlebar) {
|
||||||
if (decorations & Decor_Titlebar) {
|
xrect[0].x = _titlebar.getRect().x();
|
||||||
xrect[0].x = xrect[0].y = -frame.border_w;
|
xrect[0].y = _titlebar.getRect().y();
|
||||||
xrect[0].width = frame.rect.width();
|
xrect[0].width = _titlebar.width() + bwidth * 2; // XXX: this is useless once the widget handles borders!
|
||||||
xrect[0].height = frame.title_h + (frame.border_w * 2);
|
xrect[0].height = _titlebar.height() + bwidth * 2;
|
||||||
++num;
|
++num;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (decorations & Decor_Handle) {
|
if (_decorations & OBClient::Decor_Handle) {
|
||||||
xrect[1].x = -frame.border_w;
|
xrect[1].x = _handle.getRect().x();
|
||||||
xrect[1].y = frame.rect.height() - frame.margin.bottom +
|
xrect[1].y = _handle.getRect().y();
|
||||||
frame.mwm_border_w - frame.border_w;
|
xrect[1].width = _handle.width() + bwidth * 2; // XXX: this is useless once the widget handles borders!
|
||||||
xrect[1].width = frame.rect.width();
|
xrect[1].height = _handle.height() + bwidth * 2;
|
||||||
xrect[1].height = frame.handle_h + (frame.border_w * 2);
|
++num;
|
||||||
++num;
|
}
|
||||||
}*/
|
|
||||||
|
|
||||||
XShapeCombineRectangles(otk::OBDisplay::display, getWindow(),
|
XShapeCombineRectangles(otk::OBDisplay::display, getWindow(),
|
||||||
ShapeBounding, 0, 0, xrect, num,
|
ShapeBounding, 0, 0, xrect, num,
|
||||||
|
|
|
@ -37,6 +37,9 @@ private:
|
||||||
//! 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;
|
||||||
|
|
||||||
|
//! The size of the frame on each side of the client window inside the border
|
||||||
|
otk::Strut _innersize;
|
||||||
|
|
||||||
// decoration windows
|
// decoration windows
|
||||||
otk::OtkFocusWidget _plate; // sits entirely under the client window
|
otk::OtkFocusWidget _plate; // sits entirely under the client window
|
||||||
otk::OtkFocusWidget _titlebar;
|
otk::OtkFocusWidget _titlebar;
|
||||||
|
@ -85,6 +88,10 @@ public:
|
||||||
//! Applies gravity for the client's gravity, moving the frame to the
|
//! Applies gravity for the client's gravity, moving the frame to the
|
||||||
//! appropriate place
|
//! appropriate place
|
||||||
void applyGravity();
|
void applyGravity();
|
||||||
|
|
||||||
|
//! Reversely applies gravity for the client's gravity, moving the frame so
|
||||||
|
//! that the client is in its pre-gravity position
|
||||||
|
void restoreGravity();
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue