🏡 index : quine-global-labs/plasma-desktop.git

/*
 * Copyright 2014 Weng Xuetian <wengxt@gmail.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License or (at your option) version 3 or any later version
 * accepted by the membership of KDE e.V. (or its successor approved
 * by the membership of KDE e.V.), which shall act as a proxy
 * defined in Section 14 of version 3 of the license.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
 */

#include <limits.h>
#include <QGuiApplication>
#include <QScreen>
#include "screen.h"

int pointToRect(int x, int y, const QRect& r)
{
    int dx = 0;
    int dy = 0;
    if (x < r.left()) {
        dx = r.left() -x;
    } else if (x > r.right()) {
        dx = x - r.right();
    }
    if (y < r.top()) {
        dy = r.top() - y;
    } else if (y > r.bottom()) {
        dy = y - r.bottom();
    }
    return dx + dy;
}

Screen::Screen(QObject* parent) : QObject(parent)
{
}

Screen::~Screen()
{
}

QRect Screen::geometryForPoint(int x, int y)
{
    auto screens = qApp->screens();
    QScreen* closestScreen = nullptr;
    int shortestDistance = INT_MAX;
    foreach(QScreen* screen, screens) {
        int thisDistance = pointToRect(x, y, screen->availableGeometry());
        if (thisDistance < shortestDistance) {
            shortestDistance = thisDistance;
            closestScreen = screen;
        }
    }

    if (!closestScreen) {
        closestScreen = qApp->primaryScreen();
    }

    return closestScreen ? closestScreen->availableGeometry() : QRect();
}