Home > Apple, Hacks, Mac OS X, Scripts > Restore Previous Display Window Positions AppleScript

Restore Previous Display Window Positions AppleScript

February 4th, 2009

This AppleScript is sort of a hack to restore window positions after removing/adding an external display, similar my other script to move all windows to the main screen. You should run it before you disconnect the display, then again when you reconnect it. It’s customized for my environment right now, so you’ll need to look through the code a bit to customize it. I have this saved as an application in my Applications folder for quick launching with Spotlight.

property numFFWindows : 0
property FFPos : {}
property FFSize : {}
property iTunesPos : {}
property iTunesSize : {}
property iCalPos : 0
property iCalSize : 0
property AdiumContactsPos : 0
property AdiumContactsSize : 0
property AdiumIMSize : 0
property AdiumIMPos : 0
property OFPos : 0
property OFSize : 0

display dialog "Set Window Position or Save Window Position?" buttons {"Restore", "Save"} default button "Restore"
set theResult to result

tell application "System Events"
    if (button returned of theResult is "Restore") then
        -- Restore Settings
        if (numFFWindows > 0) then
            tell process "Firefox"
                repeat with i from 1 to numFFWindows
                    set position of window i to (item i of FFPos)
                    set size of window i to (item i of FFSize)
                end repeat
            end tell
        end if
        if (iTunesPos is not {0, 0}) then
            tell process "iTunes"
                set position of window 1 to iTunesPos
                set size of window 1 to iTunesSize
            end tell
        end if
        if (iCalPos is not {0, 0}) then
            tell process "iCal"
                set position of window 1 to iCalPos
                set size of window 1 to iCalSize
            end tell
        end if
        if (OFPos is not {0, 0}) then
            tell process "OmniFocus"
                set position of window 1 to OFPos
                set size of window 1 to OFSize
            end tell
        end if
        if (AdiumContactsPos is not {0, 0}) then
            tell process "Adium"
                set position of window "Contacts" to AdiumContactsPos
                set size of window "Contacts" to AdiumContactsSize
                repeat with i from 1 to (count windows)
                    if ((window i) is not (window "Contacts")) then
                        set position of window i to AdiumIMPos
                        set size of window i to AdiumIMSize
                    end if
                end repeat

            end tell
        end if

    else
        -- Save Settings
        tell process "Firefox"
            set numFFWindows to count windows
            set FFPos to {}
            set FFSize to {}
            repeat with i from 1 to numFFWindows
                set end of FFPos to (position of window i)
                set end of FFSize to (size of window i)
            end repeat
        end tell
        tell process "iTunes"
            set iTunesPos to position of window 1
            set iTunesSize to size of window 1
        end tell
        tell process "iCal"
            set iCalPos to position of window 1
            set iCalSize to size of window 1
        end tell
        tell process "OmniFocus"
            set OFPos to position of window 1
            set OFSize to size of window 1
        end tell
        tell process "Adium"
            set AdiumContactsPos to position of window "Contacts"
            set AdiumContactsSize to size of window "Contacts"
            set AdiumIMPos to {}
            set AdiumIMSize to {}
            repeat with i from 1 to (count windows)
                if ((window i) is not (window "Contacts")) then
                    set AdiumIMPos to (position of window i)
                    set AdiumIMSize to (size of window i)
                end if
            end repeat
        end tell
    end if
end tell

Jonathan Laliberte Apple, Hacks, Mac OS X, Scripts

  1. Justin
    March 25th, 2009 at 19:59 | #1

    I couldn’t get this to work man. Any tricks you had to do?

    Thanks.

  2. April 29th, 2009 at 22:09 | #2

    @Justin
    No tricks, but it will almost certainly require some modification depending on the applications you use. It would be possible to actually make a list of all applications and windows, and restore them – but it could be ugly, and error prone. I use this as there are a few specific apps and windows I need moved every time.

  3. Clif
    June 5th, 2009 at 09:05 | #3

    Works great thanks!

  4. June 11th, 2009 at 10:34 | #4

    Thanks you so much for this! As a web developer who needs to switch his second monitor back and forth from Mac to PC multiple times a day, this script has cured my biggest frustration. Killer.

  5. October 22nd, 2009 at 08:08 | #5

    Thanks so much, this is a huge help! Mostly b/c I am so anal about my windows all being in a perfect position… I just wish Apple would add a listener into the finder that remembered the position with multiple displays!

  6. Chris Coleman
    November 11th, 2009 at 15:53 | #6

    This seems like exactly what I need, and it seems to be working for me — mostly. It seems like even if an application is running, it throws an error unless the application is in the current Space. Is there a way to make this Spaces-aware?

  7. November 11th, 2009 at 20:34 | #7

    I don’t doubt that there is a way to make it spaces-aware, unfortunately I do not use spaces and really lack the time to look in to this. Google around a bit, and maybe check out http://macscripter.net

  1. No trackbacks yet.