Merge pull request #873 from Kingtous/flutter_desktop
fix&opt: adjust conflict plugins & change implementation for window resize fit
This commit is contained in:
		
						commit
						ce218f7abf
					
				@ -7,7 +7,6 @@ import 'package:flutter_hbb/desktop/widgets/titlebar_widget.dart';
 | 
				
			|||||||
import 'package:flutter_hbb/models/model.dart';
 | 
					import 'package:flutter_hbb/models/model.dart';
 | 
				
			||||||
import 'package:provider/provider.dart';
 | 
					import 'package:provider/provider.dart';
 | 
				
			||||||
import 'package:tray_manager/tray_manager.dart';
 | 
					import 'package:tray_manager/tray_manager.dart';
 | 
				
			||||||
import 'package:window_manager/window_manager.dart';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class DesktopHomePage extends StatefulWidget {
 | 
					class DesktopHomePage extends StatefulWidget {
 | 
				
			||||||
  DesktopHomePage({Key? key}) : super(key: key);
 | 
					  DesktopHomePage({Key? key}) : super(key: key);
 | 
				
			||||||
@ -215,7 +214,7 @@ class _DesktopHomePageState extends State<DesktopHomePage> with TrayListener {
 | 
				
			|||||||
      case "quit":
 | 
					      case "quit":
 | 
				
			||||||
        exit(0);
 | 
					        exit(0);
 | 
				
			||||||
      case "show":
 | 
					      case "show":
 | 
				
			||||||
        windowManager.show();
 | 
					        // windowManager.show();
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      default:
 | 
					      default:
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
				
			|||||||
@ -12,11 +12,11 @@ import 'package:get/get.dart';
 | 
				
			|||||||
import 'package:get/route_manager.dart';
 | 
					import 'package:get/route_manager.dart';
 | 
				
			||||||
import 'package:provider/provider.dart';
 | 
					import 'package:provider/provider.dart';
 | 
				
			||||||
import 'package:wakelock/wakelock.dart';
 | 
					import 'package:wakelock/wakelock.dart';
 | 
				
			||||||
import 'package:window_manager/window_manager.dart';
 | 
					
 | 
				
			||||||
 | 
					// import 'package:window_manager/window_manager.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import '../../common.dart';
 | 
					import '../../common.dart';
 | 
				
			||||||
import '../../mobile/widgets/dialog.dart';
 | 
					import '../../mobile/widgets/dialog.dart';
 | 
				
			||||||
import '../../mobile/widgets/gestures.dart';
 | 
					 | 
				
			||||||
import '../../mobile/widgets/overlay.dart';
 | 
					import '../../mobile/widgets/overlay.dart';
 | 
				
			||||||
import '../../models/model.dart';
 | 
					import '../../models/model.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -32,7 +32,7 @@ class RemotePage extends StatefulWidget {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class _RemotePageState extends State<RemotePage>
 | 
					class _RemotePageState extends State<RemotePage>
 | 
				
			||||||
    with WindowListener, AutomaticKeepAliveClientMixin {
 | 
					    with AutomaticKeepAliveClientMixin {
 | 
				
			||||||
  Timer? _interval;
 | 
					  Timer? _interval;
 | 
				
			||||||
  Timer? _timer;
 | 
					  Timer? _timer;
 | 
				
			||||||
  bool _showBar = !isWebDesktop;
 | 
					  bool _showBar = !isWebDesktop;
 | 
				
			||||||
@ -69,7 +69,7 @@ class _RemotePageState extends State<RemotePage>
 | 
				
			|||||||
    _physicalFocusNode.requestFocus();
 | 
					    _physicalFocusNode.requestFocus();
 | 
				
			||||||
    ffi.ffiModel.updateEventListener(widget.id);
 | 
					    ffi.ffiModel.updateEventListener(widget.id);
 | 
				
			||||||
    ffi.listenToMouse(true);
 | 
					    ffi.listenToMouse(true);
 | 
				
			||||||
    WindowManager.instance.addListener(this);
 | 
					    // WindowManager.instance.addListener(this);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
@ -89,7 +89,7 @@ class _RemotePageState extends State<RemotePage>
 | 
				
			|||||||
    if (!Platform.isLinux) {
 | 
					    if (!Platform.isLinux) {
 | 
				
			||||||
      Wakelock.disable();
 | 
					      Wakelock.disable();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    WindowManager.instance.removeListener(this);
 | 
					    // WindowManager.instance.removeListener(this);
 | 
				
			||||||
    Get.delete<FFI>(tag: widget.id);
 | 
					    Get.delete<FFI>(tag: widget.id);
 | 
				
			||||||
    super.dispose();
 | 
					    super.dispose();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@ -286,14 +286,7 @@ class _RemotePageState extends State<RemotePage>
 | 
				
			|||||||
                      OverlayEntry(builder: (context) {
 | 
					                      OverlayEntry(builder: (context) {
 | 
				
			||||||
                        return Container(
 | 
					                        return Container(
 | 
				
			||||||
                            color: Colors.black,
 | 
					                            color: Colors.black,
 | 
				
			||||||
                            child: isWebDesktop
 | 
					                            child: getBodyForDesktopWithListener(keyboard));
 | 
				
			||||||
                                ? getBodyForDesktopWithListener(keyboard)
 | 
					 | 
				
			||||||
                                : SafeArea(
 | 
					 | 
				
			||||||
                                child: Container(
 | 
					 | 
				
			||||||
                                    color: MyTheme.canvasColor,
 | 
					 | 
				
			||||||
                                    child: _isPhysicalMouse
 | 
					 | 
				
			||||||
                                        ? getBodyForMobile()
 | 
					 | 
				
			||||||
                                        : getBodyForMobileWithGesture())));
 | 
					 | 
				
			||||||
                      })
 | 
					                      })
 | 
				
			||||||
                    ],
 | 
					                    ],
 | 
				
			||||||
                  ))),
 | 
					                  ))),
 | 
				
			||||||
