From cdbab01c2d8ff76b830f007eeab2b4b8b9b11e03 Mon Sep 17 00:00:00 2001 From: rich2014 Date: Sat, 10 Jun 2023 23:05:36 +0800 Subject: [PATCH] Cocoa: Cursor: Improve support for Window/Application switching --- lcl/interfaces/cocoa/cocoawindows.pas | 4 +++- lcl/interfaces/cocoa/cocoawscommon.pas | 30 +++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/lcl/interfaces/cocoa/cocoawindows.pas b/lcl/interfaces/cocoa/cocoawindows.pas index de82fc21dc..b66031a532 100644 --- a/lcl/interfaces/cocoa/cocoawindows.pas +++ b/lcl/interfaces/cocoa/cocoawindows.pas @@ -27,7 +27,7 @@ uses Types, Classes, SysUtils, CGGeometry, // Libs - MacOSAll, CocoaAll, CocoaUtils, CocoaGDIObjects, + MacOSAll, CocoaAll, CocoaUtils, CocoaWScommon, cocoa_extra, CocoaPrivate, CocoaTextEdits, CocoaScrollers, // LCL //Forms, @@ -776,6 +776,8 @@ begin and Assigned(contentView) and (contentView.isKindOfClass(TCocoaWindowContent)) then self.makeFirstResponder( TCocoaWindowContent(contentView).documentView ); + + CursorHelper.SetCursorOnActive; end; procedure TCocoaWindow.windowDidResignKey(notification: NSNotification); diff --git a/lcl/interfaces/cocoa/cocoawscommon.pas b/lcl/interfaces/cocoa/cocoawscommon.pas index 3c4b9615a7..d8e272c1f1 100644 --- a/lcl/interfaces/cocoa/cocoawscommon.pas +++ b/lcl/interfaces/cocoa/cocoawscommon.pas @@ -12,7 +12,7 @@ uses CGGeometry, CocoaAll, cocoa_extra, Classes, Controls, SysUtils, // - WSControls, LCLType, LMessages, LCLProc, Graphics, Forms, + WSControls, LCLType, LMessages, LCLProc, LCLIntf, Graphics, Forms, CocoaPrivate, CocoaGDIObjects, CocoaCaret, CocoaUtils, LCLMessageGlue, CocoaScrollers; @@ -20,7 +20,11 @@ type { TCursorHelper } TCursorHelper = class + private + procedure CallSetCurrentControlCursor( data:IntPtr ); public + class procedure SetCursorOnActive; + class procedure SetCurrentControlCursor; class procedure SetScreenCursor; class procedure SetScreenCursorWhenNotDefault; end; @@ -356,6 +360,30 @@ end; { TCursorHelper } +procedure TCursorHelper.CallSetCurrentControlCursor( data:IntPtr ); +begin + SetCurrentControlCursor; +end; + +class procedure TCursorHelper.SetCursorOnActive; +begin + if Screen.Cursor<>crDefault then + SetScreenCursor + else + Application.QueueAsyncCall( @CursorHelper.CallSetCurrentControlCursor, 0 ); +end; + +class procedure TCursorHelper.SetCurrentControlCursor; +var + P: TPoint; + control: TControl; +begin + GetCursorPos(P); + control:= FindControlAtPosition(P, true);; + if Assigned(control) then + TCocoaCursor(Screen.Cursors[control.Cursor]).SetCursor; +end; + class procedure TCursorHelper.SetScreenCursor; begin TCocoaCursor(Screen.Cursors[Screen.Cursor]).SetCursor;