in patched-vscode/src/vs/workbench/browser/parts/notifications/notificationsCommands.ts [94:343]
export function registerNotificationCommands(center: INotificationsCenterController, toasts: INotificationsToastController, model: NotificationsModel): void {
// Show Notifications Cneter
KeybindingsRegistry.registerCommandAndKeybindingRule({
id: SHOW_NOTIFICATIONS_CENTER,
weight: KeybindingWeight.WorkbenchContrib,
primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KeyK, KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KeyN),
handler: () => {
toasts.hide();
center.show();
}
});
// Hide Notifications Center
KeybindingsRegistry.registerCommandAndKeybindingRule({
id: HIDE_NOTIFICATIONS_CENTER,
weight: KeybindingWeight.WorkbenchContrib + 50,
when: NotificationsCenterVisibleContext,
primary: KeyCode.Escape,
handler: accessor => {
const telemetryService = accessor.get(ITelemetryService);
for (const notification of model.notifications) {
if (notification.visible) {
telemetryService.publicLog2<NotificationMetrics, NotificationMetricsClassification>('notification:hide', notificationToMetrics(notification.message.original, notification.sourceId, notification.priority === NotificationPriority.SILENT));
}
}
center.hide();
}
});
// Toggle Notifications Center
CommandsRegistry.registerCommand(TOGGLE_NOTIFICATIONS_CENTER, () => {
if (center.isVisible) {
center.hide();
} else {
toasts.hide();
center.show();
}
});
// Clear Notification
KeybindingsRegistry.registerCommandAndKeybindingRule({
id: CLEAR_NOTIFICATION,
weight: KeybindingWeight.WorkbenchContrib,
when: NotificationFocusedContext,
primary: KeyCode.Delete,
mac: {
primary: KeyMod.CtrlCmd | KeyCode.Backspace
},
handler: (accessor, args?) => {
const accessibilitySignalService = accessor.get(IAccessibilitySignalService);
const notification = getNotificationFromContext(accessor.get(IListService), args);
if (notification && !notification.hasProgress) {
notification.close();
accessibilitySignalService.playSignal(AccessibilitySignal.clear);
}
}
});
// Expand Notification
KeybindingsRegistry.registerCommandAndKeybindingRule({
id: EXPAND_NOTIFICATION,
weight: KeybindingWeight.WorkbenchContrib,
when: NotificationFocusedContext,
primary: KeyCode.RightArrow,
handler: (accessor, args?) => {
const notification = getNotificationFromContext(accessor.get(IListService), args);
notification?.expand();
}
});
// Accept Primary Action
KeybindingsRegistry.registerCommandAndKeybindingRule({
id: ACCEPT_PRIMARY_ACTION_NOTIFICATION,
weight: KeybindingWeight.WorkbenchContrib,
when: ContextKeyExpr.or(NotificationFocusedContext, NotificationsToastsVisibleContext),
primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KeyA,
handler: (accessor) => {
const actionRunner = accessor.get(IInstantiationService).createInstance(NotificationActionRunner);
const notification = getNotificationFromContext(accessor.get(IListService)) || firstOrDefault(model.notifications);
if (!notification) {
return;
}
const primaryAction = notification.actions?.primary ? firstOrDefault(notification.actions.primary) : undefined;
if (!primaryAction) {
return;
}
actionRunner.run(primaryAction, notification);
notification.close();
}
});
// Collapse Notification
KeybindingsRegistry.registerCommandAndKeybindingRule({
id: COLLAPSE_NOTIFICATION,
weight: KeybindingWeight.WorkbenchContrib,
when: NotificationFocusedContext,
primary: KeyCode.LeftArrow,
handler: (accessor, args?) => {
const notification = getNotificationFromContext(accessor.get(IListService), args);
notification?.collapse();
}
});
// Toggle Notification
KeybindingsRegistry.registerCommandAndKeybindingRule({
id: TOGGLE_NOTIFICATION,
weight: KeybindingWeight.WorkbenchContrib,
when: NotificationFocusedContext,
primary: KeyCode.Space,
secondary: [KeyCode.Enter],
handler: accessor => {
const notification = getNotificationFromContext(accessor.get(IListService));
notification?.toggle();
}
});
// Hide Toasts
CommandsRegistry.registerCommand(HIDE_NOTIFICATION_TOAST, accessor => {
const telemetryService = accessor.get(ITelemetryService);
for (const notification of model.notifications) {
if (notification.visible) {
telemetryService.publicLog2<NotificationMetrics, NotificationMetricsClassification>('notification:hide', notificationToMetrics(notification.message.original, notification.sourceId, notification.priority === NotificationPriority.SILENT));
}
}
toasts.hide();
});
KeybindingsRegistry.registerKeybindingRule({
id: HIDE_NOTIFICATION_TOAST,
weight: KeybindingWeight.WorkbenchContrib - 50, // lower when not focused (e.g. let editor suggest win over this command)
when: NotificationsToastsVisibleContext,
primary: KeyCode.Escape
});
KeybindingsRegistry.registerKeybindingRule({
id: HIDE_NOTIFICATION_TOAST,
weight: KeybindingWeight.WorkbenchContrib + 100, // higher when focused
when: ContextKeyExpr.and(NotificationsToastsVisibleContext, NotificationFocusedContext),
primary: KeyCode.Escape
});
// Focus Toasts
CommandsRegistry.registerCommand(FOCUS_NOTIFICATION_TOAST, () => toasts.focus());
// Focus Next Toast
KeybindingsRegistry.registerCommandAndKeybindingRule({
id: FOCUS_NEXT_NOTIFICATION_TOAST,
weight: KeybindingWeight.WorkbenchContrib,
when: ContextKeyExpr.and(NotificationFocusedContext, NotificationsToastsVisibleContext),
primary: KeyCode.DownArrow,
handler: () => {
toasts.focusNext();
}
});
// Focus Previous Toast
KeybindingsRegistry.registerCommandAndKeybindingRule({
id: FOCUS_PREVIOUS_NOTIFICATION_TOAST,
weight: KeybindingWeight.WorkbenchContrib,
when: ContextKeyExpr.and(NotificationFocusedContext, NotificationsToastsVisibleContext),
primary: KeyCode.UpArrow,
handler: () => {
toasts.focusPrevious();
}
});
// Focus First Toast
KeybindingsRegistry.registerCommandAndKeybindingRule({
id: FOCUS_FIRST_NOTIFICATION_TOAST,
weight: KeybindingWeight.WorkbenchContrib,
when: ContextKeyExpr.and(NotificationFocusedContext, NotificationsToastsVisibleContext),
primary: KeyCode.PageUp,
secondary: [KeyCode.Home],
handler: () => {
toasts.focusFirst();
}
});
// Focus Last Toast
KeybindingsRegistry.registerCommandAndKeybindingRule({
id: FOCUS_LAST_NOTIFICATION_TOAST,
weight: KeybindingWeight.WorkbenchContrib,
when: ContextKeyExpr.and(NotificationFocusedContext, NotificationsToastsVisibleContext),
primary: KeyCode.PageDown,
secondary: [KeyCode.End],
handler: () => {
toasts.focusLast();
}
});
// Clear All Notifications
CommandsRegistry.registerCommand(CLEAR_ALL_NOTIFICATIONS, () => center.clearAll());
// Toggle Do Not Disturb Mode
CommandsRegistry.registerCommand(TOGGLE_DO_NOT_DISTURB_MODE, accessor => {
const notificationService = accessor.get(INotificationService);
notificationService.setFilter(notificationService.getFilter() === NotificationsFilter.ERROR ? NotificationsFilter.OFF : NotificationsFilter.ERROR);
});
// Configure Do Not Disturb by Source
CommandsRegistry.registerCommand(TOGGLE_DO_NOT_DISTURB_MODE_BY_SOURCE, accessor => {
const notificationService = accessor.get(INotificationService);
const quickInputService = accessor.get(IQuickInputService);
const sortedFilters = notificationService.getFilters().sort((a, b) => a.label.localeCompare(b.label));
const disposables = new DisposableStore();
const picker = disposables.add(quickInputService.createQuickPick<IQuickPickItem & INotificationSourceFilter>());
picker.items = sortedFilters.map(source => ({
id: source.id,
label: source.label,
tooltip: `${source.label} (${source.id})`,
filter: source.filter
}));
picker.canSelectMany = true;
picker.placeholder = localize('selectSources', "Select sources to enable all notifications from");
picker.selectedItems = picker.items.filter(item => (item as INotificationSourceFilter).filter === NotificationsFilter.OFF) as (IQuickPickItem & INotificationSourceFilter)[];
picker.show();
disposables.add(picker.onDidAccept(async () => {
for (const item of picker.items as (IQuickPickItem & INotificationSourceFilter)[]) {
notificationService.setFilter({
id: item.id,
label: item.label,
filter: picker.selectedItems.includes(item) ? NotificationsFilter.OFF : NotificationsFilter.ERROR
});
}
picker.hide();
}));
disposables.add(picker.onDidHide(() => disposables.dispose()));
});
// Commands for Command Palette
const category = localize2('notifications', 'Notifications');
MenuRegistry.appendMenuItem(MenuId.CommandPalette, { command: { id: SHOW_NOTIFICATIONS_CENTER, title: localize2('showNotifications', 'Show Notifications'), category } });
MenuRegistry.appendMenuItem(MenuId.CommandPalette, { command: { id: HIDE_NOTIFICATIONS_CENTER, title: localize2('hideNotifications', 'Hide Notifications'), category }, when: NotificationsCenterVisibleContext });
MenuRegistry.appendMenuItem(MenuId.CommandPalette, { command: { id: CLEAR_ALL_NOTIFICATIONS, title: localize2('clearAllNotifications', 'Clear All Notifications'), category } });
MenuRegistry.appendMenuItem(MenuId.CommandPalette, { command: { id: ACCEPT_PRIMARY_ACTION_NOTIFICATION, title: localize2('acceptNotificationPrimaryAction', 'Accept Notification Primary Action'), category } });
MenuRegistry.appendMenuItem(MenuId.CommandPalette, { command: { id: TOGGLE_DO_NOT_DISTURB_MODE, title: localize2('toggleDoNotDisturbMode', 'Toggle Do Not Disturb Mode'), category } });
MenuRegistry.appendMenuItem(MenuId.CommandPalette, { command: { id: TOGGLE_DO_NOT_DISTURB_MODE_BY_SOURCE, title: localize2('toggleDoNotDisturbModeBySource', 'Toggle Do Not Disturb Mode By Source...'), category } });
MenuRegistry.appendMenuItem(MenuId.CommandPalette, { command: { id: FOCUS_NOTIFICATION_TOAST, title: localize2('focusNotificationToasts', 'Focus Notification Toast'), category }, when: NotificationsToastsVisibleContext });
}