From 2f510c7fba93ad06d94bb3dbca389fe76971877a Mon Sep 17 00:00:00 2001 From: haretsu Date: Sat, 4 Oct 2025 14:32:30 -0300 Subject: [PATCH] Add `platformOverride` and `brightnessOverride` command extensions --- lua/flutter-tools.lua | 2 ++ lua/flutter-tools/commands.lua | 19 +++++++++++--- lua/flutter-tools/runners/debugger_runner.lua | 26 +++++++++++++++++-- lua/flutter-tools/runners/job_runner.lua | 2 ++ .../runners/vm_service_extensions.lua | 19 ++++++++++++++ 5 files changed, 63 insertions(+), 5 deletions(-) diff --git a/lua/flutter-tools.lua b/lua/flutter-tools.lua index 5890ff74..98598af6 100644 --- a/lua/flutter-tools.lua +++ b/lua/flutter-tools.lua @@ -31,6 +31,8 @@ local function setup_commands() command("FlutterRestart", commands.restart) command("FlutterQuit", commands.quit) command("FlutterVisualDebug", commands.visual_debug) + command("FlutterChangeTargetPlatform", commands.change_target_platform) + command("FlutterToggleBrightness", commands.brightness) -- Lists command("FlutterDevices", devices.list_devices) command("FlutterEmulators", devices.list_emulators) diff --git a/lua/flutter-tools/commands.lua b/lua/flutter-tools/commands.lua index a723e0a7..bc1d50e9 100644 --- a/lua/flutter-tools/commands.lua +++ b/lua/flutter-tools/commands.lua @@ -26,7 +26,7 @@ local current_device = nil ---@field is_running fun(runner: flutter.Runner):boolean ---@field run fun(runner: flutter.Runner, opts: RunOpts, paths:table, args:table, cwd:string, on_run_data:fun(is_err:boolean, data:string), on_run_exit:fun(data:string[], args: table, opts: RunOpts?, project_conf: flutter.ProjectConfig?,launch_config: dap.Configuration?), is_flutter_project: boolean, project_conf: flutter.ProjectConfig?, launch_config: dap.Configuration?) ---@field cleanup fun(funner: flutter.Runner) ----@field send fun(runner: flutter.Runner, cmd:string, quiet: boolean?) +---@field send fun(runner: flutter.Runner, cmd:string, quiet: boolean?, on_response: fun(response: any)|nil) ---@field attach fun(runner: flutter.Runner, paths:table, args:table, cwd:string, on_run_data:fun(is_err:boolean, data:string), on_run_exit:fun(data:string[], args: table, project_conf: flutter.ProjectConfig?,launch_config: dap.Configuration?)) ---@type flutter.Runner? @@ -325,9 +325,10 @@ end ---@param cmd string ---@param quiet boolean? ---@param on_send function|nil -local function send(cmd, quiet, on_send) +---@param on_response fun(response:any)|nil +local function send(cmd, quiet, on_send, on_response) if M.is_running() and runner then - runner:send(cmd, quiet) + runner:send(cmd, quiet, on_response) if on_send then on_send() end elseif not quiet then ui.notify("Sorry! Flutter is not running") @@ -354,6 +355,18 @@ function M.quit(quiet) end) end +---@param quiet boolean? +function M.change_target_platform(quiet) + send("change_target_platform", quiet, nil, function(response) + if not quiet then + ui.notify("Changing platform to " .. response.value, nil, { timeout = 1500 }) + end + end) +end + +---@param quiet boolean? +function M.brightness(quiet) send("brightness", quiet) end + ---@param quiet boolean? function M.visual_debug(quiet) send("visual_debug", quiet) end diff --git a/lua/flutter-tools/runners/debugger_runner.lua b/lua/flutter-tools/runners/debugger_runner.lua index a532de86..212ea0b9 100644 --- a/lua/flutter-tools/runners/debugger_runner.lua +++ b/lua/flutter-tools/runners/debugger_runner.lua @@ -106,6 +106,22 @@ local function register_default_configurations(paths, is_flutter_project, projec end end +local function get_current_value(cmd) + local service_activation_params = vm_service_extensions.get_request_params(cmd) + if + not service_activation_params + or not service_activation_params.params.isolateId + then return end + + service_activation_params.params = { + isolateId = service_activation_params.params.isolateId + } + dap.session():request("callService", service_activation_params, function(err, result) + if err then return end + vm_service_extensions.set_service_extensions_state(result.method, result.value) + end) +end + local function register_dap_listeners(on_run_data, on_run_exit) local started = false local before_start_logs = {} @@ -133,6 +149,11 @@ local function register_dap_listeners(on_run_data, on_run_exit) dap.listeners.before["event_dart.serviceExtensionAdded"][plugin_identifier] = function(_, body) if body and body.extensionRPC and body.isolateId then vm_service_extensions.set_isolate_id(body.extensionRPC, body.isolateId) + if body.extensionRPC == "ext.flutter.brightnessOverride" then + get_current_value("brightness") + elseif body.extensionRPC == "ext.flutter.platformOverride" then + get_current_value("change_target_platform") + end end end @@ -280,7 +301,7 @@ function DebuggerRunner:attach(paths, args, cwd, on_run_data, on_run_exit) end end -function DebuggerRunner:send(cmd, quiet) +function DebuggerRunner:send(cmd, quiet, on_response) if cmd == "open_dev_tools" then dev_tools.open_dev_tools() return @@ -292,10 +313,11 @@ function DebuggerRunner:send(cmd, quiet) end local service_activation_params = vm_service_extensions.get_request_params(cmd) if service_activation_params then - dap.session():request("callService", service_activation_params, function(err, _) + dap.session():request("callService", service_activation_params, function(err, response) if err and not quiet then ui.notify("Error calling service " .. cmd .. ": " .. err, ui.ERROR) end + if response and on_response then on_response(response) end end) return end diff --git a/lua/flutter-tools/runners/job_runner.lua b/lua/flutter-tools/runners/job_runner.lua index b42028d2..73c796d9 100644 --- a/lua/flutter-tools/runners/job_runner.lua +++ b/lua/flutter-tools/runners/job_runner.lua @@ -19,6 +19,8 @@ local command_keys = { paint_baselines = "p", open_dev_tools = "v", generate = "g", + change_target_platform = "o", + brightness = "b", } function JobRunner:is_running() return run_job ~= nil end diff --git a/lua/flutter-tools/runners/vm_service_extensions.lua b/lua/flutter-tools/runners/vm_service_extensions.lua index b981923e..622b4110 100644 --- a/lua/flutter-tools/runners/vm_service_extensions.lua +++ b/lua/flutter-tools/runners/vm_service_extensions.lua @@ -20,6 +20,8 @@ local service_activation_requests = { slow_animations = "ext.flutter.timeDilation", inspect_widget = "ext.flutter.inspector.show", paint_baselines = "ext.flutter.debugPaintBaselinesEnabled", + change_target_platform = "ext.flutter.platformOverride", + brightness = "ext.flutter.brightnessOverride", } local toggle_extension_state_keys = { @@ -29,10 +31,27 @@ local toggle_extension_state_keys = { slow_animations = "timeDilation", inspect_widget = "enabled", paint_baselines = "enabled", + change_target_platform = "value", + brightness = "value", +} + +local cicle_target_platform = { + linux = "fuchsia", + fuchsia = "android", + android = "iOS", + iOS = "windows", + windows = "macOS", + macOS = "linux", } local function toggle_value(request) local value = service_extensions_state[request] + if request == service_activation_requests.change_target_platform then + return cicle_target_platform[value] or "linux" + end + if request == service_activation_requests.brightness then + return "Brightness." .. (value == "Brightness.light" and "dark" or "light") + end if request == service_activation_requests.slow_animations then if value == "5.0" then return "1.0"