API Какао продолжает сбрасывать NSCursor
У нас есть приложение, которое имеет полноэкранный видеоплеер, и можно вызвать всплывающее окно (паллету), чтобы дать пользователям инструменты для изменения видео, есть только один вид для воспроизведения видео, и все рисование происходит там, это NSOpenGLView. подкласс. Если пользователь нажимает на кнопку в палитре, а затем перемещает палитру в вид видео, мы используем mouseEntered: чтобы обновить курсор -[NSCursor set] до единицы, чтобы отразить, что пользователь рисует, но примерно через секунду после, Какао установить курсор обратно на курсор стрелки.
Я создал символическую точку останова -[NSCursor set], чтобы увидеть, откуда это исходит, и это стек вызовов, который я получаю.
0 ??? 0x000000010cade785 0x0 + 4507690885,
1 Periscope HiDef4 0x00000001001d3f70 main + 0,
2 AppKit 0x00007fff4da7c55e __37+[NSDisplayCycle currentDisplayCycle]_block_invoke + 695,
3 QuartzCore 0x00007fff5b73b8c7 _ZN2CA11Transaction19run_commit_handlersE18CATransactionPhase + 49,
4 QuartzCore 0x00007fff5b73a389 _ZN2CA11Transaction6commitEv + 171,
5 AppKit 0x00007fff4e234a72 __65+[CATransaction(NSCATransaction) NS_setFlushesWithDisplayRefresh]_block_invoke + 283,
6 CoreFoundation 0x00007fff503ca737 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23,
7 CoreFoundation 0x00007fff503ca65f __CFRunLoopDoObservers + 511,
8 CoreFoundation 0x00007fff503ad128 __CFRunLoopRun + 1240,
9 CoreFoundation 0x00007fff503ac9b7 CFRunLoopRunSpecific + 487,
10 HIToolbox 0x00007fff4f68cd96 RunCurrentEventLoopInMode + 286,
11 HIToolbox 0x00007fff4f68cb06 ReceiveNextEventCommon + 613,
12 HIToolbox 0x00007fff4f68c884 _BlockUntilNextEventMatchingListInModeWithFilter + 64,
13 AppKit 0x00007fff4d93da73 _DPSNextEvent + 2085,
14 AppKit 0x00007fff4e0d3e34 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 3044,
15 AppKit 0x00007fff4d932885 -[NSApplication run] + 764,
16 AppKit 0x00007fff4d901a72 NSApplicationMain + 804,
17 Periscope HiDef4 0x00000001001d3f92 main + 34,
18 libdyld.dylib 0x00007fff7828a015 start + 1,
19 ??? 0x0000000000000003 0x0 + 3
Я попытался изменить реализацию с использованием -[NSCursor set] и mouseEntered: events на -[NSView addCursorRect:cursor:] с прямоугольником всех границ представления, но это не установило бы курсор вообще, возможно, потому что мы используем подкласс NSOpenGLView?
Странно то, что курсор не всегда сбрасывается, если вы нажмете кнопку и сделаете паузу, а затем переместитесь с паллеты, мы не получим -[NSCursor set] с указанным выше стеком, это только если вы двинетесь сразу, это возможно Это связано с изменением курсора рамки окна для изменения поддона, но я не уверен.
Я придумал хакерское решение использования mouseMoved: проверить курсор так, как он должен быть, но он работает только в том случае, если пользователь перемещает курсор, и я предпочел бы понять, почему я получил нежелательные -[NSCursor set] и исправить это вместо этого.