mirror of https://github.com/cutefishos/settings
feat(mouse): add cursor theme previews and size settings
parent
f0483981ab
commit
87ff66e56f
@ -0,0 +1,15 @@
|
||||
cmake_minimum_required(VERSION 3.22)
|
||||
project(cursor_theme_test LANGUAGES CXX)
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
find_package(Qt6 REQUIRED COMPONENTS Core Gui DBus Test)
|
||||
find_package(PkgConfig REQUIRED)
|
||||
pkg_check_modules(Xcursor REQUIRED IMPORTED_TARGET xcursor)
|
||||
find_program(DBUS_RUN_SESSION dbus-run-session REQUIRED)
|
||||
add_executable(cursor_theme_test cursor_theme_test.cpp ../../src/cursor/cursorthememodel.cpp
|
||||
../../src/cursor/cursortheme.cpp)
|
||||
target_include_directories(cursor_theme_test PRIVATE ../../src)
|
||||
target_link_libraries(cursor_theme_test PRIVATE Qt6::Core Qt6::Gui Qt6::DBus Qt6::Test PkgConfig::Xcursor)
|
||||
enable_testing()
|
||||
add_test(NAME cursor_theme_test COMMAND ${DBUS_RUN_SESSION} -- $<TARGET_FILE:cursor_theme_test>)
|
||||
set_tests_properties(cursor_theme_test PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=offscreen")
|
||||
@ -0,0 +1,102 @@
|
||||
#include "cursor/cursorthememodel.h"
|
||||
#include <QDBusConnection>
|
||||
#include <QDataStream>
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
#include <QGuiApplication>
|
||||
#include <QPixmap>
|
||||
#include <QSettings>
|
||||
#include <QSignalSpy>
|
||||
#include <QTemporaryDir>
|
||||
#include <QTest>
|
||||
|
||||
class AppearanceService : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_CLASSINFO("D-Bus Interface", "com.cutefish.Services.Appearance")
|
||||
public slots:
|
||||
|
||||
void setCursorTheme(const QString &theme)
|
||||
{
|
||||
QSettings settings("cutefishos", "theme");
|
||||
settings.setValue("CursorTheme", theme);
|
||||
settings.sync();
|
||||
emit cursorThemeChanged();
|
||||
}
|
||||
|
||||
void setCursorSize(int size)
|
||||
{
|
||||
QSettings settings("cutefishos", "theme");
|
||||
settings.setValue("CursorSize", size);
|
||||
settings.sync();
|
||||
emit cursorSizeChanged();
|
||||
}
|
||||
|
||||
signals:
|
||||
void cursorThemeChanged();
|
||||
void cursorSizeChanged();
|
||||
};
|
||||
|
||||
class CursorThemeTest : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
private slots:
|
||||
|
||||
void previewsAndServiceUpdates()
|
||||
{
|
||||
QTemporaryDir directory;
|
||||
QVERIFY(directory.isValid());
|
||||
qputenv("XCURSOR_PATH", directory.path().toUtf8());
|
||||
QSettings::setPath(QSettings::NativeFormat, QSettings::UserScope, directory.path());
|
||||
QVERIFY(QDir(directory.path()).mkpath("TestTheme/cursors"));
|
||||
QFile index(directory.filePath("TestTheme/index.theme"));
|
||||
QVERIFY(index.open(QIODevice::WriteOnly));
|
||||
// Icon-theme visibility must not hide bundled cursor themes such as Adwaita.
|
||||
index.write("[Icon Theme]\nName=Test Cursor\nHidden=true\n");
|
||||
index.close();
|
||||
QFile cursor(directory.filePath("TestTheme/cursors/left_ptr"));
|
||||
QVERIFY(cursor.open(QIODevice::WriteOnly));
|
||||
QDataStream out(&cursor);
|
||||
out.setByteOrder(QDataStream::LittleEndian);
|
||||
out << quint32(0x72756358) << quint32(16) << quint32(1) << quint32(1);
|
||||
out << quint32(0xfffd0002) << quint32(36) << quint32(28);
|
||||
out << quint32(36) << quint32(0xfffd0002) << quint32(36) << quint32(1);
|
||||
out << quint32(1) << quint32(1) << quint32(0) << quint32(0) << quint32(10)
|
||||
<< quint32(0xff123456);
|
||||
cursor.close();
|
||||
|
||||
AppearanceService service;
|
||||
auto bus = QDBusConnection::sessionBus();
|
||||
QVERIFY(bus.registerObject("/com/cutefish/Services/Appearance", &service,
|
||||
QDBusConnection::ExportAllSlots
|
||||
| QDBusConnection::ExportAllSignals));
|
||||
QVERIFY(bus.registerService("com.cutefish.Services"));
|
||||
CursorThemeModel first;
|
||||
CursorThemeModel second;
|
||||
const int row = first.themeIndex("TestTheme");
|
||||
QVERIFY(row >= 0);
|
||||
const auto preview =
|
||||
first.data(first.index(row), CursorThemeModel::ImageRole).value<QPixmap>();
|
||||
QVERIFY(!preview.isNull());
|
||||
QCOMPARE(preview.toImage().pixel(0, 0), QRgb(0xff123456));
|
||||
QSignalSpy changed(&second, &CursorThemeModel::currentThemeChanged);
|
||||
first.setCurrentTheme("TestTheme");
|
||||
QTRY_COMPARE(second.currentTheme(), QStringLiteral("TestTheme"));
|
||||
QVERIFY(!changed.isEmpty());
|
||||
first.setCursorSize(48);
|
||||
QTRY_COMPARE(second.cursorSize(), 48);
|
||||
first.setCurrentTheme("../missing");
|
||||
QCOMPARE(first.currentTheme(), QStringLiteral("TestTheme"));
|
||||
bus.unregisterService("com.cutefish.Services");
|
||||
bus.unregisterObject("/com/cutefish/Services/Appearance");
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
QGuiApplication application(argc, argv);
|
||||
CursorThemeTest test;
|
||||
return QTest::qExec(&test, argc, argv);
|
||||
}
|
||||
|
||||
#include "cursor_theme_test.moc"
|
||||
Loading…
Reference in New Issue