aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/RectangleUtil.hh21
-rw-r--r--src/Window.cc12
2 files changed, 19 insertions, 14 deletions
diff --git a/src/RectangleUtil.hh b/src/RectangleUtil.hh
index 9725e63..dfb0082 100644
--- a/src/RectangleUtil.hh
+++ b/src/RectangleUtil.hh
@@ -3,6 +3,14 @@
3 3
4namespace RectangleUtil { 4namespace RectangleUtil {
5 5
6inline bool insideRectangle(int x, int y, int width, int height, int px, int py) {
7
8 return
9 px >= x &&
10 px < (x + width) &&
11 py >= y &&
12 py < (y + height);
13}
6 14
7/* 15/*
8 * Determines if a point is inside a rectangle-like objects border. 16 * Determines if a point is inside a rectangle-like objects border.
@@ -10,18 +18,17 @@ namespace RectangleUtil {
10 * height. 18 * height.
11 * @param x 19 * @param x
12 * @param y 20 * @param y
13 * @param border_width The size of the border. 21 * @param border The size of the border.
14 * @returns true if point is inside the rectangle-like object. 22 * @returns true if point is inside the rectangle-like object.
15*/ 23*/
24
16template <typename RectangleLike> 25template <typename RectangleLike>
17bool insideBorder(const RectangleLike& rect, 26bool insideBorder(const RectangleLike& rect,
18 int x, int y, 27 int x, int y,
19 int border_width) { 28 int border) {
20 return 29 const int w = static_cast<int>(rect.width()) - border;
21 x >= rect.x() + border_width && 30 const int h = static_cast<int>(rect.height()) - border;
22 x < rect.x() + (int)rect.width() + border_width && 31 return insideRectangle(rect.x() + border, rect.y() + border, w, h, x, y);
23 y >= rect.y() + border_width &&
24 y < rect.y() + (int)rect.height() + border_width;
25} 32}
26 33
27 34
diff --git a/src/Window.cc b/src/Window.cc
index 1c9c795..9416978 100644
--- a/src/Window.cc
+++ b/src/Window.cc
@@ -223,11 +223,8 @@ bool isWindowVisibleOnSomeHeadOrScreen(FluxboxWindow const& w) {
223 223
224 if (w.screen().hasXinerama()) { // xinerama available => use head info 224 if (w.screen().hasXinerama()) { // xinerama available => use head info
225 return (0 != w.screen().getHead(real_x, real_y)); // if visible on some head 225 return (0 != w.screen().getHead(real_x, real_y)); // if visible on some head
226 } else { // no xinerama available => use screen info
227 return (real_x >= 0 && real_y >= 0 &&
228 real_x <= (signed) w.screen().width() &&
229 real_y <= (signed) w.screen().height()); // if visible on the screen
230 } 226 }
227 return RectangleUtil::insideRectangle(0, 0, w.screen().width(), w.screen().height(), real_x, real_y);
231} 228}
232 229
233class SetClientCmd:public FbTk::Command<void> { 230class SetClientCmd:public FbTk::Command<void> {
@@ -464,14 +461,15 @@ void FluxboxWindow::init() {
464 461
465 setWindowType(m_client->getWindowType()); 462 setWindowType(m_client->getWindowType());
466 463
464 bool is_visible = isWindowVisibleOnSomeHeadOrScreen(*this);
465
467 if (fluxbox.isStartup()) 466 if (fluxbox.isStartup())
468 m_placed = true; 467 m_placed = true;
469 else if (m_client->isTransient() || 468 else if (m_client->isTransient() ||
470 m_client->normal_hint_flags & (PPosition|USPosition)) { 469 m_client->normal_hint_flags & (PPosition|USPosition)) {
471 if (isWindowVisibleOnSomeHeadOrScreen(*this)) 470 m_placed = is_visible;
472 m_placed = true;
473 } else { 471 } else {
474 if (!isWindowVisibleOnSomeHeadOrScreen(*this)) { 472 if (!is_visible) {
475 int cur = screen().getHead(fbWindow()); 473 int cur = screen().getHead(fbWindow());
476 move(screen().getHeadX(cur), screen().getHeadY(cur)); 474 move(screen().getHeadX(cur), screen().getHeadY(cur));
477 m_placed = false; // allow placement strategy to fix position 475 m_placed = false; // allow placement strategy to fix position