enableCornerDocking static method

Future<bool> enableCornerDocking({
  1. required WindowCorner corner,
  2. double visibleSize = 20.0,
  3. int hoverDelay = 300,
})

启用角落停靠功能(类似QQ的角落停靠行为)

corner 要停靠到的角落位置 visibleSize 停靠时可见的窗口尺寸(像素),默认为20x20像素 hoverDelay 鼠标悬停多久后显示窗口(毫秒),默认300毫秒 返回 true 表示启用成功,false 表示启用失败

此功能会:

  1. 将窗口移动到指定角落,大部分隐藏,只留小部分可见
  2. 监听鼠标位置,当鼠标悬停在可见部分时显示完整窗口
  3. 当鼠标离开窗口区域时,重新隐藏到角落

Implementation

static Future<bool> enableCornerDocking({
  required WindowCorner corner,
  double visibleSize = 20.0,
  int hoverDelay = 300,
}) async {
  if (!MyPlatform.isDesktop) return false;

  try {
    final display = await screenRetriever.getPrimaryDisplay();
    if (display.visiblePosition == null || display.visibleSize == null) {
      return false;
    }

    final windowSize = await windowManager.getSize();
    final workArea = display.visibleSize!;
    final workAreaPosition = display.visiblePosition!;

    // 计算停靠位置(角落位置,大部分隐藏)
    // 角落停靠时露出一个L形区域,比正方形更容易找到
    final cornerVisibleWidth = visibleSize * 2; // 水平方向可见宽度
    final cornerVisibleHeight = visibleSize; // 垂直方向可见高度

    Offset dockPosition;
    switch (corner) {
      case WindowCorner.topLeft:
        dockPosition = Offset(
          workAreaPosition.dx - windowSize.width + cornerVisibleWidth,
          workAreaPosition.dy - windowSize.height + cornerVisibleHeight,
        );
        break;
      case WindowCorner.topRight:
        dockPosition = Offset(
          workAreaPosition.dx + workArea.width - cornerVisibleWidth,
          workAreaPosition.dy - windowSize.height + cornerVisibleHeight,
        );
        break;
      case WindowCorner.bottomLeft:
        dockPosition = Offset(
          workAreaPosition.dx - windowSize.width + cornerVisibleWidth,
          workAreaPosition.dy + workArea.height - cornerVisibleHeight,
        );
        break;
      case WindowCorner.bottomRight:
        dockPosition = Offset(
          workAreaPosition.dx + workArea.width - cornerVisibleWidth,
          workAreaPosition.dy + workArea.height - cornerVisibleHeight,
        );
        break;
    }

    // 移动窗口到停靠位置
    await windowManager.setPosition(dockPosition);

    // 启动鼠标位置监听
    _startCornerMousePositionMonitoring(
      corner: corner,
      dockPosition: dockPosition,
      windowSize: windowSize,
      visibleSize: visibleSize,
      hoverDelay: hoverDelay,
      workAreaPosition: workAreaPosition,
      workArea: workArea,
    );

    return true;
  } catch (e) {
    XlyLogger.error('启用角落停靠失败', e);
    return false;
  }
}