diff options
author | Peter Hercek <hercek@users.sourceforge.net> | 2013-02-26 19:15:44 (GMT) |
---|---|---|
committer | Mathias Gumz <akira at fluxbox dot org> | 2013-05-23 06:27:15 (GMT) |
commit | 5e3217441ad0f97bff1e946fb93a9673ac806052 (patch) | |
tree | 16f0e0929920b09ee3c4cfa87a4bc4db61c5ef78 | |
parent | 6dca40aae6e0b0d923cc5eb7d18bb53c0a42482e (diff) | |
download | fluxbox-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.cc | 25 |
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 | } |