27constexpr int base_dpi = 96;
32static const int kLinesPerScrollWindowsDefault = 3;
34static constexpr int32_t kDefaultPointerDeviceId = 0;
36static int GetCursorPositionForComposition(
const TextInputManager&
manager,
39 if (!(lparam & GCS_CURSORPOS)) {
43 return static_cast<int>(text_length);
46 int position =
static_cast<int>(
manager.GetComposingCursorPosition());
47 if (position < 0 ||
static_cast<size_t>(position) > text_length) {
48 return static_cast<int>(text_length);
50 return static_cast<int>(position);
58 constexpr LPARAM kTouchOrPenSignature = 0xFF515700;
59 constexpr LPARAM kTouchSignature = kTouchOrPenSignature | 0x80;
60 constexpr LPARAM kSignatureMask = 0xFFFFFF00;
61 LPARAM info = GetMessageExtraInfo();
62 if ((info & kSignatureMask) == kTouchOrPenSignature) {
63 if ((info & kTouchSignature) == kTouchSignature) {
72static uint64_t ConvertWinButtonToFlutterButton(
UINT button) {
88 FML_LOG(WARNING) <<
"Mouse button not recognized: " << button;
93static uint64_t ConvertWinMouseStateToFlutterButtons(
WPARAM wparam) {
94 uint64_t flutter_buttons = 0;
95 if (wparam & MK_LBUTTON) {
98 if (wparam & MK_RBUTTON) {
101 if (wparam & MK_MBUTTON) {
104 if (wparam & MK_XBUTTON1) {
107 if (wparam & MK_XBUTTON2) {
110 return flutter_buttons;
114static uint64_t ConvertWinStylusFlagsToFlutterButtons(
UINT pen_flags,
115 UINT pointer_flags) {
116 uint64_t flutter_buttons = 0;
117 if ((pointer_flags & POINTER_FLAG_INCONTACT) == 0) {
118 return flutter_buttons;
121 if (pen_flags & PEN_FLAG_BARREL) {
124 if (pen_flags & PEN_FLAG_ERASER) {
127 return flutter_buttons;
131static uint64_t ConvertWinPointerFlagsToFlutterButtons(
UINT flags) {
132 uint64_t flutter_buttons = 0;
133 if ((flags & POINTER_FLAG_INCONTACT) == 0) {
135 return flutter_buttons;
137 if (flags & POINTER_FLAG_FIRSTBUTTON) {
140 if (flags & POINTER_FLAG_SECONDBUTTON) {
143 if (flags & POINTER_FLAG_THIRDBUTTON) {
146 return flutter_buttons;
155 std::shared_ptr<WindowsProcTable> windows_proc_table,
156 std::unique_ptr<TextInputManager> text_input_manager)
159 windows_proc_table_(
std::move(windows_proc_table)),
160 text_input_manager_(
std::move(text_input_manager)),
161 ax_fragment_root_(nullptr) {
170 UpdateScrollOffsetMultiplier();
172 if (windows_proc_table_ ==
nullptr) {
173 windows_proc_table_ = std::make_unique<WindowsProcTable>();
175 if (text_input_manager_ ==
nullptr) {
176 text_input_manager_ = std::make_unique<TextInputManager>();
178 keyboard_manager_ = std::make_unique<KeyboardManager>(
this);
192 binding_handler_delegate_ =
window;
196 if (restored_ &&
window) {
205 return static_cast<float>(
GetCurrentDPI()) /
static_cast<float>(base_dpi);
214 if (hwnd ==
nullptr) {
218 HWND prevFocus = ::SetFocus(hwnd);
219 if (prevFocus ==
nullptr) {
231 if (binding_handler_delegate_ !=
nullptr) {
237 if (binding_handler_delegate_ !=
nullptr) {
249 int modifiers_state) {
251 buttons, rotation, pressure,
264 buttons, rotation, pressure);
273 binding_handler_delegate_->
OnPointerUp(
x,
y, device_kind, device_id, buttons);
324 GetCursorPos(&point);
327 binding_handler_delegate_->
OnScroll(point.x, point.y, delta_x, delta_y,
346 bool result = ::PatBlt(dc, 0, 0, current_width_, current_height_, BLACKNESS);
356 bmi.bmiHeader.biSize =
sizeof(BITMAPINFOHEADER);
357 bmi.bmiHeader.biWidth = row_bytes / 4;
358 bmi.bmiHeader.biHeight = -
height;
359 bmi.bmiHeader.biPlanes = 1;
360 bmi.bmiHeader.biBitCount = 32;
361 bmi.bmiHeader.biCompression = BI_RGB;
362 bmi.bmiHeader.biSizeImage = 0;
363 int ret = ::SetDIBitsToDevice(dc, 0, 0, row_bytes / 4,
height, 0, 0, 0,
364 height, allocation, &bmi, DIB_RGB_COLORS);
370 if (binding_handler_delegate_ ==
nullptr) {
379 GetCursorPos(&point);
381 return {(size_t)point.x, (
size_t)point.y};
388 if (!display_manager_->FindById(display_id)) {
389 FML_LOG(ERROR) <<
"Current monitor not found in display list.";
403 CreateAxFragmentRoot();
408 CreateAxFragmentRoot();
423 if (binding_handler_delegate_) {
424 binding_handler_delegate_->
OnFocus(
431 if (binding_handler_delegate_) {
432 binding_handler_delegate_->
OnFocus(
439 if (hwnd && binding_handler_delegate_) {
444void FlutterWindow::TrackMouseLeaveEvent(HWND hwnd) {
445 if (!tracking_mouse_leave_) {
447 tme.cbSize =
sizeof(tme);
448 tme.hwndTrack = hwnd;
449 tme.dwFlags = TME_LEAVE;
450 TrackMouseEvent(&tme);
451 tracking_mouse_leave_ =
true;
456 current_width_ =
width;
464FlutterWindow* FlutterWindow::GetThisFromHandle(HWND
const window)
noexcept {
465 return reinterpret_cast<FlutterWindow*
>(
466 GetWindowLongPtr(
window, GWLP_USERDATA));
469void FlutterWindow::UpdateScrollOffsetMultiplier() {
470 UINT lines_per_scroll = kLinesPerScrollWindowsDefault;
473 SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &lines_per_scroll, 0);
477 scroll_offset_multiplier_ =
478 static_cast<float>(lines_per_scroll) * 100.0 / 3.0;
487 WNDCLASS window_class = RegisterWindowClass(converted_title);
489 auto* result = CreateWindowEx(
490 0, window_class.lpszClassName, converted_title.c_str(),
491 WS_CHILD | WS_VISIBLE, CW_DEFAULT, CW_DEFAULT,
width,
height,
492 HWND_MESSAGE,
nullptr, window_class.hInstance,
this);
494 if (result ==
nullptr) {
497 size_t size = FormatMessageW(
498 FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
499 FORMAT_MESSAGE_IGNORE_INSERTS,
500 NULL,
error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
501 reinterpret_cast<LPWSTR
>(&
message), 0, NULL);
505 SetUserObjectInformationA(GetCurrentProcess(),
506 UOI_TIMERPROC_EXCEPTION_SUPPRESSION, FALSE, 1);
511 SetTimer(result, kDirectManipulationTimer, 14,
nullptr);
517 return window_handle_;
524 return ::PeekMessage(lpMsg, window_handle_, wMsgFilterMin, wMsgFilterMax,
529 return ::MapVirtualKey(virtual_key, MAPVK_VK_TO_CHAR);
535 return ::SendMessage(window_handle_, Msg, wParam, lParam);
539 size_t length = strlen(source);
541 std::wstring wideTitle(
length, L
'#');
542 mbstowcs_s(&outlen, &wideTitle[0],
length + 1, source,
length);
546WNDCLASS FlutterWindow::RegisterWindowClass(std::wstring& title) {
547 window_class_name_ = title;
549 WNDCLASS window_class{};
550 window_class.hCursor = LoadCursor(
nullptr, IDC_ARROW);
551 window_class.lpszClassName = title.c_str();
552 window_class.style = CS_HREDRAW | CS_VREDRAW;
553 window_class.cbClsExtra = 0;
554 window_class.cbWndExtra = 0;
555 window_class.hInstance = GetModuleHandle(
nullptr);
556 window_class.hIcon =
nullptr;
557 window_class.hbrBackground = 0;
558 window_class.lpszMenuName =
nullptr;
559 window_class.lpfnWndProc = WndProc;
560 RegisterClass(&window_class);
567 LPARAM const lparam)
noexcept {
569 auto cs =
reinterpret_cast<CREATESTRUCT*
>(lparam);
570 SetWindowLongPtr(
window, GWLP_USERDATA,
571 reinterpret_cast<LONG_PTR>(cs->lpCreateParams));
573 auto that =
static_cast<FlutterWindow*
>(cs->lpCreateParams);
574 that->window_handle_ =
window;
575 that->text_input_manager_->SetWindowHandle(
window);
576 }
else if (FlutterWindow* that = GetThisFromHandle(
window)) {
577 return that->HandleMessage(
message, wparam, lparam);
586 LPARAM const lparam)
noexcept {
587 LPARAM result_lparam = lparam;
588 int x_pos = 0, y_pos = 0;
590 UINT button_pressed = 0;
591 uint64_t flutter_button = 0;
595 case kWmDpiChangedBeforeParent:
597 OnDpiScale(current_dpi_);
600 width = LOWORD(lparam);
603 current_width_ =
width;
614 case WM_POINTERUPDATE:
616 case WM_POINTERLEAVE: {
617 POINT pt = {GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)};
618 ScreenToClient(window_handle_, &pt);
619 auto const x =
static_cast<double>(pt.x);
620 auto const y =
static_cast<double>(pt.y);
621 auto const pointerId = GET_POINTERID_WPARAM(wparam);
622 POINTER_INFO pointerInfo;
623 if (windows_proc_table_->GetPointerInfo(pointerId, &pointerInfo)) {
626 bool is_inverted =
false;
628 ConvertWinPointerFlagsToFlutterButtons(pointerInfo.pointerFlags);
629 if (pointerInfo.pointerType == PT_PEN) {
630 POINTER_PEN_INFO penInfo;
631 if (windows_proc_table_->GetPointerPenInfo(pointerId, &penInfo)) {
632 pressure = penInfo.pressure;
633 rotation = penInfo.rotation;
634 is_inverted = (penInfo.penFlags & PEN_FLAG_INVERTED) != 0;
635 flutter_button = ConvertWinStylusFlagsToFlutterButtons(
636 penInfo.penFlags, pointerInfo.pointerFlags);
639 auto touch_id = touch_id_generator_.GetGeneratedId(pointerId);
641 switch (pointerInfo.pointerType) {
656 FML_LOG(ERROR) <<
"Unrecognized device key "
657 << pointerInfo.pointerType;
660 if (
message == WM_POINTERDOWN) {
661 OnPointerDown(
x,
y, device_kind, touch_id, flutter_button, rotation,
663 }
else if (
message == WM_POINTERUPDATE) {
664 OnPointerMove(
x,
y, device_kind, touch_id, flutter_button, rotation,
667 }
else if (
message == WM_POINTERUP) {
668 OnPointerUp(
x,
y, device_kind, touch_id, flutter_button);
671 }
else if (
message == WM_POINTERLEAVE) {
672 OnPointerLeave(
x,
y, device_kind, touch_id);
673 touch_id_generator_.ReleaseNumber(pointerId);
679 device_kind = GetFlutterPointerDeviceKind();
681 TrackMouseLeaveEvent(window_handle_);
683 x_pos = GET_X_LPARAM(lparam);
684 y_pos = GET_Y_LPARAM(lparam);
685 mouse_x_ =
static_cast<double>(x_pos);
686 mouse_y_ =
static_cast<double>(y_pos);
689 if (wparam & MK_CONTROL) {
692 if (wparam & MK_SHIFT) {
695 OnPointerMove(mouse_x_, mouse_y_, device_kind, kDefaultPointerDeviceId,
696 ConvertWinMouseStateToFlutterButtons(wparam),
701 device_kind = GetFlutterPointerDeviceKind();
703 OnPointerLeave(mouse_x_, mouse_y_, device_kind,
704 kDefaultPointerDeviceId);
710 tracking_mouse_leave_ =
false;
713 UINT hit_test_result = LOWORD(lparam);
714 if (hit_test_result == HTCLIENT) {
723 ::CreateCaret(window_handle_,
nullptr, 1, 1);
733 device_kind = GetFlutterPointerDeviceKind();
738 if (
message == WM_LBUTTONDOWN) {
744 SetCapture(window_handle_);
747 if (
message == WM_XBUTTONDOWN) {
748 button_pressed = GET_XBUTTON_WPARAM(wparam);
750 x_pos = GET_X_LPARAM(lparam);
751 y_pos = GET_Y_LPARAM(lparam);
752 flutter_button = ConvertWinButtonToFlutterButton(button_pressed);
754 OnPointerDown(
static_cast<double>(x_pos),
static_cast<double>(y_pos),
755 device_kind, kDefaultPointerDeviceId, flutter_button,
762 device_kind = GetFlutterPointerDeviceKind();
772 button_pressed = GET_XBUTTON_WPARAM(wparam);
774 x_pos = GET_X_LPARAM(lparam);
775 y_pos = GET_Y_LPARAM(lparam);
776 flutter_button = ConvertWinButtonToFlutterButton(button_pressed);
778 OnPointerUp(
static_cast<double>(x_pos),
static_cast<double>(y_pos),
779 device_kind, kDefaultPointerDeviceId, flutter_button);
783 -(
static_cast<short>(HIWORD(wparam)) /
784 static_cast<double>(WHEEL_DELTA)),
788 OnScroll((
static_cast<short>(HIWORD(wparam)) /
789 static_cast<double>(WHEEL_DELTA)),
800 if (wparam == kDirectManipulationTimer) {
801 direct_manipulation_owner_->Update();
805 case DM_POINTERHITTEST: {
806 if (direct_manipulation_owner_) {
807 UINT contact_id = GET_POINTERID_WPARAM(wparam);
808 POINTER_INPUT_TYPE pointer_type;
809 if (windows_proc_table_->GetPointerType(contact_id, &pointer_type) &&
810 pointer_type == PT_TOUCHPAD) {
811 direct_manipulation_owner_->SetContact(contact_id);
816 case WM_INPUTLANGCHANGE:
820 case WM_IME_SETCONTEXT:
821 OnImeSetContext(
message, wparam, lparam);
825 result_lparam &= ~ISC_SHOWUICOMPOSITIONWINDOW;
827 case WM_IME_STARTCOMPOSITION:
828 OnImeStartComposition(
message, wparam, lparam);
833 case WM_IME_COMPOSITION:
834 OnImeComposition(
message, wparam, lparam);
835 if (lparam & GCS_RESULTSTR || lparam & GCS_COMPSTR) {
844 case WM_IME_ENDCOMPOSITION:
845 OnImeEndComposition(
message, wparam, lparam);
848 OnImeRequest(
message, wparam, lparam);
852 if (wparam == UNICODE_NOCHAR)
857 case WM_THEMECHANGED:
868 if (keyboard_manager_->HandleMessage(
message, wparam, lparam)) {
879 return Win32DefWindowProc(window_handle_,
message, wparam, result_lparam);
889 DWORD obj_id =
static_cast<DWORD>(
static_cast<DWORD_PTR
>(lparam));
891 bool is_uia_request =
static_cast<DWORD>(UiaRootObjectId) == obj_id;
892 bool is_msaa_request =
static_cast<DWORD>(OBJID_CLIENT) == obj_id;
894 if (is_uia_request || is_msaa_request) {
910 CreateAxFragmentRoot();
911 if (is_uia_request) {
912#ifdef FLUTTER_ENGINE_USE_UIA
914 Microsoft::WRL::ComPtr<IRawElementProviderSimple> root;
916 ax_fragment_root_->GetNativeViewAccessible()->QueryInterface(
917 IID_PPV_ARGS(&root)))) {
920 reference_result = UiaReturnRawElementProvider(window_handle_, wparam,
923 FML_LOG(ERROR) <<
"Failed to query AX fragment root.";
926 }
else if (is_msaa_request) {
929 Microsoft::WRL::ComPtr<IAccessible> root;
930 ax_fragment_root_->GetNativeViewAccessible()->QueryInterface(
931 IID_PPV_ARGS(&root));
932 reference_result = LresultFromObject(IID_IAccessible, wparam, root.Get());
935 return reference_result;
942 text_input_manager_->CreateImeWindow();
949 text_input_manager_->CreateImeWindow();
957 text_input_manager_->UpdateImeWindow();
967 if (lparam & GCS_RESULTSTR) {
970 std::optional<std::u16string>
text = text_input_manager_->GetResultString();
972 int pos = GetCursorPositionForComposition(*text_input_manager_, lparam,
978 if (lparam & GCS_COMPSTR) {
980 std::optional<std::u16string>
text =
981 text_input_manager_->GetComposingString();
983 int pos = GetCursorPositionForComposition(*text_input_manager_, lparam,
993 text_input_manager_->DestroyImeWindow();
1006 text_input_manager_->AbortComposing();
1010 text_input_manager_->UpdateCaretRect(rect);
1014 return current_dpi_;
1018 return current_width_;
1022 return current_height_;
1026 return scroll_offset_multiplier_;
1033 return ::DefWindowProc(hWnd, Msg, wParam, lParam);
1036void FlutterWindow::Destroy() {
1037 if (window_handle_) {
1038 text_input_manager_->SetWindowHandle(
nullptr);
1039 DestroyWindow(window_handle_);
1040 window_handle_ =
nullptr;
1043 UnregisterClass(window_class_name_.c_str(),
nullptr);
1046void FlutterWindow::CreateAxFragmentRoot() {
1047 if (ax_fragment_root_) {
1050 ax_fragment_root_ = std::make_unique<ui::AXFragmentRootWin>(
1053 std::make_unique<AlertPlatformNodeDelegate>(*ax_fragment_root_);
1056 alert_node_.reset(
static_cast<ui::AXPlatformNodeWin*
>(alert_node));
1057 ax_fragment_root_->SetAlertNode(
alert_node_.get());
virtual void OnCursorRectUpdated(const Rect &rect) override
virtual void OnPointerLeave(double x, double y, FlutterPointerDeviceKind device_kind, int32_t device_id)
virtual float GetScrollOffsetMultiplier()
virtual bool Focus() override
virtual ui::AXPlatformNodeWin * GetAlert() override
virtual void OnText(const std::u16string &text) override
virtual UINT Win32DispatchMessage(UINT Msg, WPARAM wParam, LPARAM lParam) override
virtual BOOL Win32PeekMessage(LPMSG lpMsg, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) override
virtual void OnThemeChange()
std::unique_ptr< AlertPlatformNodeDelegate > alert_delegate_
virtual bool OnBitmapSurfaceUpdated(const void *allocation, size_t row_bytes, size_t height) override
virtual void OnPointerDown(double x, double y, FlutterPointerDeviceKind device_kind, int32_t device_id, uint64_t buttons, uint32_t rotation, uint32_t pressure)
virtual void OnImeRequest(UINT const message, WPARAM const wparam, LPARAM const lparam)
virtual void OnPointerMove(double x, double y, FlutterPointerDeviceKind device_kind, int32_t device_id, uint64_t buttons, uint32_t rotation, uint32_t pressure, int modifiers_state)
virtual LRESULT Win32DefWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
virtual void OnImeStartComposition(UINT const message, WPARAM const wparam, LPARAM const lparam)
virtual void OnPointerUp(double x, double y, FlutterPointerDeviceKind device_kind, int32_t device_id, uint64_t buttons)
std::wstring NarrowToWide(const char *source)
virtual FlutterEngineDisplayId GetDisplayId() override
virtual ui::AXFragmentRootDelegateWin * GetAxFragmentRootDelegate()
virtual void OnScroll(double delta_x, double delta_y, FlutterPointerDeviceKind device_kind, int32_t device_id)
void InitializeChild(const char *title, unsigned int width, unsigned int height)
virtual AlertPlatformNodeDelegate * GetAlertDelegate() override
std::unique_ptr< DirectManipulationOwner > direct_manipulation_owner_
virtual HWND GetWindowHandle() override
virtual void OnComposeCommit()
virtual void UpdateCursorRect(const Rect &rect)
virtual PhysicalWindowBounds GetPhysicalWindowBounds() override
virtual void OnImeSetContext(UINT const message, WPARAM const wparam, LPARAM const lparam)
virtual void OnWindowStateEvent(WindowStateEvent event)
virtual void OnKey(int key, int scancode, int action, char32_t character, bool extended, bool was_down, KeyEventCallback callback) override
std::unique_ptr< ui::AXPlatformNodeWin > alert_node_
virtual PointerLocation GetPrimaryPointerLocation() override
virtual void OnComposeEnd()
virtual void SetView(WindowBindingHandlerDelegate *view) override
LRESULT HandleMessage(UINT const message, WPARAM const wparam, LPARAM const lparam) noexcept
virtual void OnComposeChange(const std::u16string &text, int cursor_pos)
virtual void OnResetImeComposing() override
virtual uint32_t Win32MapVkToChar(uint32_t virtual_key) override
virtual void OnImeComposition(UINT const message, WPARAM const wparam, LPARAM const lparam)
virtual void OnDpiScale(unsigned int dpi)
virtual void AbortImeComposing()
virtual float GetDpiScale() override
virtual void OnUpdateSemanticsEnabled(bool enabled)
virtual LRESULT OnGetObject(UINT const message, WPARAM const wparam, LPARAM const lparam)
virtual gfx::NativeViewAccessible GetNativeViewAccessible()
virtual void OnComposeBegin()
virtual bool OnBitmapSurfaceCleared() override
virtual void OnResize(unsigned int width, unsigned int height)
virtual void OnImeEndComposition(UINT const message, WPARAM const wparam, LPARAM const lparam)
std::function< void(bool)> KeyEventCallback
virtual void OnComposeChange(const std::u16string &text, int cursor_pos)=0
virtual void OnHighContrastChanged()=0
virtual void OnText(const std::u16string &)=0
virtual void OnPointerLeave(double x, double y, FlutterPointerDeviceKind device_kind, int32_t device_id)=0
virtual void OnKey(int key, int scancode, int action, char32_t character, bool extended, bool was_down, KeyEventCallback callback)=0
virtual void OnUpdateSemanticsEnabled(bool enabled)=0
virtual ui::AXFragmentRootDelegateWin * GetAxFragmentRootDelegate()=0
virtual void OnWindowStateEvent(HWND hwnd, WindowStateEvent event)=0
virtual void OnComposeEnd()=0
virtual void OnWindowRepaint()=0
virtual gfx::NativeViewAccessible GetNativeViewAccessible()=0
virtual bool OnWindowSizeChanged(size_t width, size_t height)=0
virtual void OnComposeBegin()=0
virtual void OnPointerUp(double x, double y, FlutterPointerDeviceKind device_kind, int32_t device_id, uint64_t buttons)=0
virtual void OnFocus(FlutterViewFocusState focus_state, FlutterViewFocusDirection direction)=0
virtual void OnPointerDown(double x, double y, FlutterPointerDeviceKind device_kind, int32_t device_id, uint64_t buttons, uint32_t rotation, uint32_t pressure)=0
virtual void OnScroll(double x, double y, double delta_x, double delta_y, int scroll_offset_multiplier, FlutterPointerDeviceKind device_kind, int32_t device_id)=0
virtual void OnComposeCommit()=0
virtual void OnPointerMove(double x, double y, FlutterPointerDeviceKind device_kind, int32_t device_id, uint64_t buttons, uint32_t rotation, uint32_t pressure, int modifiers_state)=0
uint64_t FlutterEngineDisplayId
@ kUnfocused
Specifies that a view does not have platform focus.
@ kFocused
Specifies that a view has platform focus.
@ kFlutterPointerButtonMousePrimary
@ kFlutterPointerButtonMouseMiddle
@ kFlutterPointerButtonMouseForward
@ kFlutterPointerButtonMouseBack
@ kFlutterPointerButtonMouseSecondary
@ kFlutterPointerButtonStylusSecondary
@ kFlutterPointerButtonStylusPrimary
@ kFlutterPointerButtonStylusContact
FlutterPointerDeviceKind
The device type that created a pointer event.
@ kFlutterPointerDeviceKindTouch
@ kFlutterPointerDeviceKindInvertedStylus
@ kFlutterPointerDeviceKindTrackpad
@ kFlutterPointerDeviceKindStylus
@ kFlutterPointerDeviceKindMouse
const uint8_t uint32_t uint32_t GError ** error
static const int kMaxTouchDeviceId
static const int kMinTouchDeviceId
FlutterDesktopBinaryReply callback
#define FML_LOG(severity)
UINT GetDpiForHWND(HWND hwnd)
it will be possible to load the file into Perfetto s trace viewer use test Running tests that layout and measure text will not yield consistent results across various platforms Enabling this option will make font resolution default to the Ahem test font on all disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
WindowStateEvent
An event representing a change in window state that may update the.
it will be possible to load the file into Perfetto s trace viewer use test Running tests that layout and measure text will not yield consistent results across various platforms Enabling this option will make font resolution default to the Ahem test font on all disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font manager
UnimplementedNativeViewAccessible * NativeViewAccessible
WINBASEAPI _Check_return_ _Post_equals_last_error_ DWORD WINAPI GetLastError(VOID)