These programs all include complete printed manuals and
registration cards. I need to get rid of some excess.
They're the latest versions. I've priced these programs
at less than half the list price and significantly less
than the cheapest mail-order price around.

* MICROSOFT ENTERTAINMENT PACK VOLUME ONE, includes eight
different Windows-based games, including Tetris, Taipei,
Minesweeper, TicTactics, Golf, Cruel, Pegged, and IdleWild,
list $49, sale $20.

* JUST JOKING FOR WINDOWS 1.0, database of jokes from
WordStar, can quickly find jokes for many different
occasions, useful for business writers, speechwriters,
presenters, and others, more than 2,800 jokes under 250
topics, can search by keyword and author, list $49, sale
$25.

* HUMOR PROCESSOR 2.02, DOS-based database of jokes,
requires only 384 KB of RAM, along with thousands of
categorized jokes you can quickly find also includes an
online tutorial for writing your own jokes with proven
comedy forumulas, list $99, sale $45.

* HISTORY OF THE WORLD 1.0, multimedia CD-ROM covering cave
society to the present, includes recordings of 25 famous
speeches from Churchhill, Gandi, and others, list $795, sale
$160.

If you're interested in any of these programs, please phone me at
215-885-7446 (Philadelphia) and I'll save the package for you.


henrik]  My response to the "shooting down" of a Turkish airplane over the
henrik]  Armenian air space was because of the IGNORANT posting of the
henrik]  person from your Country. Turks and Azeris consistantly WANT to
henrik]  drag ARMENIA into the KARABAKH conflict with Azerbaijan. The
henrik]  KARABAKHI-ARMENIANS who have lived in their HOMELAND for 3000
henrik]  years (CUT OFF FROM ARMENIA and GIVEN TO AZERIS BY STALIN) are
henrik]  the ones DIRECTLY involved in the CONFLICT. They are defending
henrik]  themselves against AZERI AGGRESSION. Agression that has NO MERCY
henrik]  for INOCENT people that are costantly SHELLED with MIG-23's and
henrik]  othe Russian aircraft.

henrik]  At last, I hope that the U.S. insists that Turkey stay out of the
henrik]  KARABAKH crisis so that the repeat of the CYPRUS invasion WILL
henrik]  NEVER OCCUR again.

DA] Armenia is involved in fighting with Azarbaijan.  It is Armenian
DA] soldiers from mainland Armenia that are shelling towns in Azarbaijan.

    Well, this is your opinion !

    Turkish/ Azeris can BARK all they WANT since the ABOVE is UNTRUE. However,
    I am sure YOU GUYS would have NEVER brought up ARMENIA's involvement if
    KARABAKHI-Armenians had had HEAVY losses.

DA] You might wish to read more about whether or not it is Azeri aggression
DA] only in that region.  It seems to me that the Armenians are better
DA] organized, have more success militarily and shell Azeri towns
DA] repeatedly.

	Read what ? The New York Times , that is publishing anti-armenian
	articles. Nop, I have my resources. Look, everyone knows how aggressive
        Turks/Azeris have been in the past. Armenians ARE NOT gona sit
	around and watch FIRE WORKS by AZERIS taught by TURKS.

DA] It seems to me that the Armenians are better organized, have more success
DA] militarily and shell Azeri towns repeatedly.

	Buch of non-sence CRAP and you know it. Who the hell you think
        you are talking to ? Azeris are FIGHTING LOCAL ARMENIANS in
	Nagarno-Karabakh. You tell me who has more MIG's ? Freedom fighters
        in Nagarno-Karabakh or Azerbaijan ?

	Again, I will say it for the last time, ARMENIA is NOT involved
        in this WAR and you guys WANT to bring this up in order to cover
        up the Turkish involvment in the Karabakh. Go ahead , REPEAT as
	much as you want.

DA] I don't wish to get into the Cyprus discussion.  Turkey had the right to
DA] intervene, and it did.  Perhaps the intervention was not supposed to
DA] last for so long, but the constant refusal of the Greek governments both
DA] on the island and in Greece to deal with reality is also to be blamed
DA] for the ongoing standoff in the region.

	Not a chance ! You CAN NOT convince me (based on your REASONS)that
	your GOVERNMENT did the RIGHT thing to invade CYPRUS.

DA] Lastly, why is there not a soc.culture.armenia?  I vote yes for it.
DA] After all, it is now free.


Gong!

Take a moment and look at what you just wrote. First you defined
an "objective" morality and then you qualified this "objective" morality
with subjective justifications. Do you see the error in this?

Sorry, you have just disqualified yourself, but please play again.


Which distance? The distance between one point (t = ti) on the first curve
and a point on the other curve with same parameter (u = ti)?


From a recent interview in Middle East Insight magazine,
Clinton said that he supports moving the US Embassy to
Jerusalem, but would not do so at this time because it
would interrupt the peace talks.

--
msilverm@nyx.cs.du.edu				GO CUBS!!!


DALLAS HELPS HAWKS STAY IN MONCTON
After announcing that they would pull their affiliation out
of Moncton, the Winnipeg Jets changed their mind.

The Jets announced the move when they said that they would be slashing
their minor league roster from 20-something to around a dozen; and they
wanted to share with an existing AHL or IHL franchise.

Enter the Dallas Lone Stars. Dallas agreed to supply the remaining
6 or 8 players to the Moncton franchise. Thus keeping the Hawks
in the New Brunswick city.

The deal is for one year and will be extended to three years if
the season ticket base increases to over 3000. The Hawks only sold
1400 for this year.

SAINT JOHN FLAMES OFFICIAL
The Calgary Flames have officially signed a deal with the city of
Saint John, NB. The Saint John Blue Flames will play in the 6200
Exhibition Center. The Flames still have to apply for an expansion
frnachise from the AHL but are expected to have no trouble.

CAPS FOLLOW JACKS TO MAINE
Despite rumors to the contrary, the Capitals will follow the Baltimore
Skipjacks to Maine. The Caps' current farm team, the Baltimore Skipjacks,
announced that they would move to Maine and become the Portland Pirates.
There was much doubt as to if the Caps would follow but they announced
a limited deal with Portland. They would supply a dozen or so players
including 2 goalies. They become the third team to announce a limited
farm team along with Moncton and the Capital District Islanders.


[...]

      Well, chalk one up for driving away sympathies by looking like
a paranoid lunatic.

       Last I heard there were nine.  Apparently as of this point they've
found no bodies, except those killed during the initial assault a couple
of months ago.

       Be cute if Koresh hit the trail.

       Maybe he was bodily assumed into heaven.  Wouldn't that just
make AG Reno's day?


The same place single men do, wallet in back pocket, comb in other
back pocket, keys in front pocket, knive in other from pocket, pen
in shirt pocket, or front pants pocket.  Or do married men start
carrying around a bunch of stuff to keep there women happy?


Even the 68000 can fetch two bytes at a time.

The new instruction in the 68040 is MOVE16 which fetches 16 bytes
at a time instead of 4 which the 68030 has; that means 4 24bit
pixels instead of one.

Cheers,

					/ h+
--
 -- Jon W{tte, h+@nada.kth.se, Mac Hacker Deluxe --


The first premise and the conclusion are not properly translated as identity
statements, since the "is" in those statements is the "is" of predication
rather than of identity.  Instead, they should be translated using a
predicate letter.  Using "g" to designate God and "j" to designate Jesus,
and the predicate letter "E" for the property of being eternal, the
first premise is Eg and the conclusion is Ej.
    The second premise appears to contain an "is" of identity, in which
case it can be properly symbolized as j = g.  But your remark that "Jesus
is a subset of God" suggests that strict identity is not desired here.
If, however, the first premise means that all members making up the set
God have the property of being eternal, the same conclusion follows.


Hello,

does somebody know the functions  XtShellStrings and XtStrings?
I haven't found them in any librarys not Xm, Xt, nor X11, and I need
them to install a tool.

Any hints greatly appreciated! Please reply via e-mail.

Thanks in advance!
_______________________________________________________________________________


I wanted to let people know that this motorcycle has been sold.

Thanks for your inquiries.


===============================================================================
 	I'm looking for the E_Mail Address of the Caere Corporation.
	Their Address is:

	CAERE CORPORATION
	100 COOPER COURT
	LOS GATOS
	CALIFONIA 95030

	If you know the address  o  have access to find it. Please could
	you send it to me.

	My E_Mail Address is:

		<zia@uk.ac.ed.castle>

	Thanking you in advance,


Actually I am trying to write something like this but I encounter some
problems, amongst them:

- drawing a 3d wireframe view of a quadric/quartic requires that you have
the explicit equation of the quadric/quartic (x, y, z functions of some
parameters). How to convert the implicit equation used by PoV to an
explicit one? Is it mathematically always possible?


 ."

I'm surprised. I know of a local case where a guy took his Saturn back five
times to complain they hadn't properly eliminated a rattling noise...so Saturn
gave him a new car.


	This has to be a setup.  Lookit--same site as Arnie Skurow.

Later,


It's normal for the BMW K bikes to use a little oil in the first few thousand
miles.  I don't know why.  I've had three new K bikes, and all three used a
bit of oil when new - max maybe .4 quart in first 1000 miles; this soon quits
and by the time I had 10,000 miles on them the oil consumption was about zero.
I've been told that the harder you run the bike (within reason) the sooner
it stops using any oil.


Sorry, but this is the biggest load of bunk I've seen in a while.
a) The Pirates have been trying to trade LaValliere for some time now.
Nobody was even vaguely interested.
b) Several other teams had made it known that they would grab Prince,
who was out of options.
c) LaValliere's release had nothing to do with him being through. He
was released, because, in the event of an injury to Slaught,
LaValliere is no longer capable (they believe) of being the everyday
catcher.

Since Slaught is as good against righties as he is against lefties,
the offense should actually improve with this move.


Not acceptable. Syria and Lebanon have a right to determine if
they wish to return to the situation prior to the French invasion
where they were both part of the same "mandate territory" - read
colony.

Israel has no right to determine what happens in Lebanon. Invading another
country because you consider them a threat is precisely the way that almost
all wars of aggression have started.

Again territorial expansion by force.

The UN defines them as occupied. They are recognised as such by every
nation on earth (excluding one small caribean island).

So the Adam thinks that peace is possible with continued occupation and
a continued military presence? That is a completely unsustainable situation
because the USA is bankrupt and simply cannot afford to finance the
Israeli ecconomy any more. There is no money for such an occupation.

They were moved in as part of a deliberate policy to prevent the return
of the occupied territories. Machiavelli described the reasoning in the
Prince. The clear intention was to create a constituency which the Likud
beleived could not be deprived of the land stolen from the indigenous
population.

The pretexts under which the settlers aquired land was through the
redefinition of much land used in common as "public land". The assertion
that the village common on which the village depends for food belongs to
an invader simply because no individual has title is clearly an
excuse. When the land is used to build a condominium for aliens brought
in to occupy the land for a foreign power there is a clear breach of the
Geneva convention which stipulates that land use in occupied territories
must not be changed.

