Submit Hint Search The Forums LinksStatsPollsHeadlinesRSS
14,000 hints and counting!


Click here to return to the 'A script to resize frontmost two windows to fill screen' hint
The following comments are owned by whoever posted them. This site is not responsible for what they say.
A script to resize frontmost two windows to fill screen
Authored by: SimonDorfman.com on Jan 14, '06 10:09:26PM
Cool script. One thing wasn't working for me though:
set numRows to round (ceil(windowCount / numCols))
Maybe ceil was a type-o? After some messing around, I figured out it should be changed to this:
set numRows to round (windowCount / numCols) rounding up
I also added a special case if the number of windows is less than the number of columns preference. So here's the complete script with those changes:

--Run via quicksilver trigger to tile all windows

--found in comments here: http://www.macosxhints.com/article.php?story=20060105082728937

property numCols : 2
property screenWidth : 1280
property screenHeight : 854
-- If you don't want to hard-code your screen width, because eg. you use multiple screens with differing properties at different times, then uncomment the 2 lines below:
--set screenWidth to word 3 of (do shell script "defaults read /Library/Preferences/com.apple.windowserver | grep -w Width") as number
--set screenHeight to word 3 of (do shell script "defaults read /Library/Preferences/com.apple.windowserver | grep -w Height") as number

set menubarHeight to 22

tell application "System Events"
	set frontApp to name of first application process whose frontmost is true
end tell

--some apps are wacky and put the windows higher for some reason, adjust for this bug.
if (frontApp is equal to "Finder" or frontApp is equal to "Microsoft Entourage") then
	set menubarHeight to 44
end if
--leave room for the Excel Toolbar
if (frontApp is equal to "Microsoft Excel") then
	set menubarHeight to 55
end if

try
	tell application frontApp
		-- Ignore windows that are invisible or that don't have a title
		set windowCount to count of (windows whose visible is true and name is not "")
		set allWindowCount to count of windows
		
		-- Set number of rows appropriately
		set numRows to round (windowCount / numCols) rounding up
		
		-- Special case if the number of windows is less than the number of columns preference
		if windowCount is less than or equal to numCols then
			set numRows to 1
			set numCols to windowCount
		end if
		
		-- Special case is there's only one window
		if windowCount = 1 then
			set numRows to 1
			set numCols to 1
		end if
		
		-- skipWindow is for skipping over windows which are invisible or titleless
		set skipWindow to 0
		repeat with j from 0 to numRows - 1
			repeat with i from 0 to numCols - 1
				-- If we've done all the windows, then just get out
				if (j * numCols + i + 1) > windowCount then
					exit repeat
				end if
				-- Get a handle to the window we might want to resize
				set theWindow to window (j * numCols + i + 1 + skipWindow)
				-- Check that the window is visible and titled -- if it's not, then skip it
				repeat while (visible of theWindow is false or name of theWindow is "")
					set skipWindow to skipWindow + 1
					set theWindow to window (j * numRows + i + 1 + skipWindow)
				end repeat
				
				-- resize the window
				set bounds of theWindow to {
					round (i * screenWidth / numCols), 
					menubarHeight + (round (j * (screenHeight - menubarHeight) / numRows)), 
					round ((i * screenWidth / numCols) + (screenWidth / numCols)), 
					round ((menubarHeight + (round (j * (screenHeight - menubarHeight) / numRows))) + (screenHeight - menubarHeight) / numRows) 
						}
			end repeat
		end repeat
	end tell
on error the error_message number the error_number
	display dialog "Error: " & the error_number & ". " & the error_message buttons {"OK"} default button 1
end try


