181 lines
5.8 KiB
C++
181 lines
5.8 KiB
C++
|
#include "primarymanager.h"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
PrimaryManager::PrimaryManager()
|
|||
|
{
|
|||
|
this->m_on_wayland = checkWayland();
|
|||
|
if(m_on_wayland){
|
|||
|
//支持 wayland
|
|||
|
mDbusXrandInter = new QDBusInterface(DBUS_NAME,
|
|||
|
DBUS_PATH,
|
|||
|
DBUS_INTERFACE,
|
|||
|
QDBusConnection::sessionBus());
|
|||
|
this->m_nScreen_x = getScreenGeometry("x");
|
|||
|
this->m_nScreen_y = getScreenGeometry("y");
|
|||
|
this->m_screenWidth = getScreenGeometry("width");
|
|||
|
this->m_screenHeight = getScreenGeometry("height");
|
|||
|
qDebug("初始化, geometry is x=%d, y=%d, width=%d, height=%d", m_nScreen_x, m_nScreen_y, m_screenWidth, m_screenHeight);
|
|||
|
/*监听dbus变化 更改主屏幕时,会进行信号发送 */
|
|||
|
connect(mDbusXrandInter, SIGNAL(screenPrimaryChanged(int,int,int,int)),
|
|||
|
this, SLOT(priScreenChanged(int,int,int,int)));
|
|||
|
}else{
|
|||
|
//不支持 wayland
|
|||
|
m_pDeskWgt = QApplication::desktop();
|
|||
|
m_adaptScreenInfo = new adaptScreenInfo();
|
|||
|
updateInfoByAdapt();
|
|||
|
//当改变屏幕分辨率时 重新计算 主屏坐标 屏幕宽高
|
|||
|
connect(QApplication::primaryScreen(), &QScreen::geometryChanged, this, &PrimaryManager::updateInfoByAdapt);
|
|||
|
//主屏发生变化槽函数 重新计算 主屏坐标 屏幕宽高
|
|||
|
connect(m_pDeskWgt, &QDesktopWidget::primaryScreenChanged, this, &PrimaryManager::updateInfoByAdapt);
|
|||
|
//屏幕数量改变时 重新计算 主屏坐标 屏幕宽高
|
|||
|
connect(m_pDeskWgt, &QDesktopWidget::screenCountChanged, this, &PrimaryManager::updateInfoByAdapt);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
/**
|
|||
|
* @brief 主屏幕变化监听函数
|
|||
|
*/
|
|||
|
void PrimaryManager::priScreenChanged(int x, int y, int width, int height)
|
|||
|
{
|
|||
|
QString priName;
|
|||
|
priName = getScreenName ("priScreenName");
|
|||
|
this->m_nScreen_x=x;
|
|||
|
this->m_nScreen_y=y;
|
|||
|
this->m_screenWidth=width;
|
|||
|
this->m_screenHeight=height;
|
|||
|
qDebug("primary screen changed, geometry is x=%d, y=%d, width=%d, height=%d", x, y, width, height);
|
|||
|
}
|
|||
|
/**
|
|||
|
* @brief 根据adaptScreenInfo更新数据
|
|||
|
*/
|
|||
|
void PrimaryManager::updateInfoByAdapt()
|
|||
|
{
|
|||
|
this->m_nScreen_x = m_adaptScreenInfo->m_nScreen_x;
|
|||
|
this->m_nScreen_y = m_adaptScreenInfo->m_nScreen_y;
|
|||
|
this->m_screenWidth = m_adaptScreenInfo->m_screenWidth;
|
|||
|
this->m_screenHeight = m_adaptScreenInfo->m_screenHeight;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @brief 启动获取主屏幕坐标 x/y/width/height; 以及基于Kscreen获取的主屏幕名字
|
|||
|
*/
|
|||
|
void PrimaryManager::start()
|
|||
|
{
|
|||
|
int priX, priY, priWid, priHei;
|
|||
|
QString priName;
|
|||
|
priX = getScreenGeometry("x");
|
|||
|
priY = getScreenGeometry("y");
|
|||
|
priWid = getScreenGeometry("width");
|
|||
|
priHei = getScreenGeometry("height");
|
|||
|
priName = getScreenName ("priScreenName");
|
|||
|
|
|||
|
qDebug("Start: Primary screen geometry is x=%d, y=%d, width=%d, height=%d,",
|
|||
|
priX, priY, priWid, priHei);
|
|||
|
qDebug()<<"Primary screen name = " << priName;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @brief 根据dbus 提供method 获取X/Y/width/height 参数
|
|||
|
*/
|
|||
|
int PrimaryManager::getScreenGeometry(QString methodName)
|
|||
|
{
|
|||
|
int res = 0;
|
|||
|
QDBusMessage message = QDBusMessage::createMethodCall(DBUS_NAME,
|
|||
|
DBUS_PATH,
|
|||
|
DBUS_INTERFACE,
|
|||
|
methodName);
|
|||
|
QDBusMessage response = QDBusConnection::sessionBus().call(message);
|
|||
|
if (response.type() == QDBusMessage::ReplyMessage)
|
|||
|
{
|
|||
|
if(response.arguments().isEmpty() == false) {
|
|||
|
int value = response.arguments().takeFirst().toInt();
|
|||
|
res = value;
|
|||
|
qDebug() << value;
|
|||
|
}
|
|||
|
} else {
|
|||
|
qDebug()<<methodName<<"called failed";
|
|||
|
}
|
|||
|
return res;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @brief 根据 dbus 提供method 获取基于kscreen获得的屏幕名字
|
|||
|
*/
|
|||
|
QString PrimaryManager::getScreenName(QString methodName)
|
|||
|
{
|
|||
|
QString res = 0;
|
|||
|
QDBusMessage message = QDBusMessage::createMethodCall(DBUS_NAME,
|
|||
|
DBUS_PATH,
|
|||
|
DBUS_INTERFACE,
|
|||
|
methodName);
|
|||
|
QDBusMessage response = QDBusConnection::sessionBus().call(message);
|
|||
|
if (response.type() == QDBusMessage::ReplyMessage)
|
|||
|
{
|
|||
|
if(response.arguments().isEmpty() == false) {
|
|||
|
QString value = response.arguments().takeFirst().toString();
|
|||
|
res = value;
|
|||
|
qDebug() << value;
|
|||
|
}
|
|||
|
} else {
|
|||
|
qDebug()<<methodName<<"called failed";
|
|||
|
}
|
|||
|
return res;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @brief 如果应用必须要用QScreen 可进行参数判断,代码如下:
|
|||
|
*/
|
|||
|
void PrimaryManager::init()
|
|||
|
{
|
|||
|
int dX, dY, dWidth, dHeight;
|
|||
|
QScreen *mPriScreen;
|
|||
|
|
|||
|
dX = getScreenGeometry("x");
|
|||
|
dY = getScreenGeometry("y");
|
|||
|
dWidth = getScreenGeometry("width");
|
|||
|
dHeight = getScreenGeometry("height");
|
|||
|
//根据真实值判断哪一个是主屏
|
|||
|
for (auto screen : QApplication::screens()){
|
|||
|
if (screen->geometry().x() == dX && screen->geometry().y() == dY) {
|
|||
|
mPriScreen = screen;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
PrimaryManager::~PrimaryManager()
|
|||
|
{
|
|||
|
delete mDbusXrandInter;
|
|||
|
delete m_adaptScreenInfo;
|
|||
|
}
|
|||
|
|
|||
|
int PrimaryManager::getScreenWidth() const
|
|||
|
{
|
|||
|
return m_screenWidth;
|
|||
|
}
|
|||
|
|
|||
|
int PrimaryManager::getScreenHeight() const
|
|||
|
{
|
|||
|
return m_screenHeight;
|
|||
|
}
|
|||
|
|
|||
|
int PrimaryManager::getNScreen_x() const
|
|||
|
{
|
|||
|
return m_nScreen_x;
|
|||
|
}
|
|||
|
|
|||
|
int PrimaryManager::getNScreen_y() const
|
|||
|
{
|
|||
|
return m_nScreen_y;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @brief 根据环境变量判断是否支持wayland
|
|||
|
*/
|
|||
|
bool PrimaryManager::checkWayland()
|
|||
|
{
|
|||
|
QByteArray byte = qgetenv("DESKTOP_SESSION");
|
|||
|
QString info =QString::fromLocal8Bit(byte);
|
|||
|
if("ukui-wayland"==info){
|
|||
|
return true;
|
|||
|
}else{
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|