• Stars
    star
    678
  • Rank 66,609 (Top 2 %)
  • Language
    C++
  • License
    MIT License
  • Created over 3 years ago
  • Updated 4 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

This plugin allows Flutter desktop apps to resizing and repositioning the window.

window_manager

pub version All Contributors

This plugin allows Flutter desktop apps to resizing and repositioning the window.


English | 简体中文


Platform Support

Linux macOS Windows
✔️ ✔️ ✔️

Quick Start

Installation

Add this to your package's pubspec.yaml file:

dependencies:
  window_manager: ^0.3.6

Or

dependencies:
  window_manager:
    git:
      url: https://github.com/leanflutter/window_manager.git
      ref: main

Usage

import 'package:flutter/material.dart';
import 'package:window_manager/window_manager.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // Must add this line.
  await windowManager.ensureInitialized();

  WindowOptions windowOptions = WindowOptions(
    size: Size(800, 600),
    center: true,
    backgroundColor: Colors.transparent,
    skipTaskbar: false,
    titleBarStyle: TitleBarStyle.hidden,
  );
  windowManager.waitUntilReadyToShow(windowOptions, () async {
    await windowManager.show();
    await windowManager.focus();
  });

  runApp(MyApp());
}

Please see the example app of this plugin for a full example.

Listening events

import 'package:flutter/cupertino.dart';
import 'package:window_manager/window_manager.dart';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> with WindowListener {
  @override
  void initState() {
    super.initState();
    windowManager.addListener(this);
  }

  @override
  void dispose() {
    windowManager.removeListener(this);
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // ...
  }

  @override
  void onWindowEvent(String eventName) {
    print('[WindowManager] onWindowEvent: $eventName');
  }

  @override
  void onWindowClose() {
    // do something
  }

  @override
  void onWindowFocus() {
    // do something
  }

  @override
  void onWindowBlur() {
    // do something
  }

  @override
  void onWindowMaximize() {
    // do something
  }

  @override
  void onWindowUnmaximize() {
    // do something
  }

  @override
  void onWindowMinimize() {
    // do something
  }

  @override
  void onWindowRestore() {
    // do something
  }

  @override
  void onWindowResize() {
    // do something
  }

  @override
  void onWindowMove() {
    // do something
  }

  @override
  void onWindowEnterFullScreen() {
    // do something
  }

  @override
  void onWindowLeaveFullScreen() {
    // do something
  }
}

Quit on close

If you need to use the hide method, you need to disable QuitOnClose.

macOS

Change the file macos/Runner/AppDelegate.swift as follows:

import Cocoa
import FlutterMacOS

@NSApplicationMain
class AppDelegate: FlutterAppDelegate {
  override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
-    return true
+    return false
  }
}

Confirm before closing

import 'package:flutter/cupertino.dart';
import 'package:window_manager/window_manager.dart';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> with WindowListener {
  @override
  void initState() {
    super.initState();
    windowManager.addListener(this);
    _init();
  }

  @override
  void dispose() {
    windowManager.removeListener(this);
    super.dispose();
  }

  void _init() async {
    // Add this line to override the default close handler
    await windowManager.setPreventClose(true);
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    // ...
  }

  @override
  void onWindowClose() async {
    bool _isPreventClose = await windowManager.isPreventClose();
    if (_isPreventClose) {
      showDialog(
        context: context,
        builder: (_) {
          return AlertDialog(
            title: Text('Are you sure you want to close this window?'),
            actions: [
              TextButton(
                child: Text('No'),
                onPressed: () {
                  Navigator.of(context).pop();
                },
              ),
              TextButton(
                child: Text('Yes'),
                onPressed: () {
                  Navigator.of(context).pop();
                  await windowManager.destroy();
                },
              ),
            ],
          );
        },
      );
    }
  }
}

Hidden at launch

Linux

Change the file linux/my_application.cc as follows:

...