[ Reply to This | # ]
ignore minimized windows and fix the resizing of windows in Finder
Authored by: SimonDorfman.com on Jan 15, '06 01:31:53AM
I further hacked this script to ignore minimized windows and fix the resizing of windows in Finder due to the weird menubarHeight 44 instead of 22 bug. Here's the updated script:

--Run via quicksilver trigger to tile all windows

--found in comments here: http://www.macosxhints.com/article.php?story=20060105082728937

property numCols : 2
property screenWidth : 1280
property screenHeight : 854
-- If you don't want to hard-code your screen width, because eg. you use multiple screens with differing properties at different times, then uncomment the 2 lines below:
--set screenWidth to word 3 of (do shell script "defaults read /Library/Preferences/com.apple.windowserver | grep -w Width") as number
--set screenHeight to word 3 of (do shell script "defaults read /Library/Preferences/com.apple.windowserver | grep -w Height") as number

set menubarHeight to 22

tell application "System Events"
	set frontApp to name of first application process whose frontmost is true
end tell

--some apps are wacky and put the windows higher for some reason, adjust for this bug.
if (frontApp is equal to "Finder" or frontApp is equal to "Microsoft Entourage") then
	set menubarHeight to 44
end if
--leave room for the Excel Toolbar
if (frontApp is equal to "Microsoft Excel") then
	set menubarHeight to 55
end if

try
	-- For some reason Finder calls minimized windows "collapsed" while other apps call them "miniaturized", so I deal with this by duplacating lots of code and having this big if/else. It's okay though because Finder's menubarHeight of 44 bug requires some tweaking of the numbers to resize the windows right. So the duplicate code isn't a total waste, but I'm sure there's a way to do this with list repeating.
	if frontApp is "Finder" then
		tell application "Finder"
			-- Ignore windows that are minimized, invisible or that don't have a title
			set windowCount to count of (windows whose visible is true and name is not "" and collapsed is false)
			set allWindowCount to count of windows
			
			-- Set number of rows appropriately
			set numRows to round (windowCount / numCols) rounding up
			
			-- Special case if the number of windows is less than the number of columns preference
			if windowCount is less than or equal to numCols then
				set numRows to 1
				set numCols to windowCount
			end if
			
			-- Special case is there's only one window
			if windowCount = 1 then
				set numRows to 1
				set numCols to 1
			end if
			
			-- skipWindow is for skipping over windows which are invisible or titleless
			set skipWindow to 0
			repeat with j from 0 to numRows - 1
				repeat with i from 0 to numCols - 1
					-- If we've done all the windows, then just get out
					if (j * numCols + i + 1) > windowCount then
						exit repeat
					end if
					-- Get a handle to the window we might want to resize
					set theWindow to window (j * numCols + i + 1 + skipWindow)
					-- Check that the window is visible and titled -- if it's not, then skip it
					repeat while (visible of theWindow is false or name of theWindow is "")
						set skipWindow to skipWindow + 1
						set theWindow to window (j * numRows + i + 1 + skipWindow)
					end repeat
					
					-- resize the window
					set bounds of theWindow to {
						round (i * screenWidth / numCols), 
						menubarHeight + (round (j * (screenHeight - 22) / numRows)), 
						round ((i * screenWidth / numCols) + (screenWidth / numCols)), 
						round ((22 + (round (j * (screenHeight - 22) / numRows))) + (screenHeight - 22) / numRows) 
							}
				end repeat
			end repeat
		end tell
	else
		tell application frontApp
			-- Ignore windows that are minimized, invisible or that don't have a title
			set windowCount to count of (windows whose visible is true and name is not "" and miniaturized is false)
			set allWindowCount to count of windows
			
			-- Set number of rows appropriately
			set numRows to round (windowCount / numCols) rounding up
			
			-- Special case if the number of windows is less than the number of columns preference
			if windowCount is less than or equal to numCols then
				set numRows to 1
				set numCols to windowCount
			end if
			
			-- Special case is there's only one window
			if windowCount = 1 then
				set numRows to 1
				set numCols to 1
			end if
			
			-- skipWindow is for skipping over windows which are invisible or titleless
			set skipWindow to 0
			repeat with j from 0 to numRows - 1
				repeat with i from 0 to numCols - 1
					-- If we've done all the windows, then just get out
					if (j * numCols + i + 1) > windowCount then
						exit repeat
					end if
					-- Get a handle to the window we might want to resize
					set theWindow to window (j * numCols + i + 1 + skipWindow)
					-- Check that the window is visible and titled -- if it's not, then skip it
					repeat while (visible of theWindow is false or name of theWindow is "")
						set skipWindow to skipWindow + 1
						set theWindow to window (j * numRows + i + 1 + skipWindow)
					end repeat
					
					-- resize the window
					set bounds of theWindow to {
						round (i * screenWidth / numCols), 
						menubarHeight + (round (j * (screenHeight - menubarHeight) / numRows)), 
						round ((i * screenWidth / numCols) + (screenWidth / numCols)), 
						round ((menubarHeight + (round (j * (screenHeight - menubarHeight) / numRows))) + (screenHeight - menubarHeight) / numRows) 
							}
				end repeat
			end repeat
		end tell
	end if
on error the error_message number the error_number
	display dialog "Error: " & the error_number & ". " & the error_message buttons {"OK"} default button 1
end try


[ Reply to This | # ]
ignore minimized windows and fix the resizing of windows in Finder
Authored by: ebeffel on Feb 04, '06 03:04:13PM

I dont have a /Library/Preferences/com.apple.windowserver file on my machine. What do I do to create one? Are you aware of alternative ways to get the size of the displays? Do they work with two displays?

Thanks, Ernie



[ Reply to This | # ]