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..aeb9182 100644 --- a/src/mouse.ui +++ b/src/mouse.ui @@ -6,51 +6,39 @@ 0 0 - 251 - 153 + 506 + 653 - - - 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/settings.cpp b/src/settings.cpp index 538acb1..1cb73e2 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_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; } - 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_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_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_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; - } - default: - break; + 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; + } + 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 2d9056e..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,14 +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 22ee2cf..f1f8948 100644 --- a/src/xml.cpp +++ b/src/xml.cpp @@ -194,7 +194,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; @@ -219,6 +219,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