Skip to content

Commit

Permalink
always use UltraMon API to query monitors configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
mistic100 committed Sep 5, 2014
1 parent f6de3f6 commit 3c1d730
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 153 deletions.
43 changes: 13 additions & 30 deletions src/environment.cpp
Expand Up @@ -85,11 +85,13 @@ void Environment::init()
{
umpath = SysReader::searchUMDexe(ok);

if (!ok) {
if (!ok)
{
qxtLog->error("UltraMonDesktop.exe not found");
UMWP_STATE|= UMWP::NOT_INSTALLED;
}
else {
else
{
m_settings->setOpt("umpath", umpath);
m_settings->save();
}
Expand All @@ -98,7 +100,8 @@ void Environment::init()
// SEARCH ULTRAMON VERSION
m_env["umversion"] = SysReader::getUMversion(ok);

if (!ok) {
if (!ok)
{
qxtLog->error("Unknown UltraMon version");
UMWP_STATE|= UMWP::BAD_VERSION;
}
Expand All @@ -120,12 +123,13 @@ void Environment::init()
{
m_env["wallpath"] = SysReader::buildUMwallpaperPath(m_env["umversion"].toString(), ok);

if (!ok) {
if (!ok)
{
UMWP_STATE|= UMWP::UNKNOWN_ERROR;
}
else if (!refreshMonitors())
{
UMWP_STATE|= UMWP::FILE_NOT_FOUND;
UMWP_STATE|= UMWP::COM_ERROR;
}
}

Expand All @@ -140,32 +144,11 @@ bool Environment::refreshMonitors()
{
bool ok;

if (!QFile::exists(m_env["wallpath"].toString() + "default.wallpaper"))
{
qxtLog->error("default.wallpaper not found");

QHash<int, QScreen> sizes = SysReader::queryMonitors(ok);

if (!ok || m_wpSizes.size() == 0)
{
qxtLog->error("Unable to query UltraMon API");
return false;
}
else
{
SysReader::createUMwallpaper(m_env["wallpath"].toString(), sizes, ok);
SysReader::queryMonitors(m_wpSizes, m_header, ok);

if (!ok) {
qxtLog->error("Unable create default.wallpaper");
return false;
}
}
}

SysReader::readMonitors(m_env["wallpath"].toString(), m_wpSizes, m_header, ok);

if (!ok || m_wpSizes.size() == 0) {
qxtLog->error("Unable read default.wallpaper");
if (!ok)
{
qxtLog->error("Unable to query UltraMon API");
return false;
}

Expand Down
6 changes: 2 additions & 4 deletions src/gui/errorwidget.cpp
Expand Up @@ -67,11 +67,9 @@ ErrorWidget::ErrorWidget(QWidget* _parent, Controller* _ctrl) :
.arg(QString::fromAscii(APP_MIN_UM_VERSION))
);
}
else if (UMWP_STATE & UMWP::FILE_NOT_FOUND)
else if (UMWP_STATE & UMWP::COM_ERROR)
{
description->setText(tr("<b>default.wallpaper</b> file not found, impossible to continue.<br><br>Sould be at: %1")
.arg("<i>" + m_ctrl->enviro()->get("wallpath").toString() + "</i>")
);
description->setText(tr("Can't access UltraMon API"));
}
else if (UMWP_STATE & UMWP::UNKNOWN_ERROR)
{
Expand Down
1 change: 1 addition & 0 deletions src/main.h
Expand Up @@ -16,6 +16,7 @@ namespace UMWP {
const short BAD_VERSION = 2;
const short FILE_NOT_FOUND = 4;
const short SETTINGS_FILE_ERROR = 8;
const short COM_ERROR = 16;
const short UNKNOWN_ERROR = 256;
}

Expand Down
149 changes: 33 additions & 116 deletions src/sysreader.cpp
Expand Up @@ -185,122 +185,15 @@ QString SysReader::buildUMwallpaperPath(const QString &_version, bool &_ok)
}

/**
* @brief Create default.wallpaper file with monitors dimensions
*/
void SysReader::createUMwallpaper(const QString &_path, const QHash<int, QScreen> &_sizes, bool&_ok)
{
_ok = false;
const int version = 2;
const int activedesktop = 0;
int nbMonitors = _sizes.size()-1;

QString filename = _path + "default.wallpaper";
QByteArray buffer;

buffer.append("UMWP", 4); // signature
buffer.append((char*)&version, 2); // version
buffer.append((char*)&activedesktop, 1); // active desktop
buffer.append((char*)&nbMonitors, 4); // nb monitors

// rect monitors
for (int i=0; i<nbMonitors; i++)
{
QScreen screen = _sizes.value(i);
RECT rect;
rect.right = screen.width();
rect.bottom = screen.height();
rect.left = screen.left();
rect.top = screen.top();
buffer.append((char*)&rect, sizeof(RECT));
}

// wp style
UM::WALLPAPER wpstyle = UM::W_DESKTOP;
buffer.append((char*)&wpstyle, sizeof(UM::WALLPAPER));

buffer.append((char*)&nbMonitors, 4); // nb walls

// wallpaper files
for (int i=0; i<nbMonitors; i++)
{
UM::WP_MONITOR_FILE wall;
wall.bgType = UM::BG_SOLID;
wall.color1 = 0x00000000;
wall.color2 = 0x00000000;
wall.imgStyle = UM::IM_CENTER;
memset(wall.imgFile, 0, 260*sizeof(wchar_t));
buffer.append((char*)&wall, sizeof(UM::WP_MONITOR_FILE));
}

QFile file(filename);
if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
_ok = true;
file.write(buffer);
file.close();
}
}

/**
* @brief Read monitors dimensions from default.wallpaper file
* @brief Read monitors dimensions from UltraMon API
*/
void SysReader::readMonitors(const QString &_path, QHash<int, QScreen> &_sizes, QByteArray &_header, bool &_ok)
void SysReader::queryMonitors(QHash<int, QScreen> &_sizes, QByteArray &_header, bool &_ok)
{
_sizes.clear();
_header.clear();
_ok = false;

QString filename = _path + "default.wallpaper";
QFile file(filename);

if (file.open(QIODevice::ReadOnly)) {
_ok = true;

file.seek(7); // "UMWP", version, activedesktop

// number of monitors
int nbMonitors;
file.read((char*)&nbMonitors, sizeof(DWORD));

// rect monitors
int minX=0, maxX=0, minY=0, maxY=0;
for (int i=0; i<nbMonitors; i++)
{
RECT monitor;
file.read((char*)&monitor, sizeof(RECT));

_sizes.insert(i, QScreen(
(int)monitor.right,
(int)monitor.bottom,
(int)monitor.top,
(int)monitor.left
));

minX = qMin(minX, (int)monitor.left);
minY = qMin(minY, (int)monitor.top);
maxX = qMax(maxX, (int)monitor.left+(int)monitor.right);
maxY = qMax(maxY, (int)monitor.top+(int)monitor.bottom);
}

// store the header
int headerSize = 7 + sizeof(DWORD) + nbMonitors*sizeof(RECT);
file.reset();
_header = file.read(headerSize);

_sizes.insert(-1, QScreen(maxX-minX, maxY-minY));

file.close();
}
}

/**
* @brief Read monitors dimensions from UltraMon API
*/
QHash<int, QScreen> SysReader::queryMonitors(bool &_ok)
{
_ok = false;

HRESULT result;
QHash<int, QScreen> sizes;

CoInitializeEx(0, COINIT_APARTMENTTHREADED);

Expand All @@ -309,8 +202,7 @@ QHash<int, QScreen> SysReader::queryMonitors(bool &_ok)

if (result == S_OK)
{
_ok = true;

// READ DATA FROM UM API
IUltraMonMonitors* pMons = 0;
pSys->get_Monitors(&pMons);

Expand All @@ -321,7 +213,7 @@ QHash<int, QScreen> SysReader::queryMonitors(bool &_ok)
VARIANT vt = { 0 };
vt.vt = VT_I4;

// monitors
// cycle monitors
int minX=0, maxX=0, minY=0, maxY=0;
for (int i=0; i<nbMonitors; ++i)
{
Expand All @@ -340,7 +232,7 @@ QHash<int, QScreen> SysReader::queryMonitors(bool &_ok)
pMon->get_Left(&left);
pMon->get_Top(&top);

sizes.insert(i, QScreen(
_sizes.insert(i, QScreen(
(int)width,
(int)height,
(int)top,
Expand All @@ -356,15 +248,40 @@ QHash<int, QScreen> SysReader::queryMonitors(bool &_ok)
pMon->Release();
}

sizes.insert(-1, QScreen(maxX-minX, maxY-minY));
// CREATE .wallpaper FILE HEADER
const int version = 2;
const int activedesktop = 0;
nbMonitors = _sizes.size();

if (nbMonitors > 0)
{
_ok = true;

_header.append("UMWP", 4); // signature
_header.append((char*)&version, 2); // version
_header.append((char*)&activedesktop, 1); // active desktop
_header.append((char*)&nbMonitors, 4); // nb monitors

// rect monitors
for (int i=0; i<nbMonitors; i++)
{
QScreen screen = _sizes.value(i);
RECT rect;
rect.right = screen.width();
rect.bottom = screen.height();
rect.left = screen.left();
rect.top = screen.top();
_header.append((char*)&rect, sizeof(RECT));
}

_sizes.insert(-1, QScreen(maxX-minX, maxY-minY));
}

pMons->Release();
pSys->Release();
}

CoUninitialize();

return sizes;
}

/**
Expand Down
4 changes: 1 addition & 3 deletions src/sysreader.h
Expand Up @@ -19,9 +19,7 @@ class SysReader
static QString buildShortcutPath();

static QString buildUMwallpaperPath(const QString &_version, bool &_ok);
static void createUMwallpaper(const QString &_path, const QHash<int, QScreen> &_sizes, bool &_ok);
static void readMonitors(const QString &_path, QHash<int, QScreen> &_sizes, QByteArray &_header, bool &_ok);
static QHash<int, QScreen> queryMonitors(bool &_ok);
static void queryMonitors(QHash<int, QScreen> &_sizes, QByteArray &_header, bool &_ok);
};

#endif // SYSREADER_H

0 comments on commit 3c1d730

Please sign in to comment.