From: pottier@clipper.ens.fr (Francois Pottier)
Subject: csmp-digest-v3-088
Date: Mon, 13 Mar 1995 13:22:32 +0100 (MET)

C.S.M.P. Digest             Mon, 13 Mar 95       Volume 3 : Issue 88
 
Today's Topics:
 
        Asynchronous Programming?
        Distinguishing QT-compressed PICTs
        Getting TEHandle from dialog item number
        How to get a CLUT from a PICT file?
        I need gWorlds??
        IP  --> Name translation
        LDEFs - HOW?
        ShowDragHilite -- a real drag?



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.

-------------------------------------------------------

>From Said Kobeissi <said.kobeissi@together.org>
Subject: Asynchronous Programming?
Date: 23 Feb 1995 15:57:07 GMT
Organization: TOGETHER INTERNET SERVICES

Hi all,

  Can anyone give me a pointer to examples or references for
learning how to program asynchronous routines? I want to do
some multitasking but being new to the Mac, have no idea where
to start.

Greatly aprpeciate it..
  Said

said.kobeissi@together.org


+++++++++++++++++++++++++++

>From oster@netcom.com (David Phillip Oster)
Date: Fri, 24 Feb 1995 02:44:18 GMT
Organization: Netcom Online Communications Services (408-241-9760 login: guest)

In article <3iib8j$2g0@bristlecone.together.net> Said Kobeissi <said.kobeissi@together.org> writes:
>  Can anyone give me a pointer to examples or references for
>learning how to program asynchronous routines? 

look in develop issue 17 (March 1994) "Concurrent programming with the Thread
Manager", particularly "Thread Blocking I/O", on page 90.

develop is on the Reference Library volume of the Developer's CD, and is
also available separately from APDA.  I would ignore the article on the
Thread Manager in a recent Mactech.

Also, check out a good theory of computing book on state machines. The problem
with using the Thread Manager with asynchronous routines is:

o If you use pre-emptive threads, you won't run on a PowerMac, and you'll
still have the usual resource problems that interrupt routines have on the
mac.

o If you use only co-operative threads, then your i/o completion routine
will mostly just set some thread to "ready" and it will push things along
at the next co-operative thread Yield(). This can be a problem, since
this thread will be competing for time with your main thread, which is 
calling WaitNextEvent, which takes a larger fraction of a second each time
it is called. In addition, if the user holds the mouse button down over a menu
or a control, WaitNextEvent won't get called until the user lets go, which
can be a _long_ time.

- -------- Here is what I do

pre-allocate resources, and make a "freelist" of them using the Enqueue()
system call.

>From my completion routine, I grab resources with Dequeue(). Enqueue()
and Dequeue() are specifically safe to call at interrupt time.  The system
checks the state of the keyboard and mouse at interrupt time, and Dequeues()
an EventRecord from a low-memory linked list of free event records, fills 
it in, and Enqueues() it on the event queue.  I use a similar technique,
with a private event queue, that I poll at WaitNextEvent time, to see if
the interrupt driven side of my program has any messages for the user 
interface side of the program.

My completion routines generally start more async i/o, but they also start
up "deadman" VBL tasks, which if the VBL fires, KillIO()s the async i/o
and enters an error recovery in the completion routine state machine. If the
i/o completes first, the i/o completion routine disables the VBL.
No race condition is possible, since if the i/o has completed, the KillIO
will do nothing, but if the KillIO comes in before the i/o is complete, the
i/o will be cancelled.

I'm the only guy in the world with 

o a Logitech Cyberman x,y,z,roll,pitch,yaw joysitck,

o a Kurta serial tablet,

o an X-10 CP290 Home Control interface

on my mac, all running off of my own drivers.
-- 
- ------- <mail-to:oster@netcom.com> ----------
There is no sight finer than that of the planet Earth in your rearview mirror.



---------------------------

>From mdg@seas.gwu.edu (Mark D. Gerl)
Subject: Distinguishing QT-compressed PICTs
Date: 24 Feb 1995 05:19:23 GMT
Organization: George Washington University

Here is my question:  Without requiring the presence of QT, how do I
determine that a particular PICT file IS QT compressed (so I can skip it
if QT is NOT installed)?  In other words, how do I distinguish a valid
1-bit B&W pict from a QT-compressed one?

Thanks!

Mark

- --------------------------------------------------------------------------
 Mark D. Gerl        | "The key to immortality is first living a life worth
 mdg@seas.gwu.edu    |  remembering"                    - Brandon Bruce Lee
- --------------------------------------------------------------------------

+++++++++++++++++++++++++++

>From sardaukar@aol.com (Sardaukar)
Date: 24 Feb 1995 22:22:21 -0500
Organization: America Online, Inc. (1-800-827-6364)

>Here is my question:  Without requiring the presence of QT, how do I
>determine that a particular PICT file IS QT compressed (so I can skip it
>if QT is NOT installed)?  In other words, how do I distinguish a valid
>1-bit B&W pict from a QT-compressed one?

Straight from d e v e l o p:
The key to your question is "sit in the bottlenecks." If the picture
contains any QuickTime-compressed images, the images will need to pass
through the StdPix bottleneck. This is a new graphics routine introduced
with QuickTime. Unlike standard QuickDraw images, which only call StdBits,
QuickTime-compressed images need to be decompressed first in the StdPix
routine. Then QuickDraw uses StdBits to render the decompressed image. So
swap out theQuickDraw bottlenecks and put some code in the StdPix routine.
If it's called when you call DrawPicture, you know you have a compressed
picture. To determine the type of compression, you can access the image
description using GetCompressedPixMapInfo. The cType field of the
ImageDescription record will give you the codec type. See the
CollectPictColors snippet on this issue's CD and "Inside QuickTime and
Component-Based Managers" in develop Issue 13, specifically pages 46 and
47, for more information on swapping out the bottlenecks.

---------------------------

