fix: macOS tray button selection with VoiceOver (#39352)

This commit is contained in:
Shelley Vohr 2023-08-07 09:52:18 +02:00 коммит произвёл GitHub
Родитель 1eb6e45a36
Коммит dc707ee938
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
1 изменённых файлов: 25 добавлений и 1 удалений

Просмотреть файл

@ -54,7 +54,12 @@
NSStatusItem* item = [[NSStatusBar systemStatusBar]
statusItemWithLength:NSVariableStatusItemLength];
statusItem_ = item;
[[statusItem_ button] addSubview:self]; // inject custom view
[[statusItem_ button] addSubview:self];
// We need to set the target and action on the button, otherwise
// VoiceOver doesn't know where to send the select action.
[[statusItem_ button] setTarget:self];
[[statusItem_ button] setAction:@selector(mouseDown:)];
[self updateDimensions];
}
return self;
@ -190,6 +195,25 @@
}
- (void)mouseDown:(NSEvent*)event {
// If |event| does not respond to locationInWindow, we've
// arrived here from VoiceOver, which does not pass an event.
// Create a synthetic event to pass to the click handler.
if (![event respondsToSelector:@selector(locationInWindow)]) {
event = [NSEvent mouseEventWithType:NSEventTypeRightMouseDown
location:NSMakePoint(0, 0)
modifierFlags:0
timestamp:NSApp.currentEvent.timestamp
windowNumber:0
context:nil
eventNumber:0
clickCount:1
pressure:1.0];
// We also need to explicitly call the click handler here, since
// VoiceOver won't trigger mouseUp.
[self handleClickNotifications:event];
}
trayIcon_->NotifyMouseDown(
gfx::ScreenPointFromNSPoint([event locationInWindow]),
ui::EventFlagsFromModifiers([event modifierFlags]));