@ -500,123 +493,6 @@ class _RemotePageState extends State<RemotePage>
 | 
				
			|||||||
  ///   DoubleFiner -> right click
 | 
					  ///   DoubleFiner -> right click
 | 
				
			||||||
  ///   HoldDrag -> left drag
 | 
					  ///   HoldDrag -> left drag
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Widget getBodyForMobileWithGesture() {
 | 
					 | 
				
			||||||
    final touchMode = _ffi.ffiModel.touchMode;
 | 
					 | 
				
			||||||
    return getMixinGestureDetector(
 | 
					 | 
				
			||||||
        child: getBodyForMobile(),
 | 
					 | 
				
			||||||
        onTapUp: (d) {
 | 
					 | 
				
			||||||
          if (touchMode) {
 | 
					 | 
				
			||||||
            _ffi.cursorModel.touch(
 | 
					 | 
				
			||||||
                d.localPosition.dx, d.localPosition.dy, MouseButtons.left);
 | 
					 | 
				
			||||||
          } else {
 | 
					 | 
				
			||||||
            _ffi.tap(MouseButtons.left);
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        onDoubleTapDown: (d) {
 | 
					 | 
				
			||||||
          if (touchMode) {
 | 
					 | 
				
			||||||
            _ffi.cursorModel.move(d.localPosition.dx, d.localPosition.dy);
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        onDoubleTap: () {
 | 
					 | 
				
			||||||
          _ffi.tap(MouseButtons.left);
 | 
					 | 
				
			||||||
          _ffi.tap(MouseButtons.left);
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        onLongPressDown: (d) {
 | 
					 | 
				
			||||||
          if (touchMode) {
 | 
					 | 
				
			||||||
            _ffi.cursorModel.move(d.localPosition.dx, d.localPosition.dy);
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        onLongPress: () {
 | 
					 | 
				
			||||||
          _ffi.tap(MouseButtons.right);
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        onDoubleFinerTap: (d) {
 | 
					 | 
				
			||||||
          if (!touchMode) {
 | 
					 | 
				
			||||||
            _ffi.tap(MouseButtons.right);
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        onHoldDragStart: (d) {
 | 
					 | 
				
			||||||
          if (!touchMode) {
 | 
					 | 
				
			||||||
            _ffi.sendMouse('down', MouseButtons.left);
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        onHoldDragUpdate: (d) {
 | 
					 | 
				
			||||||
          if (!touchMode) {
 | 
					 | 
				
			||||||
            _ffi.cursorModel.updatePan(d.delta.dx, d.delta.dy, touchMode);
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        onHoldDragEnd: (_) {
 | 
					 | 
				
			||||||
          if (!touchMode) {
 | 
					 | 
				
			||||||
            _ffi.sendMouse('up', MouseButtons.left);
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        onOneFingerPanStart: (d) {
 | 
					 | 
				
			||||||
          if (touchMode) {
 | 
					 | 
				
			||||||
            _ffi.cursorModel.move(d.localPosition.dx, d.localPosition.dy);
 | 
					 | 
				
			||||||
            _ffi.sendMouse('down', MouseButtons.left);
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        onOneFingerPanUpdate: (d) {
 | 
					 | 
				
			||||||
          _ffi.cursorModel.updatePan(d.delta.dx, d.delta.dy, touchMode);
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        onOneFingerPanEnd: (d) {
 | 
					 | 
				
			||||||
          if (touchMode) {
 | 
					 | 
				
			||||||
            _ffi.sendMouse('up', MouseButtons.left);
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        // scale + pan event
 | 
					 | 
				
			||||||
        onTwoFingerScaleUpdate: (d) {
 | 
					 | 
				
			||||||
          _ffi.canvasModel.updateScale(d.scale / _scale);
 | 
					 | 
				
			||||||
          _scale = d.scale;
 | 
					 | 
				
			||||||
          _ffi.canvasModel.panX(d.focalPointDelta.dx);
 | 
					 | 
				
			||||||
          _ffi.canvasModel.panY(d.focalPointDelta.dy);
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        onTwoFingerScaleEnd: (d) {
 | 
					 | 
				
			||||||
          _scale = 1;
 | 
					 | 
				
			||||||
          _ffi.bind
 | 
					 | 
				
			||||||
              .sessionPeerOption(id: widget.id, name: "view-style", value: "");
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        onThreeFingerVerticalDragUpdate: _ffi.ffiModel.isPeerAndroid
 | 
					 | 
				
			||||||
            ? null
 | 
					 | 
				
			||||||
            : (d) {
 | 
					 | 
				
			||||||
                _mouseScrollIntegral += d.delta.dy / 4;
 | 
					 | 
				
			||||||
                if (_mouseScrollIntegral > 1) {
 | 
					 | 
				
			||||||
                  _ffi.scroll(1);
 | 
					 | 
				
			||||||
                  _mouseScrollIntegral = 0;
 | 
					 | 
				
			||||||
                } else if (_mouseScrollIntegral < -1) {
 | 
					 | 
				
			||||||
                  _ffi.scroll(-1);
 | 
					 | 
				
			||||||
                  _mouseScrollIntegral = 0;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
              });
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Widget getBodyForMobile() {
 | 
					 | 
				
			||||||
    return Container(
 | 
					 | 
				
			||||||
        color: MyTheme.canvasColor,
 | 
					 | 
				
			||||||
        child: Stack(children: [
 | 
					 | 
				
			||||||
          ImagePaint(id: widget.id),
 | 
					 | 
				
			||||||
          CursorPaint(id: widget.id),
 | 
					 | 
				
			||||||
          getHelpTools(),
 | 
					 | 
				
			||||||
          SizedBox(
 | 
					 | 
				
			||||||
            width: 0,
 | 
					 | 
				
			||||||
            height: 0,
 | 
					 | 
				
			||||||
            child: !_showEdit
 | 
					 | 
				
			||||||
                ? Container()
 | 
					 | 
				
			||||||
                : TextFormField(
 | 
					 | 
				
			||||||
                    textInputAction: TextInputAction.newline,
 | 
					 | 
				
			||||||
                    autocorrect: false,
 | 
					 | 
				
			||||||
                    enableSuggestions: false,
 | 
					 | 
				
			||||||
                    autofocus: true,
 | 
					 | 
				
			||||||
                    focusNode: _mobileFocusNode,
 | 
					 | 
				
			||||||
                    maxLines: null,
 | 
					 | 
				
			||||||
                    initialValue: _value,
 | 
					 | 
				
			||||||
                    // trick way to make backspace work always
 | 
					 | 
				
			||||||
                    keyboardType: TextInputType.multiline,
 | 
					 | 
				
			||||||
                    onChanged: handleInput,
 | 
					 | 
				
			||||||
                  ),
 | 
					 | 
				
			||||||
          ),
 | 
					 | 
				
			||||||
        ]));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Widget getBodyForDesktopWithListener(bool keyboard) {
 | 
					  Widget getBodyForDesktopWithListener(bool keyboard) {
 | 
				
			||||||
    var paints = <Widget>[
 | 
					    var paints = <Widget>[
 | 
				
			||||||
      ImagePaint(
 | 
					      ImagePaint(
 | 
				
			||||||
@ -630,8 +506,26 @@ class _RemotePageState extends State<RemotePage>
 | 
				
			|||||||
        id: widget.id,
 | 
					        id: widget.id,
 | 
				
			||||||
      ));
 | 
					      ));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return Container(
 | 
					    paints.add(getHelpTools());
 | 
				
			||||||
        color: MyTheme.canvasColor, child: Stack(children: paints));
 | 
					    return MouseRegion(
 | 
				
			||||||
 | 
					        onEnter: (evt) {
 | 
				
			||||||
 | 
					          _ffi.bind.hostStopSystemKeyPropagate(stopped: false);
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        onExit: (evt) {
 | 
				
			||||||
 | 
					          _ffi.bind.hostStopSystemKeyPropagate(stopped: true);
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        child: Container(
 | 
				
			||||||
 | 
					          color: MyTheme.canvasColor,
 | 
				
			||||||
 | 
					          child: LayoutBuilder(builder: (context, constraints) {
 | 
				
			||||||
 | 
					            Future.delayed(Duration.zero, () {
 | 
				
			||||||
 | 
					              Provider.of<CanvasModel>(context, listen: false)
 | 
				
			||||||
 | 
					                  .updateViewStyle();
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            return Stack(
 | 
				
			||||||
 | 
					              children: paints,
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					          }),
 | 
				
			||||||
 | 
					        ));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int lastMouseDownButtons = 0;
 | 
					  int lastMouseDownButtons = 0;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,3 @@
 | 
				
			|||||||
import 'package:bitsdojo_window/bitsdojo_window.dart';
 | 
					 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const sidebarColor = Color(0xFF0C6AF6);
 | 
					const sidebarColor = Color(0xFF0C6AF6);
 | 
				
			||||||
@ -20,47 +19,51 @@ class DesktopTitleBar extends StatelessWidget {
 | 
				
			|||||||
            colors: [backgroundStartColor, backgroundEndColor],
 | 
					            colors: [backgroundStartColor, backgroundEndColor],
 | 
				
			||||||
            stops: [0.0, 1.0]),
 | 
					            stops: [0.0, 1.0]),
 | 
				
			||||||
      ),
 | 
					      ),
 | 
				
			||||||
      child: WindowTitleBarBox(
 | 
					      child: Row(
 | 
				
			||||||
        child: SizedBox(
 | 
					        children: [
 | 
				
			||||||
          child: Row(
 | 
					          Expanded(
 | 
				
			||||||
            children: [
 | 
					              child: child ?? Offstage(),)
 | 
				
			||||||
              Expanded(
 | 
					          // const WindowButtons()
 | 
				
			||||||
                  child: MoveWindow(
 | 
					        ],
 | 
				
			||||||
                child: child,
 | 
					 | 
				
			||||||
              )),
 | 
					 | 
				
			||||||
              const WindowButtons()
 | 
					 | 
				
			||||||
            ],
 | 
					 | 
				
			||||||
          ),
 | 
					 | 
				
			||||||
        ),
 | 
					 | 
				
			||||||
      ),
 | 
					      ),
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
final buttonColors = WindowButtonColors(
 | 
					// final buttonColors = WindowButtonColors(
 | 
				
			||||||
    iconNormal: const Color(0xFF805306),
 | 
					//     iconNormal: const Color(0xFF805306),
 | 
				
			||||||
    mouseOver: const Color(0xFFF6A00C),
 | 
					//     mouseOver: const Color(0xFFF6A00C),
 | 
				
			||||||
    mouseDown: const Color(0xFF805306),
 | 
					//     mouseDown: const Color(0xFF805306),
 | 
				
			||||||
    iconMouseOver: const Color(0xFF805306),
 | 
					//     iconMouseOver: const Color(0xFF805306),
 | 
				
			||||||
    iconMouseDown: const Color(0xFFFFD500));
 | 
					//     iconMouseDown: const Color(0xFFFFD500));
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
final closeButtonColors = WindowButtonColors(
 | 
					// final closeButtonColors = WindowButtonColors(
 | 
				
			||||||
    mouseOver: const Color(0xFFD32F2F),
 | 
					//     mouseOver: const Color(0xFFD32F2F),
 | 
				
			||||||
    mouseDown: const Color(0xFFB71C1C),
 | 
					//     mouseDown: const Color(0xFFB71C1C),
 | 
				
			||||||
    iconNormal: const Color(0xFF805306),
 | 
					//     iconNormal: const Color(0xFF805306),
 | 
				
			||||||
    iconMouseOver: Colors.white);
 | 
					//     iconMouseOver: Colors.white);
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
class WindowButtons extends StatelessWidget {
 | 
					// class WindowButtons extends StatelessWidget {
 | 
				
			||||||
  const WindowButtons({Key? key}) : super(key: key);
 | 
					//   const WindowButtons({Key? key}) : super(key: key);
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
  @override
 | 
					//   @override
 | 
				
			||||||
  Widget build(BuildContext context) {
 | 
					//   Widget build(BuildContext context) {
 | 
				
			||||||
    return Row(
 | 
					//     return Row(
 | 
				
			||||||
      children: [
 | 
					//       children: [
 | 
				
			||||||
        MinimizeWindowButton(colors: buttonColors),
 | 
					//         MinimizeWindowButton(colors: buttonColors, onPressed: () {
 | 
				
			||||||
        MaximizeWindowButton(colors: buttonColors),
 | 
					//           windowManager.minimize();
 | 
				
			||||||
        CloseWindowButton(colors: closeButtonColors),
 | 
					//         },),
 | 
				
			||||||
      ],
 | 
					//         MaximizeWindowButton(colors: buttonColors, onPressed: () async {
 | 
				
			||||||
    );
 | 
					//           if (await windowManager.isMaximized()) {
 | 
				
			||||||
  }
 | 
					//             windowManager.restore();
 | 
				
			||||||
}
 | 
					//           } else {
 | 
				
			||||||
 | 
					//             windowManager.maximize();
 | 
				
			||||||
 | 
					//           }
 | 
				
			||||||
 | 
					//         },),
 | 
				
			||||||
 | 
					//         CloseWindowButton(colors: closeButtonColors, onPressed: () {
 | 
				
			||||||
 | 
					//           windowManager.close();
 | 
				
			||||||
 | 
					//         },),
 | 
				
			||||||
 | 
					//       ],
 | 
				
			||||||
 | 
					//     );
 | 
				
			||||||
 | 
					//   }
 | 
				
			||||||
 | 
					// }
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,5 @@
 | 
				
			|||||||
import 'dart:convert';
 | 
					import 'dart:convert';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import 'package:bitsdojo_window/bitsdojo_window.dart';
 | 
					 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.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/screen/desktop_file_transfer_screen.dart';
 | 
					import 'package:flutter_hbb/desktop/screen/desktop_file_transfer_screen.dart';
 | 
				
			||||||
@ -9,7 +8,7 @@ import 'package:flutter_hbb/utils/multi_window_manager.dart';
 | 
				
			|||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
 | 
					import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
 | 
				
			||||||
import 'package:get/route_manager.dart';
 | 
					import 'package:get/route_manager.dart';
 | 
				
			||||||
import 'package:provider/provider.dart';
 | 
					import 'package:provider/provider.dart';
 | 
				
			||||||
import 'package:window_manager/window_manager.dart';
 | 
					// import 'package:window_manager/window_manager.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import 'common.dart';
 | 
					import 'common.dart';
 | 
				
			||||||
import 'mobile/pages/home_page.dart';
 | 
					import 'mobile/pages/home_page.dart';
 | 
				
			||||||
@ -38,7 +37,6 @@ void runRustDeskApp(List<String> args) async {
 | 
				
			|||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  // main window
 | 
					  // main window
 | 
				
			||||||
  await windowManager.ensureInitialized();
 | 
					 | 
				
			||||||
  if (args.isNotEmpty && args.first == 'multi_window') {
 | 
					  if (args.isNotEmpty && args.first == 'multi_window') {
 | 
				
			||||||
    windowId = int.parse(args[1]);
 | 
					    windowId = int.parse(args[1]);
 | 
				
			||||||
    final argument = args[2].isEmpty
 | 
					    final argument = args[2].isEmpty
 | 
				
			||||||
@ -59,17 +57,11 @@ void runRustDeskApp(List<String> args) async {
 | 
				
			|||||||
        break;
 | 
					        break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
 | 
					    // await windowManager.ensureInitialized();
 | 
				
			||||||
    // disable tray
 | 
					    // disable tray
 | 
				
			||||||
    // initTray();
 | 
					    // initTray();
 | 
				
			||||||
    gFFI.serverModel.startService();
 | 
					    gFFI.serverModel.startService();
 | 
				
			||||||
    runApp(App());
 | 
					    runApp(App());
 | 
				
			||||||
    doWhenWindowReady(() {
 | 
					 | 
				
			||||||
      const initialSize = Size(1280, 720);
 | 
					 | 
				
			||||||
      appWindow.minSize = initialSize;
 | 
					 | 
				
			||||||
      appWindow.size = initialSize;
 | 
					 | 
				
			||||||
      appWindow.alignment = Alignment.center;
 | 
					 | 
				
			||||||
      appWindow.show();
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -891,9 +891,7 @@ class FFI {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  /// Connect with the given [id]. Only transfer file if [isFileTransfer].
 | 
					  /// Connect with the given [id]. Only transfer file if [isFileTransfer].
 | 
				
			||||||
  void connect(String id, {bool isFileTransfer = false}) {
 | 
					  void connect(String id, {bool isFileTransfer = false}) {
 | 
				
			||||||
    if (isFileTransfer) {
 | 
					    if (!isFileTransfer) {
 | 
				
			||||||
      setByName('connect_file_transfer', id);
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      chatModel.resetClientMode();
 | 
					      chatModel.resetClientMode();
 | 
				
			||||||
      canvasModel.id = id;
 | 
					      canvasModel.id = id;
 | 
				
			||||||
      imageModel._id = id;
 | 
					      imageModel._id = id;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
#include "my_application.h"
 | 
					#include "my_application.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <flutter_linux/flutter_linux.h>
 | 
					#include <flutter_linux/flutter_linux.h>
 | 
				
			||||||
#include <bitsdojo_window_linux/bitsdojo_window_plugin.h>
 | 
					// #include <bitsdojo_window_linux/bitsdojo_window_plugin.h>
 | 
				
			||||||
#ifdef GDK_WINDOWING_X11
 | 
					#ifdef GDK_WINDOWING_X11
 | 
				
			||||||
#include <gdk/gdkx.h>
 | 
					#include <gdk/gdkx.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@ -48,8 +48,8 @@ static void my_application_activate(GApplication* application) {
 | 
				
			|||||||
    gtk_window_set_title(window, "rustdesk");
 | 
					    gtk_window_set_title(window, "rustdesk");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  auto bdw = bitsdojo_window_from(window);            // <--- add this line
 | 
					  // auto bdw = bitsdojo_window_from(window);            // <--- add this line
 | 
				
			||||||
  bdw->setCustomFrame(true);                          // <-- add this line
 | 
					  // bdw->setCustomFrame(true);                          // <-- add this line
 | 
				
			||||||
  gtk_window_set_default_size(window, 1280, 720);   // <-- comment this line
 | 
					  gtk_window_set_default_size(window, 1280, 720);   // <-- comment this line
 | 
				
			||||||
  gtk_widget_show(GTK_WIDGET(window));
 | 
					  gtk_widget_show(GTK_WIDGET(window));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import Cocoa
 | 
					import Cocoa
 | 
				
			||||||
import FlutterMacOS
 | 
					import FlutterMacOS
 | 
				
			||||||
import bitsdojo_window_macos
 | 
					// import bitsdojo_window_macos
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class MainFlutterWindow: BitsdojoWindow {
 | 
					class MainFlutterWindow: NSWindow {
 | 
				
			||||||
    override func awakeFromNib() {
 | 
					    override func awakeFromNib() {
 | 
				
			||||||
        if (!rustdesk_core_main()){
 | 
					        if (!rustdesk_core_main()){
 | 
				
			||||||
            print("Rustdesk core returns false, exiting without launching Flutter app")
 | 
					            print("Rustdesk core returns false, exiting without launching Flutter app")
 | 
				
			||||||
@ -18,7 +18,7 @@ class MainFlutterWindow: BitsdojoWindow {
 | 
				
			|||||||
        super.awakeFromNib()
 | 
					        super.awakeFromNib()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    override func bitsdojo_window_configure() -> UInt {
 | 
					//     override func bitsdojo_window_configure() -> UInt {
 | 
				
			||||||
        return BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP
 | 
					//         return BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP
 | 
				
			||||||
    }
 | 
					//     }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -21,6 +21,8 @@ void wire_rustdesk_core_main(int64_t port_);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void wire_start_global_event_stream(int64_t port_);
 | 
					void wire_start_global_event_stream(int64_t port_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wire_host_stop_system_key_propagate(int64_t port_, bool stopped);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wire_session_connect(int64_t port_, struct wire_uint_8_list *id, bool is_file_transfer);
 | 
					void wire_session_connect(int64_t port_, struct wire_uint_8_list *id, bool is_file_transfer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wire_get_session_remember(int64_t port_, struct wire_uint_8_list *id);
 | 
					void wire_get_session_remember(int64_t port_, struct wire_uint_8_list *id);
 | 
				
			||||||
@ -170,6 +172,7 @@ static int64_t dummy_method_to_enforce_bundling(void) {
 | 
				
			|||||||
    int64_t dummy_var = 0;
 | 
					    int64_t dummy_var = 0;
 | 
				
			||||||
    dummy_var ^= ((int64_t) (void*) wire_rustdesk_core_main);
 | 
					    dummy_var ^= ((int64_t) (void*) wire_rustdesk_core_main);
 | 
				
			||||||
    dummy_var ^= ((int64_t) (void*) wire_start_global_event_stream);
 | 
					    dummy_var ^= ((int64_t) (void*) wire_start_global_event_stream);
 | 
				
			||||||
 | 
					    dummy_var ^= ((int64_t) (void*) wire_host_stop_system_key_propagate);
 | 
				
			||||||
    dummy_var ^= ((int64_t) (void*) wire_session_connect);
 | 
					    dummy_var ^= ((int64_t) (void*) wire_session_connect);
 | 
				
			||||||
    dummy_var ^= ((int64_t) (void*) wire_get_session_remember);
 | 
					    dummy_var ^= ((int64_t) (void*) wire_get_session_remember);
 | 
				
			||||||
    dummy_var ^= ((int64_t) (void*) wire_get_session_toggle_option);
 | 
					    dummy_var ^= ((int64_t) (void*) wire_get_session_toggle_option);
 | 
				
			||||||
 | 
				
			|||||||
@ -36,41 +36,6 @@ packages:
 | 
				
			|||||||
      url: "https://pub.flutter-io.cn"
 | 
					      url: "https://pub.flutter-io.cn"
 | 
				
			||||||
    source: hosted
 | 
					    source: hosted
 | 
				
			||||||
    version: "2.8.2"
 | 
					    version: "2.8.2"
 | 
				
			||||||
  bitsdojo_window:
 | 
					 | 
				
			||||||
    dependency: "direct main"
 | 
					 | 
				
			||||||
    description:
 | 
					 | 
				
			||||||
      name: bitsdojo_window
 | 
					 | 
				
			||||||
      url: "https://pub.flutter-io.cn"
 | 
					 | 
				
			||||||
    source: hosted
 | 
					 | 
				
			||||||
    version: "0.1.2"
 | 
					 | 
				
			||||||
  bitsdojo_window_linux:
 | 
					 | 
				
			||||||
    dependency: transitive
 | 
					 | 
				
			||||||
    description:
 | 
					 | 
				
			||||||
      name: bitsdojo_window_linux
 | 
					 | 
				
			||||||
      url: "https://pub.flutter-io.cn"
 | 
					 | 
				
			||||||
    source: hosted
 | 
					 | 
				
			||||||
    version: "0.1.2"
 | 
					 | 
				
			||||||
  bitsdojo_window_macos:
 | 
					 | 
				
			||||||
    dependency: transitive
 | 
					 | 
				
			||||||
    description:
 | 
					 | 
				
			||||||
      name: bitsdojo_window_macos
 | 
					 | 
				
			||||||
      url: "https://pub.flutter-io.cn"
 | 
					 | 
				
			||||||
    source: hosted
 | 
					 | 
				
			||||||
    version: "0.1.2"
 | 
					 | 
				
			||||||
  bitsdojo_window_platform_interface:
 | 
					 | 
				
			||||||
    dependency: transitive
 | 
					 | 
				
			||||||
    description:
 | 
					 | 
				
			||||||
      name: bitsdojo_window_platform_interface
 | 
					 | 
				
			||||||
      url: "https://pub.flutter-io.cn"
 | 
					 | 
				
			||||||
    source: hosted
 | 
					 | 
				
			||||||
    version: "0.1.2"
 | 
					 | 
				
			||||||
  bitsdojo_window_windows:
 | 
					 | 
				
			||||||
    dependency: transitive
 | 
					 | 
				
			||||||
    description:
 | 
					 | 
				
			||||||
      name: bitsdojo_window_windows
 | 
					 | 
				
			||||||
      url: "https://pub.flutter-io.cn"
 | 
					 | 
				
			||||||
    source: hosted
 | 
					 | 
				
			||||||
    version: "0.1.2"
 | 
					 | 
				
			||||||
  boolean_selector:
 | 
					  boolean_selector:
 | 
				
			||||||
    dependency: transitive
 | 
					    dependency: transitive
 | 
				
			||||||
    description:
 | 
					    description:
 | 
				
			||||||
@ -221,11 +186,9 @@ packages:
 | 
				
			|||||||
  desktop_multi_window:
 | 
					  desktop_multi_window:
 | 
				
			||||||
    dependency: "direct main"
 | 
					    dependency: "direct main"
 | 
				
			||||||
    description:
 | 
					    description:
 | 
				
			||||||
      path: "."
 | 
					      path: "../../rustdesk_desktop_multi_window"
 | 
				
			||||||
      ref: "704718b2853723b615675e048f1f385cbfb209a6"
 | 
					      relative: true
 | 
				
			||||||
      resolved-ref: "704718b2853723b615675e048f1f385cbfb209a6"
 | 
					    source: path
 | 
				
			||||||
      url: "https://github.com/Kingtous/rustdesk_desktop_multi_window"
 | 
					 | 
				
			||||||
    source: git
 | 
					 | 
				
			||||||
    version: "0.0.1"
 | 
					    version: "0.0.1"
 | 
				
			||||||
  device_info_plus:
 | 
					  device_info_plus:
 | 
				
			||||||
    dependency: "direct main"
 | 
					    dependency: "direct main"
 | 
				
			||||||
@ -785,13 +748,6 @@ packages:
 | 
				
			|||||||
      url: "https://pub.flutter-io.cn"
 | 
					      url: "https://pub.flutter-io.cn"
 | 
				
			||||||
    source: hosted
 | 
					    source: hosted
 | 
				
			||||||
    version: "3.1.0"
 | 
					    version: "3.1.0"
 | 
				
			||||||
  screen_retriever:
 | 
					 | 
				
			||||||
    dependency: transitive
 | 
					 | 
				
			||||||
    description:
 | 
					 | 
				
			||||||
      name: screen_retriever
 | 
					 | 
				
			||||||
      url: "https://pub.flutter-io.cn"
 | 
					 | 
				
			||||||
    source: hosted
 | 
					 | 
				
			||||||
    version: "0.1.2"
 | 
					 | 
				
			||||||
  settings_ui:
 | 
					  settings_ui:
 | 
				
			||||||
    dependency: "direct main"
 | 
					    dependency: "direct main"
 | 
				
			||||||
    description:
 | 
					    description:
 | 
				
			||||||
@ -1105,13 +1061,6 @@ packages:
 | 
				
			|||||||
      url: "https://pub.flutter-io.cn"
 | 
					      url: "https://pub.flutter-io.cn"
 | 
				
			||||||
    source: hosted
 | 
					    source: hosted
 | 
				
			||||||
    version: "2.6.1"
 | 
					    version: "2.6.1"
 | 
				
			||||||
  window_manager:
 | 
					 | 
				
			||||||
    dependency: "direct main"
 | 
					 | 
				
			||||||
    description:
 | 
					 | 
				
			||||||
      name: window_manager
 | 
					 | 
				
			||||||
      url: "https://pub.flutter-io.cn"
 | 
					 | 
				
			||||||
    source: hosted
 | 
					 | 
				
			||||||
    version: "0.2.5"
 | 
					 | 
				
			||||||
  xdg_directories:
 | 
					  xdg_directories:
 | 
				
			||||||
    dependency: transitive
 | 
					    dependency: transitive
 | 
				
			||||||
    description:
 | 
					    description:
 | 
				
			||||||
 | 
				
			|||||||
@ -58,12 +58,12 @@ dependencies:
 | 
				
			|||||||
            url: https://github.com/SoLongAndThanksForAllThePizza/flutter_rust_bridge
 | 
					            url: https://github.com/SoLongAndThanksForAllThePizza/flutter_rust_bridge
 | 
				
			||||||
            ref: master
 | 
					            ref: master
 | 
				
			||||||
            path: frb_dart
 | 
					            path: frb_dart
 | 
				
			||||||
    window_manager: ^0.2.5
 | 
					    # window_manager: ^0.2.5
 | 
				
			||||||
    desktop_multi_window:
 | 
					    desktop_multi_window:
 | 
				
			||||||
        git:
 | 
					        git:
 | 
				
			||||||
            url: https://github.com/Kingtous/rustdesk_desktop_multi_window
 | 
					            url: https://github.com/Kingtous/rustdesk_desktop_multi_window
 | 
				
			||||||
            ref: 704718b2853723b615675e048f1f385cbfb209a6
 | 
					            ref: c7d97cb6615f2def34f8bad4def01af9e0077beb
 | 
				
			||||||
    bitsdojo_window: ^0.1.2
 | 
					    # bitsdojo_window: ^0.1.2
 | 
				
			||||||
    freezed_annotation: ^2.0.3
 | 
					    freezed_annotation: ^2.0.3
 | 
				
			||||||
    tray_manager: 0.1.7
 | 
					    tray_manager: 0.1.7
 | 
				
			||||||
    get: ^4.6.5
 | 
					    get: ^4.6.5
 | 
				
			||||||
 | 
				
			|||||||
@ -5,11 +5,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "flutter_window.h"
 | 
					#include "flutter_window.h"
 | 
				
			||||||
#include "utils.h"
 | 
					#include "utils.h"
 | 
				
			||||||
#include <bitsdojo_window_windows/bitsdojo_window_plugin.h>
 | 
					// #include <bitsdojo_window_windows/bitsdojo_window_plugin.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef bool (*FUNC_RUSTDESK_CORE_MAIN)(void);
 | 
					typedef bool (*FUNC_RUSTDESK_CORE_MAIN)(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
auto bdw = bitsdojo_window_configure(BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP);
 | 
					// auto bdw = bitsdojo_window_configure(BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP);
 | 
				
			||||||
int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
 | 
					int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
 | 
				
			||||||
                      _In_ wchar_t *command_line, _In_ int show_command)
 | 
					                      _In_ wchar_t *command_line, _In_ int show_command)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
@ -69,6 +69,11 @@ pub fn start_global_event_stream(s: StreamSink<String>) -> ResultType<()> {
 | 
				
			|||||||
    Ok(())
 | 
					    Ok(())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn host_stop_system_key_propagate(stopped: bool) {
 | 
				
			||||||
 | 
					    #[cfg(windows)]
 | 
				
			||||||
 | 
					    crate::platform::windows::stop_system_key_propagate(stopped);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn session_connect(
 | 
					pub fn session_connect(
 | 
				
			||||||
    events2ui: StreamSink<EventToUI>,
 | 
					    events2ui: StreamSink<EventToUI>,
 | 
				
			||||||
    id: String,
 | 
					    id: String,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user