tree d786066a81ed0b10ddf27bf347886ac6589798f0
parent bb7321c353f216862cd4e50daaf672eee81da7f5
author Matthew Kosarek <matt.kosarek@canonical.com> 1741268572 -0500
committer dart-internal-monorepo <dart-internal-monorepo@dart-ci-internal.iam.gserviceaccount.com> 1741270760 -0800

[windows] wire the focus request and the focus events through the Windows platform (#164296)

## What's changed?
- When a view is focused or unfocused, an event is now sent to the
engine. This makes it so the proper view has focus when the
corresponding window is focused. Thus, global shortcuts now work across
views :tada:
- Applications can request for a particular view to be focused, which
causes the corresponding window to be focused
- Wrote unit tests for all of this

## How To Test
1. Merge `windows/view_focus_event` into
[canonical/foundation](https://github.com/canonical/flutter/tree/foundation)
2. Create a new app:
```dart
import 'dart:ui';

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

void main() {
  final RegularWindowController controller1 = RegularWindowController(size: const Size(640, 480));
  final RegularWindowController controller2 = RegularWindowController(size: const Size(640, 480));
  runWidget(ViewCollection(
    views: [
      RegularWindow(controller: controller1, child: MyApp(otherController: controller2)),
      RegularWindow(controller: controller2, child: MyApp(otherController: controller1)),
    ]
  ));
}

class IncrementIntent extends Intent {
  const IncrementIntent();
}

class MyApp extends StatelessWidget {
  const MyApp({super.key, required this.otherController});

  final RegularWindowController otherController;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Shortcut Counter',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CounterPage(otherController: otherController),
    );
  }
}

class CounterPage extends StatefulWidget {
  const CounterPage({super.key, required this.otherController});

  final RegularWindowController otherController;

  @override
  _CounterPageState createState() => _CounterPageState();
}

class _CounterPageState extends State<CounterPage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Shortcuts(
      shortcuts: {
        LogicalKeySet(LogicalKeyboardKey.space): const IncrementIntent(),
      },
      child: Actions(
        actions: {
          IncrementIntent: CallbackAction<IncrementIntent>(onInvoke: (intent) {
            _incrementCounter();
            return null;
          }),
        },
        child: Focus(
          autofocus: true,
          child: Scaffold(
            appBar: AppBar(title: const Text('Shortcut Counter')),
            body: Center(
              child: Column(children: [Text(
                'Counter: $_counter',
                style: const TextStyle(fontSize: 24),
              ),
              OutlinedButton(onPressed: () {
                WidgetsBinding.instance.platformDispatcher.requestViewFocusChange(
                  direction: ViewFocusDirection.forward,
                  state: ViewFocusState.focused,
                  viewId: widget.otherController.rootView.viewId,
                );
              }, child: const Text('Focus other window'))]),
            ),
          ),
        ),
      ),
    );
  }
}
```
3. Run with:
```
flutter run --debug --local-engine-src-path C:/dev/flutter/engine/src/ --local-engine host_debug_unopt --local-engine-host host_debug_unopt lib/main.dart  --enable-multi-window
```
4. Pressing spacebar while either window is focused should make the
corresponding counter go up
5. Clicking the button on either window should make the other window
become focused

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
https://dart.googlesource.com/external/github.com/flutter/flutter/+/099e6d39fe38dbda78dd5efb7d8424bf7fd845a2