No amount of self justifying on the part of Likud and hard linner appologists
will change the fact that the majority of world governments, and all of
those that actually have any power have condemned this practice.

Theyu also are a liability. We are talking about civilian encampments that
would last no more than hours against tanks,

Don't fool yourself. It was the gulf war that brought the Israelis to the
negotiating table. Once their US backers had a secure base in the gulf
they insrtructed Shamir to negotiate or else.

If the creation of settlements had gone on any longer the USA would have
cut the money supply.

Not at all. They can chose to live in an arab state or return to Israel.

The existence of a comunity does not give the right for another country
to annexe territory, not in Bosnia, not in the West Bank.

Unless the new boundaries drawn up are those of 48 there will be no peace.
Araffat has precious little authority to agree to anything else.

The real issue is not the land treaty but the trade treaty. Since the
Palestinians will remain heavily dependent on Israel indefinitely it
is this that will be the guarantor of peace. another factor will be the
return of lands confiscated by the Israeli state within Israel and the
dismantling of the shadow structures which allow discrimination against
non-Jews within what is nominaly a secular state.

The irony is that in return for a guarantee that the palestinian state has
a non descrimination law in order to protect the remaining settlers the
Israeli state is going to be forced inot the same position. This will mean
outlawing of discrimination such as that which prevents arabs from buying
or using much of the land.


Not if you've scored four runs, you don't!  Why strain even the best pitching
staff?  Why not make it easier for them?

In the 2-1 game, the best pitching staff in the world can't compensate
for a blown call, a bad hop, a gust of wind.  Winning close is the
wrong way to win; both keeping opposing runs down AND scoring a lot
yourself are insurance against the "Shit happens" aspect of baseball.

Not every great teamhas even *good* pitching.  The Big Red Machine of
the 70's was league-average in pitching.  But somehow, Rose-Morgan-Bench-
Perez-etc. managed to win 100 games more than once, peaking at 108.


Does anybody know of any information regarding the implementaion of total
 quality management, quality control, quality assurance in the delivery of
 health care service.  I would appreciate any information.  If there is enough
interest, I will post the responses.
        Thank You
        Abhin Singla MS BioE, MBA, MD
        President AC Medcomp Inc


They are illegal here in Manitoba as well though I don't know what
methods are used to detect them.

It has always amazed me with the way the laws work.  It is not illegal to
sell them here in Manitoba, only to have them within a vehicle.  (Last I
heard, they don't have to be installed to be illegal.)


]I wrote the slash two blues for a bit of humor which seems to be lacking
]in the MOA Owners News, when most of the stuff is "I rode the the first
]day, I saw that, I rode there the second day, I saw this"

I admit it was a surprise to find something interesting to read in
the most boring and worthless mag of all the ones I get.

]any body out there know were the sense if humor went in people?
]I though I still had mine, but I dunno...

I think most people see your intended humor, I do, I liked the article.
you seem to forget that you've stepped into the political arena. as well
intentioned as you may intend something you're walking through a china
store carrying that /2 on your head. everything you say or do says something
about how you would represent the membership on any given day. you don't
have to look far in american politics to see what a few light hearted
jokes about one segment of the population can do to someone in the limelight.

OBMoto: I did manage to squeak in a reference to a /2 ;-)


So the only way you can tell a false hadith from a true one is
if it contradicts the Quran?  What if it relates to something
that isn't explicitly spelled out in the Quran?

Also, the Quran wasn't written down during the life of Muhammed
either.  It wasn't long after, but 20 years or so is still long
enough to shift a few verses around.

Karl
 -----------------------------------------------------------------------------


I'm thinking about upgrading my 030 50MHz to the 040 33version.  Has anyone
had any experience with the accelerator, and if so - what do you think?
Any problems, what are the speedometer results?, is it much faster than
the 50MHz?  Basically, I'd appreciate hearing all about this product.  Please
respond via email, and I'll summarize if there's a big response.  thanks
in advance, Andrew


:
: I believe this raid was ill planned because they only had 2 days to plan it,
: and it was continued when failure was obvious because it had a bit part
: in the much larger political agenda of President Clinton. I would even
: suggest that the loss of 4 ATF agents is inconsequential in this the
: context of his political agenda. It MIGHT even be beneficial to his agenda,
: as it helps point up just how evil these assualt weapons are. Further proof
: might be that the ATF denied their agents (Street Stories report) requests
: for sufficient fire power.
:
: Important dates:
: Feb 25th - NJ assembly votes to overturn assault weapon ban.
: Feb 28th - Compound in Waco attacked.
:
: On Feb. 25th the New Jersey assembly voted to overturn the assault weapon
: ban in that state. It looked like it might be a tight vote, but the Senate
: in N.J. was going to vote to overturn the ban. It would not sit well to have
: an Eastern state overturn an assault weapon ban, given Clintons stated
: agenda on gun control. I suspect Clinton gave the order to get someone or
: some: group with assualt weapons and have the press present (they were
: initially
: at the incident in Waco) to record the event for the TV audience. The agent
: on "Street Stories" reported that a supervisor was urging them all to "get
: ready fast", as "they know we are coming". I believe this attack continued,
: even tho the probablility of failure was high,  because it came from the top
: down. After the N.J. assembly vote, the ATF had a limited amount of time to
: come up with something, and the Wackos in Waco fit the bill nicely.
:
: ...rich

   I don't know Rich. Last year when the congress was debating the Bushmans
'Crime Bill', the incident at Lubys' cafe occured. Most of the anti-gun
crap was amended out of the bill anyway.

   Could a president 'order': go find some 'assault weapons' and bring the
media". I hope not.  Frankly, the Toon-meister* scares me. Of course
having a Democratic majority in congress doesn't help. (Apologies to all
Demos' who support RKBA)

( *definition: toon-meister - a characatureic name for the current
president of the U.S.:   Clinton aka, Clintoon aka Toon-meister.)


I am trying to think how to respond to this without involving personal feeling
or perceptions and I can not without having stats to back up my points.
However, I think you approached this the wrong way. I believe all of the
people mentioned here deserve the hall of fame more than Dave Kingman does. I
feel they were all much better players. I am not saying I fell they deserve to
go but that they would deserve it more.

IMHO
Dave Kingman - definately not. They guy only had a couple of years were he
could hit with atleast a respectable averag. The rest of his career I do not
think he was very feared by pitchers. I also do not think he did a lot for the
game. I mean really I am a Met fan - he was a Met for part of his career and I
still would not back him for the Hall of Fame.

Dave Winfield - I think so. He is feared by pitchers, he has had several
season where he hit for a respectable average and his production numbers are
(in my opinion - without stats) better than Kingman's (probably by quite a
bit). I also perceive him to be a leader, maybe not as much as some other
people but none the less a leader. I think he has made substantial
contributions to the game of baseball and to society. Examples of this are
some of the charitable things he has done (I know some of this from when he
was with the Yankees). I think he the type of player that kids can look up to
and while this is definately not the only criteria for the Hall of Fame I
think it deserves some consideration.

Lee Smith - Maybe, I would have to see his stats again but he definately would
deserve to go before the likes of Kingman.

Darrell Evans - No.

Eddie Murray - Maybe, He has had a very good career, he is a leader (although
a silent one), he is a good role model. Are the stats good enough? I am not
sure - but I would once again believe they are much better than Kingman's both
the average as well as the power numbers (but not as good as Winfield's). Just
think, Eddie did not have as much publicity for most of his great years.

Jeff Reardon - My guess is no, but it kind of depends on his numbers. Off the
top of my head I would take Lee Smith first.

Well, I strongly disagree here. Both of these guys deserve it for sure. I
talked about leadership above, both of these guys are leaders and have been
instumental in leading their teams to the post season. Robin does have very
good offensive numbers both average and power and Ozzie has okay numbers
offensively. The difference with Ozzie is that if you gave him a home run for
every run he saved by making an incredible play at shortstop - he would have
shattered Aaron's home run mark by now. How many of those great plays saved
games? How many of those great plays motivated his team to rally and win a
game? While I believe both of these guys have numbers, baseball is about more
than numbers (or at least winning at baseball is about more than numbers).
Both of these guys are proven stars and belong in the Hall of Fame. As does
George Brett who also belongs in this class of player.

Steve Garvey - I am not sure, probably not but I guess I could see someone
making a case for him.

Jack Morris - Once again not my first choice but I can see why someone might
bring up his name.

Kirby Puckett - Probably. The only reason I do not say definately is he still
has time left in his career. If he continues doing what he has been then my
probably will turn into a definately.

Nolan Ryan - Is there really any doubt? I think I heard something about him
having some 53 records (maybe they were not all good - I don't know I did not
hear any of them just the number). He has the numbers, he has the
contributions to the game and community and he is a great role model. I would
not say that he is the best pitcher to ever pitch the game (probably not even
top 20) but he would be the first pitcher I would put in the Hall of Fame
because of his accomplishments (no-hitters, strikeouts, respectable numbers -
even with some weaker teams) you can go on and on. I really hope he gets ALL
the possible votes.

So in summing up I have 3 groups, those that belong, those that probably do
but I am not sure and those that I lean towards saying don't belong at least
not without my seeing stats and possibly hearing reasons why they should go.

Yes -  Winfield, Yount, Brett(not in your mail), O. Smith, Puckett and Ryan
Maybe - Murray and L. Smith
No - Reardon, Garvey, Morris, Evans and definately Kingman

As I said I do not have the stats around so I do not have numbers to back this
up - these are entirely my opinions based on my perceptions.


Well, I would guess the probability of a BMW driver having a gun would
be lower than some other vehicles.  At least, I would be more likely
to say something to someone in a luxosedan, than a hopped-up pickup
truck, for example.

- Mark

------------------------------------------------------------------------
Mark S. Burnham (markb@wc.novell.com) AMA#668966  DoD#0747
Alfa Romeo GTV-6                             '90 Ninja 750


To: margoli@watson.ibm.com (Larry Margolis)
From: anthony.landreneau@ozonehole.com

LM>>The rape has passed, there is nothing that will ever take that away.

LM>True.  But forcing her to remain pregnant continues the violation of
LM>her body for another 9 months.  I see this as being unbelievably cruel.

Life is not a "violation". As for cruel, killing a living being solely
because it exsist. That my friend is down right cold.

                                   Anthony

 * SLMR 2.1 * What's the difference between an Orange?


# #They believe that they have a right to FORCE people to hire them,
# #rent to them, and do business with them, regardless of the feelings
# #or beliefs of the other person.
#
# Cramer, you are off your target again.  The law *forces* no one to obey
# it.  At every point any individual may stand up and say *this law
# sucks*.  Even you could say this.  Gay men and women have not *forced*

You mean they passed a law that does nothing at all?  No enforcement
mechanisms?  As usual, you are wrong.

# any off this.  Changes in the law have been brought about by
# democratic* processes, those same processes are the ones that protect
# you from certain abuses.

Yeah, right.  I guess the next time a homosexual complains about
sodomy laws, I can just echo your stupidity about "democratic
processes" and he won't have any basis for complaint.

# #I must admit that I never understood why it is referred to as an
# #abomination, until I started to read soc.motss, and started finding
# #evidence that homosexuality is a response to child molestation --
# #which is disproportionately done by homosexuals.  (Just to make
# #Brian Kane happy -- 30% of molestation is done by homosexuals and
# #bisexuals, but it is possible that this is because homosexual/bisexual
# #molesters have far more victims than heterosexual molesters.)
#
# No it isn't.  No it isn't. No it isn't and it depends on the subset
# (note *subset*) of abuse you look at.

Repeating it three times makes it more correct?

# #Clayton E. Cramer {uunet,pyramid}!optilink!cramer  My opinions, all mine!
# #Relations between people to be by mutual consent, or not at all.
#
# * Xavier Gallagher*************************** Play  ***************************


Charles Parr, on the Tue, 20 Apr 93 21:25:10 GMT wibbled:

: >If Satan rode a bike (CB1000?) would you stop to help him?

: Of course! We riders have to stick together, you know...Besides,
: he'd stop for me.

: Satan, by the way, rides a Vincent. So does God.

: Jesus rides an RZ350, the Angels get Ariels, and the demons
: all ride Matchless 500s.

: I know, because they talk to me through the fillings in my teeth.

: Regards, Charles
: DoD0.001
: RZ350
: --
: Within the span of the last few weeks I have heard elements of
: separate threads which, in that they have been conjoined in time,
: struck together to form a new chord within my hollow and echoing
: gourd. --Unknown net.person

I think that the Vincent is the wrong sort of bike for Satan to ride.
Honda have just brought out the CB1000 (look in BIKE Magazine) which
looks so evil that Satan would not hesitate to ride it.  17-hole DMs,
Levi 501s and a black bomber jacket.  I'm not sure about the helmet,
oh, I know, one of those Darth Vader ones.  There you go.  Satan.
Anybody seen him lately?  Just a cruisin'?

God would ride a Vincent White Lightning with rightous injection.
He'd wear a one-piece leather suit with matching boots, helmet and gloves.
--

Nick (the Righteous Biker)  DoD 1069  Concise Oxford  New (non-leaky) gearbox

M'Lud.


} >I'd have to say the most impressive HRs I've ever see came from Dave Kingman
} >and his infamous moon-raker drives...
}
} I remember one he hit circa 1976 at Wrigley Field that went across
} the street (in dead center field) and hit a house on the roof.  He
} whiffed a lot, but when he *did* connect, watch out!

