Mar 90 Letters
Volume Number: 6
Issue Number: 3
Column Tag: Letters
PICT and FCMT Resources 
By David E. Smith, Editor & Publisher, MacTutor
Dialog boxes in general and PICT resources in dialogs
Neil Ticktin, Truin Software
Letter to Tron in response to Mousehole report in January, 1990 issue
I ran into the same problem with pictures. The problem lies with ResEdit™’s
term of “Send to Back”. It turns out that while editing the item (and this is any item,
not just a PICT) in ResEdit, the item must be in front of the other items for the Dialog
Manager to think of it as in back of those same items. In ResEdit, “Send to back”
means make this item the lower item number, but the Dialog Manager thinks of the
frontmost item with the lower number. If you just give your picture the higher item
number, it should work fine.
Also, if you are using modal dialogs in either THINK or MPW Pascal or C, it would
really pay for you to look into Extender DialogHandler™. It contains over 160
routines which significantly decrease the time required to write support code for
completely functional modal dialogs. You can get it or product information from
Invention Software (313) 996-8108, but if you call MacTutor’s Mail Order store
maybe they’ll be able to get it for with their standard store discount. Also, there is a
product review in the January, 1990 issue of MacTutor.
Amusing undocumented feature
Ken Manly
Buffalo Chip Software
Buffalo, NY
Your readers may be amused by an ‘undocumented feature’ that Forrest Tanaka
(MacDTS) and I discovered. If you create an Apple menu using ResEdit, there are two
ways you can type the apple symbol into the menu title field. If you type control-T, the
value stored will be $14, and all will be well.
If you type shift-command-K (which is what Key Caps suggests) you will get a
menu which looks and acts like an Apple menu, but it is not recognized by Notification
Manager routines (in System 6.x). The first symptom is that when your alarm clock
goes off while your application is running, the alarm icon (which should alternate
with the apple) never appears. Thanks to Forrest for guessing there was something
wrong with my apple, although he had no way of knowing what.
ADB??
Kirk Chase
Anaheim CA
It seems someone did not know what the acronym “ADB” meant in a recent
article. “ADB” stands for “Apple’s Desktop Bus”. It was introduced with the new
keyboard. It allows the chaining of serial devices such as keyboards, mice, tablets, and
so on to the Mac.
If you would like more information on ADB, there is an article by Dave Kelly and
David Smith in the March '89 issue. It explains some of the concepts. In their
example , they demonstrate some simple communication with the ADB extended
keyboard. It also references Tech Note #206. You can more find information on the
Apple Desktop Bus in Inside Macintosh Vol. V.
MacFortran subroutines from MPW Assembler
Bob Robinson
Plainfield NJ 07060
One of the first things I needed after buying MPW was a way to get the files from
the assembler into a format that could be used as a subroutine by Absoft MacFortran
(chemists aren’t instructed in ‘C’ in college or grad school.) MacFortran subroutines
can be speeded up dramatically (also true of other languages) by hand-tuning the
compiler’s assembly language output. The Fortran program listed below strips out the
unneeded bytes from the MPW assembler object file. The resulting file is callable from
MacFortran as a subroutine, which can be loaded dynamically or linked in with the
main program. Also listed below is a short assembly language Fortran function for
compilation by MPW. The function locks down a Mac memory manager handle and
returns a pointer. MacFortran expects function results to be returned in register D0,
so the subroutine must save the result in D0 before exiting (the toolbox traps used
here happen to use D0.) If it’s to be loaded dynamically by MacFortran, the subroutine
must preserve A0. Note: makesub displays the subroutine name in the menu bar, to
avoid the Fortran TTY window (compile with ‘O’ option.)
*********************************************************************e
*******************
program makesub
* R.S. Robinson 6/12/89
* Converts MPW Asm ‘.a.o’ files into MacFortran ‘.sub’ files.
* File name is obtained from clipboard.
* Removes 1st 36 bytes, and last 8 bytes (44 bytes smaller)
implicit none ! always a good idea
include toolbx.par ! MacFortran toolbox definitions
integer i,j,toolbx,htoptr,length,scrap_h,scrapptr
integer*1 subr(16384) ! can make bigger if needed
character*6 fname ! subroutine names always ≤ 6 chars long plus
‘.sub’
logical*4 exists ! error checking
scrap_h=toolbx(NEWHANDLE,0) ! needs a dummy handle
length=toolbx(GETSCRAP,scrap_h,”TEXT”,i) ! we don’t use i
* funct ‘htoptr’ locks handle & returns 32bit comptble ptr;
* or use toolbox calls: call
toolbx(HLOCK,scrap_h);scrapptr=LONG(scrap_h)
scrapptr=htoptr(scrap_h)
fname=’’;if (length>6) length=6
do (i=1,length);fname(i:i)=CHAR(BYTE(scrapptr+i-1));repeat
call toolbx(HUNLOCK,scrap_h) ! finished with the scrap, release the
handle
inquire (file=TRIM(fname)//’.a.o’,exist=exists)
if (.NOT.exists) stop
call toolbx(INSERTMENU,toolbx(NEWMENU,20,char(length)//fname),0)
call toolbx(DRAWMENUBAR) ! show that we found the file
open(20,file=fname//’.a.o’,form=’unformatted’,recl=1)
do (i=1,36);read(20,end=100) subr(i);repeat ! skip 1st 36 bytes
do (i=1,16384);read(20,end=100) subr(i);repeat ! read the ‘.a.o’
file
100 close(20);i=i-9 ! ignore last 8 bytes plus loop overrun
open(20,file=fname//’.sub’,status=’new’,form=’unformatted’,recl=1)
do (j=1,i);write(20) subr(j);repeat;close(20) ! write ‘.sub’ file
end
*********************************************************************=
*******************
* Assemble the code below with MPW Asm, then run ‘makesub’ after
copying ‘htoptr’
* to the clipboard in MPW. The ‘makesub’ program will produce a
MacFortran-compatible
* subroutine from the MPW ‘a.o’ file. As set up here, ‘makesub’ must
be in the same
* folder as the ‘.a.o’ file. The MPW command sequence is:
*
* (copy ‘htoptr’ to clipboard, then)
* Asm [pathname:]htoptr.a
* [pathname:]makesub (must remove ‘ apl’ extension from Fortran
program)
*
; integer*4 function htoptr( handle)
; R.S. Robinson 6/12/89
; Takes ‘ handle’ as argument, returns locked pointer as function
result.
; Function results are obtained by MacFortran from register D0.
;
INCLUDE ‘Traps.a’ ; MPW equates
Start PROC ; needed for MPW
HTOPTR: MOVE.L A0,A2 ; preserve A0 for MacFortran
MOVEA.L 4(A7),A0 ; load pointer to ‘ handle’ argument
MOVE.L (A0),A0 ; load ‘ handle’
_MoveHHi ; move handle to top of heap zone
_HLock ; lock it
MOVE.L (A0),D0 ; convert to pointer, ready to strip
_StripAddress ; it’s now ’32-bit clean;’ result is in D0
MOVE.L A2,A0 ; restore A0
RTS ; all done; return to Fortran
END
File Comments
John I. Prugh
Tucson, AZ
First of all, I would like to thank you for providing a really informative and high
quality journal to those of us interested in using and programming on the Mac. Thanks
to you (and people like Richard Clark and Chuck Rusch) all the keys on my Mac’s
keyboard work again and the flicker is gone from the screen, and some things make a
lot more sense now
Secondly, I have a couple of questions you might be able to answer for me or
redirect to someone who can. I would like to write a routine that would enable me to
insert new information into the comment field of a file’s Get Info window. As far as I
can tell, this data is maintained in resources in the DeskTop file called FCMTs. I can’t
find any information regarding FCMTs in Apple’s Inside Macintosh.
Can you tell, me how the DeskTop knows which FCMT belongs to which file? How
would I go about updating the FCMT for an arbitrary file without invoking Get Info
from the standard Finder File menu.
I also have a question about Desk Accessories. Is it possible for a desk accessory
to close itself, or does it always require the user to click on the DA window’s close
box? If a DA can close itself, how does it do it?
Once again, thank-you for a good magazine and the worthwhile information you
pack into it. (You probably think people say these nice things just so they’ll get a
[Ok, a DA can close itself. As to when, that is up to the DA- Close box, menu
selection, etc. You then send a CloseDriver() passing it the driver reference number
(This message is passed automatically when the close box is clicked). This will then
send your driver a close message. If you are using THINK C, this means the entry point
selector will be 4. You then need to close any files, release any memory you may have
allocated, delete and dispose of any menu you may of put up (redraw the menu bar
afterwards), and dispose of any window you created.
On FCMTs, I will refer you to Technical Note #29. In it, they say the resource
are for “reading” only for the Finder’s sake. But they also say that the comments are
not preloaded when the DeskTop is opened, so I imagine you might not cause too much
trouble. On HFS volumes you call PBGetCatInfo (Read Inside Macintosh Vol. IV, page
155 and Tech Note #69). The comment ID for a file is kept in
ioFlXFndrInfo.fdComment and for a folder it is in ioDrFndrInfo.frComment. Then with
the Resource Manager, you can open up the desktop file and get the FCMT with that ID.
It is just a Pascal string. Typecast it, change it, and follow the procedure outlined in
the resource manager to change it. I believe this will change the file comment.-ed]
Speeding Up Development
MacAnalyst 2.0 and MacDesigner 3.0
Excel Software
Excel Software has released upgraded versions of their CASE tools for the
Macintosh. MacDesigner can be used to automate the structured design process or
document existing software. MacAnalyst automates the process of analyzing complex
systems by expressing it in graphic notations. Some of their new features include
additions for designing object oriented structure, and an advanced global rename
capability. For more information, contact Excel Software at:
P.O. Box 1414
Marshalltown, IA 50158
(515) 752-5359