added BScreen::availableArea() which returns a rect specifying where windows can be placed on the screen, and what area they can fill when maximized
This commit is contained in:
parent
fb96e47f23
commit
e5685e3cfd
4 changed files with 107 additions and 199 deletions
103
src/Screen.cc
103
src/Screen.cc
|
@ -49,6 +49,7 @@
|
||||||
#include "Window.h"
|
#include "Window.h"
|
||||||
#include "Workspace.h"
|
#include "Workspace.h"
|
||||||
#include "Workspacemenu.h"
|
#include "Workspacemenu.h"
|
||||||
|
#include "Util.h"
|
||||||
|
|
||||||
#ifdef HAVE_STDLIB_H
|
#ifdef HAVE_STDLIB_H
|
||||||
# include <stdlib.h>
|
# include <stdlib.h>
|
||||||
|
@ -589,6 +590,108 @@ BScreen::~BScreen(void) {
|
||||||
resource.tstyle.b_pic_gc);
|
resource.tstyle.b_pic_gc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Rect BScreen::availableArea() const {
|
||||||
|
// the following code is temporary and will be taken care of by Screen in the
|
||||||
|
// future (with the NETWM 'strut')
|
||||||
|
Rect space(0, 0, size().w(), size().h());
|
||||||
|
if (!resource.full_max) {
|
||||||
|
#ifdef SLIT
|
||||||
|
int slit_x = slit->autoHide() ? slit->hiddenOrigin().x() : slit->area().x(),
|
||||||
|
slit_y = slit->autoHide() ? slit->hiddenOrigin().y() : slit->area().y();
|
||||||
|
int tbarh = resource.hide_toolbar ? 0 :
|
||||||
|
toolbar->getExposedHeight() + resource.border_width * 2;
|
||||||
|
bool tbartop;
|
||||||
|
switch (toolbar->placement()) {
|
||||||
|
case Toolbar::TopLeft:
|
||||||
|
case Toolbar::TopCenter:
|
||||||
|
case Toolbar::TopRight:
|
||||||
|
tbartop = true;
|
||||||
|
break;
|
||||||
|
case Toolbar::BottomLeft:
|
||||||
|
case Toolbar::BottomCenter:
|
||||||
|
case Toolbar::BottomRight:
|
||||||
|
tbartop = false;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(false); // unhandled placement
|
||||||
|
}
|
||||||
|
if ((slit->direction() == Slit::Horizontal &&
|
||||||
|
(slit->placement() == Slit::TopLeft ||
|
||||||
|
slit->placement() == Slit::TopRight)) ||
|
||||||
|
slit->placement() == Slit::TopCenter) {
|
||||||
|
// exclude top
|
||||||
|
if (tbartop && slit_y + slit->area().h() < tbarh) {
|
||||||
|
space.setY(space.y() + tbarh);
|
||||||
|
space.setH(space.h() - tbarh);
|
||||||
|
} else {
|
||||||
|
space.setY(space.y() + (slit_y + slit->area().h() +
|
||||||
|
resource.border_width * 2));
|
||||||
|
space.setH(space.h() - (slit_y + slit->area().h() +
|
||||||
|
resource.border_width * 2));
|
||||||
|
if (!tbartop)
|
||||||
|
space.setH(space.h() - tbarh);
|
||||||
|
}
|
||||||
|
} else if ((slit->direction() == Slit::Vertical &&
|
||||||
|
(slit->placement() == Slit::TopRight ||
|
||||||
|
slit->placement() == Slit::BottomRight)) ||
|
||||||
|
slit->placement() == Slit::CenterRight) {
|
||||||
|
// exclude right
|
||||||
|
space.setW(space.w() - (size().w() - slit_x));
|
||||||
|
if (tbartop)
|
||||||
|
space.setY(space.y() + tbarh);
|
||||||
|
space.setH(space.h() - tbarh);
|
||||||
|
} else if ((slit->direction() == Slit::Horizontal &&
|
||||||
|
(slit->placement() == Slit::BottomLeft ||
|
||||||
|
slit->placement() == Slit::BottomRight)) ||
|
||||||
|
slit->placement() == Slit::BottomCenter) {
|
||||||
|
// exclude bottom
|
||||||
|
if (!tbartop && (size().h() - slit_y) < tbarh) {
|
||||||
|
space.setH(space.h() - tbarh);
|
||||||
|
} else {
|
||||||
|
space.setH(space.h() - (size().h() - slit_y));
|
||||||
|
if (tbartop) {
|
||||||
|
space.setY(space.y() + tbarh);
|
||||||
|
space.setH(space.h() - tbarh);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {// if ((slit->direction() == Slit::Vertical &&
|
||||||
|
// (slit->placement() == Slit::TopLeft ||
|
||||||
|
// slit->placement() == Slit::BottomLeft)) ||
|
||||||
|
// slit->placement() == Slit::CenterLeft)
|
||||||
|
// exclude left
|
||||||
|
space.setX(slit_x + slit->area().w() +
|
||||||
|
resource.border_width * 2);
|
||||||
|
space.setW(space.w() - (slit_x + slit->area().w() +
|
||||||
|
resource.border_width * 2));
|
||||||
|
if (tbartop)
|
||||||
|
space.setY(space.y() + tbarh);
|
||||||
|
space.setH(space.h() - tbarh);
|
||||||
|
}
|
||||||
|
#else // !SLIT
|
||||||
|
int tbarh = resource.hide_toolbar() ? 0 :
|
||||||
|
toolbar->getExposedHeight() + resource.border_width * 2;
|
||||||
|
switch (toolbar->placement()) {
|
||||||
|
case Toolbar::TopLeft:
|
||||||
|
case Toolbar::TopCenter:
|
||||||
|
case Toolbar::TopRight:
|
||||||
|
space.setY(toolbar->getExposedHeight());
|
||||||
|
space.setH(space.h() - toolbar->getExposedHeight());
|
||||||
|
break;
|
||||||
|
case Toolbar::BottomLeft:
|
||||||
|
case Toolbar::BottomCenter:
|
||||||
|
case Toolbar::BottomRight:
|
||||||
|
space.setH(space.h() - tbarh);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(false); // unhandled placement
|
||||||
|
}
|
||||||
|
#endif // SLIT
|
||||||
|
}
|
||||||
|
return space;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void BScreen::readDatabaseTexture(const char *rname, const char *rclass,
|
void BScreen::readDatabaseTexture(const char *rname, const char *rclass,
|
||||||
BTexture *texture,
|
BTexture *texture,
|
||||||
unsigned long default_pixel)
|
unsigned long default_pixel)
|
||||||
|
|
|
@ -187,6 +187,8 @@ public:
|
||||||
|
|
||||||
inline Toolbar *getToolbar() { return toolbar; }
|
inline Toolbar *getToolbar() { return toolbar; }
|
||||||
|
|
||||||
|
Rect availableArea() const;
|
||||||
|
|
||||||
inline Workspace *getWorkspace(int w) { return workspacesList->find(w); }
|
inline Workspace *getWorkspace(int w) { return workspacesList->find(w); }
|
||||||
inline Workspace *getCurrentWorkspace() { return current_workspace; }
|
inline Workspace *getCurrentWorkspace() { return current_workspace; }
|
||||||
|
|
||||||
|
|
101
src/Window.cc
101
src/Window.cc
|
@ -1533,111 +1533,12 @@ void OpenboxWindow::maximize(unsigned int button) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// the following code is temporary and will be taken care of by Screen in the
|
|
||||||
// future (with the NETWM 'strut')
|
|
||||||
Rect space(0, 0, screen->size().w(), screen->size().h());
|
|
||||||
if (! screen->fullMax()) {
|
|
||||||
#ifdef SLIT
|
|
||||||
Slit *slit = screen->getSlit();
|
|
||||||
int slit_x = slit->autoHide() ? slit->hiddenOrigin().x() : slit->area().x(),
|
|
||||||
slit_y = slit->autoHide() ? slit->hiddenOrigin().y() : slit->area().y();
|
|
||||||
Toolbar *toolbar = screen->getToolbar();
|
|
||||||
int tbarh = screen->hideToolbar() ? 0 :
|
|
||||||
toolbar->getExposedHeight() + screen->getBorderWidth() * 2;
|
|
||||||
bool tbartop;
|
|
||||||
switch (toolbar->placement()) {
|
|
||||||
case Toolbar::TopLeft:
|
|
||||||
case Toolbar::TopCenter:
|
|
||||||
case Toolbar::TopRight:
|
|
||||||
tbartop = true;
|
|
||||||
break;
|
|
||||||
case Toolbar::BottomLeft:
|
|
||||||
case Toolbar::BottomCenter:
|
|
||||||
case Toolbar::BottomRight:
|
|
||||||
tbartop = false;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ASSERT(false); // unhandled placement
|
|
||||||
}
|
|
||||||
if ((slit->direction() == Slit::Horizontal &&
|
|
||||||
(slit->placement() == Slit::TopLeft ||
|
|
||||||
slit->placement() == Slit::TopRight)) ||
|
|
||||||
slit->placement() == Slit::TopCenter) {
|
|
||||||
// exclude top
|
|
||||||
if (tbartop && slit_y + slit->area().h() < tbarh) {
|
|
||||||
space.setY(space.y() + tbarh);
|
|
||||||
space.setH(space.h() - tbarh);
|
|
||||||
} else {
|
|
||||||
space.setY(space.y() + (slit_y + slit->area().h() +
|
|
||||||
screen->getBorderWidth() * 2));
|
|
||||||
space.setH(space.h() - (slit_y + slit->area().h() +
|
|
||||||
screen->getBorderWidth() * 2));
|
|
||||||
if (!tbartop)
|
|
||||||
space.setH(space.h() - tbarh);
|
|
||||||
}
|
|
||||||
} else if ((slit->direction() == Slit::Vertical &&
|
|
||||||
(slit->placement() == Slit::TopRight ||
|
|
||||||
slit->placement() == Slit::BottomRight)) ||
|
|
||||||
slit->placement() == Slit::CenterRight) {
|
|
||||||
// exclude right
|
|
||||||
space.setW(space.w() - (screen->size().w() - slit_x));
|
|
||||||
if (tbartop)
|
|
||||||
space.setY(space.y() + tbarh);
|
|
||||||
space.setH(space.h() - tbarh);
|
|
||||||
} else if ((slit->direction() == Slit::Horizontal &&
|
|
||||||
(slit->placement() == Slit::BottomLeft ||
|
|
||||||
slit->placement() == Slit::BottomRight)) ||
|
|
||||||
slit->placement() == Slit::BottomCenter) {
|
|
||||||
// exclude bottom
|
|
||||||
if (!tbartop && (screen->size().h() - slit_y) < tbarh) {
|
|
||||||
space.setH(space.h() - tbarh);
|
|
||||||
} else {
|
|
||||||
space.setH(space.h() - (screen->size().h() - slit_y));
|
|
||||||
if (tbartop) {
|
|
||||||
space.setY(space.y() + tbarh);
|
|
||||||
space.setH(space.h() - tbarh);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {// if ((slit->direction() == Slit::Vertical &&
|
|
||||||
// (slit->placement() == Slit::TopLeft ||
|
|
||||||
// slit->placement() == Slit::BottomLeft)) ||
|
|
||||||
// slit->placement() == Slit::CenterLeft)
|
|
||||||
// exclude left
|
|
||||||
space.setX(slit_x + slit->area().w() +
|
|
||||||
screen->getBorderWidth() * 2);
|
|
||||||
space.setW(space.w() - (slit_x + slit->area().w() +
|
|
||||||
screen->getBorderWidth() * 2));
|
|
||||||
if (tbartop)
|
|
||||||
space.setY(space.y() + tbarh);
|
|
||||||
space.setH(space.h() - tbarh);
|
|
||||||
}
|
|
||||||
#else // !SLIT
|
|
||||||
Toolbar *toolbar = screen->getToolbar();
|
|
||||||
int tbarh = screen->hideToolbar() ? 0 :
|
|
||||||
toolbar->getExposedHeight() + screen->getBorderWidth() * 2;
|
|
||||||
switch (toolbar->placement()) {
|
|
||||||
case Toolbar::TopLeft:
|
|
||||||
case Toolbar::TopCenter:
|
|
||||||
case Toolbar::TopRight:
|
|
||||||
space.setY(toolbar->getExposedHeight());
|
|
||||||
space.setH(space.h() - toolbar->getExposedHeight());
|
|
||||||
break;
|
|
||||||
case Toolbar::BottomLeft:
|
|
||||||
case Toolbar::BottomCenter:
|
|
||||||
case Toolbar::BottomRight:
|
|
||||||
space.setH(space.h() - tbarh);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ASSERT(false); // unhandled placement
|
|
||||||
}
|
|
||||||
#endif // SLIT
|
|
||||||
}
|
|
||||||
|
|
||||||
openbox_attrib.premax_x = frame.x;
|
openbox_attrib.premax_x = frame.x;
|
||||||
openbox_attrib.premax_y = frame.y;
|
openbox_attrib.premax_y = frame.y;
|
||||||
openbox_attrib.premax_w = frame.width;
|
openbox_attrib.premax_w = frame.width;
|
||||||
openbox_attrib.premax_h = frame.height;
|
openbox_attrib.premax_h = frame.height;
|
||||||
|
|
||||||
|
Rect space = screen->availableArea();
|
||||||
unsigned int dw = space.w(),
|
unsigned int dw = space.w(),
|
||||||
dh = space.h();
|
dh = space.h();
|
||||||
dw -= frame.border_w * 2;
|
dw -= frame.border_w * 2;
|
||||||
|
|
100
src/Workspace.cc
100
src/Workspace.cc
|
@ -581,105 +581,7 @@ Point *const Workspace::cascadePlacement(const OpenboxWindow *const win){
|
||||||
void Workspace::placeWindow(OpenboxWindow *win) {
|
void Workspace::placeWindow(OpenboxWindow *win) {
|
||||||
ASSERT(win != NULL);
|
ASSERT(win != NULL);
|
||||||
|
|
||||||
// the following code is temporary and will be taken care of by Screen in the
|
Rect space = screen.availableArea();
|
||||||
// future (with the NETWM 'strut')
|
|
||||||
Rect space(0, 0, screen.size().w(), screen.size().h());
|
|
||||||
|
|
||||||
#ifdef SLIT
|
|
||||||
Slit *slit = screen.getSlit();
|
|
||||||
int slit_x = slit->autoHide() ? slit->hiddenOrigin().x() : slit->area().x(),
|
|
||||||
slit_y = slit->autoHide() ? slit->hiddenOrigin().y() : slit->area().y();
|
|
||||||
Toolbar *toolbar = screen.getToolbar();
|
|
||||||
int tbarh = screen.hideToolbar() ? 0 :
|
|
||||||
toolbar->getExposedHeight() + screen.getBorderWidth() * 2;
|
|
||||||
bool tbartop;
|
|
||||||
switch (toolbar->placement()) {
|
|
||||||
case Toolbar::TopLeft:
|
|
||||||
case Toolbar::TopCenter:
|
|
||||||
case Toolbar::TopRight:
|
|
||||||
tbartop = true;
|
|
||||||
break;
|
|
||||||
case Toolbar::BottomLeft:
|
|
||||||
case Toolbar::BottomCenter:
|
|
||||||
case Toolbar::BottomRight:
|
|
||||||
tbartop = false;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ASSERT(false); // unhandled placement
|
|
||||||
}
|
|
||||||
if ((slit->direction() == Slit::Horizontal &&
|
|
||||||
(slit->placement() == Slit::TopLeft ||
|
|
||||||
slit->placement() == Slit::TopRight)) ||
|
|
||||||
slit->placement() == Slit::TopCenter) {
|
|
||||||
// exclude top
|
|
||||||
if (tbartop && slit_y + slit->area().h() < tbarh) {
|
|
||||||
space.setY(space.y() + tbarh);
|
|
||||||
space.setH(space.h() - tbarh);
|
|
||||||
} else {
|
|
||||||
space.setY(space.y() + (slit_y + slit->area().h() +
|
|
||||||
screen.getBorderWidth() * 2));
|
|
||||||
space.setH(space.h() - (slit_y + slit->area().h() +
|
|
||||||
screen.getBorderWidth() * 2));
|
|
||||||
if (!tbartop)
|
|
||||||
space.setH(space.h() - tbarh);
|
|
||||||
}
|
|
||||||
} else if ((slit->direction() == Slit::Vertical &&
|
|
||||||
(slit->placement() == Slit::TopRight ||
|
|
||||||
slit->placement() == Slit::BottomRight)) ||
|
|
||||||
slit->placement() == Slit::CenterRight) {
|
|
||||||
// exclude right
|
|
||||||
space.setW(space.w() - (screen.size().w() - slit_x));
|
|
||||||
if (tbartop)
|
|
||||||
space.setY(space.y() + tbarh);
|
|
||||||
space.setH(space.h() - tbarh);
|
|
||||||
} else if ((slit->direction() == Slit::Horizontal &&
|
|
||||||
(slit->placement() == Slit::BottomLeft ||
|
|
||||||
slit->placement() == Slit::BottomRight)) ||
|
|
||||||
slit->placement() == Slit::BottomCenter) {
|
|
||||||
// exclude bottom
|
|
||||||
if (!tbartop && (screen.size().h() - slit_y) < tbarh) {
|
|
||||||
space.setH(space.h() - tbarh);
|
|
||||||
} else {
|
|
||||||
space.setH(space.h() - (screen.size().h() - slit_y));
|
|
||||||
if (tbartop) {
|
|
||||||
space.setY(space.y() + tbarh);
|
|
||||||
space.setH(space.h() - tbarh);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {// if ((slit->direction() == Slit::Vertical &&
|
|
||||||
// (slit->placement() == Slit::TopLeft ||
|
|
||||||
// slit->placement() == Slit::BottomLeft)) ||
|
|
||||||
// slit->placement() == Slit::CenterLeft)
|
|
||||||
// exclude left
|
|
||||||
space.setX(slit_x + slit->area().w() +
|
|
||||||
screen.getBorderWidth() * 2);
|
|
||||||
space.setW(space.w() - (slit_x + slit->area().w() +
|
|
||||||
screen.getBorderWidth() * 2));
|
|
||||||
if (tbartop)
|
|
||||||
space.setY(space.y() + tbarh);
|
|
||||||
space.setH(space.h() - tbarh);
|
|
||||||
}
|
|
||||||
#else // !SLIT
|
|
||||||
Toolbar *toolbar = screen.getToolbar();
|
|
||||||
int tbarh = screen.hideToolbar() ? 0 :
|
|
||||||
toolbar->getExposedHeight() + screen.getBorderWidth() * 2;
|
|
||||||
switch (toolbar->placement()) {
|
|
||||||
case Toolbar::TopLeft:
|
|
||||||
case Toolbar::TopCenter:
|
|
||||||
case Toolbar::TopRight:
|
|
||||||
space.setY(toolbar->getExposedHeight());
|
|
||||||
space.setH(space.h() - toolbar->getExposedHeight());
|
|
||||||
break;
|
|
||||||
case Toolbar::BottomLeft:
|
|
||||||
case Toolbar::BottomCenter:
|
|
||||||
case Toolbar::BottomRight:
|
|
||||||
space.setH(space.h() - tbarh);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ASSERT(false); // unhandled placement
|
|
||||||
}
|
|
||||||
#endif // SLIT
|
|
||||||
|
|
||||||
const Size window_size(win->area().w()+screen.getBorderWidth() * 4,
|
const Size window_size(win->area().w()+screen.getBorderWidth() * 4,
|
||||||
win->area().h()+screen.getBorderWidth() * 4);
|
win->area().h()+screen.getBorderWidth() * 4);
|
||||||
Point *place = NULL;
|
Point *place = NULL;
|
||||||
|
|
Loading…
Reference in a new issue