/System/Library/Frameworks/CoreServices.framework/Versions/A/
Frameworks/CarbonCore.framework/Versions/A/Headers/Folders.r
. but donât get carried away.
Edit: Path split into two lines to make it all visible in the forum window.
/System/Library/Frameworks/CoreServices.framework/Versions/A/
Frameworks/CarbonCore.framework/Versions/A/Headers/Folders.r
. but donât get carried away.
Edit: Path split into two lines to make it all visible in the forum window.
Thanks a whole lot!
I am not intending to use it, but it is good to be able to understand what is going on at times, when people has resorted to this practice.
My personal views on this is that the codes should be avoided, if there exist other alternatives.
But there is sure many codes in there, that there arenât many alternatives too. Interesting!!!
Having said that; those codes, that is one thing, raw events in code, a totally different one, but I guess it is sometimes necessary.
Or even:
display dialog "You need to select two and only two two different Apple Script files in the frontmost Finder Window or one file in each of the two frontmost Finder windows in order to run this script.
" with title "AppleScriptDiff" buttons {"OK"} default button 1 with icon (path to resource "Unsupported.icns" in bundle ((path to library folder from system domain as text) & "CoreServices:CoreTypes.bundle") as alias)
Hello!
There is something odd right there icon or icon file, sometimes one works but not the other, I guess that is when I have made a file reference to the icon image up front, Iâll make a mental note about that!
Yes. The relevant labelled parameter of âdisplay dialogâ is âwith iconâ. The value of this parameter has to be an âaliasâ or âfileâ reference. In your original code (and my variant), the âfileâ is in front of some code which produces an HFS text path, so the overall effect is a file specifier.
Shane coerces his path to alias instead, which I think is slighty more efficient âon the flyâ. This alias then becomes the âin bundleâ parameter of a âpath to resourceâ command, which in turn returns another alias. Putting âfileâ in front of the result would cause an error.
Hello.
display dialog "You need to select two and only two two different Apple Script files in the frontmost Finder Window or one file in each of the two frontmost Finder windows in order to run this script.
" with title "AppleScriptDiff" buttons {"OK"} default button 1 with icon (path to resource "Unsupported.icns" in bundle ((path to library folder from system domain as text) & "CoreServices:CoreTypes.bundle") as alias)
It is interesting to know that Shaneâs coercing is faster, and to be reminded of the in bundle paramter of the path to command.
And yes, the file keyword, is a qualifier for what comes after icon in the display dialog command. (That the file keyword doesnât work with a file reference is something to understand, that it doesnât work with the alias is not so intiuitive, but maybe it is only Finder that takes easy on such matters.)
Itâs actually the path to resource command. Thereâs no in bundle parameter with path to.
Hello.
I wonder, why is there an own path to resource command, other than the obvious, to state in your code that you are getting a resource?
Is there any differences from this to the normal path to command that I should be aware of, than merely the in bundle parameter?
Edit:
I see it is handy for getting into bundles, and that the directory parameter is taking a parameter relative to the resources folder of a bundle of an app.
Um, looking at the dictionary entries I see that âpath toâ either takes an application name, or some variant of that (like âmeâ or âitâ), or a folder designation (not same as its name) from a predefined (and fixed!) list.
So you can use âpath toâ on applications and (specific) folders, but not on other bundle types.
Thatâs where âpath to resourceâ comes in, with âin bundleâ to plunder any bundle whatsoever, privileges permitting.
Anyway, thatâs my ĂąâÂŹ0,02.
Hello!
This horse is beaten to death, I know!
My final words is, that when it comes to at least icon resources then I prefer the a reference to file to an alias because then there isnât any alias to resolve during the awakening of the dialog. I donât know if this can be felt, or timed, as our cpuâs performs several billions instructions per second, nowadays, and SSD disks are also aroundâŠ
But at least, it feels faster, when you know that the icon file doesnât have to be resolved during the display of a dialog.
So my favorite for displaying icons in dialog boxes are:
set my infoIcon to a reference to file ((path to library folder from system domain as text) & "CoreServices:CoreTypes.bundle:Contents:Resources:AlertNoteIcon.icns")
Yuk! I wish I hadnât looked at this this morning!
As expected:
alias ((path to library folder from system domain as text) & "CoreServices:CoreTypes.bundle:Contents:Resources:AlertNoteIcon.icns")
--> alias "MacBook Pro HD:System:Library:CoreServices:CoreTypes.bundle:Contents:Resources:AlertNoteIcon.icns"
((path to library folder from system domain as text) & "CoreServices:CoreTypes.bundle:Contents:Resources:AlertNoteIcon.icns") as alias
--> alias "MacBook Pro HD:System:Library:CoreServices:CoreTypes.bundle:Contents:Resources:AlertNoteIcon.icns"
a reference to file ((path to library folder from system domain as text) & "CoreServices:CoreTypes.bundle:Contents:Resources:AlertNoteIcon.icns")
--> file "MacBook Pro HD:System:Library:CoreServices:CoreTypes.bundle:Contents:Resources:AlertNoteIcon.icns" of «script»
But (in Leopard and Snow Leopard):
file ((path to library folder from system domain as text) & "CoreServices:CoreTypes.bundle:Contents:Resources:AlertNoteIcon.icns")
--> error "Can't get file \"MacBook Pro HD:System:Library:CoreServices:CoreTypes.bundle:Contents:Resources:AlertNoteIcon.icns\"."
But again:
read file ((path to library folder from system domain as text) & "CoreServices:CoreTypes.bundle:Contents:Resources:AlertNoteIcon.icns") as data
--> «data rdat69636E73000063A249434E230000010800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF800007FFF000. etc.
The above phenomena are true with any kind of file, not just system icons.
With regard to setting up and using file references, I havenât been able to find any reliable difference in speed between using âfile blahâ and âa reference to file blahâ. But theyâre both definitely faster than âblah as aliasâ, which in turn is faster than âalias blahâ. My earlier assertion that a coercion to alias is more efficient than a run-time file specifier must have been confusion with the fact that itâs faster than a run-time alias specifier. File specifiers are fastest, although they no longer appear to exist.
I donât doubt you, but these days I think itâs worth adding a rider about the OS used for testing â as youâre seeing, there have been changes under the hood on what constitutes a file.
Iâm not sure if itâs just a transition gone wrong or not. If you call, say, choose file name, the result appears as âfile âBlah:blahââ, but its class is «class furl». It looks to me like «class furl» has been given the term file, but that the older «class file» still has it too.
OYOH, âas «class furl»â seems to work nicelyâŠ
I just want to add that I was writing about feelings but it was in a script consisting of a little less than 2000 lines at the time being, from within Script Debugger in Debug mode.
I donât think I canât notice any difference anyway, when the script is running, though the file refrence, drags a little less resources. and furls are ok, as long as file references stay!
But then again, I like the screen updates to be as crisp as possible, so I will use the filereferences for icons anyway.
But you have to have rather quick reactions, to spot any difference, in this snippet!
set infoIcon to a reference to file ((path to library folder from system domain as text) & "CoreServices:CoreTypes.bundle:Contents:Resources:AlertNoteIcon.icns")
set unsuppicon to (path to resource "Unsupported.icns" in bundle ((path to library folder from system domain as text) & "CoreServices:CoreTypes.bundle") as alias)
tell application "SystemUIServer"
activate
display dialog "Hit Enter" with icon 1
display dialog "You hit Enter" with icon infoIcon
display dialog "Hit Enter" with icon 1
display dialog "You hit Enter" with icon unsuppicon
end tell
Interesting. Thanks for the insight.
Hello!
I came by this document on the net, from 1997.
I wonder if you know about any more updated resource on the subject matter?
I see code where people address System Events with âsyscveâ or similiar, and also sending «event Pcap» I wonder, if this partuclar lore can be found somewhere, or is there just tid bits floating around?
You can hunt through the header files, or just look at code in Script Debugger showing raw syntax. But of themselves, theyâre not particularly enlightening.
That is so true, about enlightening, and must I add interesting. But sometimes, there are gems to be found, like the trick by running a script to make something into a format that for example finder will take, with lists with keywords and specifiers that finder will understand, and accept. Or the trick by throwing an error to get read access to a datstructure, that are otherwise consealed, by reading the error string.
Sometimes, things can only be accomplished by a trick, and then it is good to know where to look for it!
And sometimes, you want sheer speed, not that it is neccessary at all times, but when the system is bogged down, then it helps, both to the robustness, and the responsetimes.
That is the only thing I can see as a liable excuse for using the more arcane language constructs.
By the way I figured out by some googling, that the alternative application id, was the applications creator type, that it can be used as an alternative for the bundle identifier
On my way I also learned that the bundle identifier of apps may vary with whether they are bought in the Appstore or not, and that holds for the creator type as well.
I found that part in http://forums.omnigroup.com/showthread.php?p=98911
Hello.
I have updated the script for Mavericks, TextWranglers path to twdiff has changed, I have also removed references to my âcoreLibraryLoaderServerâ, as with some new technology, and pretty much before that, it was obsolete. Lots of work to make it work, and it still does! But not worth the effort, in any sense.
The script still decompiles two applescripts, and puts it up into TextWrangler, so youâll need TextWrangler for this one, and the command line tools installed.
P.S If you had the commandline tools installed before you installed Mavericks over your old operating system, then you may have to reinstall them. I had to at least. If this script doesnât seem to work, then please visit a terminal window and execute the command which twdiff.
-- © McUsr 2010 and put in Public Domain see: macscripter.net/viewtopic.php?id=33758 (post #26) for reference and terms of use.
(*
Copyright © 2010 - 2015 McUsr: Fixed a bug in the classifyASfile() handler.
You may not post this as a work on your own somewhere, including paper.
*)
on run
tell application "Finder"
activate
set theSel to (get selection)
set selCount to count theSel
if selCount is 2 then
set {fileA, fileB} to {item 1 of theSel, item 2 of theSel}
else
if selCount is greater than 3 then my errMsg()
if (count its windows) is 1 or selCount is 0 then my errMsg()
-- only the desktop window or no items in the selection, -we don't handle folders - yet?
set fileA to item 1 of theSel
if class of fileA is not document file and class of fileA is not application file then my errMsg()
set fw1 to a reference to its Finder window 1
tell its Finder window 2 to activate
set theSel to (get selection) -- of Finder window 2
set selCount to count theSel
if selCount Ăąâ° 1 then my errMsg()
set fileB to item 1 of theSel
if class of fileB is not document file and class of fileB is not application file then my errMsg()
tell fw1 to activate
if contents of fileB is equal to contents of fileA then my errMsg()
end if
set {mustDecompileFileA, mustDecompileFileB} to {my classifyASfile(fileA), my classifyASfile(fileB)}
-- there were something applescript a like so we will commence
set shortNm to name of fileA
set {tids, AppleScript's text item delimiters} to {AppleScript's text item delimiters, "."}
set shortNm to text item 1 of shortNm
set AppleScript's text item delimiters to ""
set shortNm to shortNm as text
set theDir to do shell script "/usr/bin/mktemp -d -t " & quoted form of shortNm
set tempFn1 to quoted form of (theDir & "/" & my createPathDenotingFileNameWitoutExt((fileA as alias as text)))
set tempFn2 to quoted form of (theDir & "/" & my createPathDenotingFileNameWitoutExt((fileB as alias as text)))
if mustDecompileFileA then
my decompileAppleScriptTextForDiff((fileA as alias), tempFn1)
else
try
do shell script "cp " & quoted form of POSIX path of (fileA as alias) & " " & tempFn1
end try
end if
if mustDecompileFileB then
my decompileAppleScriptTextForDiff((fileB as alias), tempFn2)
else
try
do shell script "cp " & quoted form of POSIX path of (fileB as alias) & " " & tempFn2
end try
end if
end tell
-- make the differences show up in text wrangler!
try
set myres to (do shell script "/usr/local/bin/twdiff --ignore-spaces " & tempFn1 & " " & tempFn2)
tell (path to frontmost application as text)
display dialog "The files are alike!" with title "AppleScriptDiff" buttons {"Ok"} default button 1
end tell
on error e number n
tell application "TextWrangler"
activate
end tell
end try
end run
on classifyASfile(aFileRef)
tell application "Finder"
if file type of aFileRef is "osas" then return true
end tell
set aFileRef to aFileRef as alias
tell application id "sevs"
set ftype to type identifier of (get properties of item (aFileRef as text))
if ftype contains "com.apple.applescript.script" then
-- works for "com.apple.applescript.script" and "com.apple.applescript.script-bundle"
return true
else
return false
end if
end tell
end classifyASfile
on errMsg()
beep
tell (path to frontmost application as text)
display dialog "You need to select two and only two two different Apple Script files in the frontmost Finder Window or one file in each of the two frontmost Finder windows in order to run this script. If you are trying to get diffs of applets those need to have the original filepropeties as when the applet was saved in the editor in order for the script to run properly.
" with title "AppleScriptDiff" buttons {"Ok"} default button 1
end tell
error number -128
end errMsg
on decompileAppleScriptTextForDiff(fileAlias, qpxTempFileName) -- Thanks to oldmanegan
local theSourceText, qfPoxPath
set qfPoxPath to quoted form of POSIX path of (fileAlias)
try
fileAlias as alias
on error e number n
set bad to true
end try
try
beep
do shell script "/usr/bin/osadecompile " & qfPoxPath & "| /usr/bin/tr -d '\\000' >" & qpxTempFileName
on error e number n
tell application (path to frontmost application as text)
display dialog "AppleScriptDiff: decompileAppleScriptTextForDiff()" & e & " : " & n with title "AppleScriptDiff" buttons {"Ok"} default button 1
end tell
error number -128
end try
end decompileAppleScriptTextForDiff
on createPathDenotingFileNameWitoutExt(hfSfileNameAsText)
set {tids, AppleScript's text item delimiters} to {AppleScript's text item delimiters, ":"}
-- set hfsFilenameAsText to {""} & text items 2 thru -1 of hfsFilenameAsText
-- Uses the line above instead of line under if you want to convert to unix alike filename.
set hfSfileNameAsText to text items of hfSfileNameAsText
set AppleScript's text item delimiters to "_"
set hfSfileNameAsText to hfSfileNameAsText as text
set AppleScript's text item delimiters to "."
set hfSfileNameAsText to text items 1 thru -2 of hfSfileNameAsText as text
set AppleScript's text item delimiters to tids
return hfSfileNameAsText
end createPathDenotingFileNameWitoutExt
Hello.
I removed a bug I had entered, in the handler that created a filename denoting the path of the original filename.
It is now fixed.
Hello.
This is a version that shows the differences between two AppleScript files with FileMerge. Maybe I should have coalesced the two into one script, but then youâd have to do more than simple executing the script.
I did the same to the Show Differences in two ânormalâ text files with TextWrangler; added a script at the end that used FileMerge as well.
I feel more comfortable by using FileMerge, when the whole differences thing is for viewing purposes.
-- © McUsr 2013 and put in Public Domain see: macscripter.net/viewtopic.php?id=33758 (post #26) for reference and terms of use.
(*
Copyright © 2010 - 2015 McUsr: Fixed a bug in the classifyASfile() handler.
You may not post this as a work on your own somewhere, including paper.
*)
on run
tell application "Finder"
activate
set theSel to (get selection)
set selCount to count theSel
if selCount is 2 then
set {fileA, fileB} to {item 1 of theSel, item 2 of theSel}
else
if selCount is greater than 3 then my errMsg()
if (count its windows) is 1 or selCount is 0 then my errMsg()
-- only the desktop window or no items in the selection, -we don't handle folders - yet?
set fileA to item 1 of theSel
if class of fileA is not document file and class of fileA is not application file then my errMsg()
set fw1 to a reference to its Finder window 1
tell its Finder window 2 to activate
set theSel to (get selection) -- of Finder window 2
set selCount to count theSel
if selCount Ăąâ° 1 then my errMsg()
set fileB to item 1 of theSel
if class of fileB is not document file and class of fileB is not application file then my errMsg()
tell fw1 to activate
if contents of fileB is equal to contents of fileA then my errMsg()
end if
set {mustDecompileFileA, mustDecompileFileB} to {my classifyASfile(fileA), my classifyASfile(fileB)}
-- there were something applescript a like so we will commence
set shortNm to name of fileA
set {tids, AppleScript's text item delimiters} to {AppleScript's text item delimiters, "."}
set shortNm to text item 1 of shortNm
set AppleScript's text item delimiters to ""
set shortNm to shortNm as text
set theDir to do shell script "/usr/bin/mktemp -d -t " & quoted form of shortNm
set tempFn1 to quoted form of (theDir & "/" & my createPathDenotingFileNameWitoutExt((fileA as alias as text)))
set tempFn2 to quoted form of (theDir & "/" & my createPathDenotingFileNameWitoutExt((fileB as alias as text)))
if mustDecompileFileA then
my decompileAppleScriptTextForDiff((fileA as alias), tempFn1)
else
try
do shell script "cp " & quoted form of POSIX path of (fileA as alias) & " " & tempFn1
end try
end if
if mustDecompileFileB then
my decompileAppleScriptTextForDiff((fileB as alias), tempFn2)
else
try
do shell script "cp " & quoted form of POSIX path of (fileB as alias) & " " & tempFn2
end try
end if
end tell
try
do shell script "(/usr/bin/opendiff " & tempFn1 & " " & tempFn2 & " ) &> /dev/null &"
end try
end run
on classifyASfile(aFileRef)
tell application "Finder"
if file type of aFileRef is "osas" then return true
end tell
set aFileRef to aFileRef as alias
tell application id "sevs"
set ftype to type identifier of (get properties of item (aFileRef as text))
if ftype contains "com.apple.applescript.script" then
-- works for "com.apple.applescript.script" and "com.apple.applescript.script-bundle"
return true
else
return false
end if
end tell
end classifyASfile
on errMsg()
beep
tell (path to frontmost application as text)
display dialog "You need to select two and only two two different Apple Script files in the frontmost Finder Window or one file in each of the two frontmost Finder windows in order to run this script. If you are trying to get diffs of applets those need to have the original filepropeties as when the applet was saved in the editor in order for the script to run properly.
" with title "AppleScriptDiff" buttons {"Ok"} default button 1
end tell
error number -128
end errMsg
on decompileAppleScriptTextForDiff(fileAlias, qpxTempFileName) -- Thanks to oldmanegan
local theSourceText, qfPoxPath
set qfPoxPath to quoted form of POSIX path of (fileAlias)
try
fileAlias as alias
on error e number n
set bad to true
end try
try
beep
do shell script "/usr/bin/osadecompile " & qfPoxPath & "| /usr/bin/tr -d '\\000' >" & qpxTempFileName
on error e number n
tell application (path to frontmost application as text)
display dialog "AppleScriptDiff: decompileAppleScriptTextForDiff()" & e & " : " & n with title "AppleScriptDiff" buttons {"Ok"} default button 1
end tell
error number -128
end try
end decompileAppleScriptTextForDiff
on createPathDenotingFileNameWitoutExt(hfSfileNameAsText)
set {tids, AppleScript's text item delimiters} to {AppleScript's text item delimiters, ":"}
-- set hfsFilenameAsText to {""} & text items 2 thru -1 of hfsFilenameAsText
-- Uses the line above instead of line under if you want to convert to unix alike filename.
set hfSfileNameAsText to text items of hfSfileNameAsText
set AppleScript's text item delimiters to "_"
set hfSfileNameAsText to hfSfileNameAsText as text
set AppleScript's text item delimiters to "."
set hfSfileNameAsText to text items 1 thru -2 of hfSfileNameAsText as text
set AppleScript's text item delimiters to tids
return hfSfileNameAsText
end createPathDenotingFileNameWitoutExt