aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hercek <hercek@users.sourceforge.net>2013-02-26 19:15:44 (GMT)
committerMathias Gumz <akira at fluxbox dot org>2013-05-23 06:27:15 (GMT)
commit5e3217441ad0f97bff1e946fb93a9673ac806052 (patch)
tree16f0e0929920b09ee3c4cfa87a4bc4db61c5ef78
parent6dca40aae6e0b0d923cc5eb7d18bb53c0a42482e (diff)
downloadfluxbox-5e3217441ad0f97bff1e946fb93a9673ac806052.zip
fluxbox-5e3217441ad0f97bff1e946fb93a9673ac806052.tar.bz2
fix head detection for adjacent heads of too different sizes and window placement based on apps file
* if you have e.g a 1920x1200 monitor and a small 800x600 monitor to the right of the bigger one and a small window at the right side of the big monitor (but still the whole window area at the big monitor) then the original head detection would claim the window is on the small monitor because (800/2+windowWidth/2 < 1920/2+windowWidth/2) is true for small windows; but that is obviously wrong, the window is entirely on the big monitor * these incorrect head detections did lead to incorrect window placements as they were required in the apps file
-rw-r--r--src/Screen.cc25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/Screen.cc b/src/Screen.cc
index 725d4b5..507a58f 100644
--- a/src/Screen.cc
+++ b/src/Screen.cc
@@ -2115,17 +2115,20 @@ int BScreen::getHead(const FbTk::FbWindow &win) const {
2115 int cx = win.x() + static_cast<int>(win.width() / 2); 2115 int cx = win.x() + static_cast<int>(win.width() / 2);
2116 int cy = win.y() + static_cast<int>(win.height() / 2); 2116 int cy = win.y() + static_cast<int>(win.height() / 2);
2117 2117
2118 long dist = -1; 2118 head = getHead(cx, cy);
2119 2119 if ( head == 0 ) {
2120 int i; 2120 // if the center of the window is not on any head then select
2121 for (i = 0; i < m_xinerama_num_heads; ++i) { 2121 // the head which center is nearest to the window center
2122 2122 long dist = -1;
2123 XineramaHeadInfo& hi = m_xinerama_headinfo[i]; 2123 int i;
2124 int d = calcSquareDistance(cx, cy, hi.x() + (hi.width() / 2), hi.y() + (hi.height() / 2)); 2124 for (i = 0; i < m_xinerama_num_heads; ++i) {
2125 2125 XineramaHeadInfo& hi = m_xinerama_headinfo[i];
2126 if (dist == -1 || d < dist) { // found a closer head 2126 int d = calcSquareDistance(cx, cy,
2127 head = i + 1; 2127 hi.x() + (hi.width() / 2), hi.y() + (hi.height() / 2));
2128 dist = d; 2128 if (dist == -1 || d < dist) { // found a closer head
2129 head = i + 1;
2130 dist = d;
2131 }
2129 } 2132 }
2130 } 2133 }
2131 } 2134 }