the best home run i have *ever* seen came off, believe it or not,
Roger Clemens (sorry, Val) a couple of years ago. he threw a ball to
Incaviglia which was literally at Inky's neck, and he absolutely
hammered the crap out of it. after the swing, Clemens nonchalantly
motioned for a new ball--he didn't even turn around to look, or
even get upset. the ball hit the lights in the left-field standard,
some 70 or so feet about the Green Monster (over 100 feet above the
ground total!)

truly an amazing shot.


# 74S	Later modification of 74 for even higher speed, at some cost in
# 	power consumption.  Effectively obsolete; use 74F.
#
# 74LS	Combination of 74L and 74S, for speed comparable to 74 with lower
# 	power consumption.  Best all-round TTL now, widest variety of
# 	devices.
#
# 74F	Fast as blazes, power not too bad.  The clear choice for high
# 	speed in TTL.  Availability and prices generally good.

I hate to disagree w/ a fellow as smart as Henry, but...

A few years back, I worked on a project using lots of high-speed
stuff.  (My part was slow & parallel, whew.) The mild-mannered designer
working on the fast (serial) stuff cussed & swore at 74F all the time.
It was the Harry Reams of TTL. One ultra-tiny power line glitch, one
hickup, one eyeblink across the board, and bang - the F had
toggled/counted/whatevered.  At times he swore it would count even
without any 5 volt supply ;-} You can guess what the "F" stood for....

They would do anything to push S or work around it to avoid using F. I
don't think I'd consider using F to replace S unless the consequences
were *fully* understood.......


Animal Rights people have been know to do that to other
"Bike riding dogs.cats and Racoons.


Contact me for details.

   peter@psychnet.psychol.utas.edu.au

Peter

----------------------------------------------------------------------------
P.Tattam                                    International Phone 61-02-202346
Programmer, Psychology Department           Australia     Phone   002-202346
University of Tasmania, Hobart, Tasmania, Australia


Not true! Both Type 1 and TT fonts can be of excellent quality and poor quality
at any size. It all depends on the font's maker and the complexity of the glyphs
related to the size and resolution at which they are viewed. Probably the reason
for your opinion/experience that TT is inferior is because most TT fonts on the
market today have been converted from Type 1 outlines to TT either by the font
vendor or end-users using Fontographer or FontMonger instead of the TT fonts being
hand-hinted to take advantage of the TT hinting language. At best these converted
TT fonts will be on a par with the Type 1 font of its orgin.

TrueType is a much richer and more robust hinting language than Type 1 (the hinting
of diagonals for instance, which TT does and Type 1 cannot). If you check out the
Windows 3.1 core fonts (Times, Arial, Courier, Symbol, Wingdings) you'll see what can
be done with TT. There are other fonts out there that have been hand-hinted and not
just converted. Some of the Microsoft TT Font Pack 2 fonts are hinted very well.

Again, not true. The characters in a TT or Type 1 font depend on the maker. If someone
converts a Type 1 font to TT they'll only get the characters in the font of orgin. TT
allows for much more flexibility in this area as well. You can have thousands of glyphs
in a TT font file (Mac/PS/Windows/Unicode char set) and use the characters appropriate
for the particular platform you are running the font on. For instance, all or our fontpack
2 TT fonts have the Mac/Windows char set in them. The metrics of the fonts are such that
if the font is brought over to the mac the user will have access to the full mac char set.

Hope this clears up some of the confusion. Feel free to contact me if anyone would like
more info.

Regards,


The M code stream  might be independently attacked based on knowledge of
clipper chip protocols as revealed plaintext.  This could be invalidated
by changing the temporal and or spatial relationship of the clipper M stream
and the actual transmitted stream, under the control of a secure key
generator synchronized between endpoints.

The useful life time of captured law enforcement blocks might be limited
based on hostile forces using them as targets following transmission
interception.  You would need a large number of them, but, hey there's
supposed to be millions of these things, right?  Adding time stamps to
the encrypted law enforcement block is probably impractical, who wants
an encryption chip with a real time clock?

*****************************************************************************

The entire idea of the law enforcement block can be invalidated.

I just had the thought, that you could capture your own law enforcement blocks
for session keys K that you will not use in actual transmissions as
the session key authenticators.  The proviso that you don't mind your own
serial number being discovered.

d. denning just sent out further information of a new version of the clipper
chip.	If a hash function were to be embedded in a clipper M transmission
block reflecting the law enforcement block, it better not fall on 64 bit block
boundaries.  If it were a recognizeable datum, you could lie with it too.

I like the randomizer inclusion in the MYK-80.  I remember reading that
Intel had an approved random noise source on silicon, hence the ability
to put it Inside.


I got this from GW2000:

From: gateway@aol.com
X-Mailer: America Online Mailer
To: pastor@vfl.paramax.com
Subject: Re: 32-bit disk access
Date: Mon, 29 Mar 93 14:26:45 EST
Message-Id: <9303291426.tn05643@aol.com>
Status: RO

Jon -

To get 32bit access in windows all you have to do is edit the system.ini...
Look under the 386Enhanced section and add this line to it
"32bitdiskaccess=on"... This will give you the 32bitdiskaccess that you
need... Thanks  :)


	I just went through this mess in New Jersey (I'm still waiting for a
refund as well), namely, that the original company made a mistake and left me
in the lurch.  My recourse was through NJ's insurance dept. Office of Consumer
Protection.  You should have a similar office in your state.  Make use of it.

Good luck,


Archive-name: Xt-FAQ
Version: $Id: FAQ-Xt,v 1.28 93/04/02 12:41:12 ware Exp $

		    The X Toolkit Intrinsics F.A.Q
			  A monthly posting

This article contains the answers to some Frequently Asked Questions
(FAQ) from comp.windows.x about the X Toolkit Intrinsics.  To submit
questions (preferably with an answer) send email to: ware@cis.ohio-state.edu

Many FAQs, including this one, are available on the archive site
rtfm.mit.edu in the directory pub/usenet/news.answers.  The name
under which a FAQ is archived appears in the Archive-name
line at the top of the article.  This FAQ is archived as Xt-FAQ.

All code fragments are public domain.

			       Contents
0.  Xt Glossary
1.  Software Versions
2.  Related FAQ's
3.  Why does my application core dump when I use signals/alarms/cthreads?
4.  How do I use a different visual than the default?
5.  Which visual should an application use?
6.  Why do only Shell widgets have a Visual?
7.  Which visual, depth and colormap do Shells inherit?
8.  I've done all the above and I still get a BadMatch error.  Why?
9.  Why doesn't my widget get destroyed when I call XtDestroyWidget()?
10. How do I exit but still execute the DestroyCallbacks?
11. How do I resize a Shell widget?
12. Why can't XtAppAddInput() handle files?
13. What good books and magazines are there on Xt?
14. What Widgets are available?
15. What alternatives to the Intrinsics are there?
16. How do I pass a float value to XtSetValues?
17. How do I write a resource converter?
18. How do I open multiple displays?
19. What changed from R3 to R4 to R5?
20. Where are the resources loaded from?
21. What order are callbacks executed in?
22. How do I know if a widget is visible?
23. How do I reparent a widget in Xt, i.e. XtReparentWidget()?
24. Why use XtMalloc, XtFree, etc?
25. How to debug an Xt application?
26. Why don't XtAddInput(), XtAddTimeout() and XtAddWorkProc() work?
27. What is and how can I implement drag and drop?

----------------------------------------------------------------------
0.  Xt Glossary
----------------------------------------------------------------------

o The Xt Intrinsics implement an object oriented interface to C code
  to allow useful graphical components to be created.  Included with
  this are classes that provide the base functionality: Object,
  RectObj, Core, Composite, Constraint, Shell, OverrideShell, WMShell,
  etc.  The terms "Xt" and "Intrinsics" are used interchangeably,
  however, they are used very precisely to mean a specific library of the X
  window system.  In particular, it does not include the Athena,
  Motif, OLIT or any other widget set.  Without further widgets the
  Intrinsics are not especially useful.

o A widget refers to a user interface abstraction created via Xt.  The
  precise use, is any object that is a subclass of the Core class.  It
  is used loosely to refer to anything that is a subclass of the
  Object class although these are more accurately called windowless
  widgets or gadgets.

o Xlib is the C interface to the X11 protocol.  It is one layer below
  the Xt Intrinsics.  Typically a widget uses relatively few Xlib
  functions because Xt provides most such services although an
  understanding of Xlib helps with problems.

----------------------------------------------------------------------
1.  Software Versions
----------------------------------------------------------------------

