From a7a3a7d4d3bf04611c237d2ab9532df26a1a7acf Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 17 Jul 2026 11:06:26 -0400 Subject: [PATCH] add linux mobile mode toggle --- lib/models/settings.dart | 1 + lib/pages/settings_page.dart | 24 ++++++++++++++++++++++++ lib/widgets/appbar.dart | 14 +++++++++++--- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/lib/models/settings.dart b/lib/models/settings.dart index 924c733..eddc2da 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -8,6 +8,7 @@ abstract class Settings with _$Settings { const factory Settings({ @Default(ThemeMode.system) ThemeMode theme, @Default(true) bool useDynamicTheming, + @Default(false) bool linuxMobileMode, }) = _Settings; factory Settings.fromJson(Map json) => diff --git a/lib/pages/settings_page.dart b/lib/pages/settings_page.dart index c302157..ee272b5 100644 --- a/lib/pages/settings_page.dart +++ b/lib/pages/settings_page.dart @@ -77,6 +77,30 @@ class SettingsPage extends ConsumerWidget { ), ]), ), + .new( + title: "Behavior", + icon: Icons.psychology, + settings: .new([ + Setting( + title: "Linux Mobile Mode", + description: + "Enables some fixes for Linux mobile, e.g. disabling dragging appbar for moving window.", + icon: Icons.construction, + builder: (title, description, icon) => SwitchListTile( + title: Text(title), + subtitle: Text(description), + secondary: Icon(icon), + value: settings.linuxMobileMode, + onChanged: Platform.isLinux + ? (value) => ref + .watch(SettingsController.provider.notifier) + .set(settings.copyWith(linuxMobileMode: value)) + .onError(showError) + : null, + ), + ), + ]), + ), ]), }); diff --git a/lib/widgets/appbar.dart b/lib/widgets/appbar.dart index 811788a..d13fbc8 100644 --- a/lib/widgets/appbar.dart +++ b/lib/widgets/appbar.dart @@ -1,9 +1,11 @@ import "dart:io"; import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter/material.dart"; +import "package:hooks_riverpod/hooks_riverpod.dart"; +import "package:nexus/controllers/settings_controller.dart"; import "package:window_manager/window_manager.dart"; -class Appbar extends StatelessWidget implements PreferredSizeWidget { +class Appbar extends ConsumerWidget implements PreferredSizeWidget { final Widget? leading; final Widget? title; final Color? backgroundColor; @@ -25,7 +27,7 @@ class Appbar extends StatelessWidget implements PreferredSizeWidget { Size get preferredSize => const .fromHeight(kToolbarHeight); @override - Widget build(BuildContext context) { + Widget build(BuildContext context, WidgetRef ref) { Future maximize() async { final isMaximized = await windowManager.isMaximized(); @@ -37,7 +39,13 @@ class Appbar extends StatelessWidget implements PreferredSizeWidget { } return GestureDetector( - onPanStart: (_) => windowManager.startDragging(), + onPanStart: ref + .watch(SettingsController.provider) + .whenOrNull( + data: (settings) => settings.linuxMobileMode + ? null + : (_) => windowManager.startDragging(), + ), child: AppBar( leading: InkWell(onTap: onTap, child: leading), backgroundColor: backgroundColor,