summaryrefslogtreecommitdiff
path: root/xc/unsupported
diff options
context:
space:
mode:
authorjim <empty>1989-10-10 15:22:36 +0000
committerjim <empty>1989-10-10 15:22:36 +0000
commit8b51b38dacdd02a69f5c18fc295ef25e8665d8e9 (patch)
tree69c75e49759d0022aed2c6215109e4876f76253e /xc/unsupported
parent42b9c22f310158d36d2174f38dd8216449798c33 (diff)
Initial revision
Diffstat (limited to 'xc/unsupported')
-rw-r--r--xc/unsupported/doc/papers/tutorials/bugtalk.txt515
1 files changed, 515 insertions, 0 deletions
diff --git a/xc/unsupported/doc/papers/tutorials/bugtalk.txt b/xc/unsupported/doc/papers/tutorials/bugtalk.txt
new file mode 100644
index 000000000..ffc3fab9a
--- /dev/null
+++ b/xc/unsupported/doc/papers/tutorials/bugtalk.txt
@@ -0,0 +1,515 @@
+(Message inbox:31)
+Return-Path: dshr@sun.com
+Received: by expo.lcs.mit.edu; Mon, 6 Feb 89 12:47:48 EST
+Received: by ATHENA.MIT.EDU (5.45/4.7) id AA21584; Mon, 6 Feb 89 12:47:38 EST
+Received: from snail.Sun.COM by Sun.COM (4.1/SMI-4.0)
+ id AA11194; Mon, 6 Feb 89 09:49:55 PST
+Received: from devnull.sun.com by snail.Sun.COM (4.1/SMI-4.0)
+ id AA13577; Mon, 6 Feb 89 09:46:40 PST
+Received: by devnull.sun.com (4.0/SMI-4.0)
+ id AA14389; Mon, 6 Feb 89 09:44:41 PST
+Message-Id: <8902061744.AA14389@devnull.sun.com>
+Date: Mon 6 Feb 1989 09:36:43 EST
+From: David Rosenthal <dshr@sun.com>
+Subject: Usenix talk & paper
+To: xpert@athena.mit.edu
+
+Last week, I presented a paper at Usenix that David Lemke and I had
+written on the problem of choosing and using Visuals. Several people
+asked me to post the talk, and it is attached below. Also, we found
+a bug in the paper printed in the Proceedings, and I will be posting
+a shar file with the corrected source for the paper. The bug was that
+the code in the Proceedings chooses the largest available Visual, and
+you should choose the SMALLEST avaialable Visual that will do the job,
+so as not to waste resources.
+
+ David.
+
+
+
+
+
+ San Diego Usenix Talk Script
+
+
+ David S. H. Rosenthal
+
+
+
+
+
+
+Introduction
+
+Good morning. I'm Sgt. Rosenthal of the Softies, the
+Software Police. Even though its early, you'd better
+listen up and listen good, because what I'm going to tell
+you this morning can keep some of you out of a lot of trou-
+ble.
+
+Officer Lemke and I work in the X Division, and we've been
+out there on the net making undercover buys of X games pro-
+grams. When we test them back in the labs, we almost always
+find recreational bugs.
+
+The Zero-Tolerance Bugs Policy
+
+I'm here today to talk to you about the Quayle
+administration's new ``zero-tolerance'' policy on bugs.
+Nancy Reagan's "Just Say No" to bugs program was all very
+well, but it didn't stop the wave of bugs that engulfed the
+nation during her husband's administration. The new
+administration has decided to get tough on bugs, and that's
+what the zero-tolerance policy is all about.
+
+Surveys tell us that many of you have pretty tolerant atti-
+tudes to recreational bugs. I'm here to change that. There
+are three main reasons why the policy focusses on recrea-
+tional bugs:
+
++ In most of the cases we see, programs with recreational
+ bugs go on to develop more serious hard bugs.
+
++ The sharing of software involved in recreational bug
+ usage can lead to the transmission of viruses, worms and
+ other parasites.
+
++ And, of course, the bottom line is that bug-free X
+ software isn't just a good idea, its the law.
+
+Penalties for Bug Offences
+
+Under the zero-tolerance policy the penalties for even a
+small recreational bug can include:
+
++ confiscation of resources,
+
++ X protocol errors,
+
++ termination of your program,
+
++ visions of bizarre colors on your screen,
+
++ and above all making the designers of X unhappy.
+
+You do not want to make the X designers unhappy. If they
+get too unhappy with the way you're mis-using their crea-
+tion, they may just get together and build you a whole new
+industry-standard window system. Look how much work it was
+last time they did this. Think what they've learnt since
+then.
+
+The Neighbourhood Bug-Watch Program
+
+Everyone deserves a bug-free environment, but achieving it
+isn't easy. The scourge of bugs has affected every stratum
+of society. People you trust implicitly, role-models like
+the folks at MIT and elsewhere who work long hours into the
+night selflessly donating their software to the poor, even
+these people may be into recreational bugs. And you may not
+find out until its too late. When we in the Softies stop
+you out there on the net, it won't do you any good to say
+``This code isn't mine, I'm just holding it for a friend''.
+
+Types of Bug to Look Out For
+
+X bugs you should be looking for can be divided into:
+
++ The narcotics that leave programs catatonic. A warning
+ sign to look for is a program that starts ignoring Expose
+ events. You've heard plaintive complaints from people on
+ xpert that they draw and draw and nothing is visible;
+ they are suffering from narcotics abuse.
+
++ The stimulants that drive programs into a frenzy. A
+ warning sign is a program that tries to argue with
+ authority figures like window managers.
+
++ The steroids that cause programs (and especially servers)
+ to swell up and get huge.
+
++ The hallucinogens that cause swirling visions in bizarre
+ colors.
+
+This morning I'm going to review the hallucinogens and their
+symptoms, and we need to start with some basic physiology.
+
+Basic X Physiology
+
+When your X client draws, it does so in a Drawable, a rec-
+tangle of memory locations containing numbers called pixel
+values. The drawing operations like CopyArea, PolyLine,
+PutImage and PolyText8 all change these pixel values.
+
+Some of these drawables may be windows, and some of the win-
+dows may be mapped. Every few milliseconds, the screen you
+are looking at is refreshed by reading the pixels of the
+visible parts of the the mapped windows, and using these
+values to index into a colormap. The colormap cell indexed
+by the pixel value contains a red, a green and a blue value
+that is fed to the corresponding gun of the screen.
+
+The details of this process can differ between different
+types of hardware. The differences are exposed; X gives no
+guarantee of portability and you have to be aware of these
+differences:
+
++ Is there one gun (monochrome) or three (color)?
+
++ How many entries in a colormap?
+
++ Is there one colormap, or one colormap per gun?
+
++ How many colormaps are simultaneously accessible?
+
++ Can a client write the colormap entries?
+
++ How many bits in each colormap entry for each gun?
+
+All these differences are collected together into a concept
+called a Visual, and the possible Visuals divided into six
+classes:
+
++ StaticGray. The pixel value indexes a predefined,
+ read-only colormap. For each colormap cell, the red,
+ green and blue values are the same, producing a gray
+ image.
+
++ StaticColor. The pixel values indexes a predefined,
+ read-only colormap. The red, green and blue values for
+ each cell are server-dependent.
+
++ TrueColor. The pixel value is divided into sub-fields
+ for red, green and blue. Each sub-field separately
+ indexes the appropriate primary of a predefined, read-
+ only colormap. The red, green and blue values for each
+ cell are server-dependent, and are selected to provide a
+ nearly linear increasing ramp.
+
++ GrayScale. The pixel value indexes a colormap which the
+ client can alter, subject to the restriction that the
+ red, green and blue values of each cell must always be
+ the same, producing a gray image.
+
++ PseudoColor. The pixel value indexes a colormap which
+ the client can alter. The red, green and blue values of
+ each cell can be selected arbitrarily.
+
++ DirectColor. The pixel value is divided into sub-fields
+ for red, green and blue. Each sub-field separately
+ indexes the appropriate primary of a colormap that the
+ client can alter.
+
+When you implement an X server for an individual workstation
+configuration, you have to decide which Visuals you want to
+make available to your clients. Sometimes, the choice is
+obvious. For example, a normal monochrome workstation like
+a Sun 3/50 would naturally export a single depth 1 Sta-
+ticGray Visual. A simple color workstation like a Sun
+3/160C with an 8-bit-per-pixel frame buffer and a single
+256-entry colormap would naturally export a single depth 8
+PseudoColor Visual.
+
+As hardware gets more complex, the choice may be to export
+several Visuals for a single screen. For example, the Sun
+3/110C in effect has a 10-bit deep frame buffer. 8 of the
+bits index a single 256-entry colormap, one of the bits
+acts as a simple monochrome framebuffer, and one of the
+bits selects whether the 8-bit color or the 1-bit monochrome
+image is visible at this pixel. In this case, the normal
+choice would be to export two Visuals, a depth 8 PseudoColor
+Visual and a depth 1 StaticGray Visual. Even more complex
+hardware may need to export many Visuals to allow clients
+full access to its capabilities.
+
+If you're a sneaky server implementor, you may even export
+Visuals that you don't strictly have. For example, both
+the MIT server for the DEC QDSS color display and the
+X11/NeWS server for Sun color hardware export both Pseu-
+doColor and StaticColor Visuals even thought they both
+really have only a PseudoColor display. The StaticColor
+Visuals use otherwise unused entries in the hardware color-
+map, allowing simple color applications to achieve better
+colormap sharing than they would on a single PseudoColor
+Visual.
+
+What this means to you as an X client programmer is that you
+are likely to be faced with a choice of Visuals, and that as
+hardware evolves to give you bigger and better thrills, this
+choice is likely to expand greatly. You have to choose a
+suitable Visual for your client, and unless you choose with
+great care, you will be increasingly at risk for hallucino-
+genic bugs.
+
+Hallucinogenic Bugs and Their Symptoms
+
+Hallucinogenic bugs achieve their effects by interfering
+with the Visual mechanism. Here's a list of the common hal-
+lucinogens and their symptoms:
+
++ A program can assume that the default Visual is the only
+ available Visual.
+
+ Supose you had a color application that made this assump-
+ tion and a Sun 3/110C. The server implementors might
+ have chosen to make the depth-1 monochrome Visual the
+ default, in which case the application would fail even
+ though the hardware actually supported color.
+
++ A program can assume that all Visuals with more than two
+ Colormap cells are color.
+
+ Suppose you had a color application that made this
+ assumption and a Sun 3/160GS (grey-scale). It might
+ chose a foreground and a background color which mapped to
+ the same shade of grey, and the output would be invisi-
+ ble.
+
++ A program can assume that all Visuals with more than two
+ Colormap cells have writable Colormaps.
+
+ This is a very common assumption. Clients making it fail
+ with an Access error when they try to write a read-only
+ colormap cell.
+
++ A program can assume that Colormaps (and especially the
+ default Colormap) are infinitely large, so that attempts
+ to allocate private cells in them will always succeed.
+
+ Clients that make this assumption will sometimes fail
+ with Alloc errors, and sometimes succeed, depending on
+ the number of cells they ask for and the number of cells
+ that other clients have left available in the colormap.
+
++ A program can assume that all Colormaps work with all
+ Visuals.
+
+ Clients that install Colormaps in windows other than the
+ one they were created for may get a Match error if the
+ Visuals don't correspond.
+
+Traditional Values Keep Your Colors Sober
+
+At this point, you're probably saying ``this isn't a big
+deal, all my friends do bugs like this''. You're wrong; the
+only clients that can ignore the question of Visuals are
+those that use the BlackPixel() and WhitePixel() macros to
+paint a black and white image in the default Visual. All
+other clients must pay some attention to the details of the
+Visual(s) they are using, if they want their output to
+appear in sober, everyday hues.
+
+When you choose a color, you really choose an RGB triple.
+For example, you say ``I'd like this text to come out
+blue'', and what you really mean is that you'd like the
+image of the text when its refreshed on to the screen to
+have the RGB triple [001]. Working backwards:
+
++ this means that the colormap cell used in the refresh
+ process must have the RGB triple [001] in it,
+
++ and this means that the pixel value in the window must
+ have indexed to a cell in the colormap with the RGB tri-
+ ple [001] in it,
+
++ and this means that the foreground pixel value in the GC
+ that you used to draw the text must have been one that
+ would index to a cell with the RGB triple [001] in it,
+
++ and this means that the foreground pixel value you sup-
+ plied to a CreateGC or ChangeGC call that got you the GC
+ that you used to draw the text must have been one that
+ would index to a cell with the RGB triple [001] in it,
+
+OK, enough of the "for the lack of a nail the horseshoe was
+lost" stuff. You need to have some way to convert your RGB
+value into a pixel value that will map back into the RGB
+value.
+
+Where Do Pixel Values Come From?
+
+I expect you've overheard whispered conversations among your
+friends about where pixel values come from and how you can
+get one. I'm here to dispel the myths, and assure you that
+there are just three legal ways you can get a pixel value:
+
++ You can give the server a colormap and an RGB value, or a
+ text name for an RGB value, and ask it to give you back a
+ pixel value that will index to a read-only cell in that
+ colormap that has the closest available match for that
+ RGB value.
+
++ You can ask the server to reserve you a private, writ-
+ able cell in a Colormap. If this succeeds, the server
+ will give you a pixel value for your private cell, and
+ you can set whatever RGB value you like.
+
++ Or there are various ways in which you can compute a
+ pixel value from an RGB triple by predicting the values
+ in the colormap:
+
+ + If the server has a TrueColor Visual it will provide
+ linear ramps.
+
+ + The so-called ``Standard Colormaps'' also provide
+ linear ramps.
+
+ + The connection handshake process tells you Black-
+ Pixel() and WhitePixel() for the default Visual.
+
+Be warned that values you obtain any other way are illegal,
+and may be bugs.
+
+Which Method Is Right For You?
+
++ For beginners, and the simplest clients, using Black-
+ Pixel() and WhitePixel() in the default Visual is best.
+
++ Using read-only colormap cells and letting the server do
+ the conversion will work on any Visual and maximises
+ sharing with other clients. It is the technique of
+ choice unless:
+
+ + you have a lot of colors,
+
+ + the exact representation of colors is of primary
+ importance to you,
+
+ + or you want to play colormap tricks.
+
++ Clients that want to display an RGB image with many
+ colors should use the prediction technique in one of the
+ Standard Colormaps, as soon as the experts can agree on
+ how to make the technique really work.
+
++ Colormap tricks aren't actually illegal, but they're
+ risky and we advise against them. If you want to play
+ these tricks you should make sure beforehand that you
+ have a dynamic Visual, and create a private Colormap so
+ as not to disturb your neighbours.
+
+Are You Safe if You Use a Toolkit?
+
+I expect you'll hear people saying ``I don't have to worry
+about this kind of bug, I use a Toolkit''. Unfortunately,
+this is just another of the myths about bugs. Not that we
+don't advise people to use Toolkits; used in accordance with
+the manufacturer's instructions a Toolkit can keep you safe
+from many common bugs and save you a great deal of time and
+trouble. But the sad fact is that Toolkits don't protect
+against hallucinogenic bugs, and this hasn't had the publi-
+city it deserves - the Intrinsics manual doesn't mention
+Visuals.
+
+How Do Widgets Get Their Visuals?
+
+At present, Visuals are hereditary - Widgets inherit their
+Visuals from their parents. The window for a Widget is
+created when the Widget is realized, and the Visual has to
+be bound to the window then. At the root of every
+application's tree of Widgets is a Shell Widget; the Intrin-
+sics define this to inherit its Visual from its parent (ie.
+the root window), so it will have the default Visual. All
+the Widgets on the X11R3 tape have realize procedures that
+inherit their Visuals from their parents, so that by induc-
+tion all Widgets have the default Visual.
+
+If you're creating a Widget that others may use, it is your
+responsibility to ensure that it gets a suitable Visual.
+Simply trusting your parent to do this for you is not a
+suitable way to discharge this responsibility
+
+How Can You Protect Your Widgets From Hallucinogens?
+
+You can do this by equipping them with a suitable realize
+procedure. Based on your knowledge of the color require-
+ments of the Widget you are defining, you should choose one
+of the legal methods for obtaining pixel values. Then, you
+should write a realize procedure that:
+
++ Ranks the Visuals in preference order, and finds the
+ smallest best Visual that will do the job. Code to do a
+ similar task is in the paper.
+
++ Obtains a suitable Colormap for the conversion method
+ selected, by:
+
+ + Using one of the Colormap description properties on
+ the root window, if you're using the prediction
+ method.
+
+ + Choosing the default Colormap, if that will do the
+ job.
+
+ + Creating a private Colormap using the selected Visual
+ and the root window of the screen.
+
++ Creates a window in the selected Visual, and supplies
+ the selected Colormap as one of its attributes.
+
++ Sets the window and the colormap into the core attributes
+ of the Widget.
+
+Remember, educating your Widgets about Visuals right from
+the start is the key to keeping them bug-free for life.
+
+Don't Let Your Widgets Accept Colormaps From Strangers
+
+You're probably asking ``If colormaps are attributes of
+Widgets, why shouldn't I let them be Resources that can be
+changed by the user?'' The problem is that the bright shiny
+colormap that the nice user-man is offering your Widget may
+be a hallucinogenic bug. It might not belong to the same
+Visual as your Widget's window, and when the trusting little
+Widget tries to set the window's colormap attribute, wham!
+it gets a Match error.
+
+Unfortunately, there is no way to test a colormap before-
+hand to see if it is compatible with the window whose attri-
+bute you're trying to set. Given a colormap ID, the proto-
+col doesn't provide a way to find the Visual it was created
+for. So, its better to let your Widgets choose their own
+colormaps, and not to provide any way for the user to over-
+ride their choice.
+
+If you have to accept a colormap from someone else, and you
+don't know the Visual, you can create your own colormap for
+the Visual you want, read all the entries from the strange
+map, and create corresponding entries in your own map.
+There are problems with this approach:
+
++ The entries have to be read back to the client and then
+ shipped back to the server, because there is no way of
+ copying entries between colormaps of different Visuals.
+
++ There is no way of discovering which cells in the source
+ colormap are sharable and which private. This means that
+ the create-and-copy destroys the sharability of the
+ entries.
+
++ The whole idea of creating a new colormap works against
+ the sharing of resources that was probably the reason for
+ trying to accept a strange colormap in the first place.
+
+How You Can Get Your Programs Off Bugs
+
++ Understand the X display and Visual mechanism.
+
++ Understand the legal methods of converting RGB triples to
+ pixel values.
+
++ Chose a method and a Visual that match your application.
+
++ Don't let someone else choose your Visual for you.
+
++ Don't accept colormaps from strangers.
+
+What To Do If You Find Bugs In Your Program
+
++ Isolate the program immediately.
+
++ Do not pass the program on to others.
+
++ Examine the program's assumptions carefully.
+
++ Call for help from the xperts.