Mar 90 Letters
Volume Number: | | 6
|
Issue Number: | | 3
|
Column Tag: | | Letters
|
Related Info: Resource Manager Dialog Manager Notification Mgr
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 ResEdits 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 MacTutors Mail Order store maybe theyll 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 Apples 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 arent instructed in C in college or grad school.) MacFortran subroutines can be speeded up dramatically (also true of other languages) by hand-tuning the compilers 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 its 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.)
*****************************************************************************************
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 dont 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
100close(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.L4(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 ; its 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 Macs 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 files Get Info window. As far as I can tell, this data is maintained in resources in the DeskTop file called FCMTs. I cant find any information regarding FCMTs in Apples 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 windows 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 theyll get a reply )
[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 Finders 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