From c2f67c47815a5abe1041dd2bcab093533379c58b Mon Sep 17 00:00:00 2001 From: Danielle McLean Date: Wed, 30 Apr 2025 12:46:17 +1000 Subject: [PATCH 1/2] style: apply formatting fixes to AppKit code --- .../receivers/cocoa/now_playing.py | 3 +- stubs/AppKit/__init__.pyi | 38 +++++++++---------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/mpd_now_playable/receivers/cocoa/now_playing.py b/src/mpd_now_playable/receivers/cocoa/now_playing.py index 602006a..4e60ff3 100644 --- a/src/mpd_now_playable/receivers/cocoa/now_playing.py +++ b/src/mpd_now_playable/receivers/cocoa/now_playing.py @@ -1,7 +1,6 @@ from collections.abc import Callable, Coroutine from typing import Literal -from corefoundationasyncio import CoreFoundationEventLoop from MediaPlayer import ( MPChangePlaybackPositionCommandEvent, MPMusicPlaybackStatePlaying, @@ -12,6 +11,8 @@ from MediaPlayer import ( MPRemoteCommandHandlerStatusSuccess, ) +from corefoundationasyncio import CoreFoundationEventLoop + from ...config.model import CocoaReceiverConfig from ...playback import Playback from ...playback.state import PlaybackState diff --git a/stubs/AppKit/__init__.pyi b/stubs/AppKit/__init__.pyi index 30512c2..e21476e 100644 --- a/stubs/AppKit/__init__.pyi +++ b/stubs/AppKit/__init__.pyi @@ -8,26 +8,26 @@ NSCompositingOperationCopy: Final = 1 NSCompositingOperation = Literal[0, 1] class NSRect: - pass + pass def NSMakeRect(x: float, y: float, w: float, h: float) -> NSRect: ... class NSImage: - @staticmethod - def alloc() -> type[NSImage]: ... - - @staticmethod - def initByReferencingFile_(file: str) -> NSImage: ... - - @staticmethod - def initWithData_(data: bytes) -> NSImage: ... - - @staticmethod - def initWithSize_(size: CGSize) -> NSImage: ... - - def size(self) -> CGSize: ... - - def lockFocus(self) -> None: ... - def unlockFocus(self) -> None: ... - - def drawInRect_fromRect_operation_fraction_(self, inRect: NSRect, fromRect: NSRect, operation: NSCompositingOperation, fraction: float) -> None: ... + @staticmethod + def alloc() -> type[NSImage]: ... + @staticmethod + def initByReferencingFile_(file: str) -> NSImage: ... + @staticmethod + def initWithData_(data: bytes) -> NSImage: ... + @staticmethod + def initWithSize_(size: CGSize) -> NSImage: ... + def size(self) -> CGSize: ... + def lockFocus(self) -> None: ... + def unlockFocus(self) -> None: ... + def drawInRect_fromRect_operation_fraction_( + self, + inRect: NSRect, + fromRect: NSRect, + operation: NSCompositingOperation, + fraction: float, + ) -> None: ... From 28748df3c16bd7361be6b334840191cbeebbb8ff Mon Sep 17 00:00:00 2001 From: Danielle McLean Date: Wed, 30 Apr 2025 12:46:47 +1000 Subject: [PATCH 2/2] feat: hide running Cocoa receiver from the Dock --- src/mpd_now_playable/receivers/cocoa/now_playing.py | 4 ++++ stubs/AppKit/__init__.pyi | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/mpd_now_playable/receivers/cocoa/now_playing.py b/src/mpd_now_playable/receivers/cocoa/now_playing.py index 4e60ff3..83ba472 100644 --- a/src/mpd_now_playable/receivers/cocoa/now_playing.py +++ b/src/mpd_now_playable/receivers/cocoa/now_playing.py @@ -1,6 +1,7 @@ from collections.abc import Callable, Coroutine from typing import Literal +from AppKit import NSApplication, NSApplicationActivationPolicyAccessory from MediaPlayer import ( MPChangePlaybackPositionCommandEvent, MPMusicPlaybackStatePlaying, @@ -42,6 +43,9 @@ class CocoaNowPlayingReceiver(Receiver): pass async def start(self, player: Player) -> None: + NSApplication.sharedApplication().setActivationPolicy_( + NSApplicationActivationPolicyAccessory + ) self.cmd_center = MPRemoteCommandCenter.sharedCommandCenter() self.info_center = MPNowPlayingInfoCenter.defaultCenter() diff --git a/stubs/AppKit/__init__.pyi b/stubs/AppKit/__init__.pyi index e21476e..50b8fcc 100644 --- a/stubs/AppKit/__init__.pyi +++ b/stubs/AppKit/__init__.pyi @@ -2,6 +2,16 @@ from typing import Final, Literal from Foundation import CGSize +NSApplicationActivationPolicyRegular: Final = 0 +NSApplicationActivationPolicyAccessory: Final = 1 +NSApplicationActivationPolicyProhibited: Final = 2 +NSApplicationActivationPolicy = Literal[0, 1, 2] + +class NSApplication: + @staticmethod + def sharedApplication() -> NSApplication: ... + def setActivationPolicy_(self, policy: NSApplicationActivationPolicy) -> bool: ... + # There are many other operations available but we only actually use copy, so we don't need all of them here. NSCompositingOperationClear: Final = 0 NSCompositingOperationCopy: Final = 1