// Implements GApplication::activate.
static void my_application_activate(GApplication* application) {
  
  ...

  gtk_window_set_default_size(window, 1280, 720);
-  gtk_widget_show(GTK_WIDGET(window));
+  gtk_widget_realize(GTK_WIDGET(window));

  g_autoptr(FlDartProject) project = fl_dart_project_new();
  fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);

  FlView* view = fl_view_new(project);
  gtk_widget_show(GTK_WIDGET(view));
  gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));

  fl_register_plugins(FL_PLUGIN_REGISTRY(view));

  gtk_widget_grab_focus(GTK_WIDGET(view));
}

...
macOS

Change the file macos/Runner/MainFlutterWindow.swift as follows:

import Cocoa
import FlutterMacOS
+import window_manager

class MainFlutterWindow: NSWindow {
    override func awakeFromNib() {
        let flutterViewController = FlutterViewController.init()
        let windowFrame = self.frame
        self.contentViewController = flutterViewController
        self.setFrame(windowFrame, display: true)

        RegisterGeneratedPlugins(registry: flutterViewController)

        super.awakeFromNib()
    }

+    override public func order(_ place: NSWindow.OrderingMode, relativeTo otherWin: Int) {
+        super.order(place, relativeTo: otherWin)
+        hiddenWindowAtLaunch()
+    }
}
Windows

Change the file windows/runner/win32_window.cpp as follows:

bool Win32Window::CreateAndShow(const std::wstring& title,
                                const Point& origin,
                                const Size& size) {
  ...                              
  HWND window = CreateWindow(
-      window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
+      window_class, title.c_str(),
+      WS_OVERLAPPEDWINDOW, // do not add WS_VISIBLE since the window will be shown later
      Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),
      Scale(size.width, scale_factor), Scale(size.height, scale_factor),
      nullptr, nullptr, GetModuleHandle(nullptr), this);

Since flutter 3.7 new windows project Change the file windows/runner/flutter_window.cpp as follows:

