apply gravity when positioning the frame
This commit is contained in:
parent
b868726208
commit
d8de17b58e
2 changed files with 69 additions and 43 deletions
99
src/frame.cc
99
src/frame.cc
|
@ -130,7 +130,7 @@ void OBFrame::adjust()
|
||||||
_decorations = _client->decorations();
|
_decorations = _client->decorations();
|
||||||
_decorations = 0xffffffff;
|
_decorations = 0xffffffff;
|
||||||
|
|
||||||
int width; // the width of the whole frame
|
int width; // the width of the client and its border
|
||||||
int bwidth; // width to make borders
|
int bwidth; // width to make borders
|
||||||
int cbwidth; // width of the inner client border
|
int cbwidth; // width of the inner client border
|
||||||
|
|
||||||
|
@ -139,6 +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
|
||||||
|
// at the end of this function it becomes the size INCLUDING the outer border
|
||||||
_size.left = _size.top = _size.bottom = _size.right = cbwidth;
|
_size.left = _size.top = _size.bottom = _size.right = cbwidth;
|
||||||
width = _client->area().width() + cbwidth * 2;
|
width = _client->area().width() + cbwidth * 2;
|
||||||
|
|
||||||
|
@ -286,6 +288,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
|
||||||
|
|
||||||
adjustShape();
|
adjustShape();
|
||||||
|
@ -355,6 +364,7 @@ void OBFrame::grabClient()
|
||||||
XMapWindow(otk::OBDisplay::display, _client->window());
|
XMapWindow(otk::OBDisplay::display, _client->window());
|
||||||
|
|
||||||
adjust();
|
adjust();
|
||||||
|
applyGravity();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -380,47 +390,64 @@ void OBFrame::releaseClient(bool remap)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Window OBFrame::createChild(Window parent, Cursor cursor)
|
void OBFrame::applyGravity()
|
||||||
{
|
{
|
||||||
XSetWindowAttributes attrib_create;
|
int x, y;
|
||||||
unsigned long create_mask = CWBackPixmap | CWBorderPixel | CWEventMask;
|
// apply horizontal window gravity
|
||||||
|
switch (_client->gravity()) {
|
||||||
|
default:
|
||||||
|
case NorthWestGravity:
|
||||||
|
case SouthWestGravity:
|
||||||
|
case WestGravity:
|
||||||
|
x = _client->area().x();
|
||||||
|
break;
|
||||||
|
|
||||||
attrib_create.background_pixmap = None;
|
case NorthGravity:
|
||||||
attrib_create.event_mask = ButtonPressMask | ButtonReleaseMask |
|
case SouthGravity:
|
||||||
ButtonMotionMask | ExposureMask;
|
case CenterGravity:
|
||||||
|
x = _client->area().x() - (_size.left + _size.right) / 2;
|
||||||
|
break;
|
||||||
|
|
||||||
if (cursor) {
|
case NorthEastGravity:
|
||||||
create_mask |= CWCursor;
|
case SouthEastGravity:
|
||||||
attrib_create.cursor = cursor;
|
case EastGravity:
|
||||||
|
x = _client->area().x() - _size.left - _size.right + 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ForgetGravity:
|
||||||
|
case StaticGravity:
|
||||||
|
x = _client->area().x() - _size.left;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Window w = XCreateWindow(otk::OBDisplay::display, parent, 0, 0, 1, 1, 0,
|
// apply vertical window gravity
|
||||||
_screen->getDepth(), InputOutput,
|
switch (_client->gravity()) {
|
||||||
_screen->getVisual(), create_mask, &attrib_create);
|
default:
|
||||||
return w;
|
case NorthWestGravity:
|
||||||
|
case NorthEastGravity:
|
||||||
|
case NorthGravity:
|
||||||
|
y = _client->area().y();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CenterGravity:
|
||||||
|
case EastGravity:
|
||||||
|
case WestGravity:
|
||||||
|
y = _client->area().y() - (_size.top + _size.bottom) / 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SouthWestGravity:
|
||||||
|
case SouthEastGravity:
|
||||||
|
case SouthGravity:
|
||||||
|
y = _client->area().y() - _size.top - _size.bottom + 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ForgetGravity:
|
||||||
|
case StaticGravity:
|
||||||
|
y = _client->area().y() - _size.top;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
move(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Window OBFrame::createFrame()
|
|
||||||
{
|
|
||||||
XSetWindowAttributes attrib_create;
|
|
||||||
unsigned long create_mask = CWBackPixmap | CWBorderPixel | CWColormap |
|
|
||||||
CWOverrideRedirect | CWEventMask;
|
|
||||||
|
|
||||||
attrib_create.background_pixmap = None;
|
|
||||||
attrib_create.colormap = _screen->getColormap();
|
|
||||||
attrib_create.override_redirect = True;
|
|
||||||
attrib_create.event_mask = EnterWindowMask | LeaveWindowMask | ButtonPress;
|
|
||||||
/*
|
|
||||||
We catch button presses because other wise they get passed down to the
|
|
||||||
root window, which will then cause root menus to show when you click the
|
|
||||||
window's frame.
|
|
||||||
*/
|
|
||||||
|
|
||||||
return XCreateWindow(otk::OBDisplay::display, _screen->getRootWindow(),
|
|
||||||
0, 0, 1, 1, 0,
|
|
||||||
_screen->getDepth(), InputOutput, _screen->getVisual(),
|
|
||||||
create_mask, &attrib_create);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,11 +56,6 @@ private:
|
||||||
*/
|
*/
|
||||||
OBClient::DecorationFlags _decorations;
|
OBClient::DecorationFlags _decorations;
|
||||||
|
|
||||||
//! Creates the base frame window
|
|
||||||
Window createFrame();
|
|
||||||
//! Creates a child frame decoration element window
|
|
||||||
Window createChild(Window parent, Cursor cursor);
|
|
||||||
|
|
||||||
//! Reparents the client window from the root window onto the frame
|
//! Reparents the client window from the root window onto the frame
|
||||||
void grabClient();
|
void grabClient();
|
||||||
//! Reparents the client window back to the root window
|
//! Reparents the client window back to the root window
|
||||||
|
@ -86,6 +81,10 @@ public:
|
||||||
void adjust();
|
void adjust();
|
||||||
//! Shape the frame window to the client window
|
//! Shape the frame window to the client window
|
||||||
void adjustShape();
|
void adjustShape();
|
||||||
|
|
||||||
|
//! Applies gravity for the client's gravity, moving the frame to the
|
||||||
|
//! appropriate place
|
||||||
|
void applyGravity();
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue