From: pottier@clipper.ens.fr (Francois Pottier) Subject: C.S.M.P. Digest, Issue 3 Date: Mon, 14 Mar 94 14:36:48 MET C.S.M.P. Digest Mon, 14 Mar 94 Volume 3 : Issue 3 Today's Topics: A4 Worlds in MPW c-c++? Is it possible? Documented sliders? How do I know if AppleTalk uses print port? How to convert date to seconds *correctly*? To Handle or not to Handle? When to unlock? The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier (pottier@clipper.ens.fr). The digest is a collection of article threads from the internet newsgroup comp.sys.mac.programmer. It is designed for people who read c.s.m.p. semi- regularly and want an archive of the discussions. If you don't know what a newsgroup is, you probably don't have access to it. Ask your systems administrator(s) for details. If you don't have access to news, you may still be able to post messages to the group by using a mail server like anon.penet.fi (mail help@anon.penet.fi for more information). Each issue of the digest contains one or more sets of articles (called threads), with each set corresponding to a 'discussion' of a particular subject. The articles are not edited; all articles included in this digest are in their original posted form (as received by our news server at nef.ens.fr). Article threads are not added to the digest until the last article added to the thread is at least two weeks old (this is to ensure that the thread is dead before adding it to the digest). Article threads that consist of only one message are generally not included in the digest. The digest is officially distributed by two means, by email and ftp. If you want to receive the digest by mail, send email to listserv@ens.fr with no subject and one of the following commands as body: help Sends you a summary of commands subscribe csmp-digest Your Name Adds you to the mailing list signoff csmp-digest Removes you from the list Once you have subscribed, you will automatically receive each new issue as it is created. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest. Questions related to the ftp site should be directed to scott.silver@dartmouth.edu. Currently no previous volumes of the CSMP digest are available there. Also, the digests are available to WAIS users as comp.sys.mac.programmer.src. ------------------------------------------------------- >From btodorof@hmc.edu. (Brian Todoroff) Subject: A4 Worlds in MPW c-c++? Is it possible? Date: 26 Feb 1994 08:51:25 GMT Organization: Harvey Mudd College, Claremont CA Does anyone know if it is possible to do A4 worlds such as those in Think C in MPW C. This would be very useful to me in writing some external code modules for Photoshop. Please help if you can. +++++++++++++++++++++++++++ >From macguru@halcyon.com. (Allan Foster) Date: 27 Feb 1994 22:22:01 GMT Organization: Guru Inc In article <2kn2id$pvi@jaws.cs.hmc.edu> btodorof@hmc.edu. (Brian Todoroff) writes: > Does anyone know if it is possible to do A4 worlds such as those in > Think C in MPW C. This would be very useful to me in writing some > external code modules for Photoshop. Please help if you can. Well, no. Not A4 worlds exactly. But it is fairly easy to use A5 worlds from stand alone code resources in MPW. For MPW C, it is very check out technote 256 to show you how to do it. Doing it with MPW C++ is a little more exciting. The main problem is dealing with static constructors, and the need for a jump table. I wrote a paper for MacHack 91 about doing this, and the code was released public domain. I know it is up on AOL, and on CI$, and is probv available on one of the internet acrhives as well. Regards Allan Foster ---------------------------------------------------------- I am responsible for what I say and do. -- Allan Foster -- --------------------------- >From hellstrm@access3.digex.net (Ben Hellstrom) Subject: Documented sliders? Date: 21 Feb 1994 14:44:13 -0500 Organization: Express Access Online Communications, Greenbelt, MD USA I am trying to put a slider in a modeless dialog. I have tried swiping the slider from the "Sound" CDEV and also from "Appmaker" (which I own). After I load in the resource and set up the contrlRect, contrlValue, etc the slider comes up looking OK and is updated properly. Furthermore, when I click on it, FindWindow() returns a code of 'inThumb'. But when I try to track it the slider thumb just sits there. TrackControl doesn't return until I release the mouse button, but the contrlValue field is unchanged. Any suggestions? Are there any *documented* slider CNTL resources around. Without any documentation, they are hard to figure out. I searched through Apple's IM and the TNs and didn't find anything under "slider". Thanks for any help. Ben Hellstrom hellstrm@access.digex.net +++++++++++++++++++++++++++ >From marshall@kauri.vuw.ac.nz (Stephen Marshall) Date: 24 Feb 1994 20:54:50 GMT Organization: Victoria University of Wellington In article <2kb2ud$nth@access3.digex.net>, hellstrm@access3.digex.net (Ben Hellstrom) wrote: > Are there any *documented* slider CNTL resources around. Without > any documentation, they are hard to figure out. I searched through > Apple's IM and the TNs and didn't find anything under "slider". > > Thanks for any help. > > Ben Hellstrom > hellstrm@access.digex.net Somewhat foolishly I have posted a request for such a beast on Alt.sources.mac (apparently a no-no). No responses yet. For such a commonly implemented beast it seems to be quite uncommon to post code for it. If anyone does post source or an explanation of how to use the sound cdevs CNTL I would be greatful. PS: is there not a slight copyright problem with using the CNTL resource out of the Sound CDEV? I would have thought that Apples copyright would prohibit plundering? Stephen -- Macintosh Consultant Marshall@kauri.vuw.ac.nz Victoria University of Wellington New Zealand +++++++++++++++++++++++++++ >From egurney@vcd.hp.com (Eddy J. Gurney) Date: Fri, 25 Feb 1994 18:23:20 GMT Organization: Hewlett-Packard VCD Stephen Marshall (marshall@kauri.vuw.ac.nz) wrote: >In article <2kb2ud$nth@access3.digex.net>, hellstrm@access3.digex.net (Ben >Hellstrom) wrote: > >> Are there any *documented* slider CNTL resources around. Without >> any documentation, they are hard to figure out. I searched through >> Apple's IM and the TNs and didn't find anything under "slider". >Somewhat foolishly I have posted a request for such a beast on >Alt.sources.mac (apparently a no-no). No responses yet. For such a commonly >implemented beast it seems to be quite uncommon to post code for it. If >anyone does post source or an explanation of how to use the sound cdevs >CNTL I would be greatful. There is a very nice freeware slider CDEF that is used in Jersey Scientific's CMaster. The only reason I know it's freeware is from the little blurb in the manual (which is at home right now). If someone knows where this CDEF is available as a nice little package, with documentation and maybe even (we can always hope) source, please let us know! If no one can find it, I'll extract the CDEF and explain how it works (someone sent me e-mail a while ago explaining that it is pretty easy to use, just use SetMinCtrl/SetMaxCtrl, etc.) in a short read me and submit it to alt.sources.mac... -- Eddy J. Gurney N8FPW Hewlett-Packard Company, Vancouver (USA!) Division egurney@vcd.hp.com #include "Failures are divided into two classes-- those who thought and never did, and those who did and never thought." John Charles Salak +++++++++++++++++++++++++++ >From hpoppe@ncar.ucar.edu (Herb Poppe) Date: 25 Feb 1994 19:17:04 GMT Organization: National Center for Atmospheric Research In article marshall@kauri.vuw.ac.nz (Stephen Marshall) writes: > In article <2kb2ud$nth@access3.digex.net>, hellstrm@access3.digex.net (Ben > Hellstrom) wrote: > > > Are there any *documented* slider CNTL resources around. Without > > any documentation, they are hard to figure out. I searched through > > Apple's IM and the TNs and didn't find anything under "slider". > > ... > > Somewhat foolishly I have posted a request for such a beast on > Alt.sources.mac (apparently a no-no). No responses yet. For such a commonly > implemented beast it seems to be quite uncommon to post code for it. If > anyone does post source or an explanation of how to use the sound cdevs > CNTL I would be greatful. >... Source code (in C) for a slider CDEF (horiz. orientation only) is available at the alt.sources.mac archive: ftpbio.bgsu.edu in: "/Bio Mail Server/ftp/pub/alt.sources.mac/" as: cdef-slider.cpt cdef-slider.info Herb Poppe National Center for Atmospheric Research (NCAR) hpoppe@ncar.ucar.edu 1850 Table Mesa Dr. (303) 497-1296 Boulder, CO 80303 +++++++++++++++++++++++++++ >From hellstrm@access2.digex.net (Ben Hellstrom) Date: 26 Feb 1994 14:30:41 -0500 Organization: Express Access Online Communications, Greenbelt, MD USA In article , Stephen Marshall wrote: >In article <2kb2ud$nth@access3.digex.net>, hellstrm@access3.digex.net (Ben >Hellstrom) wrote: > >> Are there any *documented* slider CNTL resources around. Without >> any documentation, they are hard to figure out. I searched through >> Apple's IM and the TNs and didn't find anything under "slider". >> >> Thanks for any help. >> >> Ben Hellstrom >> hellstrm@access.digex.net > >Somewhat foolishly I have posted a request for such a beast on >Alt.sources.mac (apparently a no-no). No responses yet. For such a commonly >implemented beast it seems to be quite uncommon to post code for it. If >anyone does post source or an explanation of how to use the sound cdevs >CNTL I would be greatful. > >PS: is there not a slight copyright problem with using the CNTL resource >out of the Sound CDEV? I would have thought that Apples copyright would >prohibit plundering? > >Stephen >-- The sound CDEV is already in public domain (ftp.apple.com) with liscence to copy. I didn't intend to distribute it. BTW, I also own AppMaker 1.5.4 which *also* has the identical slider and liscence to distribute. The darndest thing is that I can easily put together an AppMaker project where the slider works but when I transfer the code resources over to my project it stops working!! Ben Hellstrom hellstrm@access.digex.net --------------------------- >From johnc@flora.ruakura.cri.nz (John Curtis) Subject: How do I know if AppleTalk uses print port? Date: 21 Feb 1994 20:48:20 GMT Organization: Hort+Research How do I find out if AppleTalk is controlling the printer port? I can check to see if the serial drivers are in use via CRMIsDriverOpen(). Likewise I can see if .MPP or .ATP is open, but can't tell if they're using ethernet or the printer port... Basically I want my app to ask before stealing the printer port... Thanks! -- ----------------------------------------------------------------------------- John Curtis | Hort+Research | johnc@flora.ruakura.cri.nz Hamilton, New Zealand | curtisj@ruakura.cri.nz +++++++++++++++++++++++++++ >From Bob@lapwing.demon.co.uk (Bob Lindsey) Date: Tue, 22 Feb 1994 05:35:50 +0000 Organization: LapWing Communications Ltd In article johnc@flora.ruakura.cri.nz "John Curtis" writes: > How do I find out if AppleTalk is controlling the printer port? IM vol II, pages 304 to 305 cover this. -- Bob Lindsey on bob@lapwing.demon.co.uk +++++++++++++++++++++++++++ >From d88-jwa@hemul.nada.kth.se (Jon Wätte) Date: 22 Feb 1994 17:09:22 GMT Organization: Royal Institute of Technology, Stockholm, Sweden In johnc@flora.ruakura.cri.nz (John Curtis) writes: >How do I find out if AppleTalk is controlling the printer port? >Basically I want my app to ask before stealing the printer port... Just call OpenDriver on the out port; if LocalTalk is using it, you will get a port busy error back. Of course, you should use the Comms Resource Manager to build a pop-up menu for the user to selects what port to use. See code in the FAQ. -- -- Jon W{tte, h+@nada.kth.se, Mac Hacker Deluxe -- What we need is a good GNU [...] licence manager implementation. -- Raphael Manfredi +++++++++++++++++++++++++++ >From leonardr@netcom.com (Leonard Rosenthol) Date: Wed, 23 Feb 1994 18:58:51 GMT Organization: Aladdin Systems, Inc. In article <2kde82$836@news.kth.se>, d88-jwa@hemul.nada.kth.se (Jon Wtte) wrote: > In johnc@flora.ruakura.cri.nz (John Curtis) writes: > > >How do I find out if AppleTalk is controlling the printer port? > >Basically I want my app to ask before stealing the printer port... > > Just call OpenDriver on the out port; if LocalTalk is using it, > you will get a port busy error back. > Nope, won't work! _OpenDriver does NOT return "Port in Use" :(. Also, the other issue that no one has yet brought up is that on certain machines (ie. Duos) there is only ONE external serial port which doubles as both modem & printer port. This is a very special case you need to worry about when trying things like this. Leonard -------------------------------------------------------------------------- Leonard Rosenthol Internet: leonardr@netcom.com Director of Advanced Technology AppleLink: MACgician Aladdin Systems, Inc. GEnie: MACgician +++++++++++++++++++++++++++ >From jvp@tools1.ee.iastate.edu (Jim Van Peursem) Date: 24 Feb 94 21:55:42 GMT Organization: Iowa State University, Ames, Iowa >> In johnc@flora.ruakura.cri.nz (John Curtis) writes: >> >> >How do I find out if AppleTalk is controlling the printer port? >> >Basically I want my app to ask before stealing the printer port... >In article <2kde82$836@news.kth.se>, d88-jwa@hemul.nada.kth.se (Jon Wtte) >wrote: >> Just call OpenDriver on the out port; if LocalTalk is using it, >> you will get a port busy error back. In leonardr@netcom.com (Leonard Rosenthol) writes: > Nope, won't work! _OpenDriver does NOT return "Port in Use" :(. It returns error -97 (portInUse) every time I do it. This may be on the particular machines I'm testing this on, but I doubt it. Error -97 is an AppleTalk error. This may be confused with "how do I tell if a port is open" which is NOT possible. But if the port is using AppleTalk, it IS possible. > Also, the other issue that no one has yet brought up is that on certain >machines (ie. Duos) there is only ONE external serial port which doubles as >both modem & printer port. This is a very special case you need to worry >about when trying things like this. Or worse yet, inconsistancies in the API between machines. Read my message regarding the PB100 difference I recently discovered. +---------------------------------------------------------------+ | Jim Van Peursem - Ph.D. Candidate - Ham Radio -> KE0PH | | Department of Electrical Engineering and Computer Engineering | | Iowa State University - Ames, IA 50011 : (515) 294-8339 | | internet - jvp@iastate.edu -or- jvp@cpre1.ee.iastate.edu | +---------------------------------------------------------------+ +++++++++++++++++++++++++++ >From egurney@vcd.hp.com (Eddy J. Gurney) Date: Fri, 25 Feb 1994 18:45:24 GMT Organization: Hewlett-Packard VCD Jim Van Peursem (jvp@tools1.ee.iastate.edu) wrote: >>> In johnc@flora.ruakura.cri.nz writes: >>> >>> >How do I find out if AppleTalk is controlling the printer port? >>> >Basically I want my app to ask before stealing the printer port... > It returns error -97 (portInUse) every time I do it. This may be on >the particular machines I'm testing this on, but I doubt it. Error -97 >is an AppleTalk error. > This may be confused with "how do I tell if a port is open" which is >NOT possible. But if the port is using AppleTalk, it IS possible. Why is it NOT possible? Can't you call GetDCtrlEntry on ports 5,6,7,8 (depending on which port you want to know is open... .Ain, .Aout, .Bin, or .Bout, respectively) and check bit 5 of the dCtlFlags, which is set if the driver is open? This should work for the built-in ports; don't know how you'd do it for Comm Toolbox drivers (since you don't know the driver's refNum... or do you?) -- Eddy J. Gurney N8FPW Hewlett-Packard Company, Vancouver (USA!) Division egurney@vcd.hp.com #include "Failures are divided into two classes-- those who thought and never did, and those who did and never thought." John Charles Salak +++++++++++++++++++++++++++ >From leonardr@netcom.com (Leonard Rosenthol) Date: Fri, 25 Feb 1994 23:13:12 GMT Organization: Aladdin Systems, Inc. In article , egurney@vcd.hp.com (Eddy J. Gurney) wrote: > Jim Van Peursem (jvp@tools1.ee.iastate.edu) wrote: > > > This may be confused with "how do I tell if a port is open" which is > >NOT possible. But if the port is using AppleTalk, it IS possible. > > Why is it NOT possible? Can't you call GetDCtrlEntry on ports 5,6,7,8 > (depending on which port you want to know is open... .Ain, .Aout, .Bin, > or .Bout, respectively) and check bit 5 of the dCtlFlags, which is set > if the driver is open? > You can certainly do this - works like a champ and it is how most applications today check for "port in use" since _OpenDriver is not guaranteed to do it (see appropriate Tech Note). > This should work for the built-in ports; don't know how you'd do it for > Comm Toolbox drivers (since you don't know the driver's refNum... or > do you?) > You can get the names of each port via the Communications Resource Manager (CRM), and then walk through the DCE's to find the entry for the port in question. Leonard -------------------------------------------------------------------------- Leonard Rosenthol Internet: leonardr@netcom.com Director of Advanced Technology AppleLink: MACgician Aladdin Systems, Inc. GEnie: MACgician +++++++++++++++++++++++++++ >From jvp@tools1.ee.iastate.edu (Jim Van Peursem) Date: 26 Feb 94 20:18:14 GMT Organization: Iowa State University, Ames, Iowa >> Jim Van Peursem (jvp@tools1.ee.iastate.edu) wrote: >> >> > This may be confused with "how do I tell if a port is open" which is >> >NOT possible. But if the port is using AppleTalk, it IS possible. >In article , egurney@vcd.hp.com (Eddy J. Gurney) >wrote: >> Why is it NOT possible? Can't you call GetDCtrlEntry on ports 5,6,7,8 >> (depending on which port you want to know is open... .Ain, .Aout, .Bin, >> or .Bout, respectively) and check bit 5 of the dCtlFlags, which is set >> if the driver is open? In leonardr@netcom.com (Leonard Rosenthol) writes: > You can certainly do this - works like a champ and it is how most >applications today check for "port in use" since _OpenDriver is not >guaranteed to do it (see appropriate Tech Note). Ah, but is bit 5 guaranteed? From the tech note it looks like a bit of a kludge. From the language, is sounded like it's how the CRM does it, but it's not guaranteed. +---------------------------------------------------------------+ | Jim Van Peursem - Ph.D. Candidate - Ham Radio -> KE0PH | | Department of Electrical Engineering and Computer Engineering | | Iowa State University - Ames, IA 50011 : (515) 294-8339 | | internet - jvp@iastate.edu -or- jvp@cpre1.ee.iastate.edu | +---------------------------------------------------------------+ --------------------------- >From cbo@cs.toronto.edu (Calvin Bruce Ostrum) Subject: How to convert date to seconds *correctly*? Date: 24 Feb 94 19:56:23 GMT Organization: Department of Computer Science, University of Toronto This may strike people as an ignorant and trivial question, but I need to know the answer anyway. How does one convert a date (y/m/d h:m:s) to seconds elapsed since Jan 1 1904? I don't have very complete documentation for the tools I have available, and in MPW 3.2 am using mktime. This seems to pick up the local time zone okay, but it does not seem to pick up whether daylight savings time is active. This is what I need it to do. When I read in a file of dates without timezone specified, it should use the local time zone, which it does. But it should also subtract an hour from the date before doing the conversion if the date is during the time of year when daylight savings time is active. This it does not do. Is there something I can set to make it do this? (If not, is there a simple uniform rule that determines when dst stops and starts? I suppose I should have picked this rule up by now, but I haven't). Please email responses. Thank you. --------------------------------------------------------------------------- Calvin Ostrum cbo@cs.toronto.edu --------------------------------------------------------------------------- It is a far, far better thing to have a firm anchor in nonsense than to put out on the troubled seas of thought. -- John Kenneth Galbraith --------------------------------------------------------------------------- +++++++++++++++++++++++++++ >From resnick@cogsci.uiuc.edu (Pete Resnick) Date: Sun, 27 Feb 1994 13:10:02 -0600 Organization: University of Illinois at Urbana-Champaign In article <94Feb24.145607est.48169@neat.cs.toronto.edu>, cbo@cs.toronto.edu (Calvin Bruce Ostrum) wrote: >This may strike people as an ignorant and trivial question, but I need >to know the answer anyway. How does one convert a date (y/m/d h:m:s) to >seconds elapsed since Jan 1 1904? The system routines String2Date and String2Time will convert string representations into a date record. These will work for all kinds of international representations and other variations on the standard by using the system tokenizer. The date record can be converted to number of seconds since 1/1/1904 by using LongDate2Secs. >This seems to pick up the local time zone okay, but it does not seem to pick >up whether daylight savings time is active. This is what I need it to do. When >I read in a file of dates without timezone specified, it should use the local >time zone, which it does. But it should also subtract an hour from the date >before doing the conversion if the date is during the time of year when >daylight savings time is active. This it does not do. Is there something I can >set to make it do this? (If not, is there a simple uniform rule that >determines when dst stops and starts? I suppose I should have picked this rule >up by now, but I haven't). The rules for daylight savings time not only vary from country to country, but they also vary within countries. (Arizona and parts of Indiana do not use daylight savings). The only way to account for it is to have the time zone encoded in the date string itself, either using rules which tell you whether daylight savings is in effect, like using "CST" for Central Standard Time and "CDT" for Central Daylight Time, or using an absolute offset from GMT, like "-0600" for Central Standard Time (6 hours less than GMT) or "-0500" for Central Daylight Time (5 hours less than GMT). I am working on a routine that uses all of the international routines properly to encode and decode such strings according to RFC 822 and RFC 1123 rules, including parsing out comments. I will post it to the net when I am finished. pr -- Pete Resnick (...so what is a mojo, and why would one be rising?) Graduate assistant - Philosophy Department, Gregory Hall, UIUC System manager - Cognitive Science Group, Beckman Institute, UIUC Internet: resnick@cogsci.uiuc.edu --------------------------- >From francis@pinza.demon.co.uk (Francis H. Knight) Subject: To Handle or not to Handle? Date: Fri, 25 Feb 1994 19:33:16 GMT Organization: Hertfordshire Mac Oasis Recently finding myself with an unanticipated amount of free time, I'm using the opportunity to get up to speed with Think C (5.0.4). I've got myself a deeply nested struct, which contains a load of configuration stuff, etcetera, and I've referred to this struct by a Handle, so the memory manager those kind folks at Apple gave us can do its stuff. Now, a lot of the general-purpose lower-level functions operate on components of the struct, so I'm dereferencing them before entering the functions. I'm finding it very laborious, and not very creative, to work out where to bracket (de-)references to the struct with HLock/HUnlock, given that a heap compaction trigger may be hidden within several layers of function calls. In fact, I'm sure I've missed some, as I'm still experiencing Bus Errors. To help my thinking, can anyone offer any good: Methods of deciding where to HLock/HUnlock? I'm using the manual method of combing through my code line by line and checking against the list of memory-moving routines in Inside Mac. I feel my Mac ought to be able to flag the potential triggers for me! Criteria for judging at the outset of a project whether the hassle of correct HLock/HUnlocking is going to outweigh the benefits of using NewHandle over NewPtr? Methods for debugging CDEVs under System 7? Or is this problem a good reason to create the interface as a small Application, in this age of MultiFinder and AppleEvents? Cheers and thanks, Francis K. At a Mac Oasis Somewhere in Suburban Hertfordshire +++++++++++++++++++++++++++ >From jwbaxter@olympus.net (John W. Baxter) Date: Fri, 25 Feb 1994 15:04:07 -0800 Organization: Internet for the Olympic Peninsula In article , francis@pinza.demon.co.uk (Francis H. Knight) wrote: > I'm finding it very laborious, and not very creative, to work out where to > bracket (de-)references to the struct with HLock/HUnlock, given that a heap > compaction trigger may be hidden within several layers of function calls. > In > fact, I'm sure I've missed some, as I'm still experiencing Bus Errors. > > To help my thinking, can anyone offer any good: > > Methods of deciding where to HLock/HUnlock? I'm using the manual method > of combing through my code line by line and checking against the list > of memory-moving routines in Inside Mac. I feel my Mac ought to be able > to flag the potential triggers for me! Any function call may move memory (by loading a segment), unless you *KNOW* that every segment which might be called by the function you call is already loaded, and that the function you call will never be modified to change what you once knew. IMHO: assume a function call moves memory. Someone may "improve" the code next week. And of course: "that little change couldn't hurt anything, we don't need to retest before the deadline." Even those traps listed as not moving memory may (someday, if not now). SysBeep is a classic example; it didn't...it often does now. Any trap may have been patched. The patch should behave, with respect to moving memory, no "worse" than the version in ROM (any ROM, by the way). But...both shareware and commercial ware messes this up, too. IMHO: treat any trap as moving memory. > Criteria for judging at the outset of a project whether the hassle > of correct HLock/HUnlocking is going to outweigh the benefits of using > NewHandle over NewPtr? Years of experience combined with lucky guesses. > Methods for debugging CDEVs under System 7? Or is this problem a good > reason to create the interface as a small Application, in this age > of MultiFinder and AppleEvents? There's not much reason for writing Control Panels any more, if you only support System 7 and later. If you never write one, you never have to learn how. -- John Baxter Port Ludlow, WA, USA [West shore, Puget Sound] jwbaxter@pt.olympus.net +++++++++++++++++++++++++++ >From AIKEN Date: Sat, 26 Feb 1994 01:13:20 GMT Organization: McGill University In article jwbaxter@olympus.net (John W. Baxter) writes: >In article , >francis@pinza.demon.co.uk (Francis H. Knight) wrote: >> Methods for debugging CDEVs under System 7? Or is this problem a good >> reason to create the interface as a small Application, in this age >> of MultiFinder and AppleEvents? > >There's not much reason for writing Control Panels any more, if you only >support System 7 and later. If you never write one, you never have to >learn how. A quick note on this: I still feel constrained to write a Control Panel if I have nothing to put in the Menu Bar of a possible replacement application. Control Panels still have the advantage of being window- only and opening in the Finder's layer. If Apple seriously wanted to junk the whole Control Panel interface, I would love to see a new type of application: 'mbla' -- menu bar-less app. To open with a face but without a menu bar. Or will this go away when Apple kills off application layers alltogether? :-) Mark Aiken inra@musicb.mcgill.ca +++++++++++++++++++++++++++ >From aep@world.std.com (Andrew E Page) Date: Sat, 26 Feb 1994 15:08:18 GMT Organization: The World Public Access UNIX, Brookline, MA Way back when, when I was learing to program a mac(do no ask) I think the best peice of advice I picked up from a technote or a BBS(can't remember where), was that when handles are concerned: IT PAYS TO BE PARANOID. ALWAYS LOCK THEM BEFORE USING THEM. When you're using your own data structs in handles sometimes it becomes a royal pain to be always typing: HLock((Handle)MyHandle) ; HUnlock((Handle)MyHandle) ; So I created the folowing macros in my personal 'types' file: #define HLOCK(h) HLock((Handle)h) #define HLOCKHI(h) HLockHi((Handle)h) #define HUNLOCK(h) HUnlock((Handle)h) Save's alot of extra typing, improves the readability of the code. Always check MemError() afterwards though, Admittedly, it can get cumbersome, but it's better than spending a couple days of debugging just to find out you passed a function a bogus handle at some point. foo() { MyStruct **MyHnd, *MyPtr ; OSErr err ; HLOCK(MyHnd) ; if( err = MemError() ) HandleMemError(err) ; MyPtr = *MyHnd ; MyPtr->someData = X ; /* * other arcane and silly operations. */ HUNLOCK(MyHnd) ; } Lately though I've been using the calls HGetState and HSetState more frequently, to guarantee that I'm not going to unlock something that had been locked somewhere else before. (That's an ouch) #define HGETSTATE(h) HGetState(h) #define HSETSTATE(h, c) HSetState(h, c) foo(MyStruct **MyHnd) { MyStruct *MyPtr ; OSErr err ; char hndState ; hndState = HGETSTATE(MyHnd) ; HLOCK(MyHnd) ; if( err = MemError() ) HandleMemError(err) ; MyPtr = *MyHnd ; MyPtr->someData = X ; /* * other arcane and silly operations. */ HSETSTATE(MyHnd, hndState) ; } By doing this religiously you can save yourself MUCH trouble throughout a programming project where you're passing back and forth alot of data in handles. -- Andrew E. Page (Warrior Poet) | Decision and Effort The Archer and Arrow Mac Consultant | The difference between what we are Macintosh and DSP Technology | and what we want to be. --------------------------- >From gurgle@netcom.com (Pete Gontier) Subject: When to unlock? Date: Sat, 26 Feb 1994 22:25:50 GMT Organization: cellular Submitted-by: gurgle@netcom.com Archive-name: oHandleLocker.cp francis@pinza.demon.co.uk (Francis H. Knight) writes: >I'm finding it very laborious, and not very creative, to work out where >to bracket (de-)references to the struct with HLock/HUnlock, given >that a heap compaction trigger may be hidden within several layers >of function calls. Essential Secret of Macintosh Programming #412 ---------------------------------------------- Never call HUnlock. Instead, do this: OSErr WhackHandle (Handle foo) { OSErr oe = noErr; char hState = HGetState (foo); if (!(oe = MemError ( ))) { HLock (foo); if (!(oe = MemError ( ))) { // whack the handle HSetState (foo,hState); if (!oe) oe = MemError ( ); } } return oe; } The above is laborious, but that's what C++ is for: class oHandleLocker { char fState; Handle fHandle; public : oHandleLocker (Handle h) { fState = HGetState (h); HLock (h); fHandle = h; } ~oHandleLocker (void) // not virtual deliberately { HSetState (fHandle, fState); } } void WhackHandle (Handle h) { oHandleLocker locked (h); // whack the handle; // it will automagically be unlocked at function exit } Note that the C++ version omits calls to MemError; that's the price you pay for a C++ compiler without exceptions. Most people don't bother with MemError when calling HLock/HGetState/HSetState anyway. I do, but that's neither here nor there. Just be aware of it. Also, oHandleLocker might benefit (depending on your world-view) from dealing with 'void *' instead of 'Handle'. I've used Handle here in order to avoid explaining why 'void *' might be useful. (By the way, none of the enclosed code has been compiled, but it should only require minimal changes, and the principles are sound; I have used them before.) -- Pete Gontier, CTO, Integer Poet Software; gurgle@netcom.com --------------------------- End of C.S.M.P. Digest **********************