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
This commit is contained in:
Peter Hercek 2013-02-26 20:15:44 +01:00 committed by Mathias Gumz
parent 6dca40aae6
commit 5e3217441a

View file

@ -2115,17 +2115,20 @@ int BScreen::getHead(const FbTk::FbWindow &win) const {
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;
}
}
}
}