The following are the latest versions of Xt based software:
        _____________________________________________________________
	Software	Version		Released	Next Expected
        _____________________________________________________________
	X11R4		patch 18			(none)
	X11R5		patch 21	12/18/92	??
	Athena Widgets	(see X11R5)
	Motif		1.2.1		9/92		??
	OLIT		??		??		??
	Xtra		2.5		6/15/92		??
	Xw		X11R4				(none)
	Xcu		X11R5				(none)
	fwf		3.4		1/11/92		4/93
        _____________________________________________________________

----------------------------------------------------------------------
2.  Related FAQ's
----------------------------------------------------------------------
David B. Lewis (uunet!craft!faq) maintains the FAQ on X.  It
is posted monthly on comp.windows.x and located on export in contrib/FAQ.

Liam R. E. Quin (lee@sq.sq.com) posts an FAQ list on Open Look to
comp.windows.x.

Jan Newmarch (jan@pandonia.canberra.edu.au) posts an FAQ list on Motif
to comp.windows.x.motif.

Peter Ware (ware@cis.ohio-state.edu) posts an FAQ list for
comp.windows.x.intrinsics; it is on export in contrib/FAQ-Xt.

----------------------------------------------------------------------
3.  Why does my application core dump when I use signals/alarms/cthreads?
----------------------------------------------------------------------

In brief, Xlib, Xt and most widget sets have no mutual exclusion for
critical sections.  Any interrupt handler is likely to leave one of
the above libraries in an inconsistent state -- such as all the
appropriate flags not yet set, dangling pointers, in the middle of a
list traversal, etc.  Note that the ANSI C standard points out that
behavior of a signal handler is undefined if the signal handler calls
any function other than signal() itself, so this is not a problem
specific to Xlib and Xt; the POSIX specification mentions other
functions which may be called safely but it may not be assumed that
these functions are called by Xlib or Xt functions.

The only safe way to deal with signals is to set a flag in the
interrupt handler.  This flag later needs to be checked either by a
work procedure or a timeout callback.  It is incorrect to add either
of these in the interrupt handler.  As another note, it is dangerous
to add a work procedure that never finishes.  This effectively
preempts any work procedures previously added and so they will never
be called.  Another option is to open a pipe, tell the event loop
about the read end using XtAppAddInput() and then the signal handler
can write a byte to the write end of the pipe for each signal.
However, this could deadlock your process if the pipe fills up.

Why don't the Intrinsics deal with this problem?  Primarily because it
is supposed to be a portable layer to any hardware and operating
system.   Is that a good enough reason -- I don't think so.

        Note: the article in The X Journal 1:4 and the example in O'Reilly
Volume 6 are in error.

----------------------------------------------------------------------
4.  How do I use a different visual than the default?
----------------------------------------------------------------------

This requires a more complicated answer than it should.  A window has
three things that are visual specific -- the visual, colormap and
border pixmap.  All widgets have their own Colormap and BorderPixmap
resource; only shell widgets have Visual resources (another questions
deals with why shells have a Visual).  The default value of these
resources is CopyFromParent which does exactly what it says.  In the
shell widget CopyFromParent gets evalulated as DefaultVisualOfScreen
and DefaultColormapOfScreen.  When any one of the three resources is
not properly set, a BadMatch error occurs when the window is
created.  They are not properly set because each of the values depends
on the visual being used.

How to get this to work?  There are two parts to the answer.  The
first is if you want an application to start with a particular visual
and the second is if you want a particular shell within an application
to start with a different visual.  The second is actually easier
because the basic information you need is available.  The first is a
little harder because you'll need to initialize much of the toolkit
yourself in order to determine the needed information.

/*
 * Some sample code to start up an application using something other
 * than the default visual.
 *
 * To compile:
 *	cc -g visual.c -o visual -lXaw -lXmu -lXt -lXext -lX11 -lm
 *
 * To run:
 *	./visual -geometry 300x300 -depth 24 -visual StaticColor -fg blue -bg yellow
 *
 * you need to move the mouse to get the particular visuals colormap
 * to install.
 */

#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Shell.h>

typedef struct
{
	Visual	*visual;
	int	depth;
} OptionsRec;

OptionsRec	Options;

XtResource resources[] =
{
	{"visual", "Visual", XtRVisual, sizeof (Visual *),
	XtOffsetOf (OptionsRec, visual), XtRImmediate, NULL},
	{"depth", "Depth", XtRInt, sizeof (int),
	XtOffsetOf (OptionsRec, depth), XtRImmediate, NULL},
};

XrmOptionDescRec Desc[] =
{
	{"-visual", "*visual", XrmoptionSepArg, NULL},
	{"-depth", "*depth", XrmoptionSepArg, NULL}
};

int
main (argc, argv)
	int		argc;
	char		**argv;
{
	XtAppContext	app;		/* the application context */
	Widget		top;		/* toplevel widget */
	Display		*dpy;		/* display */
	char		**xargv;	/* saved argument vector */
	int		xargc;		/* saved argument count */
	Colormap	colormap;	/* created colormap */
	XVisualInfo	vinfo;		/* template for find visual */
	XVisualInfo	*vinfo_list;	/* returned list of visuals */
	int		count;		/* number of matchs (only 1?) */
	Arg		args[10];
	Cardinal	cnt;
	char		*name = "test";
	char		*class = "Test";

	/*
	 * save the command line arguments
	 */

	xargc = argc;
	xargv = (char **) XtMalloc (argc * sizeof (char *));
	bcopy ((char *) argv, (char *) xargv, argc * sizeof (char *));

	/*
	 * The following creates a _dummy_ toplevel widget so we can
	 * retrieve the appropriate visual resource.
	 */
	cnt = 0;
	top = XtAppInitialize (&app, class, Desc, XtNumber (Desc), &argc, argv,
			       (String *) NULL, args, cnt);
	dpy = XtDisplay (top);
	cnt = 0;
	XtGetApplicationResources (top, &Options, resources,
				   XtNumber (resources),
				   args, cnt);
	cnt = 0;
	if (Options.visual && Options.visual != DefaultVisualOfScreen (XtScreen (top)))
	{
		XtSetArg (args[cnt], XtNvisual, Options.visual); ++cnt;
		/*
		 * Now we create an appropriate colormap.  We could
		 * use a default colormap based on the class of the
		 * visual; we could examine some property on the
		 * rootwindow to find the right colormap; we could
		 * do all sorts of things...
		 */
		colormap = XCreateColormap (dpy,
					    RootWindowOfScreen (XtScreen (top)),
					    Options.visual,
					    AllocNone);
		XtSetArg (args[cnt], XtNcolormap, colormap); ++cnt;

		/*
		 * Now find some information about the visual.
		 */
		vinfo.visualid = XVisualIDFromVisual (Options.visual);
		vinfo_list = XGetVisualInfo (dpy, VisualIDMask, &vinfo, &count);
		if (vinfo_list && count > 0)
		{
			XtSetArg (args[cnt], XtNdepth, vinfo_list[0].depth);
			++cnt;
			XFree ((XPointer) vinfo_list);
		}
	}
	XtDestroyWidget (top);

	/*
	 * Now create the real toplevel widget.
	 */
	XtSetArg (args[cnt], XtNargv, xargv); ++cnt;
	XtSetArg (args[cnt], XtNargc, xargc); ++cnt;
	top = XtAppCreateShell ((char *) NULL, class,
				applicationShellWidgetClass,
				dpy, args, cnt);

	/*
	 * Display the application and loop handling all events.
	 */
	XtRealizeWidget (top);
	XtAppMainLoop (app);
	return (0);
}

----------------------------------------------------------------------
5.  Which visual should an application use?
----------------------------------------------------------------------

This is a point that can be argued about but one opinion is there is
no way for an application to know the appropriate visual -- it has to
be specified by the user.  If you disagree with this then your
application probably falls into the category of always using the
default visual or it is hardware specific and expects some particular
visual such as 24bit TrueColor with an OverlayPlane extension (or some
such).

Why?  No application runs in isolation.  Depending on the way a server
allocates resources I may not always want your application to run in
TrueColor mode if it is going to mess up my other applications.  I may
be very upset if it chooses to run in GreyScale instead of PsuedoColor
or just monochrome.

As an example, on a low end color Sun server there are many different
possible visuals: monochrome, 256 entry colormap, static gray, static
color, and a 3/3/2 TrueColor.  The SGI Iris's offer all the above
plus 12 bit TrueColor, 24 bit TrueColor, an Overlay Plane.

----------------------------------------------------------------------
6.  Why do only Shell widgets have a Visual?
----------------------------------------------------------------------

This is strictly by convention.  It makes it possible for an arbitrary
widget to know that the visual it uses can be found by looking for the
shell widget that is its ancestor and obtaining the visual of that
shell.

A widget can have its own visual resource.  If it does, it must have
its own realize method to use the visual when it calls
XCreateWindow().  You should also make this a resource that can be
obtained with XtGetValues() so other widgets can find it.  A
reasonable value is probably XtNvisual.

----------------------------------------------------------------------
7.  Which visual, depth and colormap do Shells inherit?
----------------------------------------------------------------------

The default value for these resources are set to CopyFromParent.  This
is interpreted as the DefaultColormapOfScreen(), DefaultDepthOfScreen()
and the default visual of the screen if the widget has no parent -- i.e.
it is an applicationShellWidgetClass and the root of your widget tree.

If the parent of the widget is not null, then the shell copies
colormap and depth from its parent and uses CopyFromParent as the
visual.

----------------------------------------------------------------------
8.  I've done all the above and I still get a BadMatch error.  Why?
----------------------------------------------------------------------

Some resource converters improperly cache references.  This was
especially true of X11R3 and earlier versions of Motif.

----------------------------------------------------------------------
9.  Why doesn't my widget get destroyed when I call XtDestroyWidget()?
----------------------------------------------------------------------

See section 2.8 of the Xt specification.

It eventually does get destroyed, just not immediately.  The
Intrinsics destroy a widget in a two-phase process.  First it and all
of its children have a flag set that indicate it is being destroyed.
It is then put on a list of widgets to be destroyed.  This way any
pending X events or further references to that widget can be cleaned
up before the memory is actually freed.  The second phase is then
performed after all callbacks, event handlers, and actions have
completed, before checking for the next X event.  At this point the
list is traversed and each widget's memory is actually free()'d, among
other things.

As some further caveats/trivia, the widgets may be destroyed if the
Intrinsics determine that they have no further references to the
widgets on the list.  If so, then the phase 2 destruction occurs
immediately.  Also, if nested event loops are used, widgets placed on
the destroy list before entering the inner event loop are not
destroyed until returning to the outer event loop.

----------------------------------------------------------------------
10. How do I exit but still execute the DestroyCallbacks?
----------------------------------------------------------------------

The problem is if a simple and entirely reasonable approach to exiting
an application is used, such as calling exit() directly, then a widget
may not have a chance to clean up any external state -- such as open
sockets, temporary files, allocated X resources, etc.  (this code for
simplicity reasons assumes only a single toplevel widget):

	Widget
	ToplevelGet (gw)
		Widget		gw;		/* widget to find toplevel */
	{
		Widget		top;

		for (top = gw; XtParent (top); top = XtParent (top))
			/* empty */;
		return (top);
	}

	void
	ExitCallback (gw, closure, call_data)
		Widget		gw;		/* widget */
		XtPointer	closure;	/* data the app specified */
		XtPointer	call_data;	/* widget specific data */
	{
		Widget		toplevel;

		toplevel = ToplevelGet (gw);
		XtUnmapWidget (toplevel);	/* make it disappear quickly */
		XtDestroyWidget (toplevel);
		exit (0);
	}