>From jbeeghly@u.washington.edu (Jeff Beeghly)
Subject: Getting TEHandle from dialog item number
Date: 25 Feb 1995 21:26:09 GMT
Organization: University of Washington


I have a dialog that contains several TextEdit items.  The items were 
created in ResEdit, not on the fly by calling TENew.

My problem:  In the dialog filter I'm writing, I need to be able to 
access several of the TE fields (I need to Activate & DeActivate).

I can't just use SelIText & GetIText because I need the TEHandle of a 
particular field.

Right now I can access the CURRENT TE field by using
((DialogPeek )theDialog)->textH, but this only applies to the current field.

Ideally, I'd like to find (or create) a call that does

theTEHndl = TEHFromDialogNumber(theDialog, theNumber);

where theTEHndl is a TEHandle, theDialog is a DialogPtr, and theNumber is 
a short (it's the item number).

I have THINK Ref, and I've read through the TextEdit, Dialog Manager, and 
Control manager sections.  The stuff in the TextEdit section all seem to 
require a TEHandle of the item in question, but since I am not creating 
the TE fields on the fly, I don't have the TEHandles.  My goal:  Find out 
how to get a TEHandle from a dialog index number.

Any help would be EXTREEMLY helpful at this point....

Thanks in advance,


Jeff


+++++++++++++++++++++++++++

>From Matt Slot <fprefect@umich.edu>
Date: 25 Feb 1995 23:52:02 GMT
Organization: University of Michigan

Jeff Beeghly, jbeeghly@u.washington.edu writes:
 > My problem:  In the dialog filter I'm writing, I need to be able to 
 > access several of the TE fields (I need to Activate & DeActivate).

There are 2 ways to write dialogs, with ModalDialog() or a modeless dialog
(this includes movable modal for most intents/purposes) using
DialogSelect().
ModalDialog offers a filterProc for you to intercept events, but you can
always return FALSE to let the Dialog Mgr handle it -- but Modal Dialogs
should only need to be activated once! You are not supposed to switch out
of them when they are up. 

If you have a modeless dialog, then it may need to be
activated/deactivated
several times across its lifetime. However, DialogSelect() should already
handle (and eat) the activate events. Note that you dont write a filter
function for DialogSelect... you handle it through your main event loop.


 > I can't just use SelIText & GetIText because I need the TEHandle of a 
 > particular field.
 > 
 > Right now I can access the CURRENT TE field by using
 > ((DialogPeek )theDialog)->textH, but this only applies to the current
field.
 > 
 > Ideally, I'd like to find (or create) a call that does
 > 
 > theTEHndl = TEHFromDialogNumber(theDialog, theNumber);
 > 
 > where theTEHndl is a TEHandle, theDialog is a DialogPtr, and theNumber
is 
 > a short (it's the item number).

Each Dialog has only 1 TERec allocated for it because you are only
supposed
to have one active text field in a window. When the user tabs between
items
or clicks in a new text field, the Dialog Mgr resets the ((DialogPeek)
theDialog)->textH field to be a text record for the new active field.

Because there is little need to modify the TERec of inactive items, there
is
little way to do this beyond the GetIText(), SetIText(), and SelIText()
functions
provided. If you *need* to, you can twiddle the given TERec, but I have
done
lotsa custom dialog stuff and never needed to.

 > I have THINK Ref, and I've read through the TextEdit, Dialog Manager,
and 
 > Control manager sections.  The stuff in the TextEdit section all seem
to 
 > require a TEHandle of the item in question, but since I am not
creating 
 > the TE fields on the fly, I don't have the TEHandles.  My goal:  Find
out 
 > how to get a TEHandle from a dialog index number.

Unfortunately TR is not much help, cuz the information is scattered in
bit and
pieces. You might try NIM-Mac Toolbox Essentials... it is a total rewrite
of the
necessary information.

Matt

+++++++++++++++++++++++++++

>From altura@aol.com (ALTURA)
Date: 25 Feb 1995 21:43:34 -0500
Organization: America Online, Inc. (1-800-827-6364)

> My goal:  Find out 
> how to get a TEHandle from a dialog index number.

The Dialog Manager only creates one TEHandle for the entire dialog.  When
an edit text item is activated, the Dialog Manager munges the TEHandle for
the dialog to use that item's data.  The item_h returned by GetDItem for
each edit text item is merely a handle with text that the Dialog Manager
puts in the TEHandle's hText field.

-Jordan

+++++++++++++++++++++++++++

>From jbeeghly@u.washington.edu (Jeff Beeghly)
Date: 27 Feb 1995 00:32:50 GMT
Organization: University of Washington

Matt Slot <fprefect@umich.edu> writes:

>There are 2 ways to write dialogs, with ModalDialog() or a modeless dialog
>(this includes movable modal for most intents/purposes) using
>DialogSelect().
>ModalDialog offers a filterProc for you to intercept events, but you can
>always return FALSE to let the Dialog Mgr handle it -- but Modal Dialogs
>should only need to be activated once! You are not supposed to switch out
>of them when they are up. 

>If you have a modeless dialog, then it may need to be
>activated/deactivated
>several times across its lifetime. However, DialogSelect() should already
>handle (and eat) the activate events. Note that you dont write a filter
>function for DialogSelect... you handle it through your main event loop.


I am using a custom filter proc, however, the reason I want to activate & 
de-activate TE items is that I'm creating dialogs that act like the 
standard "Save file" dialog box.

In a dialog box I'm working on, there are two lists boxes and two TE 
fields.  Pressing TAB switches the focus.  In my dialog box, it goes TE1, 
TE2, ListBox1, ListBox2.  When LB1 or LB2 have the focus, a rectangle 
outlines the list box (please see NIM, More Toolbox Essentials: List 
Boxes for further info), and I need to de-select the current TE field.



+++++++++++++++++++++++++++

>From Matt Slot <fprefect@umich.edu>
Date: 27 Feb 1995 00:49:18 GMT
Organization: University of Michigan

Jeff Beeghly, jbeeghly@u.washington.edu writes:
 > I am using a custom filter proc, however, the reason I want to
activate & 
 > de-activate TE items is that I'm creating dialogs that act like the 
 > standard "Save file" dialog box.

You should only have to deactivate and then activate the current text
field,
which is accessible thru the textH field of the DialogPeek (the other
field
is already deactivated).

Or, you might try to see if you can tweak the textH and editField info
directly, and use it to indicate the current keyboard focus for both
text AND and lists. (My impression is that the Dialog Mgr wont like this,
but it may be worth a shot.)

---------------------------

>From Martin Cowley <cowley@sys.uea.ac.uk>
Subject: How to get a CLUT from a PICT file?
Date: 20 Feb 1995 19:32:46 GMT
Organization: BITE Project, UEA

I'm putting the finishing touches to a hypermedia system in C++ on Mac
and Windows that uses QuickTime and QuickTime for Windows.  It uses the
QuickTime DisplayPictureFromFile() function to display the picture
straight from disk, rather than reading it into memory first (which is
something I still haven't found a straightforward way of doing).  It sets
up the picture's frame from the information supplied by the
GetPictureFileHeader() function.

All my picture files have the same CLUT (optimised with Debabelizer), and
I'd like to be able to set up the CLUT from the PICT file too without
having to read the whole thing into memory first.  Does anyone know of a
good way to do this?  At the moment I'm storing the CLUT as a resource,
but this means that I have to recompile every time my CLUT changes, and
also that I need to store every possible CLUT as a resource.  Reading the
CLUT from the file would make the system far more flexible as it would be
able to deal with new CLUTs without modification.

QuickTime for Windows has a  GetPicturePalette() function which extracts
the palette from a memory-resident PICT, but then QTW also has a
GetPictureFromFile() function which sets up a picture in memory from the
disk file.  If it's not possible to get the CLUT from the file on a Mac
then I guess I'll have to read it in first, but how?  The Mac seems to
have no equivalent to QTW's GetPictureFromFile() function, and the only
relevant bit of code I've seen is in the Apple PICT File Format Notes -
it looks pretty horrendous and assumes you want to draw the picture as
you're reading it, which is not what I want to do.

Any help on this would be very much appreciated!

Thanks in advance,

Martin.

____________________________________________

Martin Cowley
Senior Research Associate
BITE Project
UEA Norwich
NR4 7TJ
UK

Email: cowley@sys.uea.ac.uk
URL  : http://www.sys.uea.ac.uk/acc/photos/cowley.html

+++++++++++++++++++++++++++

>From english@primenet.com (Lawson English)
Date: 24 Feb 1995 01:18:22 GMT
Organization: Primenet

Martin Cowley (cowley@sys.uea.ac.uk) wrote:
: I'm putting the finishing touches to a hypermedia system in C++ on Mac
: and Windows that uses QuickTime and QuickTime for Windows.  It uses the
: QuickTime DisplayPictureFromFile() function to display the picture

[snipt]

: QuickTime for Windows has a  GetPicturePalette() function which extracts
: the palette from a memory-resident PICT, but then QTW also has a
: GetPictureFromFile() function which sets up a picture in memory from the
: disk file.  If it's not possible to get the CLUT from the file on a Mac
: then I guess I'll have to read it in first, but how?  The Mac seems to
: have no equivalent to QTW's GetPictureFromFile() function, and the only
: relevant bit of code I've seen is in the Apple PICT File Format Notes -
: it looks pretty horrendous and assumes you want to draw the picture as
: you're reading it, which is not what I want to do.

What you are looking for is in NIM:Imaging with QUickDraw, pp 7-13&14.

Assuming that you've gotten a file reference number for the PICT file:

+++++++++++++++++++++++++++
Drawing a Picture Stored in a 'PICT' File

Listing 7-2 illustrates an application-defined routine, called 
MyDrawFilePicture, that uses File Manager routines to retrieve a picture 
saved in a 'PICT' file. The MyDrawFilePicture routine takes a file 
reference number as a parameter. 

Listing 7-2  Opening and drawing a picture from disk

FUNCTION MyDrawFilePicture(pictFileRefNum: Integer; destRect: Rect): OSErr;
CONST
  cPicFileHeaderSize = 512;
VAR
  myPic:        PicHandle;
  dataLength:        LongInt;
  err:        OSErr;
BEGIN      {This listing assumes the current graphics port is set.}
  err := GetEOF(pictFileRefNum,dataLength);      {get file length}
  IF err = noErr THEN BEGIN
    err := SetFPos(pictFileRefNum,fsFromStart,
              cPicFileHeaderSize);   {move past the 512-byte 'PICT' }
                                     { file header}
    dataLength := dataLength - cPicFileHeaderSize;
                        {remove 512-byte }
                        { 'PICT' file header from file length}
    myPic := PicHandle(NewHandle(dataLength)); {allocate picture handle}
    IF (err = noErr) & (myPic <> NIL) THEN BEGIN
      HLock(Handle(myPic));     {lock picture handle before using FSRead}
      err := FSRead(pictFileRefNum,dataLength,Ptr(myPic^));    {read file}
      HUnlock(Handle(myPic));   {unlock picture handle after using FSRead}
      MyAdjustDestRect(myPic,destRect);   {see Listing 7-7 on page 7-18}
      DrawPicture(myPic,destRect);
      IF QDError <> noErr THEN
        ; {likely error is that there is insufficient memory}
      KillPicture(myPic);
    END;
  END;
  MyDrawFilePicture := err;
END;

In code not shown in Listing 7-2, this application uses the File Manager 
procedure StandardGetFile to display a dialog box that asks the user for 
the name of a 'PICT' file; using the file system specification record 
returned by StandardGetFile, the application calls the File Manager 
function FSpOpenDF to return a file reference number for the file. The 
application then passes this file reference number to MyDrawFilePicture.
Because every 'PICT' file contains a 512-byte header for application-
specific use, MyDrawFilePicture uses the File Manager function SetFPos 
to skip past this header information. The MyDrawFilePicture function then 
uses the File Manager function FSRead to read the file's remaining 
bytes -those of the Picture record- into memory. 
The MyDrawFilePicture function creates a handle for the buffer into which 
the Picture record is read. Passing this handle to the DrawPicture 
procedure, MyDrawFilePicture is able to replay onscreen the commands 
stored in the Picture record.
For large 'PICT' files, it is useful to spool the picture data from disk as 
necessary instead of reading all of it directly into memory. 
+++++++++++++++++++++++++++++++++++++++++++++

Once you have the PICT file in memory, you can use the GetPictInfo 
function to gather info about a single picture:

(NIM:Imaging, pp 7-47&48)
++++++++++++++++++++++++++++++++++++++++
GetPictInfo

Use the GetPictInfo function to gather information about a single picture.
FUNCTION GetPictInfo (thePictHandle: PicHandle; 
               VAR thePictInfo: PictInfo; verb: Integer; 
               colorsRequested: Integer; 
               colorPickMethod: Integer; 
               version: Integer): OSErr;

thePictHandle: A handle to a picture. 
thePictInfo: A pointer to a PictInfo record, which will hold information 
about the picture. The PictInfo record is described on page 7-32.
verb  A value indicating what type of information you want GetPictInfo to 
return in the PictInfo record. You can use any or all of the following 
constants or the sum of the integers they represent:

        CONST
        returnColorTable            = 1;    {return a ColorTable record}
        returnPalette            = 2;    {return a Palette record}
        recordComments            = 4;    {return comment information}
        recordFontInfo            = 8;    {return font information}
        suppressBlackAndWhite
                    = 16;    {don't include black and }
                        { white with returned colors}
++++++++++++++++++++++

For more info, look at NIM:Imaging, chapter 7.

Hope that this helps...


--
- -----------------------------------------------------------------------------
Lawson English                            __  __     ____  ___       ___ ____
english@primenet.com                     /__)/__) / / / / /_  /\  / /_    /
                                        /   / \  / / / / /__ /  \/ /___  /
- -----------------------------------------------------------------------------

---------------------------

>From TICS28@waccvm.corp.mot.com (Alan Long)
Subject: I need gWorlds??
Date: 22 Feb 1995 06:14:10 MST
Organization: Motorola

     I'm new to Mac programming, and found during development of my first
(simple!) application that updating the screen after being revealed from
behind another window is a real pain.  It's difficult to keep track of
what should be on-screen and what should not, at any point in time, so my
screen update function became almost as complicated as the rest of the
program.

     Is the answer to use the famous gWorlds (I haven't yet crossed
swords with these)?  I get the feeling that it is preferable to always
write to an off-screen gWorld and then use CopyBits to write to my
visible screen.  A screen update can then presumably be accomplished by
simply copying from off-screen.

     Is this the best general solution to my updating problem?

Regards,
Alan

+++++++++++++++++++++++++++

>From Gordon Graber <gg4921s@acad.drake.edu>
Date: 22 Feb 1995 14:51:57 GMT
Organization: Drake University

In article <1995Feb22.132656.21397@schbbs.mot.com> Alan Long,
TICS28@waccvm.corp.mot.com writes:
>behind another window is a real pain.  It's difficult to keep track of
>what should be on-screen and what should not, at any point in time, so my
>screen update function became almost as complicated as the rest of the
>program.

Perhaps you, like I, are making the the situation too complicated.  I
have found that the easiest way the update a window is to draw the entire
window.  When issuing your drawing calls, bracket them with
the BeginUpdate/EndUpdate statements.  This will allow the system to
handle exactly what part of the window actually gets drawn into.
You need not be concerned with what part of a window is, say, revealed,
because the update mechinism handles that for you
  GWorlds are not going to help you in this respect.  What gworlds will
allow you to do is set up your window, offscreen.  When  you copy the
offscreen gworld to your window, your window is drawn
"at once", without the user seeing all the drawing calls executing that
comprise the graphics inside your window.  Since you have constucted the
"content" of your window offscreen, and then copy that offscreen
"content" to your "visible" window, the user only sees one "drawing
command".
  Again it is the update mechanism that ensures that only the parts of
the window that need updating, i.e. the parts that have been uncovered,
are actually drawn into.
  Hope it helps!
Gordon Graber: gg4921s@acad.drake.edu

+++++++++++++++++++++++++++

>From ssample1@cc.swarthmore.edu (Stephen &roo Sample)
Date: Wed, 22 Feb 1995 12:34:05 -0500
Organization: Radio�cular Stereo Systems

In article <3ifj2d$ad3@dunix.drake.edu>, Gordon Graber
<gg4921s@acad.drake.edu> wrote:

> Perhaps you, like I, are making the the situation too complicated.  I
> have found that the easiest way the update a window is to draw the entire
> window.  When issuing your drawing calls, bracket them with
> the BeginUpdate/EndUpdate statements.  This will allow the system to
> handle exactly what part of the window actually gets drawn into.
> You need not be concerned with what part of a window is, say, revealed,
> because the update mechinism handles that for you

The other thing you can do is use the visRgn of the window
(window->visRgn) as the mask region when you update with CopyBits. This is
probably marginally faster than the method described above (fewer calls
and less memory being thrown around), but I don't have any numbers.


Ta,
   -Stephen

+++++++++++++++++++++++++++

>From blm@chinook.halcyon.com (Brian L. Matthews)
Date: 22 Feb 1995 17:58:10 GMT
Organization: NW NEXUS, Inc. -- Internet Made Easy (206) 455-3505

In article <1995Feb22.133656.21633@schbbs.mot.com>,
Alan Long <TICS28@waccvm.corp.mot.com> wrote:
|Is this [GWorlds] the best general solution to my updating problem?

Without knowing more about your application it's hard to say, but in
general, the answer is probably not.

First, you only need to keep track of what's in the window, because
BeginUpdate will cause your drawing to be clipped to the region of your
window that needs updating.  In fact, you could draw all your data, and
Quickdraw will automatically clip things correctly.  Of course if you've
got a lot of things to draw, trap overhead may kill you, so you could
compare each item's bounds to the clip region yourself.

Second, keeping GWorlds may take a *lot* of memory.  Consider a full color
window on a 1024x768, 16bit screen.  If the window is zoomed to full size,
a GWorld would probably be around 960x750x2 or 1.44Meg.  And a 1024x768
screen isn't the biggest available, and with multiple monitors your window
could be much bigger.  And of course that's just one window, if you support
multiple windows (which, in general, you should), you'll need a GWorld
for each.  Pretty soon your memory requirements will exceed even those
of Microsoft apps. :-)

Before resorting to GWorlds, look at the design of your app and how you
keep track of your data.  Some judicious redesign may solve your problem.

Brian
--
Brian L. Matthews					blm@halcyon.com
  You can't have a syntax error with a hammer.

+++++++++++++++++++++++++++

>From Gordon Graber <gg4921s@acad.drake.edu>
Date: 22 Feb 1995 19:05:04 GMT
Organization: Drake University

In article <ssample1-2202951234050001@wallach.swarthmore.edu> Stephen
&roo Sample, ssample1@cc.swarthmore.edu writes:
>The other thing you can do is use the visRgn of the window
>(window->visRgn) as the mask region when you update with CopyBits. This
is
>probably marginally faster than the method described above (fewer calls
>and less memory being thrown around), but I don't have any numbers.

  Isn't this the region that the system uses through the update
mechanism, anyway?  Or are you helping the system out, in a sense, by
setting this region manually?  Can you elaborate?

Thanks,
Gordon Graber:  gg4921s@acad.drake.edu

+++++++++++++++++++++++++++

>From jwbaxter@olympus.net (John W. Baxter)
Date: Wed, 22 Feb 1995 13:08:32 -0800
Organization: Internet for the Olympic Peninsula

In article <1995Feb22.133656.21633@schbbs.mot.com>,
TICS28@waccvm.corp.mot.com (Alan Long) wrote:

>      I'm new to Mac programming, and found during development of my first
> (simple!) application that updating the screen after being revealed from
> behind another window is a real pain.  It's difficult to keep track of
> what should be on-screen and what should not, at any point in time, so my
> screen update function became almost as complicated as the rest of the
> program.

gWorlds aside, the general paradigm is to do ALL drawing in response to
update events ("live" scrolling in its various forms being a key
exception).  That means your app needs to keep track of what should be
drawn where (which is fairly natural:  if it were to read the same data
>From a file it would have to know what should be drawn where).  Then upon
update, the easy way is to draw everything.  Slightly more complex (and
perhaps lots faster) is to draw only things which intersect the area of
the window being drawn.  And using gWorlds is a little more complex, but
in many ways better (the user doesn't see things being drawn--she sees the
result).

>      Is the answer to use the famous gWorlds (I haven't yet crossed
> swords with these)?  I get the feeling that it is preferable to always
> write to an off-screen gWorld and then use CopyBits to write to my
> visible screen.  A screen update can then presumably be accomplished by
> simply copying from off-screen.
> 
>      Is this the best general solution to my updating problem?

Often, yes.  Not always.

Suggest you study the code samples (unfortunately, that means the more
complex ones).

   --John

-- 
John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
       Isn't C fun?
   jwbaxter@pt.olympus.net

+++++++++++++++++++++++++++

>From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
Date: Fri, 24 Feb 1995 19:31:29 +1300 (NZDT)
Organization: (none)

TICS28@waccvm.corp.mot.com (Alan Long) writes:
>      I'm new to Mac programming, and found during development of my first
> (simple!) application that updating the screen after being revealed from
> behind another window is a real pain.  It's difficult to keep track of
> what should be on-screen and what should not, at any point in time, so my
> screen update function became almost as complicated as the rest of the
> program.
> 
>      Is the answer to use the famous gWorlds (I haven't yet crossed
> swords with these)?  I get the feeling that it is preferable to always
> write to an off-screen gWorld and then use CopyBits to write to my
> visible screen.  A screen update can then presumably be accomplished by
> simply copying from off-screen.
> 
>      Is this the best general solution to my updating problem?

The general solution is to maintain some sort of data structure that
describes the screen contents, and have a single Draw() function that
draws the whole mess (or better: just the contents of a rectangular
area.

This should usually be the *only* place in your program that you draw
the contents of your window.  Anywhere else that you really think you want
to change what's on the screen, you should just call InvalidRect() on the
area you want to draw into, and wait for the system to send you an update
event.

This breaks down for things like feedback on mouse tracking, and other
animation, but is a good general rule, to br broken when needed.

Now, the data structure that you create to describe the screen's contents
will usually be something like a list of the objects on the screen, but
in some cases you might in fact want to have this data structure be an
off-screen GWorld.  The reason for doing this would usually be that
redrawing the screen takes too long otherwise, and not because it is
too complicated.  If you can draw it in the first place then it's usually
not too much harder to do it so you draw it on demand.

Of course, something that is very complicated to draw is probably also
slow to draw.  But we're talking *really* complicated -- like a 3D render
of a complex scene -- before that's an issue.

Bear in mind also that an offscreen GWorld can solve the window revealing
problem, but it doesn't solve the window resize problem, or the window
scrolling problem unless the offscreen GWorld is the size of the entire
document, not just the size of the window.

A Draw() routine that can on demand draw any rectangle from your document,
OTOH, solves all these problems, and that is exactly how application
frameworks such as MacApp and TCL and PowerPlant do window revealing and
resizing and scrolling (and printing, too).  All by calling a single
user-supplied Draw() routine to draw an appropriate rectangle.

Hope this helps.

-- Bruce

---------------------------

>From giampaol@snowhite.eeap.cwru.edu (Jude Giampaolo)
Subject: IP  --> Name translation
Date: Sun, 26 Feb 1995 12:33:57 -0500
Organization: CWRU Amoeba Project

I'm looking for a code example that takes an IP address and returns the
hostname. I would prefer Pascal, but C would be ok too.

Thanks....

-- 
Jude Giampaolo              Case Western Reserve University
Electrical Engineering      'There's not much to see actually,
and Applied Physics         we're inside a Chinese dragon...'
jcg8@po.cwru.edu            giampaol@snowhite.eeap.cwru.edu

+++++++++++++++++++++++++++

>From chris-b@cs.auckland.ac.nz (chris-b)
Date: Mon, 27 Feb 1995 18:37:58 +1200
Organization: HyperMedia Unit, Comp Sci, Auckland University

In article <giampaol-2602951233570001@caffeine.student.cwru.edu>,
giampaol@snowhite.eeap.cwru.edu (Jude Giampaolo) wrote:

>I'm looking for a code example that takes an IP address and returns the
>hostname. I would prefer Pascal, but C would be ok too.

Here's some C to do the job. Read "MacTCP Programmer's Guide" for more info.
Most error handling is removed for clarity.


#include <MacTCP.h>

OSErr           Err;
ip_addr         IPAddr;
SInt16          IOResult;
hostInfo        HInfo;

////////////////////////////////////////
//Get IP address

    IPAddr = ??;

////////////////////////////////////////
//Open DNR

    Err = OpenResolver(nil);
    if (Err != noErr)
    {
    }

////////////////////////////////////////
//Lookup our machine name on net

    IOResult = inProgress;
    Err =
AddrToName(IPAddr,&HInfo,(ResultProcPtr)DNRResultProc,(char*)&IOResult);
    if (Err == cacheFault)
    {
        WaitFor(&IOResult);
        Err = HInfo.rtnCode;
    }

    switch (Err)
    {
        case noErr:
//Machine name (CString) in HInfo.cname 
            break;

        case noNameServer:
        case authNameErr:
        case noAnsErr:
        case dnrErr:
        case outOfMemory:
            Err = CloseResolver();
            break;

        default:
            Err = CloseResolver();
            break;
   }

////////////////////////////////////////
//Close DNR

    Err = CloseResolver();
    if (Err != noErr)
    {
    }

////////////////////////////////////////

Chris B
- ---------------------------------------------------------------------
NewZealand:AucklandUniversity:ComputerScience:HyperMediaUnit:ChrisBurns
Internet: chris-b@cs.auckland.ac.nz
Phone:    +64 9 373-7599 x6194
Fax:      +64 9 373-7453                         Async, therefore I am.
- ---------------------------------------------------------------------

---------------------------

>From berntson@oeb.harvard.edu (Glenn M. Berntson)
Subject: LDEFs - HOW?
Date: Mon, 20 Feb 1995 08:50:51 -0400
Organization: Harvard University

I've been playing with lists for a while and have heard mention of LDEFs
to add functionality to lists.

How do they work?  Where can I find informtion on how to create and use an LDEF?

Any information would be greatly appreciated.

Thanks

Glenn

+++++++++++++++++++++++++++

>From Matt Slot <fprefect@engin.umich.edu>
Date: 20 Feb 1995 16:29:08 GMT
Organization: University of Michigan

Glenn M. Berntson, berntson@oeb.harvard.edu writes:
 > Where can I find informtion on how to create and use an LDEF?
 
Look at your local Sumex mirror for a file called "sample-ldefs",
somewhere in the depths of the "dev" directory.

Matt

+++++++++++++++++++++++++++

>From kurisuto@babel.ling.upenn.edu (Sean Crist)
Date: 20 Feb 1995 22:41:14 GMT
Organization: University of Pennsylvania, Linguistics Department

In article <berntson-2002950850510001@bloeb-mac8.harvard.edu>,
Glenn M. Berntson <berntson@oeb.harvard.edu> wrote:
>I've been playing with lists for a while and have heard mention of LDEFs
>to add functionality to lists.
>
> How do they work?  Where can I find informtion on how to create and use
> an LDEF? 

The idea of definition functions is common to several of the Toolbox
managers: the menu manager uses MDEFs to draw menus; the window manager
uses WDEFs to draw windows; the list manager uses LDEFs to draw cells in
lists.  For example, the menu manager doesn't do the actual drawing of
menus itself; instead, it calls an MDEF at the appropriate time to draw a
menu.  There's the standard MDEF that draws normal text menus, but you can
write your own MDEF for, say, a tools menu or a patterns menu.

Likewise with the List Manager.  The List Manager figures out how which
cell you've clicked in, what the scroll bars should be doing, etc, but the
actual drawing of the cells is done by the LDEF.  The standard LDEF draws
strings, but you can write an LDEF to draw any kind of cell you like (lists
of icons, etc.)  The description in OldIM IV is pretty clear on how to do
this (I have no idea where it is in NIM).

Apple's original idea was that the LDEF would be a separate resource which
would contain all the code to draw a cell, but the problem is that such
things are annoying to debug, since you can't use your programming
environment to step through them as you can with regular application code.
What a lot of people do is just to make a little _stub_ of an LDEF which
only contains a machine instruction to jump into your main code; then, you
can do your debugging as usual within your program and can also access all
of your program's globals from within your pseudo-LDEF, which you can't do
>From a real LDEF  (Usual caveats about self-modifying code apply).  If you
want details on how to do this, write me, or I can post some Pascal code if
there's interest.

  \/ __ __    _\_     --Sean Crist  (kurisuto@unagi.cis.upenn.edu)
 ---  |  |    \ /     For a free copy of the Bill of Rights, finger
  _| ,| ,|   -----       this account.
  _| ,| ,|    [_]     Q: What do Standard Oil, AT&T, and Microsoft have in
   |  |  |    [_]        common?   A:  Nothing... yet.


+++++++++++++++++++++++++++

>From cwatson@cam.org (Chris Watson)
Date: Wed, 22 Feb 1995 16:23:27 -0500
Organization: Communications Accessibles Montreal, Quebec Canada

In article <berntson-2002950850510001@bloeb-mac8.harvard.edu>,
berntson@oeb.harvard.edu (Glenn M. Berntson) wrote:

> I've been playing with lists for a while and have heard mention of LDEFs
> to add functionality to lists.
> 
> How do they work?  Where can I find informtion on how to create and use
an LDEF?
> 
> Any information would be greatly appreciated.


An LDEF is a List Definition, it's just a little piece of code that
controls how items in a list of drawn, and highlighted...

For example, standard file uses a custom LDEF so those icons can be drawn
next to the file name.

You can get info in NIM:More Mac ToolBox, in the List Manager section...


.:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.
|    Chris Watson                                                   |
|    cwatson@cam.org            Hooked on foniks werkes four me!    |
|    Montreal, Canada                                               |
i:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::i

---------------------------

>From Carl R. Osterwald <carl_osterwald@nrel.gov>
Subject: ShowDragHilite -- a real drag?
Date: Wed, 15 Feb 1995 16:16:53 GMT
Organization: National Renewable Energy Laboratory

The HIG for the drag manager states that a window which will be the drop
location of a drag should be highlighted when the mouse is inside that
window.  To that end, ShowDragHilite is provided to perform this
function.  Unfortunately, it only seems to work when the region to be
highlighted is mostly white (such as Finder windows), or if the bit
depth is 1 (in which case it inverts pixels).  If graphics are
displayed in the region to be highlighted (such as when a pix map is
being displayed), ShowDragHilite does nothing.  This behaviour does not
seem to be documented in the programmer's guide.

Also, if scrolling is to take place, one is supposed to call
DragPreScroll and DragPostScroll so that the highlighting can be erased
before scrolling takes place, and then restored afterwards.  It has
been my experience that these routines may be buggy in that in certain
scrolling situations, the highlighting is not erased properly and you
end up with a series of bars running across your nice clean window. 
This seems to happen about 5% of the time.

The only solution I can see is to dedicate a 3-pixel border around the
outside the display portion of the window for drag highlighting (inside
of the scroll bars, of course).  Doing this also gets around the
scrolling problem because the highlighting never has to be erased.

In summary, it would seem that the drag manager was designed and
optimized for the Finder and displays of text, not graphics.
Any comments?

+++++++++++++++++++++++++++

>From blm@coho.halcyon.com (Brian L. Matthews)
Date: 16 Feb 1995 08:20:00 GMT
Organization: NW NEXUS, Inc. -- Internet Made Easy (206) 455-3505

In article <AB677705AF013448@cro.nrel.gov>,
Carl R. Osterwald  <carl_osterwald@nrel.gov> wrote:
|Unfortunately, it [ShowDragHilite] only seems to work when the region to be
|highlighted is mostly white (such as Finder windows), or if the bit
|depth is 1 (in which case it inverts pixels).

It actually works, it just doesn't look that way. :-)  ShowDragHilite sets
hilite mode and inverts the region.  This means that in a multi-bit
environment, any pixel that is the background color (white, unless you've
changed it) is replaced with the hilite color (normally set via the Color
control panel).  So if your window is completely filled with non-white
(or non-background color) pixels, ShowDragHilite will appear to do nothing.

|Also, if scrolling is to take place, one is supposed to call
|DragPreScroll and DragPostScroll so that the highlighting can be erased
|before scrolling takes place, and then restored afterwards.  It has
|been my experience that these routines may be buggy in that in certain
|scrolling situations

They use updateRgn so if you're doing something strange with it, or not
calling BeginUpdate/EndUpdate or ScrollRect in the normal fashion, it may
not work.  I've never seen a problem with it though.

|The only solution I can see is to dedicate a 3-pixel border around the
|outside the display portion of the window for drag highlighting (inside
|of the scroll bars, of course).  Doing this also gets around the
|scrolling problem because the highlighting never has to be erased.

Or you could overwrite the outer 3 pixels with the diagonal stripes pattern
or draw in the hilight color directly (instead of just inverting in the
hilite mode).  If your window can contain any colors, then it will always
be possible to construct a graphic that is unchanged by any hiliting in
the window itself.

Hmm, just had a thought.  Maybe you could use a set of diagonal patterns
to make a "marching ants" hilighting.  I believe the Drag and Drop HIG
mentions "marching ants" marquees for when a simple 50% gray pattern outline
might not be distinguishable from the stuff in the window, so it would make
sense to use a similar thing when ShowDrawHilite hilighting might not be
distinguishable from the contents of the window.  I'll have to remember
that. :-)

|In summary, it would seem that the drag manager was designed and
|optimized for the Finder and displays of text, not graphics.
|Any comments?

ShowDragHilite and friends provide a simple way to get the standard behavior
when your window contains some stuff over the background color, which is
pretty common.  If you have something different, you may not be able to use
the drag manager provided routines for scrolling and highlighting.  Think of
ShowDragHilite and friends as helper functions that provide the "90%"
behavior.  If you need the "10%" behavior, you have all of Quickdraw to fall
back on.

Brian
--
Brian L. Matthews					blm@halcyon.com
  You can't have a syntax error with a hammer.

+++++++++++++++++++++++++++

>From Malcolm Pradhan <pradhan@camis.stanford.edu>
Date: 16 Feb 1995 17:09:18 GMT
Organization: Section on Medical Informatics, Stanford University

In article <AB677705AF013448@cro.nrel.gov> Carl R. Osterwald,
carl_osterwald@nrel.gov writes:
>Also, if scrolling is to take place, one is supposed to call
>DragPreScroll and DragPostScroll so that the highlighting can be erased
>before scrolling takes place, and then restored afterwards.  It has
>been my experience that these routines may be buggy in that in certain
>scrolling situations, the highlighting is not erased properly and you
>end up with a series of bars running across your nice clean window. 
>This seems to happen about 5% of the time

 I also thought this was the case when I was getting all sorts of
junk thanks to these calls. I was even more suspicious when I discovered
that the Finder doesn't use these calls, it erases the DragHilite and
redraws it each time. Unusually ugly for the Finder.

 However, after I finished my app I have not had this trouble. It seems
that the DragPre/PostScroll are easily confused, for example during
debugging. I'm not convinced that these are buggy in normal use but
they aren't reliable during development.


 Regards,
 Malcolm

+++++++++++++++++++++++++++

>From Carl R. Osterwald <carl_osterwald@nrel.gov>
Date: Thu, 16 Feb 1995 16:22:46 GMT
Organization: National Renewable Energy Laboratory

In article <3hv1rg$blj@news1.halcyon.com> Brian L. Matthews,
blm@coho.halcyon.com writes:

>They use updateRgn so if you're doing something strange with it, or not
>calling BeginUpdate/EndUpdate or ScrollRect in the normal fashion, it
>may not work.  I've never seen a problem with it though.

This is probably what I am seeing--I do have to monkey with the 
updateRgn.

>Or you could overwrite the outer 3 pixels with the diagonal stripes
>pattern or draw in the hilight color directly (instead of just
>inverting in the hilite mode).  If your window can contain any colors,
>then it will always be possible to construct a graphic that is
>unchanged by any hiliting in the window itself.

ShowDragHilite uses only a 2 pixel outline, so I just inset the graphic
display area by this amount. The appearance of a 2 pixel border around
the content is barely noticeable, plus it avoids the scrolling problem,
so I chose this solution. Also, the time/memory it would take to redraw
window portions obliterated by the highlighting would be unacceptable
in my case.

>Hmm, just had a thought.  Maybe you could use a set of diagonal
>patterns to make a "marching ants" hilighting.  I believe the Drag and
>Drop HIG mentions "marching ants" marquees for when a simple 50% gray
>pattern outline might not be distinguishable from the stuff in the
>window, so it would make sense to use a similar thing when
>ShowDrawHilite hilighting might not be distinguishable from the
>contents of the window.  I'll have to remember that. :-)

Because I already have a marching ants border, the pattern was still
(accidently) set to this pattern when I called ShowDragHilite, so I saw
an effect similar to this.  I didn't like it because it is very
different from what one sees in the Finder.

>|In summary, it would seem that the drag manager was designed and
>|optimized for the Finder and displays of text, not graphics.
>|Any comments?
>
>ShowDragHilite and friends provide a simple way to get the standard
>behavior when your window contains some stuff over the background
>color, which is pretty common.  If you have something different, you
>may not be able to use the drag manager provided routines for
>scrolling and highlighting.  Think of ShowDragHilite and friends as
helper functions that provide the "90%" behavior.  If you need the
>"10%" behavior, you have all of Quickdraw to fall back on.

I agree.

+++++++++++++++++++++++++++

>From blm@coho.halcyon.com (Brian L. Matthews)
Date: 17 Feb 1995 18:35:43 GMT
Organization: NW NEXUS, Inc. -- Internet Made Easy (206) 455-3505

In article <AB68C9E683023448@cro.nrel.gov>,
Carl R. Osterwald  <carl_osterwald@nrel.gov> wrote:
|ShowDragHilite uses only a 2 pixel outline, so I just inset the graphic
|display area by this amount.
|Because I already have a marching ants border, the pattern was still
|(accidently) set to this pattern when I called ShowDragHilite, so I saw
|an effect similar to this.  I didn't like it because it is very
|different from what one sees in the Finder.

Although I haven't tried it, this would be my concern too, that it's
different enough that it might not be obvious that it means the same as
the highlight color border.  I agree that the 2 pixel border is the
way to go.  As a bonus, it probably helps set off the graphic from the
window even when the window isn't drag hilited.

Brian
--
Brian L. Matthews					blm@halcyon.com
  You can't have a syntax error with a hammer.

+++++++++++++++++++++++++++

>From devans@apple.com (Dave Evans)
Date: 23 Feb 1995 09:45:22 GMT
Organization: Apple Computer, Inc.

> > ... To that end, ShowDragHilite is provided to perform this
> >function.  Unfortunately, it only seems to work when the region to be
> >highlighted is mostly white ...
> >
> >Also, if scrolling is to take place, one is supposed to call
> >DragPreScroll and DragPostScroll so that the highlighting can be erased
> >before scrolling takes place, and then restored afterwards.  It has
> >been my experience that these routines may be buggy ...

Hello,
Let me answer some comments about the DragHilite routines in the Drag 
Manager toolbox.  First, the general rule for drag hilites is to provide
the best feedback for your users.  You may need to customize the Drag
and Drop Guidelines to fit your interface, and in some cases the
DragHilite routines may not meet your needs.

Specifically, the ShowDragHilite routine will only work correctly if
the window's background color is white or a very light gray.  On a darker
gray background, I recommend you draw our own drag hilite in a very dark
grey and restore to your background color manually.  This should be
easy to implement.

The DragPreScroll and DragPostScroll routines should work fine.  Be
careful with your port's clip region -- if you modify this during
your scroll the drag scroll routines might leave bits behind.

For best scroll appearance, however, I recommend using an offscreen
port for your drawing -- just use the show and hide hilite routines
in this port -- then update to the screen for flicker free scrolling.

And the reason the Finder doesn't use the DragPreScroll and DragPostScroll
routines is because:
  1. They don't use offscreen drawing (probably to use minimal memory)
  2. The Drag Manager and Finder version 7.1.x were developed concurrently
  3. and Francis, the fabulous Finder Engineer, promised he was going to
use
     them but never got around to adding them before finishing the
Finder...
     everyone in unison now: "bad Francis..."

Thank You,
Dave Evans
not a Finder engineer

- --
Apple Computer, Inc. pays the bills but doesn't necessarily endorse
what I put in writing.  (especially after 1 am)

---------------------------

End of C.S.M.P. Digest
**********************