Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,12 @@ jobs:
- distro: archlinux
container: archlinux:latest
pkg_cache_path: /var/cache/pacman/pkg
install: pacman -Syu --noconfirm --needed cmake ninja gcc git pkgconf qt6-base qt6-declarative qt6-svg systemd-libs gtest
install: pacman -Syu --noconfirm --needed cmake ninja gcc git pkgconf qt6-base qt6-declarative qt6-svg systemd-libs gtest layer-shell-qt glib2
run_tests: false
- distro: fedora-42
container: fedora:42
pkg_cache_path: /var/cache/dnf
install: dnf install -y --setopt=keepcache=1 cmake ninja-build gcc-c++ git pkgconf-pkg-config qt6-qtbase-devel qt6-qtdeclarative-devel qt6-qtsvg-devel qt6-qtshadertools systemd-devel gtest-devel
install: dnf install -y --setopt=keepcache=1 cmake ninja-build gcc-c++ git pkgconf-pkg-config qt6-qtbase-devel qt6-qtdeclarative-devel qt6-qtsvg-devel qt6-qtshadertools systemd-devel gtest-devel layer-shell-qt-devel glib2
run_tests: false
- distro: ubuntu-24.04
container: ubuntu:24.04
Expand Down Expand Up @@ -181,7 +181,11 @@ jobs:
deb-pkg:
name: Debian Package
runs-on: ubuntu-24.04
container: debian:trixie
steps:
- name: Install checkout prerequisites
run: apt-get update -qq && apt-get install -y git ca-certificates

- uses: actions/checkout@v4
with:
fetch-depth: 0
Expand All @@ -199,8 +203,8 @@ jobs:
- name: Install dependencies
run: |
mkdir -p ~/.cache/apt-archives/partial
sudo apt-get update
sudo apt-get -o Dir::Cache::archives="$HOME/.cache/apt-archives" install -y \
apt-get update
apt-get -o Dir::Cache::archives="$HOME/.cache/apt-archives" install -y \
build-essential cmake ninja-build pkg-config dpkg-dev \
qt6-base-dev qt6-declarative-dev qt6-svg-dev \
qt6-tools-dev qt6-tools-dev-tools \
Expand All @@ -209,9 +213,9 @@ jobs:
qml6-module-qtquick-templates qml6-module-qtqml-workerscript \
qml6-module-qtquick-dialogs \
qt6-qpa-plugins libqt6opengl6-dev libqt6svg6-dev \
libxkbcommon-dev libudev-dev
libxkbcommon-dev libudev-dev liblayershellqtinterface-dev libglib2.0-bin
# Ensure the cache dir is owned by the runner user before save.
sudo chown -R "$(id -u):$(id -g)" ~/.cache/apt-archives
chown -R "$(id -u):$(id -g)" ~/.cache/apt-archives

- name: Build .deb
run: bash scripts/package-deb.sh
Expand Down
20 changes: 12 additions & 8 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,11 @@ jobs:
# --------------------------------------------------------------------------
package-deb:
runs-on: ubuntu-24.04
container: debian:trixie
steps:
- name: Install checkout prerequisites
run: apt-get update -qq && apt-get install -y git ca-certificates

- uses: actions/checkout@v4
with:
fetch-depth: 0
Expand All @@ -49,10 +53,10 @@ jobs:

- name: Install dependencies
run: |
echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' | \
sudo tee /etc/apt/apt.conf.d/01keep-debs >/dev/null
sudo apt-get update
sudo apt-get install -y \
echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > \
/etc/apt/apt.conf.d/01keep-debs
apt-get update
apt-get install -y \
build-essential cmake ninja-build pkg-config dpkg-dev \
qt6-base-dev qt6-declarative-dev qt6-svg-dev \
qt6-tools-dev qt6-tools-dev-tools \
Expand All @@ -61,8 +65,8 @@ jobs:
qml6-module-qtquick-templates qml6-module-qtqml-workerscript \
qml6-module-qtquick-dialogs qml6-module-qt5compat-graphicaleffects \
qt6-qpa-plugins libqt6opengl6-dev libqt6svg6-dev \
libxkbcommon-dev libudev-dev
sudo chmod -R a+rX /var/cache/apt/archives
libxkbcommon-dev libudev-dev liblayershellqtinterface-dev libglib2.0-bin
chmod -R a+rX /var/cache/apt/archives

