Всем привет!
Добрались руки до нормальной переделки. За исходник взял код arhiv6 и малость допилил. Корректно работает на нескольких мониторах (расширенный рабочий стол). И корректно отрабатывает доступные области (липнет к краям панели задач, а не к краю экрана под ней).
Пробовал только под виндой. Если руки дойдут - попробую под линуксом - отпишусь (хочется проверить, не будет ли конфликтов с wm).
CODE
void MainWindow::moveEvent(QMoveEvent *event)
{
Q_UNUSED(event);
const int magnetDistance = 100;
int screenNum = QApplication::desktop()->screenNumber(this);
int windowTopBorder = pos().y();
int windowBottomBorder = windowTopBorder + size().height();
int windowLeftBorder = pos().x();
int windowRightBorder = windowLeftBorder + size().width();
qDebug() << "win" << windowLeftBorder << windowRightBorder << windowTopBorder << windowBottomBorder;
int screenTopBorder = QApplication::desktop()->availableGeometry(screenNum).top();
int screenBottomBorder = QApplication::desktop()->availableGeometry(screenNum).bottom();
int screenLeftBorder = QApplication::desktop()->availableGeometry(screenNum).left();
int screenRightBorder = QApplication::desktop()->availableGeometry(screenNum).right();
qDebug() << "screen" << screenLeftBorder << screenRightBorder << screenTopBorder << screenBottomBorder;
if (abs(windowLeftBorder - screenLeftBorder) < magnetDistance) {
move(screenLeftBorder, windowTopBorder);
}
if (abs(windowRightBorder - screenRightBorder) < magnetDistance) {
move(screenRightBorder - size().width(), windowTopBorder);
}
if (abs(windowTopBorder - screenTopBorder) < magnetDistance) {
move(windowLeftBorder, screenTopBorder);
}
if (abs(windowBottomBorder - screenBottomBorder) < magnetDistance) {
move(windowLeftBorder, screenBottomBorder - size().height());
}
}