all repos — fluxbox @ 5e3217441ad0f97bff1e946fb93a9673ac806052

custom fork of the fluxbox windowmanager

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
Peter Hercek hercek@users.sourceforge.net
commit

5e3217441ad0f97bff1e946fb93a9673ac806052

parent

6dca40aae6e0b0d923cc5eb7d18bb53c0a42482e

1 files changed, 14 insertions(+), 11 deletions(-)

jump to
M src/Screen.ccsrc/Screen.cc

@@ -2115,17 +2115,20 @@ // since it might become negative

int cx = win.x() + static_cast<int>(win.width() / 2); int cy = win.y() + static_cast<int>(win.height() / 2); - long dist = -1; - - int i; - for (i = 0; i < m_xinerama_num_heads; ++i) { - - XineramaHeadInfo& hi = m_xinerama_headinfo[i]; - int d = calcSquareDistance(cx, cy, hi.x() + (hi.width() / 2), hi.y() + (hi.height() / 2)); - - if (dist == -1 || d < dist) { // found a closer head - head = i + 1; - dist = d; + head = getHead(cx, cy); + if ( head == 0 ) { + // if the center of the window is not on any head then select + // the head which center is nearest to the window center + long dist = -1; + int i; + for (i = 0; i < m_xinerama_num_heads; ++i) { + XineramaHeadInfo& hi = m_xinerama_headinfo[i]; + int d = calcSquareDistance(cx, cy, + hi.x() + (hi.width() / 2), hi.y() + (hi.height() / 2)); + if (dist == -1 || d < dist) { // found a closer head + head = i + 1; + dist = d; + } } } }