One can see that the above code exit's immediately after destroying
the toplevel widget.  The trouble is the phase 2 destruction may never
occur.

This works for most widgets and most applications but will not work
for those widgets that have any external state.  You might think that
since it works now it will always work but remember that part of the
reason an object oriented approach is used is so one can be ignorant
of the implementation details for each widget.  Which means that the
widget may change and someday require that some external state is
cleaned up by the Destroy callbacks.

One alternative is to modify ExitCallback() to set a global flag and
then test for that flag in a private event loop.  However, private
event loops are frowned upon because it tends to encourage sloppy, and
difficult to maintain practices.

Try the following code instead.

	#include <X11/Intrinsic.h>

	extern Widget ToplevelGet (
	#if NeedFunctionPrototypes
		Widget		gw
	#endif
	);

	extern Boolean ExitWorkProc (
	#if NeedFunctionPrototypes
		XtPointer	closure
	#endif
	);

	extern void ExitCallback (
	#if NeedFunctionPrototypes
		Widget		gw,
		XtPointer	closure,
		XtPointer	call_data
	#endif
	);

	Widget
	ToplevelGet (gw)
	Widget		gw;		/* widget to find toplevel */
	{
		Widget		top;

		for (top = gw; XtParent (top); top = XtParent (top))
			/* empty */;
		return (top);
	}

	void
	ExitCallback (gw, closure, call_data)
	Widget		gw;		/* widget */
	XtPointer	closure;	/* data the app specified */
	XtPointer	call_data;	/* widget specific data */
	{
		Widget		toplevel;

		toplevel = ToplevelGet (gw);
		XtUnmapWidget (toplevel);	/* make it disappear quickly */
		XtDestroyWidget (toplevel);
		XtAppAddWorkProc (XtWidgetToApplicationContext (gw),
				  ExitWorkProc, (XtPointer) NULL);
	}

	Boolean
	ExitWorkProc (closure)
		XtPointer	closure;
	{
		exit (0);
		/*NOTREACHED*/
	}

ExitCallback() adds a work procedure that will get called when the
application is next idle -- which happens after all the events are
processed and the destroy callbacks are executed.

----------------------------------------------------------------------
11. How do I resize a Shell widget?
----------------------------------------------------------------------

After it is realized, one doesn't resize a Shell widget.  The proper
thing is to resize the currently managed child of the Shell widget
using XtSetValues().  The geometry change is then propagated to the
Shell which asks the window manager which may or may not allow the
request.  However, the Shell must have the resource
XtNallowShellResize set to True otherwise it will not even ask the
window manager to grant the request and the Shell will not resize.

To change the position of a Shell, use XtSetValues() on the Shell, not
the child, and within the limits of the window manager it should be granted.

----------------------------------------------------------------------
12. Why can't XtAppAddInput() handle files?
----------------------------------------------------------------------

It does, however Unix semantics for when I/O is ready for a file does
not fit most peoples' intuitive model.  In Unix terms a file
descriptor is ready for reading whenever the read() call would not
block, ignoring the setting of optional flags that indicate not to
block.  This works as expected for terminals, sockets and pipes.  For
a file the read() will always return but the return indicates an EOF
-- i.e. no more data.  The result is the code in the Intrinsics always
calls the input handler because it always thinks something is about to
be read.  The culprit is the select() system call or on SYSV based
OS's it is the poll() system call.

How to get around this on a Unix system?  The best approach is to use
another process to check for available input on the file.  Use a pipe
to connect the application with this other process and pass the file
descriptor from the pipe to XtAppAddInput().  A suitable program on
BSD systems is "tail -f filename".

It's rumored that select() on some systems is not _completely_
reliable.  In particular:

	- IBM AIX 3.1: this is one where it would work for a while
	  (several thousand times) and then stop until some other
	  event woke it up. This seemed to be the result of a race
	  condition in the Kernel.  IBM claims to have a fix for this.

	- Pyramid, doesn't work at all.

	- Ultrix (and possibly others where pipes are implemented as
	  sockets), wasn't completely broken, but although the writing
	  side wrote in 512 byte blocks the reading side received it
	  all broken up as if it was being put into the pipe a byte at
	  a time.  You can waste a lot of time by reading small blocks
	  (get raound it by detecting the situation and having
	  select() ignore the pipe for 10 mseconds - by then it had
	  been given the whole block).

Note that all the above descriptions used Unix terminology such as
read(), file descriptor, pipes, etc.  This is an OS dependent area and
may not be identical on all systems.  However the Intrinsic designers
felt it was a common enough operation that it should be included with
part of the toolkit.  Why they didn't also deal with signals at this
point I don't know.

----------------------------------------------------------------------
13. What good books and magazines are there on Xt?
----------------------------------------------------------------------

I have a favorite that is the definitive reference.  To my perspective
it offers a reasonable introduction but also goes into the full
details of the Intrinsics.  When I started using it I was already
familiar with Xt and the concepts behind it, so newcomers may or may
not find it useful.  I've always found it accurate and complete, which
means its a 1000 pages.

Asente, Paul J., and Swick, Ralph R., "X Window System Toolkit, The
	Complete Programmer's Guide and Specification", Digital Press,
	1990, ISBN 1-55558-051-3, order number EY-E757E-DP; and by
	Prentice-Hall, ISBN 0-13-972191-6. Also available through DEC
	Direct at 1-800-DIGITAL.

The other book I commonly recomend to novices is:

Young, Doug. "The X Window System: Applications and Programming with
	Xt (Motif Version)," Prentice Hall, 1989 (ISBN 0-13-497074-8).
	(ISBN 0-13-972167-3)

And of course O'Reilly has an entire series of manuals on X and Xt.
O'Reilly ordering is 800-998-9938.  In particular, Volume 5 is an Xt
reference done in manual page style.  The 3rd edition is extensively
overhauled and goes far beyond the MIT manual pages.  I'm finding it
very useful.  In particular, the permutted index and references to
other manual pages help a great deal in chasing down related
information.

I read two periodicals, "The X Resource" and the "The X Journal".
These are the only two dealing specifically with X.  "The X Resource"
is published quarterly, by O'Reilly, with one of the issues being the
MIT X Consortium Technical Conference Proceedings.  There is no
advertising.  I've found it informative with pretty good depth.  For
orders, call 1-800-998-9938, or email cathyr@ora.com.  For editorial
matters, email adrian@ora.com.  Table of contents are posted at
math.utah.edu in ~ftp/pub/tex/bib in TeX form and on ftp.uu.net in
~ftp/published/oreilly/xresource in ASCII form.

"The X Journal" is a bimonthly trade rag with lots of advertising.
The articles are informative and oriented toward a less technical
audience.  I read it more to see what's going on then with an
expectation of learning a great deal (but remember, I represent a
fairly small percentage of people).  Also, they have a pretty good
collection of people on the advisory board and as columnists.  Call
(908) 563-9033.

----------------------------------------------------------------------
14. What Widgets are available?
----------------------------------------------------------------------

There are three popular widget sets:

Athena	- The set provided with X11.  This is sufficient for most
	  purposes but is on the ugly side.  Recently, a 3d look is
	  available for ftp on export.lcs.mit.edu:/contrib/Xaw3d.tar.Z.
Motif	- From OSF available for a license fee and commonly shipped on
	  many workstation vendors platforms (almost everyone but
	  Sun).  It looks good and works well but personally I think
	  it is poorly implemented.
OLIT	- The Open Look Intrinsics Toolkit is a set of widgets
	  implementing Sun's Open Look specification.  Developed by
	  AT&T.  I've never used it so can't comment on its quality.
	  I've heard rumours that it is a pain to actually get.

In addition the following collection of widgets are also available:

Xtra	- a library of widgets for sale from Graphical Software
	  Technology (310-328-9338).  It includes bar graph, stacked
	  bar graph, line graph, pie chart, xy plot, hypertext, help,
	  spreadsheet, and data entry form widgets.  I've never seen
	  them so I can't comment.
FWF	- The Free Widget Foundation is attempting to collect a set of
	  freely available widgets.  Included are a Pixmap editor,
	  FileDialog, and a few others.  The current set of widgets
	  can be obtained via anonymous ftp from the machine
	  a.cs.uiuc.edu (128.174.252.1) in the file pub/fwf.shar.Z.
Xcu	- The Cornell University widgets from Gene Dykes.  One of the
	  early widget sets released.  Provides a nice appearance for
	  buttons and has a mini command language.  Probably not so
	  widely used.
Xs	- The Sony widget set.  This was around during R3 days but
	  seemed to disappear.  It looked like it had promise.
Xw	- The HP widgets.  The precursor to Motif.  Originally written
	  for R3 there exists diffs to get it to work under R4 & R5.
	  Again, a pretty good widget set but has more or less died.
	  The precursor to this was the Xray toolkit which was
	  originally implemented for X10R4 and apparently provided
	  much experience for the designers of Xt.
