feat(desktop): rework the windows, linux, and macos runners, packaging, and native build

Update the runner projects for the reworked plugins. The Windows runner
asks the plugin for the running window before booting a second instance
and forwards a clash:// link through app_links; the Linux runner routes a
relaunch to the primary through GApplication; the macOS delegate forwards
applicationShouldHandleReopen to the plugin. The Linux desktop entries
claim the clash, clashmeta, and flclash schemes, and the rpm spec stops
stripping the Core whose hash the Helper validates.

The runner projects consume the setup build hook's artifacts: macOS drops
the CocoaPods integration and its script phase, pins release ARCHS to the
host, and stages the Core after the hook may have rewritten it; Windows
and Linux copy the Core, Helper and manifest from the CMake install
rules, and a Debug install on Windows stops a Helper that holds its exe
open, matched by executable path so a registered release Helper keeps
running. The deb depends on the appindicator runtime library instead of
its development package, and the keybinder dependency and README lines
go with hotkey_manager.

Changelog: Rework the desktop runners, packaging, and native build
This commit is contained in:
chen08209
2026-09-05 20:09:35 +08:00
parent ae29f38f6b
commit c0fcbc03ee
25 changed files with 194 additions and 287 deletions
+1 -2
View File
@@ -42,7 +42,6 @@ on Mobile:
```bash
sudo apt-get install libayatana-appindicator3-dev
sudo apt-get install libkeybinder-3.0-dev
```
### Android
@@ -109,7 +108,7 @@ brew install --cask flclash
2. Dependencies are auto-installed by setup script, or manually:
```bash
sudo apt-get install -y libayatana-appindicator3-dev libkeybinder-3.0-dev
sudo apt-get install -y libayatana-appindicator3-dev
```
3. Run build script
+1 -2
View File
@@ -42,7 +42,6 @@ on Mobile:
```bash
sudo apt-get install libayatana-appindicator3-dev
sudo apt-get install libkeybinder-3.0-dev
```
### Android
@@ -109,7 +108,7 @@ brew install --cask flclash
2. 依赖会由 setup 脚本自动安装,也可以手动安装:
```bash
sudo apt-get install -y libayatana-appindicator3-dev libkeybinder-3.0-dev
sudo apt-get install -y libayatana-appindicator3-dev
```
3. 运行构建脚本
+11
View File
@@ -106,6 +106,17 @@ foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})
COMPONENT Runtime)
endforeach(bundled_library)
# Produced by the setup build hook during flutter_assemble.
set(CORE_ARTIFACTS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../libclash/linux")
install(PROGRAMS
"${CORE_ARTIFACTS_DIR}/FlClashCore"
"${CORE_ARTIFACTS_DIR}/FlClashHelperService"
DESTINATION "${CMAKE_INSTALL_PREFIX}"
COMPONENT Runtime)
install(FILES "${CORE_ARTIFACTS_DIR}/manifest.json"
DESTINATION "${CMAKE_INSTALL_PREFIX}"
COMPONENT Runtime)
# Copy the native assets provided by the build.dart from all packages.
set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/")
install(DIRECTORY "${NATIVE_ASSETS_DIR}"
+4 -12
View File
@@ -8,11 +8,9 @@
#include <dynamic_color/dynamic_color_plugin.h>
#include <file_selector_linux/file_selector_plugin.h>
#include <flutter_js/flutter_js_plugin.h>
#include <gtk/gtk_plugin.h>
#include <hotkey_manager_linux/hotkey_manager_linux_plugin.h>
#include <screen_retriever_linux/screen_retriever_linux_plugin.h>
#include <tray_manager/tray_manager_plugin.h>
#include <tray/tray_plugin.h>
#include <url_launcher_linux/url_launcher_plugin.h>
#include <wifi_ssid/wifi_ssid_plugin.h>
#include <window_manager/window_manager_plugin.h>
@@ -24,21 +22,15 @@ void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) file_selector_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin");
file_selector_plugin_register_with_registrar(file_selector_linux_registrar);
g_autoptr(FlPluginRegistrar) flutter_js_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterJsPlugin");
flutter_js_plugin_register_with_registrar(flutter_js_registrar);
g_autoptr(FlPluginRegistrar) gtk_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "GtkPlugin");
gtk_plugin_register_with_registrar(gtk_registrar);
g_autoptr(FlPluginRegistrar) hotkey_manager_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "HotkeyManagerLinuxPlugin");
hotkey_manager_linux_plugin_register_with_registrar(hotkey_manager_linux_registrar);
g_autoptr(FlPluginRegistrar) screen_retriever_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverLinuxPlugin");
screen_retriever_linux_plugin_register_with_registrar(screen_retriever_linux_registrar);
g_autoptr(FlPluginRegistrar) tray_manager_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "TrayManagerPlugin");
tray_manager_plugin_register_with_registrar(tray_manager_registrar);
g_autoptr(FlPluginRegistrar) tray_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "TrayPlugin");
tray_plugin_register_with_registrar(tray_registrar);
g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);
+1 -5
View File
@@ -5,11 +5,9 @@
list(APPEND FLUTTER_PLUGIN_LIST
dynamic_color
file_selector_linux
flutter_js
gtk
hotkey_manager_linux
screen_retriever_linux
tray_manager
tray
url_launcher_linux
wifi_ssid
window_manager
@@ -17,8 +15,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
list(APPEND FLUTTER_FFI_PLUGIN_LIST
jni
rust_api
setup
)
set(PLUGIN_BUNDLED_LIBRARIES)
@@ -2,6 +2,11 @@ display_name: FlClash
icon: ./assets/images/icon.png
supported_mime_type:
- x-scheme-handler/clash
- x-scheme-handler/clashmeta
- x-scheme-handler/flclash
keywords:
- FlClash
- Clash
+14 -2
View File
@@ -11,10 +11,22 @@ essential: false
icon: ./assets/images/icon.png
dependencies:
- libayatana-appindicator3-dev
- libkeybinder-3.0-dev
- libayatana-appindicator3-1
- libsecret-1-0
# The Helper unit is written on demand by the app, not at install time, so only
# its teardown belongs here; the binary is already gone when postrm runs.
postuninstall_scripts:
- 'case "${1:-}" in remove|purge) ;; *) exit 0 ;; esac'
- 'systemctl disable --now flclash-helper.service >/dev/null 2>&1 || true'
- 'rm -f /etc/systemd/system/flclash-helper.service'
- 'systemctl daemon-reload >/dev/null 2>&1 || true'
supported_mime_type:
- x-scheme-handler/clash
- x-scheme-handler/clashmeta
- x-scheme-handler/flclash
keywords:
- FlClash
- Clash
+22
View File
@@ -13,6 +13,28 @@ icon: ./assets/images/icon.png
requires:
- libsecret
# rpmbuild's find-debuginfo and brp-strip rewrite the Core, and the Helper only
# starts a Core whose SHA256 matches the value built into it.
spec_macros:
- '%global debug_package %{nil}'
- '%global __os_install_post %{nil}'
postinstall_scripts:
- 'update-desktop-database %{_datadir}/applications &> /dev/null || :'
# The Helper unit is written on demand by the app, not at install time, so only
# its teardown belongs here; the binary is already gone when %postun runs.
postuninstall_scripts:
- '[ "$1" = 0 ] || exit 0'
- 'systemctl disable --now flclash-helper.service >/dev/null 2>&1 || true'
- 'rm -f /etc/systemd/system/flclash-helper.service'
- 'systemctl daemon-reload >/dev/null 2>&1 || true'
supported_mime_type:
- x-scheme-handler/clash
- x-scheme-handler/clashmeta
- x-scheme-handler/flclash
keywords:
- FlClash
- Clash
+37 -16
View File
@@ -5,11 +5,14 @@
#include <gdk/gdkx.h>
#endif
#include <window_manager/window_manager_plugin.h>
#include "flutter/generated_plugin_registrant.h"
struct _MyApplication {
GtkApplication parent_instance;
char** dart_entrypoint_arguments;
gboolean had_window_before_emit;
};
G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)
@@ -17,6 +20,9 @@ G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)
// Implements GApplication::activate.
static void my_application_activate(GApplication* application) {
MyApplication* self = MY_APPLICATION(application);
if (self->had_window_before_emit) {
return;
}
GtkWindow* window =
GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
@@ -47,7 +53,7 @@ static void my_application_activate(GApplication* application) {
gtk_window_set_title(window, "FlClash");
}
gtk_window_set_default_size(window, 1280, 720);
gtk_window_set_default_size(window, 680, 580);
g_autoptr(FlDartProject) project = fl_dart_project_new();
fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);
@@ -69,23 +75,36 @@ static void my_application_activate(GApplication* application) {
gtk_widget_grab_focus(GTK_WIDGET(view));
}
// Implements GApplication::local_command_line.
static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) {
// Implements GApplication::command_line.
static gint my_application_command_line(GApplication* application, GApplicationCommandLine* command_line) {
MyApplication* self = MY_APPLICATION(application);
// Strip out the first argument as it is the binary name.
self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);
g_autoptr(GError) error = nullptr;
if (!g_application_register(application, nullptr, &error)) {
g_warning("Failed to register: %s", error->message);
*exit_status = 1;
return TRUE;
if (self->dart_entrypoint_arguments == nullptr) {
gchar** arguments = g_application_command_line_get_arguments(command_line, nullptr);
// Strip out the first argument as it is the binary name.
self->dart_entrypoint_arguments = g_strdupv(arguments + 1);
g_strfreev(arguments);
}
g_application_activate(application);
*exit_status = 0;
return 0;
}
return TRUE;
// Implements GApplication::before_emit.
static void my_application_before_emit(GApplication* application, GVariant* platform_data) {
MyApplication* self = MY_APPLICATION(application);
self->had_window_before_emit =
gtk_application_get_windows(GTK_APPLICATION(application)) != nullptr;
G_APPLICATION_CLASS(my_application_parent_class)->before_emit(application, platform_data);
}
// Implements GApplication::after_emit. A relaunch reaches the primary as a
// command-line signal that the gtk plugin consumes first, so the window is
// raised here, while the launcher's activation token is still current.
static void my_application_after_emit(GApplication* application, GVariant* platform_data) {
MyApplication* self = MY_APPLICATION(application);
if (self->had_window_before_emit) {
window_manager_plugin_activate();
}
G_APPLICATION_CLASS(my_application_parent_class)->after_emit(application, platform_data);
}
// Implements GApplication::startup.
@@ -115,7 +134,9 @@ static void my_application_dispose(GObject* object) {
static void my_application_class_init(MyApplicationClass* klass) {
G_APPLICATION_CLASS(klass)->activate = my_application_activate;
G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line;
G_APPLICATION_CLASS(klass)->command_line = my_application_command_line;
G_APPLICATION_CLASS(klass)->before_emit = my_application_before_emit;
G_APPLICATION_CLASS(klass)->after_emit = my_application_after_emit;
G_APPLICATION_CLASS(klass)->startup = my_application_startup;
G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown;
G_OBJECT_CLASS(klass)->dispose = my_application_dispose;
@@ -132,6 +153,6 @@ MyApplication* my_application_new() {
return MY_APPLICATION(g_object_new(my_application_get_type(),
"application-id", APPLICATION_ID,
"flags", G_APPLICATION_NON_UNIQUE,
"flags", G_APPLICATION_HANDLES_COMMAND_LINE,
nullptr));
}
-1
View File
@@ -1,6 +1,5 @@
# Flutter-related
**/Flutter/ephemeral/
**/Pods/
# Xcode-related
**/dgph
-1
View File
@@ -1,2 +1 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "ephemeral/Flutter-Generated.xcconfig"
-1
View File
@@ -1,2 +1 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "ephemeral/Flutter-Generated.xcconfig"
@@ -9,19 +9,16 @@ import app_links
import connectivity_plus
import device_info_plus
import dynamic_color
import file_picker
import file_picker_darwin
import file_selector_macos
import flutter_js
import hotkey_manager_macos
import mobile_scanner
import package_info_plus
import screen_retriever_macos
import shared_preferences_foundation
import sqflite_darwin
import tray_manager
import tray
import url_launcher_macos
import wifi_ssid
import window_ext
import window_manager
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
@@ -31,16 +28,13 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin"))
FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin"))
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
FlutterJsPlugin.register(with: registry.registrar(forPlugin: "FlutterJsPlugin"))
HotkeyManagerMacosPlugin.register(with: registry.registrar(forPlugin: "HotkeyManagerMacosPlugin"))
MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin"))
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
TrayManagerPlugin.register(with: registry.registrar(forPlugin: "TrayManagerPlugin"))
TrayPlugin.register(with: registry.registrar(forPlugin: "TrayPlugin"))
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
WifiSsidPlugin.register(with: registry.registrar(forPlugin: "WifiSsidPlugin"))
WindowExtPlugin.register(with: registry.registrar(forPlugin: "WindowExtPlugin"))
WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin"))
}
-47
View File
@@ -1,47 +0,0 @@
platform :osx, '11.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
project 'Runner', {
'Debug' => :debug,
'Profile' => :release,
'Release' => :release,
}
def flutter_root
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__)
unless File.exist?(generated_xcode_build_settings_path)
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first"
end
File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches
end
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\""
end
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
flutter_macos_podfile_setup
target 'Runner' do
use_frameworks!
use_modular_headers!
flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))
target 'RunnerTests' do
inherit! :search_paths
end
end
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_macos_build_settings(target)
target.build_configurations.each do |config|
config.build_settings['MACOSX_DEPLOYMENT_TARGET'] = '11.0'
end
end
end
-47
View File
@@ -1,47 +0,0 @@
PODS:
- flutter_js (0.0.1):
- FlutterMacOS
- FlutterMacOS (1.0.0)
- HotKey (0.2.1)
- hotkey_manager_macos (0.0.1):
- FlutterMacOS
- HotKey
- rust_api (0.0.1):
- FlutterMacOS
- setup (0.0.1):
- FlutterMacOS
DEPENDENCIES:
- flutter_js (from `Flutter/ephemeral/.symlinks/plugins/flutter_js/macos`)
- FlutterMacOS (from `Flutter/ephemeral`)
- hotkey_manager_macos (from `Flutter/ephemeral/.symlinks/plugins/hotkey_manager_macos/macos`)
- rust_api (from `Flutter/ephemeral/.symlinks/plugins/rust_api/macos`)
- setup (from `Flutter/ephemeral/.symlinks/plugins/setup/macos`)
SPEC REPOS:
trunk:
- HotKey
EXTERNAL SOURCES:
flutter_js:
:path: Flutter/ephemeral/.symlinks/plugins/flutter_js/macos
FlutterMacOS:
:path: Flutter/ephemeral
hotkey_manager_macos:
:path: Flutter/ephemeral/.symlinks/plugins/hotkey_manager_macos/macos
rust_api:
:path: Flutter/ephemeral/.symlinks/plugins/rust_api/macos
setup:
:path: Flutter/ephemeral/.symlinks/plugins/setup/macos
SPEC CHECKSUMS:
flutter_js: 79c3c70d33ba464c67d8eb88639a61aa718cd8b8
FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1
HotKey: 400beb7caa29054ea8d864c96f5ba7e5b4852277
hotkey_manager_macos: a4317849af96d2430fa89944d3c58977ca089fbe
rust_api: 112f3cfd993afe61c6662bdb30fd6e3509fb3bf8
setup: fbca4a83aba6efbe6510b5e268c8aea0bf192d00
PODFILE CHECKSUM: b9facb167d6b7e90fef40306c3fe521e010924ac
COCOAPODS: 1.16.2
+27 -108
View File
@@ -27,11 +27,9 @@
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
36318A03D19527AAA8B8DCFC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34DDDF4BE376B6283E8CF3FB /* Pods_Runner.framework */; };
EDFB0F7BFE44CA6EE10BC97E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 318645D7A7E65945F20006A1 /* Pods_RunnerTests.framework */; };
78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; };
F5131FDD2EF0F1A500A1748D /* LaunchAtLogin in Frameworks */ = {isa = PBXBuildFile; productRef = F5131FDC2EF0F1A500A1748D /* LaunchAtLogin */; };
F51BB7CB2EF0267400E05D67 /* FlClashCore in Copy Core */ = {isa = PBXBuildFile; fileRef = F51BB7CA2EF0267400E05D67 /* FlClashCore */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -76,8 +74,6 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
1C8D2B0222EEC9EFBD4CB7D3 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
318645D7A7E65945F20006A1 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
@@ -94,16 +90,10 @@
33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; };
33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
341B4B12F589DC2F9A4F85AF /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; };
34DDDF4BE376B6283E8CF3FB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
3559EC2EA8528361668A5C2B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
57401BE05DC1812684175E8F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
9C9D4EF99A207AF51C53E0A3 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
CE90D6AE6AF7FF51A5D7A5BB /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
F51BB7CA2EF0267400E05D67 /* FlClashCore */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = FlClashCore; path = ../libclash/macos/FlClashCore; sourceTree = "<group>"; };
78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = "<group>"; };
F51BB7CA2EF0267400E05D67 /* FlClashCore */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; path = FlClashCore; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -111,7 +101,6 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
EDFB0F7BFE44CA6EE10BC97E /* Pods_RunnerTests.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -121,7 +110,6 @@
files = (
78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */,
F5131FDD2EF0F1A500A1748D /* LaunchAtLogin in Frameworks */,
36318A03D19527AAA8B8DCFC /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -155,8 +143,6 @@
33CEB47122A05771004F2AC0 /* Flutter */,
331C80D6294CF71000263BE5 /* RunnerTests */,
33CC10EE2044A3C60003C045 /* Products */,
D73912EC22F37F3D000D13A0 /* Frameworks */,
A0D80B3A13090D09F645DBDB /* Pods */,
);
sourceTree = "<group>";
};
@@ -205,28 +191,6 @@
path = Runner;
sourceTree = "<group>";
};
A0D80B3A13090D09F645DBDB /* Pods */ = {
isa = PBXGroup;
children = (
57401BE05DC1812684175E8F /* Pods-Runner.debug.xcconfig */,
CE90D6AE6AF7FF51A5D7A5BB /* Pods-Runner.release.xcconfig */,
1C8D2B0222EEC9EFBD4CB7D3 /* Pods-Runner.profile.xcconfig */,
3559EC2EA8528361668A5C2B /* Pods-RunnerTests.debug.xcconfig */,
9C9D4EF99A207AF51C53E0A3 /* Pods-RunnerTests.release.xcconfig */,
341B4B12F589DC2F9A4F85AF /* Pods-RunnerTests.profile.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
};
D73912EC22F37F3D000D13A0 /* Frameworks */ = {
isa = PBXGroup;
children = (
34DDDF4BE376B6283E8CF3FB /* Pods_Runner.framework */,
318645D7A7E65945F20006A1 /* Pods_RunnerTests.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -234,7 +198,6 @@
isa = PBXNativeTarget;
buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
buildPhases = (
8B8DBAC78DBB17589F89FBF4 /* [CP] Check Pods Manifest.lock */,
331C80D1294CF70F00263BE5 /* Sources */,
331C80D2294CF70F00263BE5 /* Frameworks */,
331C80D3294CF70F00263BE5 /* Resources */,
@@ -250,19 +213,15 @@
productType = "com.apple.product-type.bundle.unit-test";
};
33CC10EC2044A3C60003C045 /* Runner */ = {
packageProductDependencies = (
78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */,
);
isa = PBXNativeTarget;
buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
B48271F4874F0AE8C0B5B789 /* [CP] Check Pods Manifest.lock */,
33CC10E92044A3C60003C045 /* Sources */,
33CC10EA2044A3C60003C045 /* Frameworks */,
33CC10EB2044A3C60003C045 /* Resources */,
33CC110E2044A8840003C045 /* Bundle Framework */,
3399D490228B24CF009A79C7 /* ShellScript */,
DD2258A65B871C474676AD18 /* [CP] Embed Pods Frameworks */,
F51BB7CC2EF0268000E05D67 /* Stage Core */,
F51BB7C92EF0265000E05D67 /* Copy Core */,
);
buildRules = (
@@ -271,6 +230,9 @@
33CC11202044C79F0003C045 /* PBXTargetDependency */,
);
name = Runner;
packageProductDependencies = (
78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */,
);
productName = Runner;
productReference = 33CC10ED2044A3C60003C045 /* FlClash.app */;
productType = "com.apple.product-type.application";
@@ -316,7 +278,7 @@
);
mainGroup = 33CC10E42044A3C60003C045;
packageReferences = (
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */,
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */,
F5131FDB2EF0F1A500A1748D /* XCRemoteSwiftPackageReference "LaunchAtLogin" */,
);
productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
@@ -388,66 +350,25 @@
shellPath = /bin/sh;
shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
};
8B8DBAC78DBB17589F89FBF4 /* [CP] Check Pods Manifest.lock */ = {
F51BB7CC2EF0268000E05D67 /* Stage Core */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
name = "Stage Core";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
"$(BUILT_PRODUCTS_DIR)/FlClashCore",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
B48271F4874F0AE8C0B5B789 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
DD2258A65B871C474676AD18 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
shellScript = "core=\"$SRCROOT/../libclash/macos/FlClashCore\"\nif [ ! -f \"$core\" ]; then\n echo \"error: $core is missing; the setup build hook produced no Core\"\n exit 1\nfi\nslices=\"$(lipo -archs \"$core\")\"\nfor arch in $ARCHS; do\n case \" $slices \" in\n *\" $arch \"*) ;;\n *) echo \"error: $core has no $arch slice (has: $slices)\"; exit 1 ;;\n esac\ndone\nif ! cmp -s \"$core\" \"$BUILT_PRODUCTS_DIR/FlClashCore\"; then\n cp -f \"$core\" \"$BUILT_PRODUCTS_DIR/FlClashCore\"\nfi\n";
};
/* End PBXShellScriptBuildPhase section */
@@ -500,7 +421,6 @@
/* Begin XCBuildConfiguration section */
331C80DB294CF71000263BE5 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 3559EC2EA8528361668A5C2B /* Pods-RunnerTests.debug.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CURRENT_PROJECT_VERSION = 1;
@@ -515,7 +435,6 @@
};
331C80DC294CF71000263BE5 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9C9D4EF99A207AF51C53E0A3 /* Pods-RunnerTests.release.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CURRENT_PROJECT_VERSION = 1;
@@ -530,7 +449,6 @@
};
331C80DD294CF71000263BE5 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 341B4B12F589DC2F9A4F85AF /* Pods-RunnerTests.profile.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CURRENT_PROJECT_VERSION = 1;
@@ -584,7 +502,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 11.0;
MACOSX_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule;
@@ -669,7 +587,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 11.0;
MACOSX_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
@@ -719,7 +637,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 11.0;
MACOSX_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule;
@@ -832,6 +750,13 @@
};
/* End XCConfigurationList section */
/* Begin XCLocalSwiftPackageReference section */
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = {
isa = XCLocalSwiftPackageReference;
relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage;
};
/* End XCLocalSwiftPackageReference section */
/* Begin XCRemoteSwiftPackageReference section */
F5131FDB2EF0F1A500A1748D /* XCRemoteSwiftPackageReference "LaunchAtLogin" */ = {
isa = XCRemoteSwiftPackageReference;
@@ -844,22 +769,16 @@
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = {
isa = XCSwiftPackageProductDependency;
productName = FlutterGeneratedPluginSwiftPackage;
};
F5131FDC2EF0F1A500A1748D /* LaunchAtLogin */ = {
isa = XCSwiftPackageProductDependency;
package = F5131FDB2EF0F1A500A1748D /* XCRemoteSwiftPackageReference "LaunchAtLogin" */;
productName = LaunchAtLogin;
};
78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = {
isa = XCSwiftPackageProductDependency;
productName = FlutterGeneratedPluginSwiftPackage;
};
/* End XCSwiftPackageProductDependency section */
/* Begin XCLocalSwiftPackageReference section */
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = {
isa = XCLocalSwiftPackageReference;
relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage;
};
/* End XCLocalSwiftPackageReference section */
};
rootObject = 33CC10E52044A3C60003C045 /* Project object */;
}
-3
View File
@@ -4,7 +4,4 @@
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>
+4 -12
View File
@@ -1,6 +1,6 @@
import Cocoa
import FlutterMacOS
import window_ext
import window_manager
@main
class AppDelegate: FlutterAppDelegate {
@@ -10,7 +10,7 @@ class AppDelegate: FlutterAppDelegate {
}
override func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply {
WindowExtPlugin.instance?.handleShouldTerminate()
WindowManagerPlugin.instance?.handleShouldTerminate()
return .terminateCancel
}
@@ -19,15 +19,7 @@ class AppDelegate: FlutterAppDelegate {
}
override func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
if !flag {
for window in NSApp.windows {
if !window.isVisible {
window.setIsVisible(true)
}
window.makeKeyAndOrderFront(self)
NSApp.activate(ignoringOtherApps: true)
}
}
return true
WindowManagerPlugin.instance?.handleReopen()
return false
}
}
+8
View File
@@ -1,2 +1,10 @@
#include "../../Flutter/Flutter-Release.xcconfig"
#include "Warnings.xcconfig"
// flutter_tools builds release and profile for a generic destination, which
// defaults to a universal binary; every FlClash artifact ships one slice.
// :default= keeps an unlisted host from resolving ARCHS to the empty string.
FLCLASH_HOST_ARCH_arm64e = arm64
FLCLASH_HOST_ARCH_arm64 = arm64
FLCLASH_HOST_ARCH_x86_64 = x86_64
ARCHS = $(FLCLASH_HOST_ARCH_$(NATIVE_ARCH_ACTUAL):default=$(NATIVE_ARCH))
+38
View File
@@ -83,12 +83,50 @@ install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
install(FILES "EnableLoopback.exe" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
COMPONENT Runtime)
# Ship the MSVC runtime next to the executable. Neither the installer nor the
# portable archive can assume a machine already carries VCRedist, and without
# these the app cannot start at all.
set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE)
include(InstallRequiredSystemLibraries)
if(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS)
install(FILES ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS}
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
COMPONENT Runtime)
endif()
if(PLUGIN_BUNDLED_LIBRARIES)
install(FILES "${PLUGIN_BUNDLED_LIBRARIES}"
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
COMPONENT Runtime)
endif()
# Produced by the setup build hook during flutter_assemble.
set(CORE_ARTIFACTS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../libclash/windows")
# A running Debug Helper holds its exe open and the copy below fails behind an
# opaque MSB3073; only a Debug install with a changed Helper stops it, matched
# by path so a Helper registered from an installed release is left alone.
install(CODE "
set(helper_src \"${CORE_ARTIFACTS_DIR}/FlClashHelperService.exe\")
set(helper_dst \"${INSTALL_BUNDLE_LIB_DIR}/FlClashHelperService.exe\")
if(\"\${CMAKE_INSTALL_CONFIG_NAME}\" STREQUAL \"Debug\" AND EXISTS \"\${helper_dst}\")
file(SHA256 \"\${helper_src}\" helper_src_hash)
file(SHA256 \"\${helper_dst}\" helper_dst_hash)
if(NOT helper_src_hash STREQUAL helper_dst_hash)
message(STATUS \"Stopping the Helper running from \${helper_dst} before installing the Debug build\")
file(TO_NATIVE_PATH \"\${helper_dst}\" helper_dst_native)
execute_process(COMMAND powershell -NoProfile -NonInteractive -Command
\"Get-Process -Name FlClashHelperService -ErrorAction SilentlyContinue | Where-Object { $_.Path -eq '\${helper_dst_native}' } | Stop-Process -Force\"
OUTPUT_QUIET ERROR_QUIET)
endif()
endif()
" COMPONENT Runtime)
install(FILES
"${CORE_ARTIFACTS_DIR}/FlClashCore.exe"
"${CORE_ARTIFACTS_DIR}/FlClashHelperService.exe"
"${CORE_ARTIFACTS_DIR}/manifest.json"
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
COMPONENT Runtime)
# Copy the native assets provided by the build.dart from all packages.
set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/")
install(DIRECTORY "${NATIVE_ASSETS_DIR}"
+3 -12
View File
@@ -10,14 +10,11 @@
#include <connectivity_plus/connectivity_plus_windows_plugin.h>
#include <dynamic_color/dynamic_color_plugin_c_api.h>
#include <file_selector_windows/file_selector_windows.h>
#include <flutter_js/flutter_js_plugin.h>
#include <hotkey_manager_windows/hotkey_manager_windows_plugin_c_api.h>
#include <proxy/proxy_plugin_c_api.h>
#include <screen_retriever_windows/screen_retriever_windows_plugin_c_api.h>
#include <tray_manager/tray_manager_plugin.h>
#include <tray/tray_plugin_c_api.h>
#include <url_launcher_windows/url_launcher_windows.h>
#include <wifi_ssid/wifi_ssid_plugin_c_api.h>
#include <window_ext/window_ext_plugin_c_api.h>
#include <window_manager/window_manager_plugin.h>
void RegisterPlugins(flutter::PluginRegistry* registry) {
@@ -29,22 +26,16 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
registry->GetRegistrarForPlugin("DynamicColorPluginCApi"));
FileSelectorWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FileSelectorWindows"));
FlutterJsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FlutterJsPlugin"));
HotkeyManagerWindowsPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("HotkeyManagerWindowsPluginCApi"));
ProxyPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("ProxyPluginCApi"));
ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("ScreenRetrieverWindowsPluginCApi"));
TrayManagerPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("TrayManagerPlugin"));
TrayPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("TrayPluginCApi"));
UrlLauncherWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
WifiSsidPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("WifiSsidPluginCApi"));
WindowExtPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("WindowExtPluginCApi"));
WindowManagerPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("WindowManagerPlugin"));
}
+1 -6
View File
@@ -7,21 +7,16 @@ list(APPEND FLUTTER_PLUGIN_LIST
connectivity_plus
dynamic_color
file_selector_windows
flutter_js
hotkey_manager_windows
proxy
screen_retriever_windows
tray_manager
tray
url_launcher_windows
wifi_ssid
window_ext
window_manager
)
list(APPEND FLUTTER_FFI_PLUGIN_LIST
jni
rust_api
setup
)
set(PLUGIN_BUNDLED_LIBRARIES)
+5 -1
View File
@@ -6,8 +6,12 @@ publisher_url: https://github.com/chen08209/FlClash
display_name: FlClash
executable_name: FlClash.exe
output_base_file_name: FlClash.exe
setup_icon_file: ..\windows\runner\resources\app_icon.ico
# Resolved against the project root: flutter_distributor turns this into an
# absolute path via Directory.current.
setup_icon_file: windows\runner\resources\app_icon.ico
locales:
# Written into the .iss verbatim, so this one stays relative to the generated
# script in dist/.
- lang: zh
file: ..\windows\packaging\exe\ChineseSimplified.isl
- lang: en
+9
View File
@@ -2,11 +2,20 @@
#include <flutter/flutter_view_controller.h>
#include <windows.h>
#include <app_links/app_links_plugin_c_api.h>
#include <window_manager/window_manager_plugin.h>
#include "flutter_window.h"
#include "utils.h"
int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
_In_ wchar_t *command_line, _In_ int show_command) {
if (HWND running = WindowManagerFindRunningWindow()) {
SendAppLink(running);
WindowManagerActivateWindow(running);
return EXIT_SUCCESS;
}
// Attach to console when present (e.g., 'flutter run') or create a
// new console when running with a debugger.
if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {
Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 23 KiB