- name: Build .deb
run: bash scripts/package-deb.sh
Expand Down Expand Up @@ -99,7 +103,7 @@ jobs:
gcc gcc-c++ cmake ninja-build pkgconf-pkg-config rpm-build \
qt6-qtbase-devel qt6-qtdeclarative-devel qt6-qtsvg-devel \
qt6-qttools-devel qt6-qt5compat-devel \
libxkbcommon-devel systemd-devel grep
libxkbcommon-devel systemd-devel layer-shell-qt-devel glib2 grep

- name: Build .rpm
run: bash scripts/package-rpm.sh
Expand Down Expand Up @@ -138,7 +142,7 @@ jobs:
pacman -S --noconfirm --needed \
base-devel cmake ninja \
qt6-base qt6-declarative qt6-svg qt6-tools qt6-5compat \
libxkbcommon systemd-libs sudo
libxkbcommon systemd-libs layer-shell-qt glib2 sudo

- name: Create unprivileged build user (makepkg refuses root)
run: |
Expand Down
8 changes: 8 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,14 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)

find_package(Qt6 6.4 REQUIRED COMPONENTS Core Quick Svg DBus Widgets Concurrent Test QuickTest Network)
option(LOGITUNE_REQUIRE_LAYER_SHELL
"Fail configuration when LayerShellQt is unavailable" OFF)
find_package(LayerShellQt QUIET)
if(LOGITUNE_REQUIRE_LAYER_SHELL AND NOT TARGET LayerShellQt::Interface)
message(FATAL_ERROR "LayerShellQt is required for package builds")
elseif(NOT TARGET LayerShellQt::Interface)
message(WARNING "LayerShellQt not found: KDE action-ring overlay is disabled")
endif()
find_package(PkgConfig REQUIRED)
pkg_check_modules(UDEV REQUIRED libudev)

Expand Down
4 changes: 2 additions & 2 deletions pkg/obs/debian.control
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ Source: logitune
Section: utils
Priority: optional
Maintainer: mmaher88 <mina.maher88@hotmail.com>
Build-Depends: debhelper-compat (= 13), cmake (>= 3.22), g++ (>= 12), ninja-build, pkg-config, qt6-base-dev, qt6-declarative-dev, qt6-svg-dev, qt6-base-dev-tools, qt6-declarative-dev-tools, libudev-dev
Build-Depends: debhelper-compat (= 13), cmake (>= 3.22), g++ (>= 12), ninja-build, pkg-config, qt6-base-dev, qt6-declarative-dev, qt6-svg-dev, qt6-base-dev-tools, qt6-declarative-dev-tools, libudev-dev, liblayershellqtinterface-dev
Standards-Version: 4.6.2
Homepage: https://github.com/mmaher88/logitune

