JMichaelTX
6/25/2013 - 11:09 PM

AppleScript to save and restore window position and sizes.

AppleScript to save and restore window position and sizes.


-- 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