Last active
November 2, 2024 17:41
-
-
Save cmackay/5863257 to your computer and use it in GitHub Desktop.
AppleScript to save and restore window position and sizes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- allSettings is a list of records containing {width:? height:? apps:{{name:? pos:? size:?},...} | |
-- for each display setup store the apps and their associated position and size | |
property allSettings : {} | |
-- create a variable for the current settings | |
set currentSettings to {} | |
display dialog "Restore or save window settings?" buttons {"Restore", "Save"} default button "Restore" | |
set dialogResult to result | |
tell application "Finder" | |
-- use the desktop bounds to determine display config | |
set desktopBounds to bounds of window of desktop | |
set desktopWidth to item 3 of desktopBounds | |
set desktopHeight to item 4 of desktopBounds | |
set desktopResolution to desktopWidth & "x" & desktopHeight | |
-- find the saved settings for the display config | |
repeat with i from 1 to (count of allSettings) | |
if (w of item i of allSettings is desktopWidth) and (h of item i of allSettings is desktopHeight) then | |
set currentSettings to item i of allSettings | |
end if | |
end repeat | |
if (count of currentSettings) is 0 then | |
-- add the current display settings to the stored settings | |
set currentSettings to {w:desktopWidth, h:desktopHeight, apps:{}} | |
set end of allSettings to currentSettings | |
--say "creating new config for " & desktopResolution | |
else | |
--say "found config for " & desktopResolution | |
end if | |
end tell | |
tell application "System Events" | |
if (button returned of dialogResult is "Save") then | |
say "saving" | |
repeat with p in every process | |
if background only of p is false then | |
tell application "System Events" to tell application process (name of p as string) | |
set appName to name of p | |
if (count of windows) > 0 then | |
set appSize to size of window 1 | |
set appPosition to position of window 1 | |
else | |
set appSize to 0 | |
set appPosition to 0 | |
end if | |
set appSettings to {} | |
repeat with i from 1 to (count of apps of currentSettings) | |
if name of item i of apps of currentSettings is name of p then | |
set appSettings to item i of apps of currentSettings | |
end if | |
end repeat | |
if (count of appSettings) is 0 then | |
set appSettings to {name:appName, position:appPosition, size:appSize} | |
set end of apps of currentSettings to appSettings | |
else | |
set position of appSettings to appPosition | |
set size of appSettings to appSize | |
end if | |
end tell | |
end if | |
end repeat | |
end if | |
if (button returned of dialogResult is "Restore") then | |
if (count of apps of currentSettings) is 0 then | |
say "no window settings were found" | |
else | |
say "restoring" | |
repeat with i from 1 to (count of apps of currentSettings) | |
set appSettings to item i of apps of currentSettings | |
set appName to (name of appSettings as string) | |
try | |
tell application "System Events" to tell application process appName | |
if (count of windows) > 0 then | |
set position of window 1 to position of appSettings | |
set size of window 1 to size of appSettings | |
end if | |
end tell | |
end try | |
end repeat | |
end if | |
end if | |
end tell | |
It's 2024 and I'm running Sonoma and this script is working fine! Thank you for sharing it.
Glad to hear it still works and is helpful! 😊
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I haven't used that in many years. I currently use the Moom app to keep track of window positions. Good luck with it.