From 11ba10afcae374a87ab0e639fbfb77866b5850b5 Mon Sep 17 00:00:00 2001 From: stefonarch Date: Fri, 5 Dec 2025 11:43:34 +0100 Subject: [PATCH 1/3] Added set/get float write and updated mouse page --- src/maindialog.cpp | 25 +++- src/maindialog1.cpp | 156 ++++++++++++++++++++ src/mouse.cpp | 139 +++++++++++++++++ src/mouse.ui | 352 +++++++++++++++++++++++++++++++++++++++++--- src/mouse.ui.~ | 67 +++++++++ src/settings.cpp | 144 ++++++++++++++---- src/settings.h | 11 +- src/xml.cpp | 13 +- src/xml.h | 1 + 9 files changed, 846 insertions(+), 62 deletions(-) create mode 100644 src/maindialog1.cpp create mode 100644 src/mouse.ui.~ diff --git a/src/maindialog.cpp b/src/maindialog.cpp index f5072d7..e6ac6db 100644 --- a/src/maindialog.cpp +++ b/src/maindialog.cpp @@ -29,15 +29,15 @@ MainDialog::MainDialog(QWidget *parent) : QDialog(parent) { - resize(640, 480); + //resize(640, 480); QVBoxLayout *verticalLayout = new QVBoxLayout(this); - verticalLayout->setContentsMargins(6, 6, 6, 6); + //verticalLayout->setContentsMargins(6, 6, 6, 6); QWidget *widget = new QWidget(this); QHBoxLayout *horizontalLayout = new QHBoxLayout(widget); - horizontalLayout->setContentsMargins(6, 6, 6, 6); + //horizontalLayout->setContentsMargins(6, 6, 6, 6); // List Widget on the Left QListWidget *list = new QListWidget(widget); @@ -59,13 +59,22 @@ MainDialog::MainDialog(QWidget *parent) : QDialog(parent) item3->setText(tr("Language & Region")); QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); - sizePolicy.setHorizontalStretch(0); - sizePolicy.setVerticalStretch(0); - sizePolicy.setHeightForWidth(list->sizePolicy().hasHeightForWidth()); + //sizePolicy.setHorizontalStretch(0); + //sizePolicy.setVerticalStretch(0); + //sizePolicy.setHeightForWidth(list->sizePolicy().hasHeightForWidth()); list->setSizePolicy(sizePolicy); list->setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy::AdjustToContents); - list->setCurrentRow(0); - list->setFixedWidth(list->sizeHintForColumn(0) + 2 * list->frameWidth()); + //list->setCurrentRow(0); + //list->setFixedWidth(list->sizeHintForColumn(0) + 2 * list->frameWidth()); + + list->setViewMode(QListView::IconMode); + list->setMovement(QListView::Static); + list->setResizeMode(QListView::Adjust); + list->setWrapping(true); + list->setIconSize(QSize(48, 48)); + list->setWordWrap(true); // prevents text from wrapping inside + list->setUniformItemSizes(true); // keeps all items same layout + horizontalLayout->addWidget(list); diff --git a/src/maindialog1.cpp b/src/maindialog1.cpp new file mode 100644 index 0000000..e6ac6db --- /dev/null +++ b/src/maindialog1.cpp @@ -0,0 +1,156 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "appearance.h" +#include "behaviour.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "environment.h" +#include "find-themes.h" +#include "log.h" +#include "macros.h" +#include "maindialog.h" +#include "xml.h" + +MainDialog::MainDialog(QWidget *parent) : QDialog(parent) +{ + //resize(640, 480); + + QVBoxLayout *verticalLayout = new QVBoxLayout(this); + //verticalLayout->setContentsMargins(6, 6, 6, 6); + + QWidget *widget = new QWidget(this); + + QHBoxLayout *horizontalLayout = new QHBoxLayout(widget); + //horizontalLayout->setContentsMargins(6, 6, 6, 6); + + // List Widget on the Left + QListWidget *list = new QListWidget(widget); + + QListWidgetItem *item0 = new QListWidgetItem(list); + item0->setIcon(QIcon::fromTheme("applications-graphics")); + item0->setText(tr("Appearance")); + + QListWidgetItem *item1 = new QListWidgetItem(list); + item1->setIcon(QIcon::fromTheme("preferences-desktop")); + item1->setText(tr("Behaviour")); + + QListWidgetItem *item2 = new QListWidgetItem(list); + item2->setIcon(QIcon::fromTheme("input-mouse")); + item2->setText(tr("Mouse & Touchpad")); + + QListWidgetItem *item3 = new QListWidgetItem(list); + item3->setIcon(QIcon::fromTheme("preferences-desktop-locale")); + item3->setText(tr("Language & Region")); + + QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); + //sizePolicy.setHorizontalStretch(0); + //sizePolicy.setVerticalStretch(0); + //sizePolicy.setHeightForWidth(list->sizePolicy().hasHeightForWidth()); + list->setSizePolicy(sizePolicy); + list->setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy::AdjustToContents); + //list->setCurrentRow(0); + //list->setFixedWidth(list->sizeHintForColumn(0) + 2 * list->frameWidth()); + + list->setViewMode(QListView::IconMode); + list->setMovement(QListView::Static); + list->setResizeMode(QListView::Adjust); + list->setWrapping(true); + list->setIconSize(QSize(48, 48)); + list->setWordWrap(true); // prevents text from wrapping inside + list->setUniformItemSizes(true); // keeps all items same layout + + + horizontalLayout->addWidget(list); + + // The stack containing all the pages + QStackedWidget *stack = new QStackedWidget(widget); + + m_pageAppearance = new Appearance(); + stack->addWidget(m_pageAppearance); + + m_pageBehaviour = new Behaviour(); + stack->addWidget(m_pageBehaviour); + + m_pageMouse = new Mouse(); + stack->addWidget(m_pageMouse); + + m_pageLanguage = new Language(); + stack->addWidget(m_pageLanguage); + + horizontalLayout->addWidget(stack); + + verticalLayout->addWidget(widget); + + m_buttonBox = new QDialogButtonBox(this); + m_buttonBox->setOrientation(Qt::Orientation::Horizontal); + m_buttonBox->setStandardButtons(QDialogButtonBox::StandardButton::Apply + | QDialogButtonBox::StandardButton::Close); + m_buttonBox->setCenterButtons(false); + + verticalLayout->addWidget(m_buttonBox); + + // Change pages when list items are clicked + QObject::connect(list, SIGNAL(currentRowChanged(int)), stack, SLOT(setCurrentIndex(int))); + + // Close Button + QObject::connect(m_buttonBox, SIGNAL(rejected()), this, SLOT(reject())); + + // Apply Button + QObject::connect(m_buttonBox, &QDialogButtonBox::clicked, [&](QAbstractButton *button) { + if (m_buttonBox->standardButton(button) == QDialogButtonBox::Apply) { + onApply(); + } + }); + + activate(); +} + +MainDialog::~MainDialog() +{ + xml_finish(); +} + +void MainDialog::activate() +{ + m_pageAppearance->activate(); + m_pageBehaviour->activate(); + m_pageMouse->activate(); + m_pageLanguage->activate(); +} + +void MainDialog::onApply() +{ + m_pageAppearance->onApply(); + m_pageBehaviour->onApply(); + m_pageMouse->onApply(); + m_pageLanguage->onApply(); + + // TODO: Get filename in a more consistent way - share common code with main.cpp + std::string config_home = std::getenv("HOME") + std::string("/.config/labwc"); + std::string config_dir = std::getenv("LABWC_CONFIG_DIR") ?: config_home; + std::string environment_file = config_dir + "/environment"; + + xml_save(); + environmentSave(environment_file); + + /* reconfigure labwc */ + if (!fork()) { + execl("/bin/sh", "/bin/sh", "-c", "labwc -r", (void *)NULL); + } +} diff --git a/src/mouse.cpp b/src/mouse.cpp index ed1300d..41e2c79 100644 --- a/src/mouse.cpp +++ b/src/mouse.cpp @@ -2,6 +2,7 @@ #include "environment.h" #include "find-themes.h" #include "macros.h" +#include "pair.h" #include "settings.h" #include "./ui_mouse.h" @@ -27,12 +28,150 @@ void Mouse::activate() /* Natural Scroll */ ui->naturalScroll->setChecked(getBool("/labwc_config/libinput/device/naturalScroll")); + + /* Left Handed */ + ui->leftHanded->setChecked(getBool("/labwc_config/libinput/device/leftHanded")); + + /* Pointer Speed */ + ui->pointerSpeed->setValue(getFloat("/labwc_config/libinput/device/pointerSpeed")); + + /* Accel Profiles */ + ui->accelProfile->clear(); // remove 2 empty values created for some reason + + QVector> profiles; + profiles.append(QSharedPointer(new Pair("flat", tr("flat")))); + profiles.append(QSharedPointer(new Pair("adaptive", tr("adaptive")))); + + QString current_profile = getStr("/labwc_config/libinput/device/accelProfile"); + int profile_index = -1; + foreach (auto profile, profiles) { + ui->accelProfile->addItem(profile.get()->description(), QVariant(profile.get()->value())); + ++profile_index; + if (current_profile == profile.get()->value()) { + ui->accelProfile->setCurrentIndex(profile_index); + } + } + + /* Tap to click */ + ui->tap->setChecked(getBool("/labwc_config/libinput/device/tap")); + + /* Tap Button Map */ + ui->tapButtonMap->clear(); // remove 2 empty values created for some reason + + QVector> maps; + maps.append(QSharedPointer(new Pair("lrm", tr("lrm")))); + maps.append(QSharedPointer(new Pair("lmr", tr("lmr")))); + + QString current_map = getStr("/labwc_config/libinput/device/tapButtonMap"); + int map_index = -1; + foreach (auto map, maps) { + ui->tapButtonMap->addItem(map.get()->description(), QVariant(map.get()->value())); + ++map_index; + if (current_map == map.get()->value()) { + ui->tapButtonMap->setCurrentIndex(map_index); + } + } + + /* Tap And Drag */ + ui->tapAndDrag->setChecked(getBool("/labwc_config/libinput/device/tapAndDrag")); + + /* Drag Lock */ + ui->dragLock->setChecked(getBool("/labwc_config/libinput/device/dragLock")); + + // Disable it when tapAndDrag is unchecked + ui->dragLock->setEnabled(ui->tapAndDrag->isChecked()); + ui->label_dragLock->setEnabled(ui->tapAndDrag->isChecked()); + + connect(ui->tapAndDrag, &QCheckBox::toggled,ui->dragLock, &QWidget::setEnabled); + connect(ui->tapAndDrag, &QCheckBox::toggled,ui->label_dragLock, &QWidget::setEnabled); + + /* 3 Finger Drag */ + ui->threeFingerDrag->setChecked(getBool("/labwc_config/libinput/device/threeFingerDrag")); + + /* Middle Emulation */ + ui->middleEmulation->setChecked(getBool("/labwc_config/libinput/device/middleEmulation")); + + /* Disable While Typing */ + ui->disableWhileTyping->setChecked(getBool("/labwc_config/libinput/device/disableWhileTyping")); + + /* Click Method */ + ui->clickMethod->clear(); + + QVector> clickmethods; + clickmethods.append(QSharedPointer(new Pair("none", tr("none")))); + clickmethods.append(QSharedPointer(new Pair("buttonAreas", tr("Button area")))); + clickmethods.append(QSharedPointer(new Pair("clickFinger", tr("Clickfinger")))); + + QString current_clickmethod = getStr("/labwc_config/libinput/device/clickMethod"); + int clickmethod_index = -1; + foreach (auto clickmethod, clickmethods) { + ui->clickMethod->addItem(clickmethod.get()->description(), QVariant(clickmethod.get()->value())); + ++clickmethod_index; + if (current_clickmethod == clickmethod.get()->value()) { + ui->clickMethod->setCurrentIndex(clickmethod_index); + } + } + + /* Scroll Method */ + ui->scrollMethod->clear(); + + QVector> scrollmethods; + scrollmethods.append(QSharedPointer(new Pair("twoFinger", tr("Two Finger")))); + scrollmethods.append(QSharedPointer(new Pair("edge", tr("Edge")))); + scrollmethods.append(QSharedPointer(new Pair("none", tr("None")))); + + QString current_scrollmethod = getStr("/labwc_config/libinput/device/scrollMethod"); + int scrollmethod_index = -1; + foreach (auto scrollmethod, scrollmethods) { + ui->scrollMethod->addItem(scrollmethod.get()->description(), QVariant(scrollmethod.get()->value())); + ++scrollmethod_index; + if (current_scrollmethod == scrollmethod.get()->value()) { + ui->scrollMethod->setCurrentIndex(scrollmethod_index); + } + } + + /* Send Events Mode */ + ui->sendEventsMode->clear(); + + QVector> sendeventsmodes; + sendeventsmodes.append(QSharedPointer(new Pair("enabled", tr("Enabled")))); + //sendeventsmodes.append(QSharedPointer(new Pair("no", tr("no")))); will disable also keyboard + // we cannot write "no" here as we get <touchpad>disabledOnExternalMouse + // implement write to ? + sendeventsmodes.append(QSharedPointer(new Pair("disabledOnExternalMouse", tr("Disable with external mouse")))); + + QString current_sendeventsmode = getStr("/labwc_config/libinput/device/sendEventsMode"); + int sendeventsmode_index = -1; + foreach (auto sendeventsmode, sendeventsmodes) { + ui->sendEventsMode->addItem(sendeventsmode.get()->description(), QVariant(sendeventsmode.get()->value())); + ++sendeventsmode_index; + if (current_sendeventsmode == sendeventsmode.get()->value()) { + ui->sendEventsMode->setCurrentIndex(sendeventsmode_index); + } + } + + /* Scroll Factor */ + ui->scrollFactor->setValue(getFloat("/labwc_config/libinput/device/scrollFactor")); } void Mouse::onApply() { /* ~/.config/labwc/rc.xml */ setBool("/labwc_config/libinput/device/naturalScroll", ui->naturalScroll->isChecked()); + setBool("/labwc_config/libinput/device/leftHanded", ui->leftHanded->isChecked()); + setFloat("/labwc_config/libinput/device/pointerSpeed", ui->pointerSpeed->value()); + setStr("/labwc_config/libinput/device/accelProfile", DATA(ui->accelProfile)); + setBool("/labwc_config/libinput/device/tap", ui->tap->isChecked()); + setStr("/labwc_config/libinput/device/tapButtonMap", DATA(ui->tapButtonMap)); + setBool("/labwc_config/libinput/device/tapAndDrag", ui->tapAndDrag->isChecked()); + setBool("/labwc_config/libinput/device/dragLock", ui->dragLock->isChecked()); + setBool("/labwc_config/libinput/device/threeFingerDrag", ui->threeFingerDrag->isChecked()); + setBool("/labwc_config/libinput/device/middleEmulation", ui->middleEmulation->isChecked()); + setBool("/labwc_config/libinput/device/disableWhileTyping", ui->disableWhileTyping->isChecked()); + setStr("/labwc_config/libinput/device/clickMethod", DATA(ui->clickMethod)); + setStr("/labwc_config/libinput/device/scrollMethod", DATA(ui->scrollMethod)); + setStr("/labwc_config/libinput/device/sendEventsMode", DATA(ui->sendEventsMode)); + setFloat("/labwc_config/libinput/device/scrollFactor", ui->scrollFactor->value()); /* ~/.config/labwc/environment */ environmentSet("XCURSOR_THEME", TEXT(ui->cursorTheme)); diff --git a/src/mouse.ui b/src/mouse.ui index c16c270..bc0a4c6 100644 --- a/src/mouse.ui +++ b/src/mouse.ui @@ -6,51 +6,39 @@ 0 0 - 251 - 153 + 400 + 500 - - - 6 - - - 6 - - - 6 - - - 6 - - + + Cursor Theme - + - + Cursor Size - + - + Natural Scroll - + @@ -60,6 +48,328 @@ + + + + Left Handed + + + + + + + + 0 + 33 + + + + + + + + Pointer Speed + + + + + + + 2 + + + -1.000000000000000 + + + 1.000000000000000 + + + 0.100000000000000 + + + + + + + Acceleration Profile + + + + + + + + flat + + + + + adaptive + + + + + + + + Touchpad + + + + + + + + enabled + + + + + disabled + + + + + disabled-on-external-mouse + + + + + + + + Tap to Click + + + + + + + + 0 + 33 + + + + true + + + + + + + Tap Button Map + + + + + + + + lrm + + + + + lmr + + + + + + + + Tap and Drag + + + + + + + + 0 + 33 + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 1 + + + + + + + + Drag Lock + + + + + + + + 0 + 33 + + + + + + + + Three Finger Drag + + + + + + + + 0 + 33 + + + + + + + + Middle Button Emulation + + + + + + + + 0 + 33 + + + + + + + + Disable While Typing + + + + + + + + 0 + 33 + + + + + + + + Click Method + + + + + + + + none + + + + + buttonareas + + + + + clickfinger + + + + + + + + Scroll Method + + + + + + + + twofinger + + + + + edge + + + + + onbuttondown + + + + + none + + + + + + + + Scroll Factor + + + + + + + 2 + + + 0.100000000000000 + + + 5.000000000000000 + + + 0.100000000000000 + + + 1.000000000000000 + + + + + + + Qt::Orientation::Vertical + + + + 5 + 1 + + + + diff --git a/src/mouse.ui.~ b/src/mouse.ui.~ new file mode 100644 index 0000000..c16c270 --- /dev/null +++ b/src/mouse.ui.~ @@ -0,0 +1,67 @@ + + + pageMouse + + + + 0 + 0 + 251 + 153 + + + + + 6 + + + 6 + + + 6 + + + 6 + + + + + Cursor Theme + + + + + + + + + + Cursor Size + + + + + + + + + + Natural Scroll + + + + + + + + 0 + 33 + + + + + + + + + diff --git a/src/settings.cpp b/src/settings.cpp index 1fc3812..4cc1ac6 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -39,13 +39,61 @@ void initSettings(std::vector> *settings) settings->push_back(std::make_shared("/labwc_config/libinput/device/naturalScroll", LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_BOOL, 0)); + settings->push_back(std::make_shared("/labwc_config/libinput/device/leftHanded", + LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_BOOL, 0)); + + settings->push_back(std::make_shared("/labwc_config/libinput/device/pointerSpeed", + LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_FLOAT, 0.0f)); + + settings->push_back(std::make_shared("/labwc_config/libinput/device/accelProfile", + LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_STRING, + "Flat")); + + settings->push_back(std::make_shared("/labwc_config/libinput/device/tap", + LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_BOOL, 0)); + + settings->push_back(std::make_shared("/labwc_config/libinput/device/tapButtonMap", + LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_STRING, + "lrm")); + + settings->push_back(std::make_shared("/labwc_config/libinput/device/tapAndDrag", + LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_BOOL, 0)); + + settings->push_back(std::make_shared("/labwc_config/libinput/device/dragLock", + LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_BOOL, 0)); + + settings->push_back(std::make_shared("/labwc_config/libinput/device/threeFingerDrag", + LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_BOOL, 0)); + + settings->push_back(std::make_shared("/labwc_config/libinput/device/middleEmulation", + LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_BOOL, 0)); + + settings->push_back(std::make_shared("/labwc_config/libinput/device/disableWhileTyping", + LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_BOOL, 0)); + + settings->push_back(std::make_shared("/labwc_config/libinput/device/clickMethod", + LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_STRING, + "none")); + + settings->push_back(std::make_shared("/labwc_config/libinput/device/scrollMethod", + LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_STRING, + "twoFinger")); + + settings->push_back(std::make_shared("/labwc_config/libinput/device/sendEventsMode", + LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_STRING, + "yes")); + + settings->push_back(std::make_shared("/labwc_config/libinput/device/scrollFactor", + LAB_FILE_TYPE_RCXML, LAB_VALUE_TYPE_FLOAT, 0.0f)); + // Language settings->push_back(std::make_shared("XKB_DEFAULT_LAYOUT", LAB_FILE_TYPE_ENVIRONMENT, + LAB_VALUE_TYPE_STRING, "us")); } Setting::Setting(QString name, enum settingFileType fileType, enum settingValueType valueType, - std::variant defaultValue) + std::variant defaultValue) : m_name(name), m_fileType(fileType), m_valueType(valueType), m_value(defaultValue) { m_valueOrigin = LAB_VALUE_ORIGIN_DEFAULT; @@ -53,35 +101,44 @@ Setting::Setting(QString name, enum settingFileType fileType, enum settingValueT // Use values from rc.xml if different from default if (m_fileType == LAB_FILE_TYPE_RCXML) { switch (m_valueType) { - case LAB_VALUE_TYPE_STRING: { - QString value = QString(xml_get(m_name.toStdString().c_str())); - if (!value.isNull() && (value != std::get(m_value))) { - m_valueOrigin = LAB_VALUE_ORIGIN_USER_OVERRIDE; - m_value = value; - info("[user-override] {}: {}", m_name.toStdString(), value.toStdString()); + case LAB_VALUE_TYPE_INT: { + int value = xml_get_int(m_name.toStdString().c_str()); + if (value != std::get(m_value)) { + m_valueOrigin = LAB_VALUE_ORIGIN_USER_OVERRIDE; + m_value = value; + info("[user-override] {}: {}", m_name.toStdString(), value); + } + break; } - break; - } - case LAB_VALUE_TYPE_INT: { - int value = xml_get_int(m_name.toStdString().c_str()); - if (value != std::get(m_value)) { - m_valueOrigin = LAB_VALUE_ORIGIN_USER_OVERRIDE; - m_value = value; - info("[user-override] {}: {}", m_name.toStdString(), value); + case LAB_VALUE_TYPE_FLOAT: { + float value = xml_get_float(m_name.toStdString().c_str()); + if (value != std::get(m_value)) { + m_valueOrigin = LAB_VALUE_ORIGIN_USER_OVERRIDE; + m_value = value; + info("[user-override] {}: {}", m_name.toStdString(), value); + } + break; } - break; - } - case LAB_VALUE_TYPE_BOOL: { - int value = xml_get_bool_text(m_name.toStdString().c_str()); - if (value != -1 && value != std::get(m_value)) { - m_valueOrigin = LAB_VALUE_ORIGIN_USER_OVERRIDE; - m_value = value; - info("[user-override] {}: {}", m_name.toStdString(), value); + case LAB_VALUE_TYPE_BOOL: { + int value = xml_get_bool_text(m_name.toStdString().c_str()); + if (value != std::get(m_value)) { + m_valueOrigin = LAB_VALUE_ORIGIN_USER_OVERRIDE; + m_value = value; + info("[user-override] {}: {}", m_name.toStdString(), value); + } + break; } - break; - } - default: - break; + case LAB_VALUE_TYPE_STRING: { + const char *value = xml_get(m_name.toStdString().c_str()); + if (value && QString(value) != std::get(m_value)) { + m_valueOrigin = LAB_VALUE_ORIGIN_USER_OVERRIDE; + m_value = QString(value); + info("[user-override] {}: {}", m_name.toStdString(), value); + } + break; + } + default: + break; } } @@ -121,7 +178,7 @@ Setting::Setting(QString name, enum settingFileType fileType, enum settingValueT } } -void Setting::setValue(std::variant value) +void Setting::setValue(std::variant value) { if (value != m_value) { m_valueOrigin = LAB_VALUE_ORIGIN_CHANGED_IN_THIS_SESSION; @@ -165,6 +222,19 @@ int getInt(QString name) return std::get(setting->value()); } +float getFloat(QString name) +{ + std::shared_ptr setting = retrieve(name); + if (setting == nullptr) { + qDebug() << "warning: no settings with name" << name; + return -65535; + } + if (setting->valueType() != LAB_VALUE_TYPE_FLOAT) { + qDebug() << "getFloat(): not valid float setting" << name; + } + return std::get(setting->value()); +} + /* Return -1 for error, which works will with setCurrentIndex() */ int getBool(QString name) { @@ -197,6 +267,24 @@ void setInt(QString name, int value) } } +void setFloat(QString name, float value) +{ + std::shared_ptr setting = retrieve(name); + if (setting == nullptr) { + qDebug() << "warning: no settings with name" << name; + return; + } + if (setting->valueType() != LAB_VALUE_TYPE_FLOAT) { + qDebug() << "setFloat(): not valid float setting" << name << value; + } + if (value != std::get(setting->value())) { + info("'{} has changed to '{}'", name.toStdString(), value); + xpath_add_node(name.toStdString().c_str()); + xml_set_num(name.toStdString().c_str(), value); + setting->setValue(value); + } +} + void setStr(QString name, QString value) { std::shared_ptr setting = retrieve(name); diff --git a/src/settings.h b/src/settings.h index 4352003..51b8e6f 100644 --- a/src/settings.h +++ b/src/settings.h @@ -22,6 +22,7 @@ enum settingValueType { LAB_VALUE_TYPE_INT, LAB_VALUE_TYPE_BOOL, LAB_VALUE_TYPE_STRING, + LAB_VALUE_TYPE_FLOAT }; static inline QString settingFileTypeName(enum settingFileType type) @@ -37,15 +38,15 @@ class Setting { public: Setting(QString name, enum settingFileType fileType, enum settingValueType valueType, - std::variant defaultValue); - void setValue(std::variant value); + std::variant defaultValue); + void setValue(std::variant value); private: QString m_name; enum settingFileType m_fileType; enum settingValueOrigin m_valueOrigin; enum settingValueType m_valueType; - std::variant m_value; + std::variant m_value; public: // Getters @@ -53,15 +54,17 @@ class Setting enum settingFileType fileType() const { return m_fileType; } enum settingValueOrigin valueOrigin() const { return m_valueOrigin; } enum settingValueType valueType() const { return m_valueType; } - std::variant value() const { return m_value; } + std::variant value() const { return m_value; }// this too or not? }; void initSettings(std::vector> *settings); QString getStr(QString name); int getInt(QString name); int getBool(QString name); +float getFloat(QString name); void setInt(QString name, int value); void setStr(QString name, QString value); int parseBool(const char *str, int defaultValue); void setBool(QString name, int value); void setBoolfromString(QString name, QString value); +void setFloat(QString name, float value); diff --git a/src/xml.cpp b/src/xml.cpp index c4963ac..689b3fd 100644 --- a/src/xml.cpp +++ b/src/xml.cpp @@ -193,7 +193,7 @@ void xml_set(const char *nodename, const char *value) void xml_set_num(const char *nodename, double value) { char buf[64]; - snprintf(buf, sizeof(buf), "%.0f", value); + snprintf(buf, sizeof(buf), "%g", value); ctx.nodename = nodename; ctx.value = buf; ctx.mode = XML_MODE_SETTING; @@ -218,6 +218,17 @@ int xml_get_int(const char *nodename) return ctx.value ? atoi(ctx.value) : 0; } +float xml_get_float(const char *nodename) +{ + ctx.value = NULL; + ctx.nodename = nodename; + ctx.mode = XML_MODE_GETTING; + xml_tree_walk(xmlDocGetRootElement(ctx.doc)); + + return ctx.value ? atof(ctx.value) : 0.0f; +} + + int xml_get_bool_text(const char *nodename) { const char *value = xml_get(nodename); diff --git a/src/xml.h b/src/xml.h index 26b35b4..70f3460 100644 --- a/src/xml.h +++ b/src/xml.h @@ -11,6 +11,7 @@ void xml_set_num(const char *nodename, double value); const char *xml_get(const char *nodename); int xml_get_int(const char *nodename); int xml_get_bool_text(const char *nodename); +float xml_get_float(const char *nodename); /** * xpath_get_content() - Get content of node specified by xpath From 120e609a1e84d9d5d52bf9a30a84e4a8fb863f12 Mon Sep 17 00:00:00 2001 From: stefonarch Date: Sat, 6 Dec 2025 20:59:26 +0100 Subject: [PATCH 2/3] Realign mouse.ui left; drop waste --- src/maindialog.cpp | 25 +++---- src/maindialog1.cpp | 156 -------------------------------------------- src/mouse.ui | 36 +++++----- src/mouse.ui.~ | 67 ------------------- src/settings.cpp | 18 ++--- 5 files changed, 35 insertions(+), 267 deletions(-) delete mode 100644 src/maindialog1.cpp delete mode 100644 src/mouse.ui.~ diff --git a/src/maindialog.cpp b/src/maindialog.cpp index e6ac6db..f5072d7 100644 --- a/src/maindialog.cpp +++ b/src/maindialog.cpp @@ -29,15 +29,15 @@ MainDialog::MainDialog(QWidget *parent) : QDialog(parent) { - //resize(640, 480); + resize(640, 480); QVBoxLayout *verticalLayout = new QVBoxLayout(this); - //verticalLayout->setContentsMargins(6, 6, 6, 6); + verticalLayout->setContentsMargins(6, 6, 6, 6); QWidget *widget = new QWidget(this); QHBoxLayout *horizontalLayout = new QHBoxLayout(widget); - //horizontalLayout->setContentsMargins(6, 6, 6, 6); + horizontalLayout->setContentsMargins(6, 6, 6, 6); // List Widget on the Left QListWidget *list = new QListWidget(widget); @@ -59,22 +59,13 @@ MainDialog::MainDialog(QWidget *parent) : QDialog(parent) item3->setText(tr("Language & Region")); QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); - //sizePolicy.setHorizontalStretch(0); - //sizePolicy.setVerticalStretch(0); - //sizePolicy.setHeightForWidth(list->sizePolicy().hasHeightForWidth()); + sizePolicy.setHorizontalStretch(0); + sizePolicy.setVerticalStretch(0); + sizePolicy.setHeightForWidth(list->sizePolicy().hasHeightForWidth()); list->setSizePolicy(sizePolicy); list->setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy::AdjustToContents); - //list->setCurrentRow(0); - //list->setFixedWidth(list->sizeHintForColumn(0) + 2 * list->frameWidth()); - - list->setViewMode(QListView::IconMode); - list->setMovement(QListView::Static); - list->setResizeMode(QListView::Adjust); - list->setWrapping(true); - list->setIconSize(QSize(48, 48)); - list->setWordWrap(true); // prevents text from wrapping inside - list->setUniformItemSizes(true); // keeps all items same layout - + list->setCurrentRow(0); + list->setFixedWidth(list->sizeHintForColumn(0) + 2 * list->frameWidth()); horizontalLayout->addWidget(list); diff --git a/src/maindialog1.cpp b/src/maindialog1.cpp deleted file mode 100644 index e6ac6db..0000000 --- a/src/maindialog1.cpp +++ /dev/null @@ -1,156 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "appearance.h" -#include "behaviour.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include "environment.h" -#include "find-themes.h" -#include "log.h" -#include "macros.h" -#include "maindialog.h" -#include "xml.h" - -MainDialog::MainDialog(QWidget *parent) : QDialog(parent) -{ - //resize(640, 480); - - QVBoxLayout *verticalLayout = new QVBoxLayout(this); - //verticalLayout->setContentsMargins(6, 6, 6, 6); - - QWidget *widget = new QWidget(this); - - QHBoxLayout *horizontalLayout = new QHBoxLayout(widget); - //horizontalLayout->setContentsMargins(6, 6, 6, 6); - - // List Widget on the Left - QListWidget *list = new QListWidget(widget); - - QListWidgetItem *item0 = new QListWidgetItem(list); - item0->setIcon(QIcon::fromTheme("applications-graphics")); - item0->setText(tr("Appearance")); - - QListWidgetItem *item1 = new QListWidgetItem(list); - item1->setIcon(QIcon::fromTheme("preferences-desktop")); - item1->setText(tr("Behaviour")); - - QListWidgetItem *item2 = new QListWidgetItem(list); - item2->setIcon(QIcon::fromTheme("input-mouse")); - item2->setText(tr("Mouse & Touchpad")); - - QListWidgetItem *item3 = new QListWidgetItem(list); - item3->setIcon(QIcon::fromTheme("preferences-desktop-locale")); - item3->setText(tr("Language & Region")); - - QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); - //sizePolicy.setHorizontalStretch(0); - //sizePolicy.setVerticalStretch(0); - //sizePolicy.setHeightForWidth(list->sizePolicy().hasHeightForWidth()); - list->setSizePolicy(sizePolicy); - list->setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy::AdjustToContents); - //list->setCurrentRow(0); - //list->setFixedWidth(list->sizeHintForColumn(0) + 2 * list->frameWidth()); - - list->setViewMode(QListView::IconMode); - list->setMovement(QListView::Static); - list->setResizeMode(QListView::Adjust); - list->setWrapping(true); - list->setIconSize(QSize(48, 48)); - list->setWordWrap(true); // prevents text from wrapping inside - list->setUniformItemSizes(true); // keeps all items same layout - - - horizontalLayout->addWidget(list); - - // The stack containing all the pages - QStackedWidget *stack = new QStackedWidget(widget); - - m_pageAppearance = new Appearance(); - stack->addWidget(m_pageAppearance); - - m_pageBehaviour = new Behaviour(); - stack->addWidget(m_pageBehaviour); - - m_pageMouse = new Mouse(); - stack->addWidget(m_pageMouse); - - m_pageLanguage = new Language(); - stack->addWidget(m_pageLanguage); - - horizontalLayout->addWidget(stack); - - verticalLayout->addWidget(widget); - - m_buttonBox = new QDialogButtonBox(this); - m_buttonBox->setOrientation(Qt::Orientation::Horizontal); - m_buttonBox->setStandardButtons(QDialogButtonBox::StandardButton::Apply - | QDialogButtonBox::StandardButton::Close); - m_buttonBox->setCenterButtons(false); - - verticalLayout->addWidget(m_buttonBox); - - // Change pages when list items are clicked - QObject::connect(list, SIGNAL(currentRowChanged(int)), stack, SLOT(setCurrentIndex(int))); - - // Close Button - QObject::connect(m_buttonBox, SIGNAL(rejected()), this, SLOT(reject())); - - // Apply Button - QObject::connect(m_buttonBox, &QDialogButtonBox::clicked, [&](QAbstractButton *button) { - if (m_buttonBox->standardButton(button) == QDialogButtonBox::Apply) { - onApply(); - } - }); - - activate(); -} - -MainDialog::~MainDialog() -{ - xml_finish(); -} - -void MainDialog::activate() -{ - m_pageAppearance->activate(); - m_pageBehaviour->activate(); - m_pageMouse->activate(); - m_pageLanguage->activate(); -} - -void MainDialog::onApply() -{ - m_pageAppearance->onApply(); - m_pageBehaviour->onApply(); - m_pageMouse->onApply(); - m_pageLanguage->onApply(); - - // TODO: Get filename in a more consistent way - share common code with main.cpp - std::string config_home = std::getenv("HOME") + std::string("/.config/labwc"); - std::string config_dir = std::getenv("LABWC_CONFIG_DIR") ?: config_home; - std::string environment_file = config_dir + "/environment"; - - xml_save(); - environmentSave(environment_file); - - /* reconfigure labwc */ - if (!fork()) { - execl("/bin/sh", "/bin/sh", "-c", "labwc -r", (void *)NULL); - } -} diff --git a/src/mouse.ui b/src/mouse.ui index bc0a4c6..aeb9182 100644 --- a/src/mouse.ui +++ b/src/mouse.ui @@ -6,12 +6,12 @@ 0 0 - 400 - 500 + 506 + 653 - + Cursor Theme @@ -21,7 +21,7 @@ - + Cursor Size @@ -31,7 +31,7 @@ - + Natural Scroll @@ -48,7 +48,7 @@ - + Left Handed @@ -65,7 +65,7 @@ - + Pointer Speed @@ -88,7 +88,7 @@ - + Acceleration Profile @@ -109,7 +109,7 @@ - + Touchpad @@ -135,7 +135,7 @@ - + Tap to Click @@ -155,7 +155,7 @@ - + Tap Button Map @@ -176,7 +176,7 @@ - + Tap and Drag @@ -223,7 +223,7 @@ - + Three Finger Drag @@ -240,7 +240,7 @@ - + Middle Button Emulation @@ -257,7 +257,7 @@ - + Disable While Typing @@ -274,7 +274,7 @@ - + Click Method @@ -300,7 +300,7 @@ - + Scroll Method @@ -331,7 +331,7 @@ - + Scroll Factor diff --git a/src/mouse.ui.~ b/src/mouse.ui.~ deleted file mode 100644 index c16c270..0000000 --- a/src/mouse.ui.~ +++ /dev/null @@ -1,67 +0,0 @@ - - - pageMouse - - - - 0 - 0 - 251 - 153 - - - - - 6 - - - 6 - - - 6 - - - 6 - - - - - Cursor Theme - - - - - - - - - - Cursor Size - - - - - - - - - - Natural Scroll - - - - - - - - 0 - 33 - - - - - - - - - diff --git a/src/settings.cpp b/src/settings.cpp index 4cc1ac6..cf50b84 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -101,6 +101,15 @@ Setting::Setting(QString name, enum settingFileType fileType, enum settingValueT // Use values from rc.xml if different from default if (m_fileType == LAB_FILE_TYPE_RCXML) { switch (m_valueType) { + case LAB_VALUE_TYPE_STRING: { + const char *value = xml_get(m_name.toStdString().c_str()); + if (value && QString(value) != std::get(m_value)) { + m_valueOrigin = LAB_VALUE_ORIGIN_USER_OVERRIDE; + m_value = QString(value); + info("[user-override] {}: {}", m_name.toStdString(), value); + } + break; + } case LAB_VALUE_TYPE_INT: { int value = xml_get_int(m_name.toStdString().c_str()); if (value != std::get(m_value)) { @@ -128,15 +137,6 @@ Setting::Setting(QString name, enum settingFileType fileType, enum settingValueT } break; } - case LAB_VALUE_TYPE_STRING: { - const char *value = xml_get(m_name.toStdString().c_str()); - if (value && QString(value) != std::get(m_value)) { - m_valueOrigin = LAB_VALUE_ORIGIN_USER_OVERRIDE; - m_value = QString(value); - info("[user-override] {}: {}", m_name.toStdString(), value); - } - break; - } default: break; } From 741d90bb5c0d097fe41f52991ae7a79c5db35d77 Mon Sep 17 00:00:00 2001 From: stefonarch Date: Sun, 7 Dec 2025 08:37:38 +0100 Subject: [PATCH 3/3] Readd removed lines --- src/settings.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/settings.h b/src/settings.h index 17bcb15..51b8e6f 100644 --- a/src/settings.h +++ b/src/settings.h @@ -66,3 +66,5 @@ void setInt(QString name, int value); void setStr(QString name, QString value); int parseBool(const char *str, int defaultValue); void setBool(QString name, int value); +void setBoolfromString(QString name, QString value); +void setFloat(QString name, float value);