bool FlutterWindow::OnCreate() {
  ...
  flutter_controller_->engine()->SetNextFrameCallback([&]() {
-   this->Show();
+   "" //delete this->Show()
  });

Make sure to call setState once on the onWindowFocus event.

import 'package:flutter/cupertino.dart';
import 'package:window_manager/window_manager.dart';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> with WindowListener {
  @override
  void initState() {
    super.initState();
    windowManager.addListener(this);
  }

  @override
  void dispose() {
    windowManager.removeListener(this);
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // ...
  }

  @override
  void onWindowFocus() {
    // Make sure to call once.
    setState(() {});
    // do something
  }
}

Articles

Who's using it?

  • AuthPass - Password Manager based on Flutter for all platforms. Keepass 2.x (kdbx 3.x) compatible.
  • Biyi (比译) - A convenient translation and dictionary app written in dart / Flutter.
  • BlueBubbles - BlueBubbles is an ecosystem of apps bringing iMessage to Android, Windows, and Linux
  • LunaSea - A self-hosted controller for mobile and macOS built using the Flutter framework.
  • Linwood Butterfly - Open source note taking app written in Flutter
  • RustDesk - Yet another remote desktop software, written in Rust. Works out of the box, no configuration required.
  • Ubuntu Desktop Installer - This project is a modern implementation of the Ubuntu Desktop installer.

API

WindowManager

Methods

waitUntilReadyToShow

Wait until ready to show.

destroy

Force closing the window.

close

Try to close the window.

isPreventClose

Check if is intercepting the native close signal.

setPreventClose

Set if intercept the native close signal. May useful when combine with the onclose event listener. This will also prevent the manually triggered close event.

focus

Focuses on the window.

blur macos windows

Removes focus from the window.

isFocused macos windows

Returns bool - Whether window is focused.

show

Shows and gives focus to the window.

hide

Hides the window.

isVisible

Returns bool - Whether the window is visible to the user.

isMaximized

Returns bool - Whether the window is maximized.

maximize

Maximizes the window. vertically simulates aero snap, only works on Windows

unmaximize

Unmaximizes the window.

isMinimized

Returns bool - Whether the window is minimized.

minimize

Minimizes the window. On some platforms the minimized window will be shown in the Dock.

restore

Restores the window from minimized state to its previous state.

isFullScreen

Returns bool - Whether the window is in fullscreen mode.

setFullScreen

Sets whether the window should be in fullscreen mode.

isDockable windows

Returns bool - Whether the window is dockable or not.

isDocked windows

Returns bool - Whether the window is docked.

dock windows

Docks the window. only works on Windows

undock windows

Undocks the window. only works on Windows

setAspectRatio

This will make a window maintain an aspect ratio.

setBackgroundColor

Sets the background color of the window.

setAlignment

Move the window to a position aligned with the screen.

center

Moves window to the center of the screen.

getBounds

Returns Rect - The bounds of the window as Object.

setBounds

Resizes and moves the window to the supplied bounds.

getSize

Returns Size - Contains the window's width and height.

setSize

Resizes the window to width and height.

getPosition

Returns Offset - Contains the window's current position.

setPosition

Moves window to position.

setMinimumSize

Sets the minimum size of window to width and height.

setMaximumSize

Sets the maximum size of window to width and height.

isResizable

Returns bool - Whether the window can be manually resized by the user.

setResizable

Sets whether the window can be manually resized by the user.

isMovable macos

Returns bool - Whether the window can be moved by user.

setMovable macos

Sets whether the window can be moved by user.

isMinimizable macos windows

Returns bool - Whether the window can be manually minimized by the user.

setMinimizable macos windows

Sets whether the window can be manually minimized by user.

isClosable windows

Returns bool - Whether the window can be manually closed by user.

isMaximizable macos windows

Returns bool - Whether the window can be manually maximized by the user.

setMaximizable

Sets whether the window can be manually maximized by the user.

setClosable macos windows

Sets whether the window can be manually closed by user.

isAlwaysOnTop

Returns bool - Whether the window is always on top of other windows.

setAlwaysOnTop

Sets whether the window should show always on top of other windows.

isAlwaysOnBottom

Returns bool - Whether the window is always below other windows.

setAlwaysOnBottom linux windows

Sets whether the window should show always below other windows.

getTitle

Returns String - The title of the native window.

setTitle

Changes the title of native window to title.

setTitleBarStyle

Changes the title bar style of native window.

getTitleBarHeight

Returns int - The title bar height of the native window.

isSkipTaskbar

Returns bool - Whether skipping taskbar is enabled.

setSkipTaskbar

Makes the window not show in the taskbar / dock.

setProgressBar macos windows

Sets progress value in progress bar. Valid range is [0, 1.0].

setIcon windows

Sets window/taskbar icon.

isVisibleOnAllWorkspaces macos

Returns bool - Whether the window is visible on all workspaces.

setVisibleOnAllWorkspaces macos

Sets whether the window should be visible on all workspaces.

Note: If you need to support dragging a window on top of a fullscreen window on another screen, you need to modify MainFlutterWindow to inherit from NSPanel

class MainFlutterWindow: NSPanel {
// ...
}
setBadgeLabel macos

Set/unset label on taskbar(dock) app icon

Note that it's required to request access at your AppDelegate.swift like this: UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge])

hasShadow macos windows

Returns bool - Whether the window has a shadow. On Windows, always returns true unless window is frameless.

setHasShadow macos windows

Sets whether the window should have a shadow. On Windows, doesn't do anything unless window is frameless.

getOpacity

Returns double - between 0.0 (fully transparent) and 1.0 (fully opaque).

setOpacity

Sets the opacity of the window.

setBrightness

Sets the brightness of the window.

setIgnoreMouseEvents

Makes the window ignore all mouse events.

All mouse events happened in this window will be passed to the window below this window, but if this window has focus, it will still receive keyboard events.

startDragging

Starts a window drag based on the specified mouse-down event.

startResizing linux windows

Starts a window resize based on the specified mouse-down & mouse-move event.

grabKeyboard linux

Grabs the keyboard.

ungrabKeyboard linux

Ungrabs the keyboard.

WindowListener

Methods

onWindowClose

Emitted when the window is going to be closed.

onWindowFocus

Emitted when the window gains focus.

onWindowBlur

Emitted when the window loses focus.

onWindowMaximize

Emitted when window is maximized.

onWindowUnmaximize

Emitted when the window exits from a maximized state.

onWindowMinimize

Emitted when the window is minimized.

onWindowRestore

Emitted when the window is restored from a minimized state.

onWindowResize

Emitted after the window has been resized.

onWindowResized macos windows

Emitted once when the window has finished being resized.

onWindowMove

Emitted when the window is being moved to a new position.

onWindowMoved macos windows

Emitted once when the window is moved to a new position.

onWindowEnterFullScreen

Emitted when the window enters a full-screen state.

onWindowLeaveFullScreen

Emitted when the window leaves a full-screen state.

onWindowDocked windows

Emitted when the window entered a docked state.

onWindowUndocked windows

Emitted when the window leaves a docked state.

onWindowEvent

Emitted all events.

Contributors

LiJianying
LiJianying

💻
 A Arif A S
A Arif A S

💻
J-P Nurmi
J-P Nurmi

💻
Dixeran
Dixeran

💻
nikitatg
nikitatg

💻
Kristen McWilliam
Kristen McWilliam

💻
Kingtous
Kingtous

💻
Prome
Prome

💻
Bin
Bin

💻
youxiachai
youxiachai

💻
Allen Xu
Allen Xu

💻
CodeDoctor
CodeDoctor

💻
Jean-Christophe Binet
Jean-Christophe Binet

💻
Jon Salmon
Jon Salmon

💻
Karol Wrótniak
Karol Wrótniak

💻
LAIIIHZ
LAIIIHZ

💻
Mikhail Kulesh
Mikhail Kulesh

💻
Prateek Sunal
Prateek Sunal

💻
Ricardo Boss
Ricardo Boss

💻
Add your contributions

License

MIT

More Repositories

1

awesome-flutter-desktop

A curated list of awesome things related to Flutter desktop.
1,509
star
2

flutter_distributor

An all-in-one Flutter application packaging and distribution tool, providing you with a one-stop solution to meet various distribution needs.
Dart
781
star
3

widget-livebook

Live preview example for flutter widgets.
Dart
611
star
4

flutter_flipperkit

Flipper (Extensible mobile app debugger) for flutter.
Java
359
star
5

auto_updater

This plugin allows Flutter desktop apps to automatically update themselves (based on sparkle and winsparkle).
C++
274
star
6

tray_manager

This plugin allows Flutter desktop apps to defines system tray.
C++
223
star
7

hotkey_manager

This plugin allows Flutter desktop apps to defines system/inapp wide hotkey (i.e. shortcut).
Dart
131
star
8

.github

96
star
9

launch_at_startup

This plugin allows Flutter desktop apps to Auto launch on startup / login.
C++
87
star
10

screen_capturer

This plugin allows Flutter desktop apps to capture screenshots.
C++
80
star
11

protocol_handler

This plugin allows Flutter apps to register and handle custom protocols (i.e. deep linking).
C++
75
star
12

contextual_menu

This plugin allows Flutter desktop apps to create native context menus.
C++
74
star
13

local_notifier

This plugin allows Flutter desktop apps to notify local notifications.
C++
69
star
14

screen_text_extractor

This plugin allows Flutter desktop apps to extract text from screen.
C++
52
star
15

clipboard_watcher

This plugin allows Flutter apps to watch clipboard changes.
C++
50
star
16

screen_retriever

This plugin allows Flutter desktop apps to Retrieve information about screen size, displays, cursor position, etc.
C++
45
star
17

flipper-plugin-reduxinspector

Redux Inspector for flipper (Extensible mobile app debugger).
JavaScript
42
star
18

anyinspect_app

AnyInspect desktop app.
Dart
41
star
19

flutter_apps

A collection of apps built on Flutter.
Dart
41
star
20

flutter_flipperkit_plugins

Plugins for flutter flipperkit.
Dart
33
star
21

uni_links_desktop

A desktop (supports macOS and Windows) implementation of uni_links plugin.
C++
28
star
22

keypress_simulator

This plugin allows Flutter desktop apps to simulate key presses.
C++
27
star
23

flutter_tencent_captcha

适用于 Flutter 的腾讯云验证码插件
Java
26
star
24

uni_translate

A universal translate client.
Dart
21
star
25

flutter_aliyun_captcha

适用于 Flutter 的阿里云滑动验证插件
Dart
20
star
26

uni_ocr

A universal ocr client.
Dart
18
star
27

influxui

A fully featured Flutter widgets library, Inspired by mantine.
Dart
16
star
28

flutter_svprogresshud

A clean and lightweight progress HUD for flutter app.
Objective-C
16
star
29

flutter_superplayer

适用于 Flutter 的腾讯云超级播放器插件
Java
14
star
30

shortcut_menu_extender

This plugin allows Flutter apps to Extending global shortcut menus.
C++
12
star
31

makeanyicon

A configurable icon maker.
Dart
11
star
32

vclibs

Let your flutter windows apps include vclibs.
C++
11
star
33

storybook_dart

Storybook for Flutter, build your Flutter widgets storybook using storybookjs.
Dart
11
star
34

anyinspect

AnyInspect is a tool for debugging your Flutter apps.
Dart
10
star
35

flutter_qiyu

适用于 Flutter 的七鱼客服插件
Objective-C
9
star
36

flutter_photo_picker

Photo Picker plugin for Flutter.
Swift
9
star
37

awesome-flutter-mobile

A curated list of awesome things related to Flutter mobile.
9
star
38

flutter_txugcupload

适用于 Flutter 的腾讯云点播上传 SDK
Objective-C
7
star
39

menu_base

Dart
5
star
40

flutter_yunpian_captcha

适用于 Flutter 的云片行为验证插件
Java
5
star
41

sync2gitee

LeanFlutter - To make the flutter even simpler
5
star
42

flipper-plugin-dbbrowser

Database Browser for flipper (Extensible mobile app debugger).
JavaScript
4
star
43

preference_list

Simplifies building preference pages with flexibility and ease-of-use.
Dart
4
star
44

any_icon_maker

A configurable icon maker.
Dart
4
star
45

anyinspect_web

AnyInspect website.
TypeScript
3
star
46

embed_web_pkgs

Dart
3
star
47

flutter_flipperkit_examples

Examples for flutter flipperkit.
Dart
3
star
48

anyinspect_plugins

Plugins for AnyInspect
Dart
3
star
49

flutter_desktop_examples

C++
2
star
50

leanflutter_snippets

Dart
2
star
51

awesome_list_maker

A awesome list maker
Dart
2
star
52

website

LeanFlutter web site
Astro
2
star
53

flutter_universal_boilerplate

Dart
1
star
54

base_orm

Dart
1
star
55

flutter_distributor_docs_zh

1
star
56

harmonic

Dart
1
star
57

flutter_yidun_captcha

适用于 Flutter 的网易易盾行为式验证码插件
Java
1
star
58

anyinspect_integrate_example

C++
1
star
59

openai-api-bridge

TypeScript
1
star
60

analyzeanyapp

1
star
61

all_sponsors_maker

Dart
1
star
62

mostly_reasonable_lints

A mostly reasonable set of lints for Dart and Flutter projects.
Dart
1
star