diff --git a/lib/widgets/toplevel.dart b/lib/widgets/toplevel.dart index 3cfe4609..4435ae93 100644 --- a/lib/widgets/toplevel.dart +++ b/lib/widgets/toplevel.dart @@ -12,12 +12,14 @@ class ToplevelDecor extends StatelessWidget { this.onMinimize, this.onMaximize, this.onClose, + this.onDrag, }); final DisplayServerToplevel toplevel; final VoidCallback? onMinimize; final VoidCallback? onMaximize; final VoidCallback? onClose; + final GestureDragUpdateCallback? onDrag; @override Widget build(BuildContext context) { @@ -38,7 +40,8 @@ class ToplevelDecor extends StatelessWidget { icon: Icon(Icons.circleXmark), ) : null, ].where((e) => e != null).toList().cast(); - return AppBar( + + Widget value = AppBar( automaticallyImplyLeading: false, primary: false, title: Text(toplevel.title ?? 'Untitled Window'), @@ -54,6 +57,15 @@ class ToplevelDecor extends StatelessWidget { const SizedBox() ] : actions, ); + + if (onDrag != null) { + value = GestureDetector( + onPanUpdate: onDrag!, + child: value, + ); + } + + return value; } } diff --git a/lib/widgets/wm.dart b/lib/widgets/wm.dart index 2288fbed..f68037ab 100644 --- a/lib/widgets/wm.dart +++ b/lib/widgets/wm.dart @@ -20,8 +20,11 @@ class WindowView extends StatelessWidget { final WindowManagerMode? mode; Widget _buildInner(BuildContext context) { + final _win = context.watch(); + final _mode = mode ?? _win.manager.mode; + Widget content = ToplevelView( - toplevel: win.toplevel, + toplevel: _win.toplevel, buildDecor: (context, toplevel, content) => !Breakpoints.small.isActive(context) ? Container( @@ -36,6 +39,10 @@ class WindowView extends StatelessWidget { onClose: () { win.toplevel.close(); }, + onDrag: (info) { + _win.x += info.delta.dx; + _win.y += info.delta.dy; + }, ), ClipRRect( borderRadius: BorderRadius.only( @@ -49,13 +56,13 @@ class WindowView extends StatelessWidget { ) : null, ); - if (mode == WindowManagerMode.floating) { + if (_mode == WindowManagerMode.floating) { content = Positioned( - top: win.y, - left: win.x, + top: _win.y, + left: _win.x, child: Container( - width: win.toplevel.size != null ? (win.toplevel.size!.width ?? 0).toDouble() : null, - height: win.toplevel.size != null ? (win.toplevel.size!.height ?? 0).toDouble() + (kToolbarHeight / 1.5) : null, + width: _win.toplevel.size != null ? (_win.toplevel.size!.width ?? 0).toDouble() : null, + height: _win.toplevel.size != null ? (_win.toplevel.size!.height ?? 0).toDouble() + (kToolbarHeight / 1.5) : null, child: content, ), ); @@ -103,6 +110,8 @@ class WindowManagerViewState extends State { void initState() { super.initState(); + _instance.mode = widget.mode; + _toplevelAdded = widget.displayServer.toplevelAdded.listen((toplevel) { _instance.fromToplevel(toplevel); });