Xo	- A widget set I'm working on.  It's still primitive but you
	  can give it a try in archive.cis.ohio-state.edu:pub/Xo/*

The following specialized widgets are also available:

Tbl	- Implements a tabular layout of widgets.  Supports Motif
	  widgets as children.  Part of Wcl.
Plots	- The Athena Plotting widgets (not the Athena widgets).
	  Contact gnb@bby.oz.au or joe@Athena.MIT.EDU.

----------------------------------------------------------------------
15. What alternatives to the Intrinsics are there?
----------------------------------------------------------------------

	__________________________________________
	Name		Language	Vendor
	__________________________________________
	Xview		C		Sun
	OI		C++		ParcPlace
	Interviews	C++		Stanford
	Tcl/tk		C		sprite.berkeley.edu
	__________________________________________

However much I like C and admire the skill in both designing and
implementing the Intrinsics, hopefully some alternative will develop
in the next 3-5 years that uses an object oriented language.  Keep
your eyes open and expect some change about the same time a language
other than C _starts_ gaining acceptance.

----------------------------------------------------------------------
16. How do I pass a float value to XtSetValues?
----------------------------------------------------------------------

First, what is going wrong is the structure for an Arg is (essentially)
	typdef struct
	{
	    String	name;
	    long	value;
	} Arg;

and the code:
	Arg	arg;

	XtSetArg (arg, "name", 3.2)

expands to
	Arg	arg;

	arg.name = "name";
	arg.value = 3.2;

you can see that with normal C type conversions, the arg.value
gets the integer "3" instead of the floating point value "3.2".  When
the value is copied into the widget resource, the bit pattern is
wildly different than that required for a floating point value.  So,
how to get around this?

The following macro is from the Athena widgets document and I am now
recomending it over the previous suggestions.

#define XtSetFloatArg(arg, n, d) \
    if (sizeof(float) > sizeof(XtArgVal)) { \
        XtSetArg(arg, n, &(d)); \
    } else { \
        XtArgVal *ld = (XtArgVal *)&(d); \
        XtSetArg(arg, n, *ld); \
    }

----------------------------------------------------------------------
17. How do I write a resource converter?
----------------------------------------------------------------------

Courtesy of Rich Thomson (rthomson@dsd.es.com):

The following discussion of resource converters assumes R4 (or R5)
Intrinsics.  Resource converters changed between R3 and R4 to allow
for destructors and caching of converted values.

There are several main types of resource converters:

    string to data type
    data type to string
    data type to data type

i) string to data type
    Usually a string to data type converter has a fixed set of strings
    that will be converted to data type values.  This is most often
    used to map enumerated names to enumerated values:

	Name		Value
	"True"		1
	"False"		0

    In this case, the string to data type converter needs to compare
    the resource value to the list of fixed strings.  This is most
    readily accomplished by the use of the "quark" mechanism of the
    resource manager.  The resource value is turned into a quark,
    which is a unique representation of the string that fits into a
    single word.  Then the resource quark is compared against the
    quarks for the fixed strings representing the enumerated values.

    If there are many enumerated strings in the converter (or many
    converters, each with a small number of enumeration strings), then
    a global initialization routine might be used to turn all the
    resource strings into quarks.  That way, the first time one of
    these converters is used, the strings will be turned into quarks
    and held in static variables for use in the next invocation of one
    of the converters.

ii) data type to string
    This type of converter is slightly easier than the string to data
    type converters since the use of quarks isn't necessary.  Instead,
    the data type value is simply converted to a string value,
    probably by the use of sprintf.

    Data type to string converters are useful for applications that
    wish to convert an internal data type value into a string so that
    they can write out a valid resource specification to a file.  This
    mechanism can be used to provide a "snapshot" of application state
    into a file.  This snapshot can be used to restore the program to
    a known state via the usual X resource database mechanisms.

    If you are taking the trouble to write a string to data type
    converter, it isn't much extra effort to write the data type to
    string converter.  Writing both at the same time helps to ensure
    that they are consistent.

iii) data type to data type
    This type of converter is used to convert an existing data type
    value to another data type.  For instance, an X pixel value can be
    converted to an RGB data type that contains separate fields for
    red, green and blue.

The type signature for a resource converter is as follows:

typedef Boolean (*XtTypeConverter)(Display *, XrmValuePtr, Cardinal *,
	XrmValuePtr, XrmValuePtr, XtPointer *);
    Display *dpy;
    XrmValuePtr args;
    Cardinal *num_args;
    XrmValuePtr fromVal;
    XrmValuePtr toVal;
    XtPointer *converter_data;

When the converter is invoked, the "fromVal" argument points to the source
X resource manager value and the "toVal" argument points to the
destination X resource manager value.  The "converter_data" argument
is an opaque pointer to some converter-specific data that is specified
when the converter is registered.  The "args" and "num_args" arguments
allow extra information to be passed to the converter when it is
invoked.  For instance, the Pixel to RGB structure converter discussed
above would need colormap and visual arguments in which to lookup the
Pixel to obtain the RGB values corresponding to that pixel.

Care must be taken with the "toVal" argument.  An XrmValue has the
following type definition and specifies a size and location for a
converted value:

typedef struct {
    unsigned int    size;
    caddr_t         addr;
} XrmValue, *XrmValuePtr;

When the converter is invoked, the address may point to a location of
the given size for the converted value or the location can be NULL.
In the former case, the converter should ensure that the size of the
destination area is large enough to handle the converted value.  If
the destination area is not large enough, then the converter should
set the size to the amount of space needed and return False.  The
caller can then ensure that enough space is allocated and reinvoke the
converter.  If the size is large enough, then the converter can simply
copy the converted value into the space given and return True.

If the location is NULL, then the converter can assign the location to
the address of a static variable containing the converted value and
return True.

When writing a group of converters, this code is often repeated and it
becomes convenient to define a macro:

    #define DONE(var, type) \
      if (toVal->addr) \
	{ \
	  if (toVal->size < sizeof(type)) \
	    { \
	      toVal->size = sizeof(type); \
	      return False; \
	    } \
	  else \
	    *((type *) toVal->addr) = var; \
	} \
      else \
	toVal->addr = (caddr_t) &var; \
      toVal->size = sizeof(type); \
      return True;

    #define DONESTR(str) \
      if (toVal->addr && toVal->size < sizeof(String)) \
	{ \
	  toVal->size = sizeof(String); \
	  return False; \
	} \
      else \
	toVal->addr = (caddr_t) str; \
      toVal->size = sizeof(String); \
      return True;

Inside the converter, it is a good idea to perform a little safety
checking on the "num_args" and "args" arguments to ensure that your
converter is being called properly.

Once you have written your converter, you need to register it with the
Intrinsics.  The Intrinsics invokes resource converters when creating
widgets and fetching their resource values from the resource database.

To register a converter with a single application context, use
XtAppSetTypeConverter:

void XtAppSetTypeConverter(context, from, to, converter, args, num_args,
	cache, destructor)
    XtAppContext context;
    String from;
    String to;
    XtTypeConverter converter;
    XtConvertArgList args;
    Cardinal num_args;
    XtCacheType cache;
    XtDestructor destructor;

To register a converter with all application contexts, use
XtSetTypeConverter:

void XtSetTypeConverter(from, to, converter, args, num_args,
	cache, destructor)
    String from;
    String to;
    XtTypeConverter converter;
    XtConvertArgList args;
    Cardinal num_args;
    XtCacheType cache;
    XtDestructor destructor;

In the R3 Intrinsics, there were the routines XtAppAddConverter and
XtAddConverter; these have been superseded by XtAppSetTypeConverter
and XtSetTypeConverter.  Whenever possible, the newer routines should be
used.

When a converter is registered with the Intrinsics, a "cache" argument
specifies how converted resource values are to be cached:

    XtCacheNone		Don't cache any converted values
    XtCacheAll		Cache all converted values
    XtCacheByDisplay	Cache converted values on a per display basis

Caching converted values that require a round-trip to the server is a
good idea (for instance string to Pixel conversions).

The "destructor" argument is a routine that is invoked then the
resource is destroyed, either because its cached reference count has
been decremented to zero or because the widget owning the value is
being destroyed.  XtDestructor has the following type definition:

typedef void (*XtDestructor)(XtAppContext, XrmValuePtr, XtPointer,
	XrmValuePtr, Cardinal *);
    XtAppContext context;
    XrmValuePtr to;
    XtPointer converter_data;
    XrmValuePtr args;
    Cardinal *num_args;

The destructor is invoked to free any auxiliary storage associated
with the "to" argument, but does not actually free the storage pointed
to by the "to" argument itself (to->addr).  The destructor is passed
the extra arguments that were passed to the converter when the
conversion was performed (for instance, colormap and visual arguments
for the string to Pixel converter since the destructor would need to
free the allocated Pixel from the colormap) as well as the private
data passed in when the converter was registered.

Sample converter code can be found in the following files in the MIT
R5 distribution:

    mit/lib/Xt/Converters.c
    contrib/lib/PEXt/Converters.c
    contrib/lib/PEXt/Converters.h

----------------------------------------------------------------------
18. How do I open multiple displays?
----------------------------------------------------------------------

See "Multi-user Application Software Using Xt", The X Resource, Issue 3,
(Summer 1992) by Oliver Jones for a complete coverage of the issues
involved.  Most of this answer is based on that article.  In a
nutshell, one uses XtOpenDisplay() to add each display to a _single_
application context and then XtCloseDisplay() to shutdown each display
and remove it from the application context.

The real problems occur when trying to close down a display.  This can
happen 3 ways:
	1. User selects a "quit" button on one of the displays,
	2. User has window manager send a WM_DELETE_WINDOW message,
	3. Server disconnect -- possibly from a KillClient message,
	   server shutdown/crash, or network failure.

I'll assume you can deal gracefully with 1 & 2 since it is _merely_ a
problem of translating a Widget to a display and removing that
display.  If not, then read the Oliver Jones article.

The third one is difficult to handle.  The following is based on the
Oliver Jones article and I include it here because it is a difficult
problem.

The difficulty arises because the Xlib design presumed that an I/O
error is always unrecoverable and so fatal.  This is essentially true
for a single display X based application, but not true for a
multiple display program or an application that does things other than
display information on an X server.  When an X I/O error occurs the
I/O error handler is called and _if_ it returns then an exit()
happens.  The only way around this is to use setjmp/longjmp to avoid
returning to the I/O error handler.  The following code fragment
demonstrates this:

#include <setjmp.h>
jmp_buf XIOrecover;

void
XIOHandler (dpy)
	Display		*dpy;
{
	destroyDisplay (dpy);
	longjmp (XIOrecover, 1);
}

main ()
{
	...
	if (setjmp (XIOrecover) == 0)
		XSetIOErrorHandler (XIOHandler);
	XtAppMainLoop (app_context);
}

The destroyDisplay() is something that given a Display pointer can go
back to the application specific data and perform any necessary
cleanup.  It should also call XtCloseDisplay().

For those of you unfamiliar with setjmp/longjmp, when setjmp() is
first called it returns a 0 and save's enough information in the
jmp_buf that a latter execution of longjmp() can return the program to
the same state as if the setjmp() was just executed.  The return value
of this second setjmp() is the value of the second argument to
longjmp().  There are several caveats about using these but for this
purpose it is adequate.

Some other problems you might run into are resource converters that
improperly cache resources.  The most likely symptoms are Xlib errors
such as BadColor, BadAtom, or BadFont.  There may be problems with the
total number of displays you can open since typically only a limited
number of file descriptors are available with 32 being a typical
value.  You may also run into authorization problems when trying to
connect to a display.

There was much discussion in comp.windows.x about this topic in
November of 91.  Robert Scheifler posted an article which basically
said this is the way it will be and Xlib will not change.

----------------------------------------------------------------------
19. What changed from R3 to R4 to R5?
----------------------------------------------------------------------

This addresses only changes in the Intrinsics.  First, the general
changes for each release are described.  Then a, certainly incomplete,
list of new functions added and others that are now deprecated are
listed.  Brevity is a primary goal.

Much of the following information is retrieved from Chapter 13 of the MIT
Xt Intrinsics Manual and from O'Reilly Volume 5, 3rd edition.

From R3 to R4
- Addition of gadgets (windowless widgets)
- New resource type converter interface to handle cacheing and
  additional  data.
- Variable argument list interface.
- #define XtSpecificationRelease 4  (added with this release)
- WMShellPart, TopLevelShellPart & TransientShellPart changed
  incompatibly.
- core.initialize, core.set_values added ArgList and count parameters
- event handlers had continue_to_dispatch parameter added
- core.set_values_almost specification changed.
- core.compress_exposure changed to an enumerated data type from Boolean
- core.class_inited changed to enumerated data type from Boolean
- constraint.get_values_hook added to extension record
- core.initialize_hook obsolete as info is passed to core.initialize
- shell.root_geometry_manager added to extension record
- core.set_values_hook obsolete as info is passed to core.set_values
- Calling XtQueryGeometry() must store complete geometry.
- Added UnrealizeCallback.
- XtTranslateCoords() actually works under R4.

From R4 to R5:
- Psuedo resource baseTranslation added.
- Searching for app-default, and other files, made more flexible
- customization resource added.
- Per-screen resource database.
- Support permanently allocated strings.
- Permanetly allocated strings required for several class fields.
- The args argument to XtAppInitialize, XtVaAppInitialize,
  XtOpenDisplay, XtDisplayInitialize, and XtInitialize were changed
  from Cardinal* to int*
- Many performance improvements (this is summarized from the article
  "Xt Performance Improvements in Release 5" by Gabe Beged-Dov in "The
  X Resource", Issue 3):
	- XrmStringToQuark() augmented with XrmPermStringToQuark() to
	  avoid string copies.  Several fields in the class record are
	  indicated as needing permanent strings.
	- Using an array of Strings for resources
	- Callback lists redesigned to use less memory
	- Translation manager redesigned and rewritten so it takes
	  less memory, translation tables merges are faster, cache of
	  action bindings
	- Keycode to Keysyms are cached.
	- Better sharing of GC's with modifiable fields
	- Window to Widget translation uses less space and faster
	- Does not malloc space for widget name since quark is available
	- Widget space is allocated to include the constraints
	- Over several example programs, about a 26% reduction in
	  memory usage.

Functions new with R5:
----------------------
XtAllocateGC()		- sharable GC with modifiable fields
XtGetActionList()	- get the action table of a class
XtScreenDatabase()	- return resource database for a screen
XtSetLanguageProc()	- register language procedure called to set locale

Functions new with R4:
----------------------
XtAppAddActionHook()	- procedure to call before _every_ action.
XtAppInitialize()	- lots of initialization work.
XtAppReleaseCacheRefs()	- decrement cache reference count for converter
XtAppSetFallbackResources() - specify default resources
XtAppSetTypeConverter()	- register a new style converter
XtCallCallbackList()	- directly execute a callback list
XtCallConverter	()	- invoke a new style converter
XtCallbackReleaseCacheRef() - release a cached resource value
XtCallbackReleaseCacheRefList() - release a list of cached resource values
XtConvertAndStore()	- find and call a resource converter
XtDirectConvert()	- Invoke old-style converter
XtDisplayOfObject()	- Return the display
XtDisplayStringConversionWarning() - issue a warning about conversion
XtFindFile()		- Find a file
XtGetActionKeysym()	- Retrieve keysym & modifies for this action
XtGetApplicationNameAndClass() - return name and class
XtGetConstraintResourceList() - get constraints for a widget
XtGetKeysymTable()	- return keycode-to-keysym mapping table
XtGetMultiClickTime()	- read the multi-click time
XtGetSelectionRequest()	- retrieve the SelectionRequest event
XtGetSelectionValueIncremental() - obtain the selection value incrementally
XtGetSelectionValuesIncremental() - obtain the selection value incrementally
XtInitializeWidgetClass() - initialize a widget class manually
XtInsertEventHanlder()	- register event handler before/after others
XtInsertRawEventHandler() - register event handler without modify input mask
XtIsObject()		- test if subclass of Object
XtIsRectObj()		- test if subclass of RectObj
XtKeysymToKeyCodeList()	- return list of keycodes
XtLastTimestampProcessed() - retrieve most recent event time
XtMenuPopdown		- Action for popping down a widget
XtMenuPopup		- Action for popping up a widget
XtOffsetOf		- macro for structure offsets
XtOwnSelectionIncremental() - make selection data availabe incrementally
XtPoupSpringLoaded()	- map a spring-loaded popup
XtRegisterGrabAction()	- indicate action procedure needs a passive grab
XtRemoveActiohHook()	- remove function called after every action
XtResolvePathname()	- find a file
XtScreenOfObject()	- return screen of object.
XtSetMultiClickTime()	- set the multi-click time
XtSetWMColormapWindows() - set WM_COLORMAP_WINDOWS for custom colormaps
XtUngrabButton()	- cancel a passive button grab
XtUngrabKey()		- cancel a passive key grab
XtUngrabKeybard()	- release an active keyboard grab
XtUngrabPointer()	- release an active pointer grab
XtVa*()			- varags interfaces to a bunch of functions
XtWindowOfObject()	- return Window of nearest widget ancestor

Deprecated		Replacement			When
----------------------------------------------------------------------
XtAddActions()		XtAppAddActions()		R3
XtAddConverter()	XtAppAddConverter()		R3
XtAddInput()		XtAppAddInput ()		R3
XtAddTimeout()		XtAppAddTimeout()		R3
XtAddWorkProc()		XtAppAddWorkProc()		R3
XtConvert()		XtConvertAndStore()		R4
XtCreateApplicationShell XtAppCreateShell()		R3
XtDestroyGC()		XtReleaseGC()			R3
XtError()		XtAppError()			R3
XtGetErrorDatabase()	XtAppGetErrorDatabase		R3
XtGetErrorDatabaseText() XtAppGetErrorDatabaseText	R3
XtGetSelectionTimeout()	XtAppGetSelectionTimeout	R3
XtInitialize()		XtAppInitialize()		R3
XtMainLoop()		XtAppMainLoop()			R3
MenuPopdown(action)	XtMenuPopdown(action)		R4
MenuPopup(action)	XtMenuPopup(action)		R4
XtNextEvent()		XtAppNextEvent()		R3
XtPeekEvent()		XtAppPeekEvent()		R3
XtPending()		XtAppPending()			R3
XtSetErrorHandler()	XtAppSetErrorHandler()		R3
XtSetErrorMsgHandler	XtAppSetErrorMsgHandler()	R3
XtSetSelectionTimeout()	XtAppSetSelectionTimeout()	R3
XtSetWarningHandler()	XtAppSetWarningHandler()	R3
XtSetWarningMsgHandler() XtAppSetWarningMsgHandler()	R3
XtWarning()		XtAppWarning()			R3
XtWarningMsg()		XtAppWarningMsg()		R3

----------------------------------------------------------------------
20. Where are the resources loaded from?
----------------------------------------------------------------------

The resources of a widget are filled in from the following places
(from highest priority to lowest priority):

	1. Args passed at creation time.
	2. Command line arguments.
	3. User's per host defaults file
	4. User's defaults file.
	5. User's per application default file.
	6. System wide per application default file.

Note that 2-6 are read only once on application startup.  The result
of steps 3-6 is a single resource database used for further queries.

The per host defaults file contains customizations for all
applications executing on a specific computer.  This file is either
specified with the XENVIRONMENT environment variable or if that is not
set then the file $HOME/.Xdefaults-<host> is used.

The user defaults file is either obtained from the RESOURCE_MANAGER
property on the root window of the display or if that is not set then
the file $HOME/.Xdefaults is used.  Typically, the program "xrdb" is
used to set the RESOURCE_MANAGER property.  Please note that this
should be kept relatively small as each client that connects to the
display must transfer the property.  A size of around 1-3KByte is
reasonable.  Some toolkits may track changes to the RESOURCE_MANAGER
but most do not.

A user may have many per application default files containing
customizations specific to each application.  The intrinsics are quite
flexible on how this file is found.  Read the next part that describes
the various environment variables and how they effect where this file
is found.

The system wide per application default files are typically found in
/usr/lib/X11/app-defaults.  If such a file is not found then the
fallback resources are used.  The intrinsics are quite flexible on how
this file is found.  Read the next part that describes the various
environment variables and how they effect where this file is found.

[Thanks to Oliver Jones (oj@pictel.com) for the following, 6/92]

You can use several environment variables to control how resources are
loaded for your Xt-based programs -- XFILESEARCHPATH,
XUSERFILESEARCHPATH, and XAPPLRESDIR.  These environment variables
control where Xt looks for application-defaults files as an
application is initializing.  Xt loads at most one app-defaults file
from the path defined in XFILESEARCHPATH and another from the path
defined in XUSERFILESEARCHPATH.

Set XFILESEARCHPATH if software is installed on your system in such a
way that app-defaults files appear in several different directory
hierarchies.  Suppose, for example, that you are running Sun's Open
Windows, and you also have some R4 X applications installed in
/usr/lib/X11/app-defaults. You could set a value like this for
XFILESEARCHPATH, and it would cause Xt to look up app-defaults files
in both /usr/lib/X11 and /usr/openwin/lib (or wherever your
OPENWINHOME is located):

	setenv XFILESEARCHPATH /usr/lib/X11/%T/%N:$OPENWINHOME/lib/%T/%N

The value of this environment variable is a colon-separated list of
pathnames.  The pathnames contain replacement characters as follows
(see XtResolvePathname()):

	%N	The value of the filename parameter, or the
		application's class name.
	%T	The value of the file "type".  In this case, the
		literal string "app-defaults"
	%C	customization resource (R5 only)
	%S	Suffix.  None for app-defaults.
	%L	Language, locale, and codeset (e.g. "ja_JP.EUC")
	%l	Language part of %L  (e.g. "ja")
	%t	The territory part of the display's language string
	%c	The codeset part of the display's language string

Let's take apart the example.  Suppose the application's class name is
"Myterm". Also, suppose Open Windows is installed in /usr/openwin.
(Notice the example omits locale-specific lookup.)

	/usr/lib/X11/%T/%N        means /usr/lib/X11/app-defaults/Myterm
	$OPENWINHOME/lib/%T/%N    means /usr/openwin/lib/app-defaults/Myterm

As the application initializes, Xt tries to open both of the above
app-defaults files, in the order shown.  As soon as it finds one, it
reads it and uses it, and stops looking for others.  The effect of
this path is to search first in /usr/lib/X11, then in /usr/openwin.

Let's consider another example. This time, let's set
XUSERFILESEARCHPATH so it looks for the file Myterm.ad in the current
working directory, then for Myterm in the directory ~/app-defaults.

	setenv XUSERFILESEARCHPATH ./%N.ad:$HOME/app-defaults/%N

The first path in the list expands to ./Myterm.ad.  The second expands
to $HOME/app-defaults/Myterm.  This is a convenient setting for
debugging because it follows the Imake convention of naming the
app-defaults file Myterm.ad in the application's source directory, so
you can run the application from the directory in which you are
working and still have the resources loaded properly.

NOTE: when looking for app-default files with XUSERFILESEARCHPATH,
      for some  bizarre reason, neither the type nor file suffix is
      defined so %T and %S are useless.

With R5, there's another twist.  You may specify a customization
resource value.  For example, you might run the "myterm" application
like this:

	myterm -xrm "*customization: -color"

If one of your pathname specifications had the value
"/usr/lib/X11/app-defaults/%N%C" then the expanded pathname would be
"/usr/lib/X11/app-defaults/Myterm-color" because the %C substitution
character takes on the value of the customization resource.

The default XFILESEARCHPATH, compiled into Xt, is:

		/usr/lib/X11/%L/%T/%N%C:\  (R5)
		/usr/lib/X11/%l/%T/%N%C:\  (R5)
		/usr/lib/X11/%T/%N%C:\     (R5)
		/usr/lib/X11/%L/%T/%N:\
		/usr/lib/X11/%l/%T/%N:\
		/usr/lib/X11/%T/%N

(Note: some sites replace /usr/lib/X11 with a ProjectRoot in this
batch of default settings.)

The default XUSERFILESEARCHPATH, also compiled into Xt, is

		<root>/%L/%N%C:\  (R5)
		<root>/%l/%N%C:\  (R5)
		<root>/%N%C:\     (R5)
		<root>/%L/%N:\
		<root>/%l/%N:\
		<root>/%N:

<root> is either the value of XAPPLRESDIR or the user's home directory
if XAPPLRESDIR is not set.  If you set XUSERFILESEARCHPATH to some
value other than the default, Xt ignores XAPPLRESDIR altogether.

Notice that the quick and dirty way of making your application find
your app-defaults file in your current working directory is to set
XAPPLRESDIR to ".", a single dot.  In R3, all this machinery worked
differently; for R3 compatibilty, many people set their XAPPLRESDIR
value to "./", a dot followed by a slash.

----------------------------------------------------------------------
21. What order are callbacks executed in?
----------------------------------------------------------------------
(Courtesy of Donna Converse, converse@expo.lcs.mit.edu; 5/10/92)

The Intrinsics library do not guarantee an order.  This is because
both the widget writer and the application writer have the ability to
modify the entire contents of the callback list.  Neither one
currently knows what the other is doing and so the Intrinsics cannot
guarantee the order of execution.

The application programmer cannot rely on the widget writer; the
widget writer is not required to document when the widget will add and
remove callbacks from the list or what effect this will have;
therefore the functionality contained in a callback should be
independent of the functionality contained in other callbacks on the
list.

Even though the Xt standard in the definition of XtAddCallback

 	"callback_name: Specifies the callback list to which the
 	procedure is to be appended."

you may not infer from the word "appended" that the callback routines
are called in the same order as they have been added to the callback
list.

----------------------------------------------------------------------
22. How do I know if a widget is visible?
----------------------------------------------------------------------
(Courtesy of Donna Converse, converse@expo.lcs.mit.edu; 5/14/92)

Right, everything is implemented correctly.  This demonstrates a "deficiency"
in the X protocol, and the Core widget is reflecting the capabilities of the
protocol.  (The "deficiency" is that the information is available in one way,
in this case an inconvenient way.)  The Xt specification is accurate, in
the second and third paragraphs of section 7.10.2, so read this section
carefully.  The visible field will not change in response to iconification.

A VisibilityNotify event will not be received when the window goes from
viewable to unviewable, that is, when the widget or an ancestor is unmapped;
that is, when iconification occurs.  This is the protocol deficiency.
Visibility state and viewable state have specific meanings in the X protocol;
see the glossary in your Xlib and X protocol reference manual.

You'll see this with any window manager, with no window manager.

As an application writer, keep track with a global Boolean in an action
routine with translations for MapNotify and UnmapNotify on the Shell widget
which contains your custom widget.  As the custom widget writer, see the
map_state field returned by a call to XGetWindowAttributes.  These are
suggestions.

----------------------------------------------------------------------
23. How do I reparent a widget in Xt, i.e. XtReparentWidget()?
----------------------------------------------------------------------

You can't.

----------------------------------------------------------------------
24. Why use XtMalloc, XtFree, etc?
----------------------------------------------------------------------

Unfortunately, most code that calls malloc(), realloc() or calloc()
tends to ignore the possibility of returning NULL.  At best it is
handled something like:

	ptr = (type *) malloc (sizeof (type))
	if (!ptr)
	{
		perror ("malloc in xyzzy()");
		exit (1)
	}
To handle this common case the Intrinsics define the functions
XtMalloc(), XtCalloc(), XtNew(), XtNewString() and XtRealloc() which
all use the standard C language functions malloc(), calloc() and
realloc() but execute XtErrorMsg() if a NULL value is returned.  Xt
error handlers are not supposed to return so this effectively exits.

In addition, if XtRealloc() is called with a NULL pointer, it uses
XtMalloc() to get the initial space.  This allows code like:

	if (!ptr)
		ptr = (type *) malloc (sizeof (type));
	else
		ptr = (type *) realloc (ptr, sizeof (type) * (count + 1));
	++count;

to be written as:

	ptr = XtRealloc (ptr, sizeof (ptr) * ++count);

Also, XtFree() accepts a NULL pointer as an argument.  Generally, I've
found the Xt functions conveniant to use.  However, anytime I'm
allocating anything potentially large I use the standard functions so
I can fully recover from not enough memory errors.

XtNew() and XtNewString() are conveniant macros for allocating a
structure or copying a string:

	  struct abc *xyzzy;
	  char	     *ptr;
	  char	     *str = "abcdef";

	  xyzzy = XtNew (struct abc);	/* takes care of type casting */
	  ptr = XtNewString (str);