Package: logitune
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, libqt6core6 (>= 6.4), libqt6quick6, libqt6svg6, libqt6dbus6, libqt6widgets6, libudev1, qml6-module-qtqml, qml6-module-qtqml-workerscript, qml6-module-qtquick, qml6-module-qtquick-controls, qml6-module-qtquick-dialogs, qml6-module-qtquick-layouts, qml6-module-qtquick-templates, qml6-module-qtquick-window
Depends: ${shlibs:Depends}, ${misc:Depends}, libqt6core6 (>= 6.4), libqt6quick6, libqt6svg6, libqt6dbus6, libqt6widgets6, libudev1, libglib2.0-bin, qml6-module-qtqml, qml6-module-qtqml-workerscript, qml6-module-qtquick, qml6-module-qtquick-controls, qml6-module-qtquick-dialogs, qml6-module-qtquick-layouts, qml6-module-qtquick-templates, qml6-module-qtquick-window
Suggests: gnome-shell
Description: Logitech device configurator for Linux
Logitune is a Logitech Options+ alternative for Linux. Configure HID++
Expand Down
2 changes: 1 addition & 1 deletion pkg/obs/debian.rules
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ override_dh_auto_configure:
# DEB_VERSION_UPSTREAM comes from debian/changelog (which OBS keeps in
# sync via the set_version service). CMakeLists.txt refuses to guess
# without an explicit -DLOGITUNE_VERSION, so feed it here.
cmake -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DLOGITUNE_VERSION=$(DEB_VERSION_UPSTREAM) -Wno-dev
cmake -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DLOGITUNE_REQUIRE_LAYER_SHELL=ON -DLOGITUNE_VERSION=$(DEB_VERSION_UPSTREAM) -Wno-dev

override_dh_auto_build:
cmake --build build -j$$(nproc)
Expand Down
2 changes: 1 addition & 1 deletion pkg/obs/logitune.dsc
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@ Maintainer: mmaher88 <mina.maher88@hotmail.com>
Architecture: any
Homepage: https://github.com/mmaher88/logitune
Standards-Version: 4.6.2
Build-Depends: debhelper-compat (= 13), cmake (>= 3.22), g++ (>= 12), ninja-build, pkg-config, qt6-base-dev, qt6-declarative-dev, qt6-svg-dev, qt6-base-dev-tools, qt6-declarative-dev-tools, libudev-dev
Build-Depends: debhelper-compat (= 13), cmake (>= 3.22), g++ (>= 12), ninja-build, pkg-config, qt6-base-dev, qt6-declarative-dev, qt6-svg-dev, qt6-base-dev-tools, qt6-declarative-dev-tools, libudev-dev, liblayershellqtinterface-dev
6 changes: 5 additions & 1 deletion pkg/obs/logitune.spec
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@ BuildRequires: qt6-declarative-devel
BuildRequires: qt6-svg-devel
BuildRequires: qt6-shadertools-devel
BuildRequires: systemd-devel
BuildRequires: layer-shell-qt6-devel
%else
BuildRequires: ninja-build
BuildRequires: qt6-qtbase-devel
BuildRequires: qt6-qtdeclarative-devel
BuildRequires: qt6-qtsvg-devel
BuildRequires: qt6-qtshadertools
BuildRequires: systemd-devel
BuildRequires: layer-shell-qt-devel
%endif

%if 0%{?suse_version}
Expand All @@ -34,6 +36,8 @@ Requires: qt6-svg
Requires: qt6-qtbase
Requires: qt6-qtdeclarative
Requires: qt6-qtsvg
Requires: layer-shell-qt
Requires: glib2
%endif

%description
Expand All @@ -47,7 +51,7 @@ DPI, SmartShift, scroll, gesture, and thumb wheel settings.
%build
# OBS builds from a source tarball with no .git, so feed the version
# through -DLOGITUNE_VERSION; CMakeLists.txt refuses to guess.
%cmake -DBUILD_TESTING=OFF -DLOGITUNE_VERSION=%{version}
%cmake -DBUILD_TESTING=OFF -DLOGITUNE_REQUIRE_LAYER_SHELL=ON -DLOGITUNE_VERSION=%{version}
%cmake_build

%install
Expand Down
6 changes: 3 additions & 3 deletions scripts/package-arch.sh
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,15 @@ pkgdesc="Logitech device configurator for Linux — per-app profiles, button rem
arch=('x86_64')
url="https://github.com/mmaher88/logitune"
license=('GPL-3.0-or-later')
depends=('qt6-base' 'qt6-declarative' 'qt6-svg' 'qt6-5compat' 'systemd-libs')
makedepends=('cmake' 'ninja' 'qt6-tools')
depends=('qt6-base' 'qt6-declarative' 'qt6-svg' 'qt6-5compat' 'systemd-libs' 'layer-shell-qt' 'glib2')
makedepends=('cmake' 'ninja' 'qt6-tools' 'layer-shell-qt')
optdepends=('gnome-shell: per-app profile switching on GNOME'
'gnome-shell-extension-appindicator: system tray icon on GNOME')
source=()

