This is a nice idea. A minor tweak, to account for appleScript applets (.app) and any apps (including appleScript applets) with _ in their names.
property visibleList : {}
property secondAppInfo : {}
on getSecondFrontProcessName()
set ATID to AppleScript's text item delimiters
set visibleList to do shell script "lsappinfo visibleProcessList"
set AppleScript's text item delimiters to {"-\"", "\": "}
set visibleList to text items of visibleList
set secondFrontProcessID to item 3 of visibleList
set secondAppInfo to do shell script "lsappinfo info -app " & secondFrontProcessID
set AppleScript's text item delimiters to {"\"", ".app"}
set secondFrontProcessName to text item 2 of secondAppInfo
set AppleScript's text item delimiters to ATID
return secondFrontProcessName
end getSecondFrontProcessName
set secondFrontAppProcessName to getSecondFrontProcessName()
display dialog secondFrontAppProcessName
Here is a slightly shorter version where you can convert “_” to spaces in one line
use AppleScript version "2.4" -- Yosemite (10.10) or later
use scripting additions
on getSecondFrontProcessName()
set ATID to AppleScript's text item delimiters
set AppleScript's text item delimiters to quote
set secondFrontProcess to text item 4 of (do shell script "lsappinfo visibleProcessList")
set AppleScript's text item delimiters to {" ", "_"}
set secondFrontProcess to (text items of secondFrontProcess) as text
set AppleScript's text item delimiters to ATID
return secondFrontProcess
end getSecondFrontProcessName
set secondFrontAppProcessName to getSecondFrontProcessName()
CK’s suggestion is excellent and does exactly what the OP wants. Very nice
The following script returns all visible apps, which may be helpful on occasion. Finder is included in the list only if a Finder window is open. The timing result with five active apps and a Finder window was 12 milliseconds.
set appList to getAppList()
on getAppList()
set appData to do shell script "lsappinfo visibleProcessList"
tell application "Finder"
if exists Finder window 1 then
set finderWindowExists to true
else
set finderWindowExists to false
end if
end tell
set ATID to AppleScript's text item delimiters
set AppleScript's text item delimiters to {"\""}
set appData to text items of appData
set AppleScript's text item delimiters to {" ", "_"} -- as suggested by robertfern
set appList to {}
if finderWindowExists then
repeat with i from 2 to (count appData) by 2
set end of appList to ((text items of (item i of appData)) as text)
end repeat
else
repeat with i from 2 to (count appData) by 2
if (item i of appData) is not "Finder" then set end of appList to ((text items of (item i of appData)) as text)
end repeat
end if
set AppleScript's text item delimiters to ATID
return appList
end getAppList
Since we’re going through the trouble of calling out to do shell script, it makes sense to milk it for everything it’s worth, including having it perform the necessary text manipulations:
set runningApplications to the paragraphs of ¬
(do shell script "lsappinfo metainfo |
tail -1 | grep -Eo '\"[^\"]+\"' | tr -d '\"'")
which produces the following output:[format]{“Script Editor”, “Vivaldi”, “Mail”, “Messages”, “Finder”, “Sidekick”, ¬
“Telegram”, “Usenapp”, “Raycast”, “Music”, “Messenger”, “Automator”, ¬
“kitty”, “Messages”, “Karabiner-Elements”, “Amazon Music”, “Safari”}[/format]The most recently active application is, then, item2.
Very cool. Especially that the metainfo correctly handles app names that have “_” and applets without adding the “.app” to the end.
And here’s the same thing, without GREP.
property visibleList : {}
on getSecondFrontProcessName()
set ATID to AppleScript's text item delimiters
set AppleScript's text item delimiters to {"\""}
set secondFrontProcessName to text item 4 of (do shell script "lsappinfo metainfo | tail -1")
set AppleScript's text item delimiters to ATID
return secondFrontProcessName
end getSecondFrontProcessName
on GetRunningProcessNames()
set runningProcessNames to {}
set ATID to AppleScript's text item delimiters
set AppleScript's text item delimiters to {"\""}
set visibleList to text items of (do shell script "lsappinfo metainfo | tail -1")
repeat with x from 2 to count of visibleList by 2
set the end of runningProcessNames to item x of visibleList
end repeat
set AppleScript's text item delimiters to ATID
return runningProcessNames
end GetRunningProcessNames
display dialog getSecondFrontProcessName()
choose from list GetRunningProcessNames()
I have a very similar version to stocky but mine uses the ‘visibleProcessList’ option for ‘lsappinfo’
It is 40% faster according to “Script Geek”
on getFrontToBackProcessName()
local theInfo, processList, tid, i
set tid to text item delimiters
set text item delimiters to quote
set theInfo to text items of (do shell script "lsappinfo visibleProcessList")
set processList to {}
set text item delimiters to {" ", "_"}
repeat with i from 2 to count theInfo by 2
set end of processList to (text items of item i of theInfo) as text -- this replaces the "_" with a space
end repeat
set text item delimiters to tid
return processList
end getFrontToBackProcessName
Also whenever I see “Applescript’s text item delimiter” I know the code is of an older vintage.
Apple removed the need to preface ‘text item delimiters’ with ‘Applescript’s’ a long time ago.
I’m also persnickety in that I always have a ‘local’ line in my procedures just incase the variable names I’ve used are in conflict with other code. (ie. I always declare my variables, probably OCD)
tell application "Safari" to set AppleScript's text item delimiters to {"… ", "... ", "…", "..."}
Text item delimiters belong to appleScript, but an app can have their own. It’s OK to set them in a tell application block, but you need to specify you mean AppleScript’s.
I made a text shortcut using atid which expands into the full text. FWIW, I haven’t seen it deprecated anywhere — the last time apple used that word in their release notes was OS 10.4, so before applescript 2. I don’t get errors using it and don’t have to think about them so….