Move all Windows to the Main Display

If you have more than one monitor, you may be familiar with the problem of windows getting stuck off the edge of the main screen. When you disconnect a second monitor, Mac OS X is normally quite good at bringing all the windows back to your main monitor. However, every now and again, windows get left behind, off the edge of the main display and out of reach.

Luckily, this blog post has the solution - a simple AppleScript. When run, it automatically finds all the windows that are off the edge of the screen and clusters them in the top left of the main monitor. To run it, start by opening up Script Editor (located in Applications/AppleScript) then paste in the following:

property processesToIgnore : {}
tell application "Finder"
set _b to bounds of window of desktop
set screen_width to item 3 of _b
set screen_height to item 4 of _b
end tell
tell application "System Events"
set allProcesses to application processes
set _results to ""
repeat with i from 1 to count allProcesses
set doIt to 1
repeat with z from 1 to count processesToIgnore
if process i = process (item z of processesToIgnore) then
set doIt to 0
end if
end repeat
if doIt = 1 then
tell process i
repeat with x from 1 to (count windows)
set winPos to position of window x
set _x to item 1 of winPos
set _y to item 2 of winPos
if (_x < 0 or _y < 0 or _x > screen_width or _y > screen_height) then
set position of window x to {0, 22}
end if
end repeat
end tell
end if
end repeat
end tell

Click the Compile button at the top to make sure the script is OK. If you receive an error message, check for any problems that may have occurred in the copy/paste process.

For the script to work, you will need to enable access for assistive devices. You can do this by going to the Universal Access section of System Preferences. Check the box at the bottom that says “Enable access for assistive devices”.

Now, when you click the Run button above the script, any off-screen windows will be placed in the top left of the main monitor.

One problem with this is that you may have some applications that keep windows off-screen on purpose. One example of this is Firefox, which gives you a blank square in the top left when you run the script. The first line of the script allows you to get around this by excluding specific applications from the script. For example you could change it to

property processesToIgnore : {"Firefox"}


processesToIgnore : {"Firefox", "otherApp", "anotherOne"}

Now, opening up the script and clicking the "Run" button every time you disconnect your second monitor is quite time consuming. There are a couple of ways to run it much more quickly. The first is to add it to your scripts menu. If you haven't already enabled this, you can do so by navigating to Macintosh HD/Applications/AppleScript and opening up AppleScript Utility. Near the bottom of the window that appears, check the box that says "Show Script Menu in Menu Bar". To add your script to the menu, you have to save it in a specific location. Go to the Library folder inside your user folder and look for a folder called "Scripts". If it isn't there, create it. Save the script here.

Script Menu

An alternative way to run the script is to save it as an application. With the script open in Script Editor, go to the File menu and choose Save As. Change the File Format drop-down menu to Application and then save it. Now when you double-click the script, it will instantly run. Save it somewhere you can easily access it, like on the desktop.

blog comments powered by Disqus