API Какао продолжает сбрасывать наш NSCursor - PullRequest
0 голосов
/ 18 сентября 2018

У нас есть приложение, которое имеет полноэкранный видеоплеер, и можно вызвать всплывающее окно (паллету), чтобы предоставить пользователям инструменты для изменения видео, есть только один вид для воспроизведения видео, и все рисование происходит там,это подкласс 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] и исправить это вместо этого.

...