build() {
cd "$startdir"
cmake -B build-pkg -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_TESTING=OFF -DLOGITUNE_VERSION=VERSION_PLACEHOLDER -Wno-dev
cmake -B build-pkg -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_TESTING=OFF -DLOGITUNE_REQUIRE_LAYER_SHELL=ON -DLOGITUNE_VERSION=VERSION_PLACEHOLDER -Wno-dev
cmake --build build-pkg -j$(nproc)
}

Expand Down
4 changes: 2 additions & 2 deletions scripts/package-deb.sh
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ echo "Building .deb package v$VERSION ($ARCH)"

# Build release (offscreen for headless gtest_discover_tests)
export QT_QPA_PLATFORM=offscreen
cmake -B build-release -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_TESTING=OFF -DLOGITUNE_VERSION="$VERSION" -Wno-dev > /dev/null 2>&1
cmake -B build-release -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_TESTING=OFF -DLOGITUNE_REQUIRE_LAYER_SHELL=ON -DLOGITUNE_VERSION="$VERSION" -Wno-dev > /dev/null 2>&1
cmake --build build-release -j$(nproc)

# Create package structure
Expand All @@ -34,7 +34,7 @@ Version: $VERSION
Section: utils
Priority: optional
Architecture: $ARCH
Depends: libqt6core6 (>= 6.4), libqt6qml6, libqt6quick6, libqt6svg6, libqt6dbus6, libqt6widgets6, libudev1, qml6-module-qtqml, qml6-module-qtqml-workerscript, qml6-module-qtquick, qml6-module-qtquick-controls, qml6-module-qtquick-dialogs, qml6-module-qtquick-layouts, qml6-module-qtquick-templates, qml6-module-qtquick-window
Depends: libqt6core6 (>= 6.4), libqt6qml6, libqt6quick6, libqt6svg6, libqt6dbus6, libqt6widgets6, liblayershellqtinterface6, libudev1, libglib2.0-bin, qml6-module-qtqml, qml6-module-qtqml-workerscript, qml6-module-qtquick, qml6-module-qtquick-controls, qml6-module-qtquick-dialogs, qml6-module-qtquick-layouts, qml6-module-qtquick-templates, qml6-module-qtquick-window
Recommends: gnome-shell-extension-appindicator
Maintainer: Mina Maher <mina.maher88@hotmail.com>
Description: Logitech device configurator for Linux
Expand Down
2 changes: 1 addition & 1 deletion scripts/package-rpm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ VERSION="${TAG//-/\~}"
echo "Building .rpm package v$VERSION"

# Build release
cmake -B build-release -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_TESTING=OFF -DLOGITUNE_VERSION="$VERSION" -Wno-dev > /dev/null 2>&1
cmake -B build-release -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_TESTING=OFF -DLOGITUNE_REQUIRE_LAYER_SHELL=ON -DLOGITUNE_VERSION="$VERSION" -Wno-dev > /dev/null 2>&1
cmake --build build-release -j$(nproc)

# Install to staging dir
Expand Down
2 changes: 2 additions & 0 deletions src/app/AppRoot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,8 @@ void AppRoot::onPhysicalDeviceAdded(PhysicalDevice *device)
[this, device](int delta) {
m_buttonDispatcher.onThumbWheelRotation(device, delta);
});
connect(device, &PhysicalDevice::stateChanged, &m_buttonDispatcher,
[this, device]() { m_buttonDispatcher.onDeviceStateChanged(device); });