A strict interpretation of the Intrinsics reference manual allow an
implementation to provide functions that are not exchangable with
malloc() and free().  I.e. code such as:

	 char	      *ptr;

	 ptr = XtMalloc (100);
	 /* ... */
	 free (ptr);

may not work.  Personally, I'd call any implementation that did this
broken and complain to the vendor.

A common error for Motif programmers is to use XtFree() on a string
when they should really be using XmStringFree().

----------------------------------------------------------------------
25. How to debug an Xt application?
----------------------------------------------------------------------
First, I'd recomend getting "purify" from Pure Software.  This is a
great package for tracing memory problems on Sun's.  It's a bit pricey
at $2750 but I'd still recomend it.  Excuse the marketing blurb
(contact support@pure.com for more info).

	Purify inserts additional checking instructions directly into
	the object code produced by existing compilers.  These
	instructions check every memory read and write performed by
	the program under test and detect several types of access
	errors, such as reading unitialized memory, writing past
	malloc'd bounds, or writing to freed memory.  Purify inserts
	checking logic into all of the code in a program, including
	third party and vendor object-code libraries, and verifies
	system call interfaces.  In addition, Purify tracks memory
	usage and identifies individual memory leaks using a novel
	adaption of garbage collection techniques.  Purify's nearly
	comprehensive memory access checking slows the target program
	down typically by a factor of two to five.

