I can’t agree more with that, and I’m wrong again in the future about something for sure. I wasn’t offended and my post was more as an confirmation than a correction or whatsoever. I want to keep things clear as well and when anyone’s post could lead into wrong interpretations, seems he didn’t understand it completely or still has some questions I keep responding till everything is clear. Not only for the topic starter but also when someone searches MacScripter and read the topic when the topic is a few weeks old (forgotten). So it’s not personal, stubbornness or anything like that, it’s just that I want to have everything as clear as you.
Agreed!
It is the dialogue that is important. It is a Norwegian saying, that when men speak (or women), it is like lighting a torch in the dark. Now, if everybody was afraid of saying or writing somethinging wrong, it wouldn’t be much development would it? And I say and do a lot of wrong stuff, not only now, but for the future too I guess.
This hasn’t been polished by any means, but this is what I worked up for centering the frontmost window on either of my two screens. At least it works for me. :lol:
global details, tApp
(*HANDLERS*)
-- Get screen parameters
to getScreens()
tell (do shell script "echo `defaults read /Library/Preferences/com.apple.windowserver | grep -wA 1 -m 2 OriginX``defaults read /Library/Preferences/com.apple.windowserver | grep -w -m 2 Height``defaults read /Library/Preferences/com.apple.windowserver | grep -w -m 2 Width``defaults read /Library/Preferences/com.apple.windowserver | grep DisplayLayoutToRight``defaults read com.apple.dock | grep orientation``defaults read com.apple.dock | grep tilesize`") to set details to {word 3, word 6, word 9, word 12, word 15, word 18, word 21, word 24, word 27, word 30, word 33}
return details
end getScreens
--> Origin1 x, y; Origin2 x, y; Height 1, 2; Width 1, 2; DisplayLayout 1 = Right; DockPosition 0 = Left; DockSize; Extent x, y. The screen with origin 0, 0 has the menu bar, or if Display2toRight = 1, then the menu bar is on the left.
to getCenterMain()
tell details -- not general, specific to my own setup (no calculation of which screen is which and dock position)
-- X center, main screen is width - dock size over 2 + dock size
set ctr_Main_X to (((item 7 as integer) - (item 11)) / 2 + (item 11)) as integer
-- Y center, main screen is hight - menu bar size over 2 + menu bar height.
set ctr_Main_Y to (((item 5 as integer) - 22) / 2 + 22) as integer
end tell
return {ctr_Main_X, ctr_Main_Y}
end getCenterMain
to getCenterSecondary()
tell details
set ctr_Sec_X to ((item 8 as integer)) / 2 as integer
set ctr_Sec_Y to ((item 6 as integer) / 2) as integer
end tell
return {ctr_Sec_X, ctr_Sec_Y}
end getCenterSecondary
-- Get running apps, identify frontmost, get its window size and position
to getFrontmostWindow()
tell application "Finder" to set |running| to name of processes whose visible is true
-- Find the frontmost
tell application "System Events"
repeat with anApp in |running|
if get frontmost of process anApp then
tell application process anApp to tell window 1
set {{p1, p2}, {s1, s2}, tApp} to {position, size, contents of anApp}
end tell
end if
end repeat
return {{p1, p2}, {s1, s2}}
end tell
end getFrontmostWindow
--- MAIN ---
set tScreens to getScreens() -- get the screen centers
set {tPosition, tSize} to getFrontmostWindow() -- get postion and extent of window
-- if the window is more than half way into the second screen choose second screen for centering.
if (item 1 of tPosition as integer) + (item 1 of tSize) / 2 > item 3 of tScreens as integer then
set Ctr to getCenterSecondary()
set Scr to "Sec"
else
set Ctr to getCenterMain()
set Scr to "Main"
end if
-- Find bounds to center the window without changing its size.
set {Tx, Ty} to {(item 1 of Ctr) - (item 1 of tSize) / 2, (item 2 of Ctr) - (item 2 of tSize) / 2}
-- Set new bounds for the window to center it.
tell application tApp
if Scr is "Sec" then
set Tx to Tx + (item 3 of details)
set Ty to Ty + (item 4 of details)
end if
set bounds of window 1 to {Tx, Ty, Tx + (item 1 of tSize), Ty + (item 2 of tSize)}
end tell
Hello Adam!
That is so cool! I think I am going to snag some pieces of it, for a project coming up soon!
It is really impressive, and it works for me too!
Hello!
I am curious about the advantages of using this:
tell application "Finder" to set |running| to name of processes whose visible is true
Instead of System Events. I guess it is out of speed concerns, but I am not sure, that is why I am asking.
there is no advantage on local systems. The Finder just launches System Events
On remote systems “ to send Remote Apple Events “ it’s advantageous to be able to launch System Events via the Finder
Ahh! Thanks Stefan!
Normally the Finder is sluggish, but in this particular case several OS Xs ago, it seemed faster than System Events. Now it’s as Stefan says.