Resize all windows of all running applications

I am trying to write an applescript script that will allow me to resize all windows of all running applications whenever I select (I am currently using Stay but found it glitchy from time to time so I want to "rethink" it)
I am following for some tutorials on writing boxes and came up with the following code to do it, but it's buggy:

tell application "Finder"
    set rect to bounds of window of desktop
end tell

property excludedApplicationNames : {"Finder"}
tell application "System Events"
    say "a"
    repeat with theProcess in processes
        say "b"
        if background only of theProcess is false then
            say "c"
            set theProcessName to name of theProcess as string
            if theProcessName is not in excludedApplicationNames then
                say theProcessName
                tell application theProcess
                    set bounds of windows of process theProcess to rect
                end tell
            end if
        end if
    end repeat
end tell
say "done"

      

The problem is, when this code comes across my only terminal window (with multiple open tabs), this is an error: System Events got an error: Can’t set application (item 2 of every process) to {0, 0, 1280, 900}.System Events got an error: Can’t set application (item 2 of every process) to {0, 0, 1280, 900}.

Change tell application theProcess

to tell application theProcessName

not work (same error), and does not change it for tell application "System Events"

(error: System Events got an error: Can’t make item 2 of every process into type integer.

)

Interestingly, this works as expected:

tell application "Finder"
    set rect to bounds of window of desktop
end tell

tell application "Terminal"
    repeat with theWindow in windows
        set bounds of theWindow to rect
    end repeat
end tell

      

So I am very confused. What am I doing wrong? How can I fix this?

+3


source to share


3 answers


tell application "Finder"
    set {0, 0, dtw, dth} to bounds of window of desktop
end tell
tell application "System Events"
    repeat with p in (processes where background only is false)
        tell p
            if name is not in {"Finder"} then
                set position of windows to {0, 0}
                set size of windows to {dtw, dth}
            end if
        end tell
    end repeat
end tell

      

  • Took about 3 seconds on my Mac
  • Maximizes the terminal windows to fill the screen (excluding the 4px area occupied by the dock)
tell application "Finder"
    set dtb to bounds of window of desktop
end tell
tell application "System Events"
    bundle identifier of processes where background only is false
end tell
repeat with bid in result
    tell application id bid
        try
            if name is not in {"Finder"} then
                set (bounds of windows where visible is true) to dtb
            end if
        end try
    end tell
end repeat

      

  • Took about 0.3 seconds on my Mac
  • Doesn't work with all apps like Preview or Reeder
  • Uses package IDs because multiple applications have different process and application names.
  • Resizes terminal windows so that they have white space a few pixels above and below.


I am using this script to maximize windows:

try
    tell application "Finder" to set dtb to bounds of window of desktop
    tell application (path to frontmost application as text)
        if name is in {"Terminal"} then
            error
        else
            set bounds of window 1 to dtb
        end if
    end tell
on error
    tell application "System Events" to tell (process 1 where it is frontmost)
        try
            click (button 1 of window 1 where subrole is "AXZoomButton")
        end try
    end tell
end try

      

In many applications that do not have basic AppleScript support, the zoom button also maximizes windows to fill the screen.

+5


source


This takes into account the size of the dock. I have a monitor on the right side, but needs to be easily modified to accommodate the dock at the bottom.



tell application "Finder"
    set dtb to bounds of window of desktop
end tell

tell application "System Events" to tell process "Dock"
    set dockDimentions to size in list 1
    set dockWidth to item 1 of dockDimentions
end tell

tell application "System Events"
    bundle identifier of processes where background only is false
end tell

repeat with bid in result
    tell application id bid
        try
            if name is not in {"Finder", "System Preferences", "Notepad", "Terminal", "Activity Monitor"} then
                set x to item 1 of dtb
                set y to item 2 of dtb
                set w to (item 3 of dtb) - dockWidth
                set h to item 4 of dtb
                set (bounds of windows) to {x, y, w, h}
            end if
        end try
    end tell
end repeat

      

+1


source


This ultimately worked for me:

property blacklist : {"Finder", "Preview", "Console", "AppleScript Editor", "Spotify", "TaskCoach"}
property buttonApps : {"LyX", "Eclipse"}
property buttonMaps : {{name:"LyX", Button:1, pname:"lyx"}, {name:"Eclipse", Button:2, pname:"eclipse"}}

tell application "Finder" to set theBounds to bounds of window of desktop

tell application "System Events"
    set bids to bundle identifier of processes where background only is false
end tell

repeat with bid in bids
    tell application id bid
        if name is not in blacklist then
            set appName to name as string
            if name is "Terminal" then
                set newBounds to {0, 0, (item 3 of theBounds) - 10, item 4 of theBounds}
                repeat with theWindow in windows
                    if visible of theWindow is true then
                        say appName
                        set bounds of theWindow to newBounds
                    end if
                end repeat
            else if name is not in buttonApps then
                repeat with theWindow in windows
                    if visible of theWindow is true then
                        set bounds of theWindow to theBounds
                    end if
                end repeat
            else if name is in buttonApps then
                -- get the buttonNumber
                repeat with buttonApp in buttonMaps
                    if (name of buttonApp as string) is appName then
                        set theButton to Button of buttonApp
                    end if
                end repeat
                tell application "System Events"
                    repeat with theProcess in (processes where bundle identifier is bid)
                        try
                            tell theProcess to tell window 1 to click button theButton
                        end try
                    end repeat
                end tell
            end if
        end if
    end tell
end repeat

      

Please note that "Spotify" and "Task Coach" are blacklisted because I cannot resize them:

  • setting window borders
  • pressing the green button
  • clicking Window> Zoom on the menu bar
  • using the F10shortcut I mapped it to.

If anyone can come up with a better solution, I'm all ears

0


source







All Articles