<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:media="http://search.yahoo.com/mrss/"

	>
<channel>
	<title>
	Comments on: How to make a macOS screen saver	</title>
	<atom:link href="https://wadetregaskis.com/how-to-make-a-macos-screen-saver/feed/" rel="self" type="application/rss+xml" />
	<link>https://wadetregaskis.com/how-to-make-a-macos-screen-saver/</link>
	<description></description>
	<lastBuildDate>Mon, 29 Dec 2025 06:42:22 +0000</lastBuildDate>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>
		By: Ralph Caraveo		</title>
		<link>https://wadetregaskis.com/how-to-make-a-macos-screen-saver/#comment-6145</link>

		<dc:creator><![CDATA[Ralph Caraveo]]></dc:creator>
		<pubDate>Mon, 29 Dec 2025 06:42:22 +0000</pubDate>
		<guid isPermaLink="false">https://wadetregaskis.com/?p=8580#comment-6145</guid>

					<description><![CDATA[Great timing on finding this article. I was trying to get a screensaver working recently and was getting so frustrated with encountering these issues.

Two things I’ll say:

1.  these workarounds are great and I think it would be nice to encapsulate the logic in a community base class that has these fixes bootstrapped and ready to go. Basically a subclass of ScreenSaverView with these hooks in place.

2. I feel like it might be time to also consider abandoning ScreenSaverView entirely because a screen saver is nothing more than a background process that opens a full screen app after an idle timeout. Maybe that’s just the way going forward since Apple doesn’t seem interested in fixing anything.]]></description>
			<content:encoded><![CDATA[<p>Great timing on finding this article. I was trying to get a screensaver working recently and was getting so frustrated with encountering these issues.</p>
<p>Two things I’ll say:</p>
<p>1.  these workarounds are great and I think it would be nice to encapsulate the logic in a community base class that has these fixes bootstrapped and ready to go. Basically a subclass of ScreenSaverView with these hooks in place.</p>
<p>2. I feel like it might be time to also consider abandoning ScreenSaverView entirely because a screen saver is nothing more than a background process that opens a full screen app after an idle timeout. Maybe that’s just the way going forward since Apple doesn’t seem interested in fixing anything.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: Cwizou		</title>
		<link>https://wadetregaskis.com/how-to-make-a-macos-screen-saver/#comment-6063</link>

		<dc:creator><![CDATA[Cwizou]]></dc:creator>
		<pubDate>Sat, 13 Dec 2025 19:16:23 +0000</pubDate>
		<guid isPermaLink="false">https://wadetregaskis.com/?p=8580#comment-6063</guid>

					<description><![CDATA[Thanks for the shoutout, however some of the information in that stackoverflow post is outdated, not all events are sent nowadays depending on the version of macOS... 

And maybe just to clarify, savers are not apps. Historically, savers were plugins (as in, a bunch of code another app can load, think .dll for the Windows people) for ScreenSaverEngine. Apple however deprecated all plugins a while ago in favor of the (truly) safer app extension format. Except screensavers were left in the dust. So they came up with that magical solution of legacyScreenSaver.appex which tries to emulate the old API but as you&#039;ve seen, fails progressively more and more at each major release of macOS. 

So nowadays, a .saver is a plugin to an app extension (legacyScreenSaver.appex) to ScreenSaverEngine. Yay. Apple does have a private api for making appex screensaver, which it sometimes uses (or sometimes it bypasses the legacyScreenSaver requirement, because why not).  

I&#039;m pointing this out because of your title on handing resume. In practice, each screen, every time you launch the screensaver (or System Settings) creates an instance of the class in your bundle. As you pointed out, those will remain active (never get stopped or destroyed since Sonoma), and Tahoe makes this worse. System settings will (wrongfully) start 2 instances of your saver if you dare to open the ScreenSaver panel hidden inside Wallpapers. And it will not kill both (nor stop them, and here the stopAnimation trick is not sufficient). 

There are tons of other issues regarding killing your own instance, depending on when you do it and various hardware, it will bring black screen issues. It may be safer to have stubs (what you call lameducks) laying around forever. And I didn&#039;t even mention the multi monitor issues where legacyScreenSaver mixes up your screens. 

Maintaining a third party macOS screensaver is needlessly impossible at this point, and it&#039;s just a pain. I keep filing radars and try to raise the issue with DTS at every WWDC, and while they all acknowledge this is really bad, nothing ever changes. I try and maintain a minimal swift screensaver template (https://github.com/AerialScreensaver/ScreenSaverMinimal) with the various workarounds, but the not caring as you put it, is truly maddening.]]></description>
			<content:encoded><![CDATA[<p>Thanks for the shoutout, however some of the information in that stackoverflow post is outdated, not all events are sent nowadays depending on the version of macOS&#8230; </p>
<p>And maybe just to clarify, savers are not apps. Historically, savers were plugins (as in, a bunch of code another app can load, think .dll for the Windows people) for ScreenSaverEngine. Apple however deprecated all plugins a while ago in favor of the (truly) safer app extension format. Except screensavers were left in the dust. So they came up with that magical solution of legacyScreenSaver.appex which tries to emulate the old API but as you&#8217;ve seen, fails progressively more and more at each major release of macOS. </p>
<p>So nowadays, a .saver is a plugin to an app extension (legacyScreenSaver.appex) to ScreenSaverEngine. Yay. Apple does have a private api for making appex screensaver, which it sometimes uses (or sometimes it bypasses the legacyScreenSaver requirement, because why not).  </p>
<p>I&#8217;m pointing this out because of your title on handing resume. In practice, each screen, every time you launch the screensaver (or System Settings) creates an instance of the class in your bundle. As you pointed out, those will remain active (never get stopped or destroyed since Sonoma), and Tahoe makes this worse. System settings will (wrongfully) start 2 instances of your saver if you dare to open the ScreenSaver panel hidden inside Wallpapers. And it will not kill both (nor stop them, and here the stopAnimation trick is not sufficient). </p>
<p>There are tons of other issues regarding killing your own instance, depending on when you do it and various hardware, it will bring black screen issues. It may be safer to have stubs (what you call lameducks) laying around forever. And I didn&#8217;t even mention the multi monitor issues where legacyScreenSaver mixes up your screens. </p>
<p>Maintaining a third party macOS screensaver is needlessly impossible at this point, and it&#8217;s just a pain. I keep filing radars and try to raise the issue with DTS at every WWDC, and while they all acknowledge this is really bad, nothing ever changes. I try and maintain a minimal swift screensaver template (<a href="https://github.com/AerialScreensaver/ScreenSaverMinimal" rel="nofollow ugc external noopener" data-wpel-link="external" target="_blank">https://github.com/AerialScreensaver/ScreenSaverMinimal</a>) with the various workarounds, but the not caring as you put it, is truly maddening.</p>
]]></content:encoded>
		
			</item>
		<item>
		<title>
		By: xmddmx		</title>
		<link>https://wadetregaskis.com/how-to-make-a-macos-screen-saver/#comment-6058</link>

		<dc:creator><![CDATA[xmddmx]]></dc:creator>
		<pubDate>Fri, 12 Dec 2025 22:31:49 +0000</pubDate>
		<guid isPermaLink="false">https://wadetregaskis.com/?p=8580#comment-6058</guid>

					<description><![CDATA[Yep.  Apple managed to totally break the new &quot;legacyScreenSaver&quot; in Sonoma, again in Sequoia, and again in Tahoe.    It&#039;s amazing, because one would assume the &quot;legacy&quot; engine would implement the API as written.  Nope!

Through several rounds of group effort, we managed to un-tangle the mess and come up with a ton of workarounds.   

One particular fix we came up with is that it&#039;s better to call exit(0) instead of NSApplication.shared.terminate.

Please read the thread here: https://github.com/JohnCoates/Aerial/issues/1396  for the gory details.  There are links in that thread to Apple Developer forum posts which are also interesting - at least one Apple employee knows the situation is a mess.]]></description>
			<content:encoded><![CDATA[<p>Yep.  Apple managed to totally break the new &#8220;legacyScreenSaver&#8221; in Sonoma, again in Sequoia, and again in Tahoe.    It&#8217;s amazing, because one would assume the &#8220;legacy&#8221; engine would implement the API as written.  Nope!</p>
<p>Through several rounds of group effort, we managed to un-tangle the mess and come up with a ton of workarounds.   </p>
<p>One particular fix we came up with is that it&#8217;s better to call exit(0) instead of NSApplication.shared.terminate.</p>
<p>Please read the thread here: <a href="https://github.com/JohnCoates/Aerial/issues/1396" rel="nofollow ugc external noopener" data-wpel-link="external" target="_blank">https://github.com/JohnCoates/Aerial/issues/1396</a>  for the gory details.  There are links in that thread to Apple Developer forum posts which are also interesting &#8211; at least one Apple employee knows the situation is a mess.</p>
]]></content:encoded>
		
			</item>
	</channel>
</rss>
