#include "Window.h"
#include "Workspace.h"
#include "Workspacemenu.h"
+#include "Util.h"
#ifdef HAVE_STDLIB_H
# include <stdlib.h>
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,
BTexture *texture,
unsigned long default_pixel)
inline Toolbar *getToolbar() { return toolbar; }
+ Rect availableArea() const;
+
inline Workspace *getWorkspace(int w) { return workspacesList->find(w); }
inline Workspace *getCurrentWorkspace() { return current_workspace; }
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_y = frame.y;
openbox_attrib.premax_w = frame.width;
openbox_attrib.premax_h = frame.height;
+ Rect space = screen->availableArea();
unsigned int dw = space.w(),
dh = space.h();
dw -= frame.border_w * 2;
void Workspace::placeWindow(OpenboxWindow *win) {
ASSERT(win != NULL);
- // 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());
-
-#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
-
+ Rect space = screen.availableArea();
const Size window_size(win->area().w()+screen.getBorderWidth() * 4,
win->area().h()+screen.getBorderWidth() * 4);
Point *place = NULL;