// Re-apply profile whenever any transport finishes (re-)enumeration.
// PhysicalDevice emits this from its setupComplete fan-in, which
Expand Down
1 change: 1 addition & 0 deletions src/app/AppRoot.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ class AppRoot : public QObject {
ProfileModel *profileModel() { return &m_profileModel; }
SettingsModel *settingsModel() { return &m_settingsModel; }
EditorModel *editorModel() const { return m_editorModel.get(); }
RadialMenuController *radialMenu() { return m_buttonDispatcher.radialMenu(); }

private slots:
void onPhysicalDeviceAdded(PhysicalDevice *device);
Expand Down
9 changes: 8 additions & 1 deletion src/app/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ add_library(logitune-app-lib STATIC
services/ActiveDeviceResolver.cpp
services/DeviceCommandHandler.cpp
services/ButtonActionDispatcher.cpp
services/RadialMenuController.cpp
services/ProfileOrchestrator.cpp
dialogs/GitHubIssueBuilder.cpp
dialogs/CrashReportDialog.cpp
Expand All @@ -24,6 +25,10 @@ target_include_directories(logitune-app-lib PUBLIC
)

target_link_libraries(logitune-app-lib PUBLIC logitune-core Qt6::Quick Qt6::Widgets)
if(TARGET LayerShellQt::Interface)
target_link_libraries(logitune-app-lib PUBLIC LayerShellQt::Interface)
target_compile_definitions(logitune-app-lib PRIVATE LOGITUNE_LAYER_SHELL)
endif()
target_compile_definitions(logitune-app-lib PUBLIC
PROJECT_VERSION="${PROJECT_VERSION}"
PROJECT_VERSION_FULL="${LOGITUNE_DISPLAY_VERSION}"
Expand All @@ -40,7 +45,7 @@ else()
SideNav BatteryChip LogituneSlider LogituneToggle InfoCallout
DetailPanel KeystrokeCapture ButtonCallout ActionsPanel
DeviceCard DeviceRender AppProfileBar Toast EditorToolbar
EditableText ConflictBanner DiffModal HotspotControl)
EditableText ConflictBanner DiffModal HotspotControl RadialMenuRing)
set_source_files_properties(qml/components/${_file}.qml
PROPERTIES QT_RESOURCE_ALIAS qml/${_file}.qml)
endforeach()
Expand All @@ -58,6 +63,7 @@ qt_add_qml_module(logitune-app-lib
QML_FILES
qml/Theme.qml
qml/Main.qml
qml/RadialMenuOverlay.qml
qml/HomeView.qml
qml/DeviceView.qml
qml/AppSettingsView.qml
Expand All @@ -79,6 +85,7 @@ qt_add_qml_module(logitune-app-lib
qml/components/ConflictBanner.qml
qml/components/DiffModal.qml
qml/components/HotspotControl.qml
qml/components/RadialMenuRing.qml
qml/pages/PointScrollPage.qml
qml/pages/ButtonsPage.qml
qml/pages/EasySwitchPage.qml
Expand Down
2 changes: 2 additions & 0 deletions src/app/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -200,13 +200,15 @@ int main(int argc, char *argv[])
qmlRegisterSingletonInstance("Logitune", 1, 0, "GestureActionModel", controller.gestureActionFilterModel());
qmlRegisterSingletonInstance("Logitune", 1, 0, "ProfileModel", controller.profileModel());
qmlRegisterSingletonInstance("Logitune", 1, 0, "SettingsModel", controller.settingsModel());
qmlRegisterSingletonInstance("Logitune", 1, 0, "RadialMenu", controller.radialMenu());
#else
engine.rootContext()->setContextProperty("DeviceModel", controller.deviceModel());
engine.rootContext()->setContextProperty("ButtonModel", controller.buttonModel());
engine.rootContext()->setContextProperty("ActionModel", controller.actionFilterModel());
engine.rootContext()->setContextProperty("GestureActionModel", controller.gestureActionFilterModel());
engine.rootContext()->setContextProperty("ProfileModel", controller.profileModel());
engine.rootContext()->setContextProperty("SettingsModel", controller.settingsModel());
engine.rootContext()->setContextProperty("RadialMenu", controller.radialMenu());

// Qt 6.4: QML singletons from qmldir with "prefer :" don't resolve correctly.
// Explicitly register Theme from its resource path.
Expand Down
6 changes: 5 additions & 1 deletion src/app/models/ActionFilterModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ bool ActionFilterModel::filterAcceptsRow(int sourceRow,
// stay in the list; the dispatcher currently no-ops on them and
// can be extended later to handle them as gesture actions.
if (m_gestureMode) {
if (type == QLatin1String("gesture-trigger")) return false;
if (type == QLatin1String("gesture-trigger")
|| type == QLatin1String("radial-menu")) return false;
if (type == QLatin1String("none")) return false;
}

Expand All @@ -59,6 +60,9 @@ bool ActionFilterModel::filterAcceptsRow(int sourceRow,
return m_desktop->resolveNamedAction(id).has_value();
}

if (type == QLatin1String("radial-menu"))
return m_desktop && m_desktop->supportsActionRing();

// Capability filtering (unchanged): hide actions whose required device
// capability is absent on the current device.
if (!m_deviceModel || m_deviceModel->selectedIndex() < 0)
Expand Down
5 changes: 5 additions & 0 deletions src/app/models/ActionModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ ActionModel::ActionModel(QObject *parent)
// Device
{ "DPI cycle", "Step through the device's DPI preset list", "dpi-cycle", "", "Device" },
{ "Gestures", "Trigger gesture recognition", "gesture-trigger", "", "Device" },
{ "Action ring", "Open the circular action overlay", "radial-menu", "", "Device" },
{ "Shift wheel mode", "Toggle scroll wheel ratchet/freespin", "smartshift-toggle", "", "Device" },

// Edit
Expand Down Expand Up @@ -125,6 +126,8 @@ QString ActionModel::buttonActionToName(const ButtonAction &ba) const
return QString();
if (ba.type == ButtonAction::GestureTrigger)
return QStringLiteral("Gestures");
if (ba.type == ButtonAction::RadialMenu)
return QStringLiteral("Action ring");
if (ba.type == ButtonAction::PresetRef) {
for (const auto &a : m_actions) {
if (a.actionType == QStringLiteral("preset") && a.payload == ba.payload)
Expand All @@ -148,6 +151,8 @@ ButtonAction ActionModel::buttonEntryToAction(const QString &actionType, const Q
return {ButtonAction::Default, {}};
if (actionType == QStringLiteral("gesture-trigger"))
return {ButtonAction::GestureTrigger, {}};
if (actionType == QStringLiteral("radial-menu"))
return {ButtonAction::RadialMenu, {}};
if (actionType == QStringLiteral("smartshift-toggle"))
return {ButtonAction::SmartShiftToggle, {}};
if (actionType == QStringLiteral("dpi-cycle"))
Expand Down
2 changes: 2 additions & 0 deletions src/app/qml/Main.qml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import Logitune
ApplicationWindow {
id: root

RadialMenuOverlay { }

// ── Window geometry ─────────────────────────────────────────────────
// Design minimum keeps the Buttons page sane: the right action
// panel needs ~360px wide plus the main area needs ~560px for the
Expand Down
23 changes: 23 additions & 0 deletions src/app/qml/RadialMenuOverlay.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import QtQuick
import QtQuick.Window
import Logitune

Window {
id: overlay
width: 380
height: 380
x: RadialMenu.overlayPosition.x
y: RadialMenu.overlayPosition.y
visible: RadialMenu.visible
color: "transparent"
flags: Qt.FramelessWindowHint | Qt.Tool | Qt.WindowStaysOnTopHint

Component.onCompleted: RadialMenu.configureWindow(overlay)

RadialMenuRing {
anchors.fill: parent
entries: RadialMenu.items
onActivated: function(index) { RadialMenu.activate(index) }
onCancelled: RadialMenu.cancel()
}
}
Loading