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