An alternative package that isn't as pricey ($395 for a Sun), runs on
many Unix's and has pretty similar features is "The SENTINEL Debugging
Environment".  This replaces malloc() and several other C library
functions to add additional checks.  (contact cpcahil@virtech.vti.com
for more info)

Next, if you are getting any sort of Xlib error, you'll need to run in
synchronous mode, easily accomplished with the "-sync" command line
argument or by setting the variable Xdebug to 1 with your debugger.  Then
set a break point in exit().  This will let you trace back to the
original Xlib function being called.  If you don't run in synchronous
mode, then the actual error may have occured any number of calls to
Xlib previously since the Xlib calls are buffered and replies from the
server are asynchronous.

Next, if you are having trouble with window layout, you can use the
undocumented resource "xtIdentifyWindows" or the class resource
"XtDebug" to cause the widget name to be identified with each window.
For example:

    example% xload -xrm '*XtDebug:true' &
    example% xwininfo -tree
	     <click in new xload window>

will give the normal information but the widget name and class of each
window is included.  This can help for checking the location and size
of errant widgets.

Next, if you are having trouble with geometry managers or you want to
test the way a widget manages it's children, you can try
export.lcs.mit.edu:contrib/libXtGeo.tar.Z.  This acts as a filter
between any children and a geometry manager and checks the behaviour
of both.  It's a very clever idea.

The most unfortunate problem is debugging a callback while the
application is executing a grab of the keyboard or mouse (such as from
a pulldown menu).  The server effectively locks up and you'll need to
go to another machine and kill the debugger manually.  The server
locks up because the application being debugged has said no one else
can have access to the keyboard but the application is not stopped
waiting because the debugger is waiting for your commands.
Unfortunately you can't give them because all the input is going to
your application which is stopped.

The best way to debug this kind of problem is with two machines on
your desk, running the program under a debugger (or other environment)
on one machine, and running the application on the other, possibly
using a command sequence like this:

	othermachine% xhost +thismachine
	thismachine% setenv DISPLAY othermachine:0;
	thismachine% gdb application	# Your favorite debugger.
	or this:
	othermachine% xhost +thismachine
	thismachine% gdb application
	(gdb) set environment DISPLAY othermachine:0
	(gdb) run ...

I believe CodeCenter, a C interpreter/graphical debugger has a method
of dealing with this by explicitely calling the Xlib functions to
release any grabs during breakpoints.

Debugging widget problems requires pretty good debugging skills and
knowledge of how widgets work.  You can go a long way without knowing
the internals of a particular widget but not very far without
understanding how a widget works.  Judicious use of conditional
breakpoints and adding print statements with the debugger help a great
deal.

----------------------------------------------------------------------
26. Why don't XtAddInput(), XtAddTimeout() and XtAddWorkProc() work?
----------------------------------------------------------------------
   I have got a delicate problem with the three routines XtAddInput,
   XtAddTimeOut and XtAddWorkProc. The problem I have is that when
   I use them in my application they seem not to be registred properly.
   I have made a handy little testprogram where everything works
   perfect, but in my "real" application nothing happens.

The introduction in R3 of the XtApp*() functions obsoleted those
routines (see Q19 for other changes in R3, R4, and R5).  What happens is
they use a default application context different then the one you may
have created.  Since events and timeouts are distributed on a per
application context basis and you are using two application contexts,
you won't get those events.

For example:

	...
	cnt = 0;
	toplevel = XtAppInitialize(&app, class,
				   Desc, XtNumber (Desc),
				   &argc, argv,
				   Fallback, args, cnt);

	XtAddTimeOut (...)
	XtAddWorkProc (...)

	XtAppMainLoop (app)

would never invoke the timeout.

----------------------------------------------------------------------
27. What is and how can I implement drag and drop?
----------------------------------------------------------------------
(Courtesy of Roger Reynolds, rogerr@netcom.com; 19 Feb 93)

Drag-n-drop is a buzzword for moving data between clients, in an
``intuitive'' fashion.

Motif Version 1.2 supports drag-n-drop capabilities, OpenLook has
supported d-n-d all along.  The two protocols are not compatable with
each other, and so far as I know, they are not published.

I wrote a package called RDD which is designed to be a flexible public
protocol for doing drag 'n drop operations between clients.  My
intention was to provide a tool which would make it easy for people to
support a "standard" drag-n-drop protocol in the programs they develop
and contribute or sell, regardless of what widget set is used (as long
as it is based on Xt).

The implementation is based upon my understanding of the ICCCM
conventions, for more details read the code.

I have heard from dozens of people using RDD who like it and feel that
it works a whole lot better than Motif 1.2 stuff.  Also, there seem to
be many who think that it is neat but are constrained to use Motif
anyway.

The latest RDD (and some other stuff) is available for ftp from
netcom.com, in /pub/rogerr.  A (possibly older) version is also
available on export.lcs.mit.edu in /contrib.