macOS: add ability to show subtitles in notifications

This used to be implemented before 4e3c6e52aa, when the now deprecated notifications framework was still being used.
Implement it again for feature parity.
This commit is contained in:
Luflosi 2020-09-28 12:17:26 +02:00
parent d3d2930bd2
commit 7c4ad278d5
No known key found for this signature in database
GPG key ID: 4E41E29EDCC345D0
4 changed files with 18 additions and 13 deletions

View file

@ -1569,7 +1569,7 @@ def send_test_notification(self) -> None:
from .notify import notify
now = monotonic()
ident = f'test-notify-{now}'
notify(f'Test {now}', f'At: {now}', identifier=ident)
notify(f'Test {now}', f'At: {now}', identifier=ident, subtitle=f'Test subtitle {now}')
def notification_activated(self, identifier: str, window_id: int, focus: bool, report: bool) -> None:
w = self.window_id_map.get(window_id)

View file

@ -156,13 +156,14 @@ - (void)userNotificationCenter:(UNUserNotificationCenter *)center
static void
schedule_notification(const char *identifier, const char *title, const char *body) {
schedule_notification(const char *identifier, const char *title, const char *body, const char *subtitle) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
if (!center) return;
// Configure the notification's payload.
UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
if (title) content.title = @(title);
if (body) content.body = @(body);
if (subtitle) content.subtitle = @(subtitle);
// Deliver the notification
static unsigned long counter = 1;
UNNotificationRequest* request = [
@ -178,7 +179,7 @@ - (void)userNotificationCenter:(UNUserNotificationCenter *)center
typedef struct {
char *identifier, *title, *body;
char *identifier, *title, *body, *subtitle;
} QueuedNotification;
typedef struct {
@ -188,12 +189,13 @@ - (void)userNotificationCenter:(UNUserNotificationCenter *)center
static NotificationQueue notification_queue = {0};
static void
queue_notification(const char *identifier, const char *title, const char* body) {
queue_notification(const char *identifier, const char *title, const char* body, const char* subtitle) {
ensure_space_for((&notification_queue), notifications, QueuedNotification, notification_queue.count + 16, capacity, 16, true);
QueuedNotification *n = notification_queue.notifications + notification_queue.count++;
n->identifier = identifier ? strdup(identifier) : NULL;
n->title = title ? strdup(title) : NULL;
n->body = body ? strdup(body) : NULL;
n->subtitle = subtitle ? strdup(subtitle) : NULL;
}
static void
@ -201,13 +203,13 @@ - (void)userNotificationCenter:(UNUserNotificationCenter *)center
if (granted) {
for (size_t i = 0; i < notification_queue.count; i++) {
QueuedNotification *n = notification_queue.notifications + i;
schedule_notification(n->identifier, n->title, n->body);
schedule_notification(n->identifier, n->title, n->body, n->subtitle);
}
}
while(notification_queue.count) {
QueuedNotification *n = notification_queue.notifications + --notification_queue.count;
free(n->identifier); free(n->title); free(n->body);
n->identifier = NULL; n->title = NULL; n->body = NULL;
free(n->identifier); free(n->title); free(n->body); free(n->subtitle);
n->identifier = NULL; n->title = NULL; n->body = NULL; n->subtitle = NULL;
}
}
@ -221,13 +223,13 @@ - (void)userNotificationCenter:(UNUserNotificationCenter *)center
static PyObject*
cocoa_send_notification(PyObject *self UNUSED, PyObject *args) {
char *identifier = NULL, *title = NULL, *body = NULL;
if (!PyArg_ParseTuple(args, "zsz", &identifier, &title, &body)) return NULL;
char *identifier = NULL, *title = NULL, *body = NULL, *subtitle = NULL;
if (!PyArg_ParseTuple(args, "zsz|z", &identifier, &title, &body, &subtitle)) return NULL;
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
if (!center) Py_RETURN_NONE;
if (!center.delegate) center.delegate = [[NotificationDelegate alloc] init];
queue_notification(identifier, title, body);
queue_notification(identifier, title, body, subtitle);
[center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert)
completionHandler:^(BOOL granted, NSError * _Nullable error) {

View file

@ -520,6 +520,7 @@ def cocoa_send_notification(
identifier: Optional[str],
title: str,
body: Optional[str],
subtitle: Optional[str],
) -> None:
pass

View file

@ -20,9 +20,10 @@ def notify(
timeout: int = 5000,
application: str = 'kitty',
icon: bool = True,
identifier: Optional[str] = None
identifier: Optional[str] = None,
subtitle: Optional[str] = None,
) -> None:
cocoa_send_notification(identifier, title, body)
cocoa_send_notification(identifier, title, body, subtitle)
else:
@ -48,7 +49,8 @@ def notify(
timeout: int = -1,
application: str = 'kitty',
icon: bool = True,
identifier: Optional[str] = None
identifier: Optional[str] = None,
subtitle: Optional[str] = None,
) -> None:
icf = ''
if icon is True: