flutter_desktop: remote rxbool of fullscreen

Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
fufesou 2022-11-01 17:01:43 +08:00
parent 5df850e7de
commit b28fa19dfe
12 changed files with 128 additions and 141 deletions

View File

@ -6,6 +6,7 @@ import 'package:flutter_hbb/consts.dart';
import 'package:flutter_hbb/desktop/pages/desktop_home_page.dart'; import 'package:flutter_hbb/desktop/pages/desktop_home_page.dart';
import 'package:flutter_hbb/desktop/pages/desktop_setting_page.dart'; import 'package:flutter_hbb/desktop/pages/desktop_setting_page.dart';
import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart';
import 'package:flutter_hbb/models/state_model.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:window_manager/window_manager.dart'; import 'package:window_manager/window_manager.dart';
@ -62,8 +63,6 @@ class _DesktopTabPageState extends State<DesktopTabPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
RxBool fullscreen = false.obs;
Get.put(fullscreen, tag: 'fullscreen');
final tabWidget = Container( final tabWidget = Container(
child: Overlay(initialEntries: [ child: Overlay(initialEntries: [
OverlayEntry(builder: (context) { OverlayEntry(builder: (context) {
@ -84,9 +83,7 @@ class _DesktopTabPageState extends State<DesktopTabPage> {
); );
return Platform.isMacOS return Platform.isMacOS
? tabWidget ? tabWidget
: Obx(() => DragToResizeArea( : DragToResizeArea(
resizeEdgeSize: resizeEdgeSize: stateGlobal.resizeEdgeSize, child: tabWidget);
fullscreen.value ? kFullScreenEdgeSize : kWindowEdgeSize,
child: tabWidget));
} }
} }

View File

@ -47,7 +47,7 @@ class _FileManagerTabPageState extends State<FileManagerTabPage> {
rustDeskWinManager.setMethodHandler((call, fromWindowId) async { rustDeskWinManager.setMethodHandler((call, fromWindowId) async {
print( print(
"[FileTransfer] call ${call.method} with args ${call.arguments} from window ${fromWindowId} to ${windowId()}"); "[FileTransfer] call ${call.method} with args ${call.arguments} from window $fromWindowId to ${windowId()}");
// for simplify, just replace connectionId // for simplify, just replace connectionId
if (call.method == "new_file_transfer") { if (call.method == "new_file_transfer") {
final args = jsonDecode(call.arguments); final args = jsonDecode(call.arguments);
@ -86,11 +86,7 @@ class _FileManagerTabPageState extends State<FileManagerTabPage> {
); );
return Platform.isMacOS return Platform.isMacOS
? tabWidget ? tabWidget
: SubWindowDragToResizeArea( : SubWindowDragToResizeArea(child: tabWidget);
resizeEdgeSize: kWindowEdgeSize,
windowId: windowId(),
child: tabWidget,
);
} }
void onRemoveId(String id) { void onRemoveId(String id) {

View File

@ -50,7 +50,7 @@ class _PortForwardTabPageState extends State<PortForwardTabPage> {
rustDeskWinManager.setMethodHandler((call, fromWindowId) async { rustDeskWinManager.setMethodHandler((call, fromWindowId) async {
debugPrint( debugPrint(
"call ${call.method} with args ${call.arguments} from window ${fromWindowId}"); "call ${call.method} with args ${call.arguments} from window $fromWindowId");
// for simplify, just replace connectionId // for simplify, just replace connectionId
if (call.method == "new_port_forward") { if (call.method == "new_port_forward") {
final args = jsonDecode(call.arguments); final args = jsonDecode(call.arguments);
@ -97,11 +97,7 @@ class _PortForwardTabPageState extends State<PortForwardTabPage> {
); );
return Platform.isMacOS return Platform.isMacOS
? tabWidget ? tabWidget
: SubWindowDragToResizeArea( : SubWindowDragToResizeArea(child: tabWidget);
resizeEdgeSize: kWindowEdgeSize,
windowId: windowId(),
child: tabWidget,
);
} }
void onRemoveId(String id) { void onRemoveId(String id) {

View File

@ -28,15 +28,9 @@ class RemotePage extends StatefulWidget {
const RemotePage({ const RemotePage({
Key? key, Key? key,
required this.id, required this.id,
required this.windowId,
required this.tabBarHeight,
required this.windowBorderWidth,
}) : super(key: key); }) : super(key: key);
final String id; final String id;
final int windowId;
final double tabBarHeight;
final double windowBorderWidth;
@override @override
State<RemotePage> createState() => _RemotePageState(); State<RemotePage> createState() => _RemotePageState();
@ -58,11 +52,6 @@ class _RemotePageState extends State<RemotePage>
late FFI _ffi; late FFI _ffi;
void _updateTabBarHeight() {
_ffi.canvasModel.tabBarHeight = widget.tabBarHeight;
_ffi.canvasModel.windowBorderWidth = widget.windowBorderWidth;
}
void _initStates(String id) { void _initStates(String id) {
PrivacyModeState.init(id); PrivacyModeState.init(id);
BlockInputState.init(id); BlockInputState.init(id);
@ -91,7 +80,6 @@ class _RemotePageState extends State<RemotePage>
_ffi = FFI(); _ffi = FFI();
_updateTabBarHeight();
Get.put(_ffi, tag: widget.id); Get.put(_ffi, tag: widget.id);
_ffi.start(widget.id); _ffi.start(widget.id);
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
@ -164,7 +152,6 @@ class _RemotePageState extends State<RemotePage>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
super.build(context); super.build(context);
_updateTabBarHeight();
return WillPopScope( return WillPopScope(
onWillPop: () async { onWillPop: () async {
clientClose(_ffi.dialogManager); clientClose(_ffi.dialogManager);
@ -241,7 +228,6 @@ class _RemotePageState extends State<RemotePage>
paints.add(QualityMonitor(_ffi.qualityMonitorModel)); paints.add(QualityMonitor(_ffi.qualityMonitorModel));
paints.add(RemoteMenubar( paints.add(RemoteMenubar(
id: widget.id, id: widget.id,
windowId: widget.windowId,
ffi: _ffi, ffi: _ffi,
onEnterOrLeaveImageSetter: (func) => _onEnterOrLeaveImage4Menubar = func, onEnterOrLeaveImageSetter: (func) => _onEnterOrLeaveImage4Menubar = func,
onEnterOrLeaveImageCleaner: () => _onEnterOrLeaveImage4Menubar = null, onEnterOrLeaveImageCleaner: () => _onEnterOrLeaveImage4Menubar = null,

View File

@ -34,24 +34,20 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
_ConnectionTabPageState(Map<String, dynamic> params) { _ConnectionTabPageState(Map<String, dynamic> params) {
RemoteCountState.init(); RemoteCountState.init();
final RxBool fullscreen = Get.find(tag: 'fullscreen');
final peerId = params['id']; final peerId = params['id'];
if (peerId != null) { if (peerId != null) {
ConnectionTypeState.init(peerId); ConnectionTypeState.init(peerId);
tabController.add(TabInfo( tabController.add(TabInfo(
key: peerId, key: peerId,
label: peerId, label: peerId,
selectedIcon: selectedIcon, selectedIcon: selectedIcon,
unselectedIcon: unselectedIcon, unselectedIcon: unselectedIcon,
onTabCloseButton: () => tabController.closeBy(peerId), onTabCloseButton: () => tabController.closeBy(peerId),
page: Obx(() => RemotePage( page: RemotePage(
key: ValueKey(peerId), key: ValueKey(peerId),
id: peerId, id: peerId,
windowId: windowId(), ),
tabBarHeight: ));
fullscreen.isTrue ? 0 : kDesktopRemoteTabBarHeight,
windowBorderWidth: fullscreen.isTrue ? 0 : kWindowBorderWidth,
))));
_update_remote_count(); _update_remote_count();
} }
} }
@ -66,7 +62,6 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
print( print(
"call ${call.method} with args ${call.arguments} from window $fromWindowId"); "call ${call.method} with args ${call.arguments} from window $fromWindowId");
final RxBool fullscreen = Get.find(tag: 'fullscreen');
// for simplify, just replace connectionId // for simplify, just replace connectionId
if (call.method == "new_remote_desktop") { if (call.method == "new_remote_desktop") {
final args = jsonDecode(call.arguments); final args = jsonDecode(call.arguments);
@ -75,22 +70,13 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
window_on_top(windowId()); window_on_top(windowId());
ConnectionTypeState.init(id); ConnectionTypeState.init(id);
tabController.add(TabInfo( tabController.add(TabInfo(
key: id, key: id,
label: id, label: id,
selectedIcon: selectedIcon, selectedIcon: selectedIcon,
unselectedIcon: unselectedIcon, unselectedIcon: unselectedIcon,
onTabCloseButton: () => tabController.closeBy(id), onTabCloseButton: () => tabController.closeBy(id),
page: ObxValue<RxBool>( page: RemotePage(key: ValueKey(id), id: id),
(fullscreen) => RemotePage( ));
id: id,
windowId: windowId(),
tabBarHeight:
fullscreen.isTrue ? 0 : kDesktopRemoteTabBarHeight,
windowBorderWidth: fullscreen.isTrue ? 0 : kWindowBorderWidth,
),
fullscreen,
key: ValueKey(id),
)));
} else if (call.method == "onDestroy") { } else if (call.method == "onDestroy") {
tabController.clear(); tabController.clear();
} else if (call.method == kWindowActionRebuild) { } else if (call.method == kWindowActionRebuild) {
@ -105,7 +91,6 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final RxBool fullscreen = Get.find(tag: 'fullscreen');
final tabWidget = Container( final tabWidget = Container(
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border.all( border: Border.all(
@ -113,61 +98,52 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
width: kWindowBorderWidth)), width: kWindowBorderWidth)),
child: Scaffold( child: Scaffold(
backgroundColor: Theme.of(context).backgroundColor, backgroundColor: Theme.of(context).backgroundColor,
body: Obx(() => DesktopTab( body: DesktopTab(
controller: tabController, controller: tabController,
showTabBar: fullscreen.isFalse, onWindowCloseButton: handleWindowCloseButton,
onWindowCloseButton: handleWindowCloseButton, tail: const AddButton().paddingOnly(left: 10),
tail: const AddButton().paddingOnly(left: 10), pageViewBuilder: (pageView) => pageView,
pageViewBuilder: (pageView) { tabBuilder: (key, icon, label, themeConf) => Obx(() {
WindowController.fromWindowId(windowId()) final connectionType = ConnectionTypeState.find(key);
.setFullscreen(fullscreen.isTrue); if (!connectionType.isValid()) {
return pageView; return Row(
}, mainAxisAlignment: MainAxisAlignment.center,
tabBuilder: (key, icon, label, themeConf) => Obx(() { children: [
final connectionType = ConnectionTypeState.find(key); icon,
if (!connectionType.isValid()) { label,
return Row( ],
mainAxisAlignment: MainAxisAlignment.center, );
children: [ } else {
icon, final msgDirect = translate(
label, connectionType.direct.value == ConnectionType.strDirect
], ? 'Direct Connection'
); : 'Relay Connection');
} else { final msgSecure = translate(
final msgDirect = translate( connectionType.secure.value == ConnectionType.strSecure
connectionType.direct.value == ConnectionType.strDirect ? 'Secure Connection'
? 'Direct Connection' : 'Insecure Connection');
: 'Relay Connection'); return Row(
final msgSecure = translate( mainAxisAlignment: MainAxisAlignment.center,
connectionType.secure.value == ConnectionType.strSecure children: [
? 'Secure Connection' icon,
: 'Insecure Connection'); Tooltip(
return Row( message: '$msgDirect\n$msgSecure',
mainAxisAlignment: MainAxisAlignment.center, child: SvgPicture.asset(
children: [ 'assets/${connectionType.secure.value}${connectionType.direct.value}.svg',
icon, width: themeConf.iconSize,
Tooltip( height: themeConf.iconSize,
message: '$msgDirect\n$msgSecure', ).paddingOnly(right: 5),
child: SvgPicture.asset( ),
'assets/${connectionType.secure.value}${connectionType.direct.value}.svg', label,
width: themeConf.iconSize, ],
height: themeConf.iconSize, );
).paddingOnly(right: 5), }
), }),
label, )),
],
);
}
}),
))),
); );
return Platform.isMacOS return Platform.isMacOS
? tabWidget ? tabWidget
: Obx(() => SubWindowDragToResizeArea( : SubWindowDragToResizeArea(child: tabWidget);
resizeEdgeSize:
fullscreen.value ? kFullScreenEdgeSize : kWindowEdgeSize,
windowId: windowId(),
child: tabWidget));
} }
void onRemoveId(String id) { void onRemoveId(String id) {

View File

@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_hbb/common.dart'; import 'package:flutter_hbb/common.dart';
import 'package:flutter_hbb/desktop/pages/remote_tab_page.dart'; import 'package:flutter_hbb/desktop/pages/remote_tab_page.dart';
import 'package:flutter_hbb/desktop/widgets/refresh_wrapper.dart'; import 'package:flutter_hbb/desktop/widgets/refresh_wrapper.dart';
import 'package:get/get.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
/// multi-tab desktop remote screen /// multi-tab desktop remote screen
@ -13,8 +12,6 @@ class DesktopRemoteScreen extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
RxBool fullscreen = false.obs;
Get.put(fullscreen, tag: 'fullscreen');
return MultiProvider( return MultiProvider(
providers: [ providers: [
ChangeNotifierProvider.value(value: gFFI.ffiModel), ChangeNotifierProvider.value(value: gFFI.ffiModel),

View File

@ -6,6 +6,7 @@ import 'dart:ui' as ui;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_hbb/models/chat_model.dart'; import 'package:flutter_hbb/models/chat_model.dart';
import 'package:flutter_hbb/models/state_model.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:rxdart/rxdart.dart' as rxdart; import 'package:rxdart/rxdart.dart' as rxdart;
@ -29,7 +30,6 @@ class _MenubarTheme {
class RemoteMenubar extends StatefulWidget { class RemoteMenubar extends StatefulWidget {
final String id; final String id;
final int windowId;
final FFI ffi; final FFI ffi;
final Function(Function(bool)) onEnterOrLeaveImageSetter; final Function(Function(bool)) onEnterOrLeaveImageSetter;
final Function() onEnterOrLeaveImageCleaner; final Function() onEnterOrLeaveImageCleaner;
@ -37,7 +37,6 @@ class RemoteMenubar extends StatefulWidget {
const RemoteMenubar({ const RemoteMenubar({
Key? key, Key? key,
required this.id, required this.id,
required this.windowId,
required this.ffi, required this.ffi,
required this.onEnterOrLeaveImageSetter, required this.onEnterOrLeaveImageSetter,
required this.onEnterOrLeaveImageCleaner, required this.onEnterOrLeaveImageCleaner,
@ -55,9 +54,12 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
bool _isCursorOverImage = false; bool _isCursorOverImage = false;
window_size.Screen? _screen; window_size.Screen? _screen;
bool get isFullscreen => Get.find<RxBool>(tag: 'fullscreen').isTrue; int get windowId => stateGlobal.windowId;
bool get isFullscreen => stateGlobal.fullscreen;
void _setFullscreen(bool v) { void _setFullscreen(bool v) {
Get.find<RxBool>(tag: 'fullscreen').value = v; stateGlobal.setFullscreen(v);
setState(() {});
} }
@override @override
@ -213,7 +215,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
onPressed: () { onPressed: () {
_setFullscreen(!isFullscreen); _setFullscreen(!isFullscreen);
}, },
icon: Obx(() => isFullscreen icon: isFullscreen
? const Icon( ? const Icon(
Icons.fullscreen_exit, Icons.fullscreen_exit,
color: _MenubarTheme.commonColor, color: _MenubarTheme.commonColor,
@ -221,7 +223,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
: const Icon( : const Icon(
Icons.fullscreen, Icons.fullscreen,
color: _MenubarTheme.commonColor, color: _MenubarTheme.commonColor,
)), ),
); );
} }
@ -920,8 +922,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
_setFullscreen(false); _setFullscreen(false);
double scale = _screen!.scaleFactor; double scale = _screen!.scaleFactor;
final wndRect = final wndRect =
await WindowController.fromWindowId(widget.windowId) await WindowController.fromWindowId(windowId).getFrame();
.getFrame();
final mediaSize = MediaQueryData.fromWindow(ui.window).size; final mediaSize = MediaQueryData.fromWindow(ui.window).size;
// On windows, wndRect is equal to GetWindowRect and mediaSize is equal to GetClientRect. // On windows, wndRect is equal to GetWindowRect and mediaSize is equal to GetClientRect.
// https://stackoverflow.com/a/7561083 // https://stackoverflow.com/a/7561083
@ -944,8 +945,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
double top = wndRect.top + (wndRect.height - height) / 2; double top = wndRect.top + (wndRect.height - height) / 2;
Rect frameRect = _screen!.frame; Rect frameRect = _screen!.frame;
final RxBool fullscreen = Get.find(tag: 'fullscreen'); if (!isFullscreen) {
if (fullscreen.isFalse) {
frameRect = _screen!.visibleFrame; frameRect = _screen!.visibleFrame;
} }
if (left < frameRect.left) { if (left < frameRect.left) {
@ -960,7 +960,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
if ((top + height) > frameRect.bottom) { if ((top + height) > frameRect.bottom) {
top = frameRect.bottom - height; top = frameRect.bottom - height;
} }
await WindowController.fromWindowId(widget.windowId) await WindowController.fromWindowId(windowId)
.setFrame(Rect.fromLTWH(left, top, width, height)); .setFrame(Rect.fromLTWH(left, top, width, height));
} }
}(); }();

View File

@ -8,7 +8,9 @@ import 'package:flutter/material.dart' hide TabBarTheme;
import 'package:flutter_hbb/common.dart'; import 'package:flutter_hbb/common.dart';
import 'package:flutter_hbb/consts.dart'; import 'package:flutter_hbb/consts.dart';
import 'package:flutter_hbb/main.dart'; import 'package:flutter_hbb/main.dart';
import 'package:flutter_hbb/common/shared_state.dart';
import 'package:flutter_hbb/models/platform_model.dart'; import 'package:flutter_hbb/models/platform_model.dart';
import 'package:flutter_hbb/models/state_model.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:get/get_rx/src/rx_workers/utils/debouncer.dart'; import 'package:get/get_rx/src/rx_workers/utils/debouncer.dart';
import 'package:scroll_pos/scroll_pos.dart'; import 'package:scroll_pos/scroll_pos.dart';
@ -179,7 +181,6 @@ typedef LabelGetter = Rx<String> Function(String key);
int _lastClickTime = DateTime.now().millisecondsSinceEpoch; int _lastClickTime = DateTime.now().millisecondsSinceEpoch;
class DesktopTab extends StatelessWidget { class DesktopTab extends StatelessWidget {
final bool showTabBar;
final bool showLogo; final bool showLogo;
final bool showTitle; final bool showTitle;
final bool showMinimize; final bool showMinimize;
@ -206,7 +207,6 @@ class DesktopTab extends StatelessWidget {
DesktopTab({ DesktopTab({
Key? key, Key? key,
required this.controller, required this.controller,
this.showTabBar = true,
this.showLogo = true, this.showLogo = true,
this.showTitle = true, this.showTitle = true,
this.showMinimize = true, this.showMinimize = true,
@ -229,8 +229,8 @@ class DesktopTab extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column(children: [ return Column(children: [
Offstage( Obx(() => Offstage(
offstage: !showTabBar, offstage: !stateGlobal.showTabBar.isTrue,
child: SizedBox( child: SizedBox(
height: _kTabBarHeight, height: _kTabBarHeight,
child: Column( child: Column(
@ -245,7 +245,7 @@ class DesktopTab extends StatelessWidget {
), ),
], ],
), ),
)), ))),
Expanded( Expanded(
child: pageViewBuilder != null child: pageViewBuilder != null
? pageViewBuilder!(_buildPageView()) ? pageViewBuilder!(_buildPageView())

View File

@ -3,6 +3,7 @@ import 'dart:io';
import 'package:desktop_multi_window/desktop_multi_window.dart'; import 'package:desktop_multi_window/desktop_multi_window.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_hbb/models/state_model.dart';
import 'package:flutter_hbb/desktop/pages/desktop_tab_page.dart'; import 'package:flutter_hbb/desktop/pages/desktop_tab_page.dart';
import 'package:flutter_hbb/desktop/pages/server_page.dart'; import 'package:flutter_hbb/desktop/pages/server_page.dart';
import 'package:flutter_hbb/desktop/pages/install_page.dart'; import 'package:flutter_hbb/desktop/pages/install_page.dart';
@ -15,7 +16,6 @@ import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:uni_links_desktop/uni_links_desktop.dart';
import 'package:window_manager/window_manager.dart'; import 'package:window_manager/window_manager.dart';
// import 'package:window_manager/window_manager.dart'; // import 'package:window_manager/window_manager.dart';
@ -41,11 +41,14 @@ Future<void> main(List<String> args) async {
// main window // main window
if (args.isNotEmpty && args.first == 'multi_window') { if (args.isNotEmpty && args.first == 'multi_window') {
windowId = int.parse(args[1]); windowId = int.parse(args[1]);
stateGlobal.setWindowId(windowId!);
WindowController.fromWindowId(windowId!).showTitleBar(false); WindowController.fromWindowId(windowId!).showTitleBar(false);
final argument = args[2].isEmpty final argument = args[2].isEmpty
? <String, dynamic>{} ? <String, dynamic>{}
: jsonDecode(args[2]) as Map<String, dynamic>; : jsonDecode(args[2]) as Map<String, dynamic>;
int type = argument['type'] ?? -1; int type = argument['type'] ?? -1;
// to-do: No need to parse window id ?
// Because stateGlobal.windowId is a global value.
argument['windowId'] = windowId; argument['windowId'] = windowId;
WindowType wType = type.windowType; WindowType wType = type.windowType;
switch (wType) { switch (wType) {

View File

@ -10,6 +10,7 @@ import '../../models/model.dart';
import '../../models/platform_model.dart'; import '../../models/platform_model.dart';
import '../common.dart'; import '../common.dart';
import '../consts.dart'; import '../consts.dart';
import './state_model.dart';
import 'dart:ui' as ui; import 'dart:ui' as ui;
/// Mouse button enum. /// Mouse button enum.
@ -321,9 +322,7 @@ class InputModel {
double x = evt['x']; double x = evt['x'];
double y = max(0.0, evt['y']); double y = max(0.0, evt['y']);
if (isDesktop) { if (isDesktop) {
final RxBool fullscreen = Get.find(tag: 'fullscreen'); y = y - stateGlobal.tabBarHeight;
final tabBarHeight = fullscreen.isTrue ? 0 : kDesktopRemoteTabBarHeight;
y = y - tabBarHeight;
} }
final canvasModel = parent.target!.canvasModel; final canvasModel = parent.target!.canvasModel;
final ffiModel = parent.target!.ffiModel; final ffiModel = parent.target!.ffiModel;

View File

@ -14,6 +14,7 @@ import 'package:flutter_hbb/models/chat_model.dart';
import 'package:flutter_hbb/models/file_model.dart'; import 'package:flutter_hbb/models/file_model.dart';
import 'package:flutter_hbb/models/server_model.dart'; import 'package:flutter_hbb/models/server_model.dart';
import 'package:flutter_hbb/models/user_model.dart'; import 'package:flutter_hbb/models/user_model.dart';
import 'package:flutter_hbb/models/state_model.dart';
import 'package:flutter_hbb/utils/multi_window_manager.dart'; import 'package:flutter_hbb/utils/multi_window_manager.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
@ -483,9 +484,9 @@ class CanvasModel with ChangeNotifier {
// image scale // image scale
double _scale = 1.0; double _scale = 1.0;
// the tabbar over the image // the tabbar over the image
double tabBarHeight = 0.0; // double tabBarHeight = 0.0;
// the window border's width // the window border's width
double windowBorderWidth = 0.0; // double windowBorderWidth = 0.0;
// remote id // remote id
String id = ''; String id = '';
// scroll offset x percent // scroll offset x percent
@ -571,6 +572,9 @@ class CanvasModel with ChangeNotifier {
return parent.target?.ffiModel.display.height ?? defaultHeight; return parent.target?.ffiModel.display.height ?? defaultHeight;
} }
double get windowBorderWidth => stateGlobal.windowBorderWidth;
double get tabBarHeight => stateGlobal.tabBarHeight;
Size get size { Size get size {
final size = MediaQueryData.fromWindow(ui.window).size; final size = MediaQueryData.fromWindow(ui.window).size;
return Size(size.width - windowBorderWidth * 2, return Size(size.width - windowBorderWidth * 2,

View File

@ -0,0 +1,33 @@
import 'package:desktop_multi_window/desktop_multi_window.dart';
import 'package:get/get.dart';
import '../consts.dart';
class StateGlobal {
int _windowId = -1;
bool _fullscreen = false;
final RxBool _showTabBar = true.obs;
int get windowId => _windowId;
bool get fullscreen => _fullscreen;
double get tabBarHeight => fullscreen ? 0 : kDesktopRemoteTabBarHeight;
double get windowBorderWidth => fullscreen ? 0 : kWindowBorderWidth;
RxBool get showTabBar => _showTabBar;
double get resizeEdgeSize =>
fullscreen ? kFullScreenEdgeSize : kWindowEdgeSize;
setWindowId(int id) => _windowId = id;
setFullscreen(bool v) {
if (_fullscreen != v) {
_fullscreen = v;
_showTabBar.value = !_fullscreen;
WindowController.fromWindowId(windowId).setFullscreen(_fullscreen);
}
}
StateGlobal._();
static final StateGlobal instance = StateGlobal._();
}
final stateGlobal = StateGlobal.instance;