text:
by Robert Wilkinson
Today we take a new look at a crucial factors in how practical Astrology works. Dispositorship is a primary factor in how any planet in any sign manifests, as it provides the background material to why the "inner lights" (planets) work as they do. Though each of the planets has their areas of influence, how that influence works is entirely dependent on what planet rules the sign they're in.
The sign any planet occupies is affected by the planet that rules that sign. This in turn is shaded by what sign that ruling planet is in. When a planet rules the sign another planet is in, we say it "disposes," or is the dispositor of, that planet. That's why it's important to know which signs a given planet rules.
For example, when Mars is in Taurus, it is heavily affected by Venus, which rules Taurus. That makes the sign Venus occupies important in showing us the backdrop to how Mars in Taurus energies express themselves. Pay attention to Venus the next few weeks, since she'll be behind all Mars activities as long as Mars is in Taurus.
When Mars is in Gemini, as it will be between the Summer Solstice through early August, it will be heavily influenced by Mercury, which rules Gemini. Therefore the sign Mercury occupies is important in showing us how Mars will express itself during that time.
So when Mars is in Cancer in August and September 2011, it will be heavily affected by what sign the Moon is in, and when Mars is in Leo from late September to mid-November 2011, it will be heavily affected by the signs the Sun transits since the Sun rules Leo.
You can see how the concept of dispositorship would be of importance in showing us how a planet in a sign operates, since if a planet is in Gemini (or Virgo), Mercury's sign would make a big difference. A Mercury in Pisces is a much different Mercury energy than when it's in Aries, and a Venus in Cancer is much different than Venus in Leo!
On a purely practical level, during the upcoming weeks when Mars is in Taurus, Venus will begin in late Aries, move into Taurus, and then into Gemini. Observe how Mars alters its qualities and expression in these three periods. The first will be May 11-16 (Venus in Aries), May 16-June 9 (Venus in Taurus), and June 9-21 (Venus in Gemini). On June 20-21 Mars enters Gemini, making Mercury its dispositor for several weeks after that.
Returning to the main topic, Jupiter influences any planets or houses involving Sagittarius and Pisces. Using the same principles as those outlined above, planets in these signs will take on the shading of whatever sign Jupiter is in.
So while Jupiter rules the Sagittarius and Pisces areas of our charts, it is influenced by the ruler of the sign it occupies. When Jupiter was in Capricorn from 12/2007-1/2009, it was influenced by Saturn (ruling Capricorn) which occupied Virgo. When Jupiter was in Aquarius from 1/2009-1/2010, it was still influenced by Saturn, since Saturn also rules Aquarius.
While Jupiter in Capricorn had Saturn only in Virgo, Jupiter in Aquarius had dispositor Saturn in Libra from January through early April 2010, then Saturn in late Virgo from April through July 2010, and then Saturn back in Libra through the rest of the time that Jupiter was in the Saturn-ruled sign of Aquarius.
When a planet is in its home sign (the sign it rules), it is its own final dispositor. Therefore it is the the final dispositor of any "chain of dispositors" occupying a sign it rules. Jupiter in Pisces was its own final dispositor.
Another example of this would be Saturn in Libra disposited by Venus in Aries disposited by Mars in Aries, or Mars in Gemini disposited by Mercury in Taurus disposited by Venus in Aries disposited by Mars in Aries. For this "final dispositor" circumstance to occur, a planet must occupy one of the two signs it rules.
Sometimes there is no final dispositor, in which case a chain of dispositors is set up with a group influencing each other through the qualities of what sign they're in. An example of this would be Saturn in Libra disposited by Venus in Cancer disposited by the Moon in Capricorn disposited by Saturn in Libra..... with no other planet in one of its home signs. This "chain of dispositors" rules all the other planets, since every planet is ruled by another planet that would eventually eventually find a dispositor in this chain.
Then you have the special situation when two planets dispose each other, such as Moon in Aquarius and Uranus in Cancer, or Jupiter in Gemini and Mercury in Sagittarius. This is called "mutual reception," and is a very strong influence. It is as though the two planets feed each other, and grow stronger, for good or ill, in their ability to dominate those affairs in the chart.
You can find any and/or all of these at work in a chart, such as when one planet is the final dispositor for 2 or 3 others, two are in mutual reception, and 3 or 4 more form a chain of dispositors between them. Finding all of these in a chart is uncommon, but finding at least 2 of these is not so rare.
In my own chart I have Jupiter in Pisces as its own final dispositor, Moon in Aquarius and Uranus in Cancer in mutual reception, and two other final dispositors of all the rest of my natal planets.
Mars is the final dispositor of my Mercury in Aries, Sun in Aries, Mars in Aries, Saturn in Virgo disposited by Mercury in Aries, and Pluto in Leo disposited by the Sun in Aries. I also have Venus in Taurus as final dispositor of my Neptune in Libra and Venus in Taurus. While this quantity of final dispositors (Venus, Mars, and Jupiter all in their home signs!) is rare, it is common to find at least one of these three dispositor circumstances in a birth chart.
So you can see that during the year when planets are in Leo, they'll have more of the qualities of the sign the Sun is in, just like when planets are in Virgo they will be more the quality of the sign(s) Mercury occupies. When planets are in Libra they will take on the quality of whatever sign Venus is in, and when they are in Scorpio they will take on the quality of whatever sign Mars is in.
The upshot for the rest of 2011 is that Venus' influence will dominate the astrological landscape between May 15 and June 9 when it's in its home sign of Taurus. It will be the final dispositor for all the other planets (except standalone Neptune in Pisces) from May 15 through June 2, after which Mercury in Gemini equally dominates the scene as final dispositor for itself and the Sun. Mercury then takes final dispositorship for all the planets between June 9-16 when Venus also slips into Gemini while Mercury's still in its home sign.
Once Mercury and then the Sun move into Cancer the last half of June the Moon becomes their dispositor. Since the Moon moves through the signs so quickly it speeds up the rapidly changing backdrop to events. It only becomes final dispositor of itself and other planets in Cancer when it moves through its home sign of Cancer, which doesn't happen for very long, and it will make a mutual reception with Mercury when it's in Gemini at the end of June.
For as long as Pluto is in Capricorn it will be disposited by Saturn which will be disposited by Venus. So Venus and whatever sign it's in will influence Saturn and Pluto for months to come. When Neptune retrogrades back into Aquarius it will join this chain of dispositors.
Uranus in Aries will be disposited by Mars for years to come, so take note of what sign Mars is in to understand how Uranus is influenced. So when Mars is in Gemini, Uranus will also have Mercury as its dispositor, and when Mars is in Cancer, Uranus will also have the Moon as its dispositor. When Mars is in Leo, Uranus will also have the Sun as its dispositor, and when Mars is in Virgo, Uranus will also have Mercury as its dispositor.
Jupiter's dispositor changes each year at the time it changes signs. This year early January had Jupiter as its own final dispositor. From January through early June, Jupiter in Aries has Mars as its dispositor. From June 2011-2012, Jupiter in Taurus has Venus as its dispositor.
Within the last two spans, the transits of Mars and Venus indicate the backdrop to how Jupiter works. This will make Mars and then Venus very important in all Jupiter-influenced new adventures, learning challenges, and studies of higher consciousness and other spiritual areas
Though some of this is technical, hopefully it will help you understand why two different people with Saturn in Virgo, Venus in Gemini, or Mars in Capricorn (or any other planetary position) can be so radically different in their responses to similar areas or events. What we've covered here can also help to elucidate why some supposed "compatibilities" are not so compatible, and some supposedly incompatible planets in signs actually get along quite well. The answer to the mystery could very well be found in the dispositors!
© Copyright 2007, 2011 Robert Wilkinson


text:
As I had hinted previously, we are going to work on the most popular pattern of her collection, the Sureau dress.
- Monday : How sizes work and a little French glossary
- Tuesday : Choosing the fabric and buying the supplies for the dress and the muslin
- Wednesday : Tracing the pattern + using more than one size, or in-between size
- Friday : Sewing the muslin
2nd week (12/11): Adjusting the pattern
- Monday : SBA and gaping back
- Tuesday : FBA
- Wednesday : Adjusting the shoulder line
- Friday : Lenghtening or shortening the bodice and the skirt
3rd week (19/11): Construction
- Monday : How to make perfect gathers for the bust and the skirt
- Wednesday : How to set sleeves
- Friday : How to sew the zipper
4th week (26/11): Variations
- Monday : Adding a collar
- Wednesday : Omitting the sleeves
- Friday : How to add a lining on the skirt / on the entire dress
- BONUS: How to add horizontal pleats
Both Eléonore and I are quite the perfectionist types, so we are hoping to cover everything that you need! We will give further support on the Flickr group of the sew-along, where you can show your fabric choices, muslins and, of course, final dresses. The group is bilingual, so don't be scared if you see some French here and there (on the contrary, enjoy how international we're being :D ).
I am so excited, I can't wait to start! Admittedly, I'm a bit scared because this is my first sew-along, but collaborating with Eléonore has been a dream until now, so I'm very very positive! :)
So, who's in?
Please leave a comment below to further boost my excitement, and if you want to spread the love, here's a button for you to grab:

subset: commoncrawl


text:
Using the Clone() System Call
Low-level C programming has always been seen as the arena of the "guru". In my upper level operating systems course, the professor thought this was an idea that should be wiped from our minds. To this end, we had quite a few programming assignments that pushed us into totally new territories. One of these assignments was to research and use the clone() system call provided by Linux. Finding information on the low-level system calls provided by Linux was no easy task. Hopefully, this article will save any other budding guru-wannabees some time and trouble.
C programmers in the UNIX world have long used the fork() system call. This call is the basis of multiprocessing, as this is how new processes are created. Actually, for most systems, this is the only way to create a new process. Linux has introduced a new call, clone(), which allows a new level of process context creation.
Processes come in two basic flavours, heavy-weight and light-weight. Heavy-weight processes are those that you normally think of when you run a program. They contain their own address space and program execution context (see Figure 1). Light-weight processes are normally thought of as threads. These light-weight processes share the address space of the parent, and only contain some subset of the context elements (see Figure 2).
Before looking at the clone() system call, I'll begin with a quick review of fork. This system call, along with the class of exec system calls (i.e., execl(), execlp(), execv(), execvp()) is actually the way your shell executes programs given on the command line. A simple example of using fork() is given in Listing 1. The parent opens a file, assigns a value to a variable and forks a child. The child then tries to change the variable and close the file. After exiting, the parent wakes up and checks to see what the variable is and whether the file is open.
As you can see, the child is in a totally new address space. Within this address space, the child process receives a copy of everything the parent had at the point of forking. (This isn't exactly true in Linux. The child only receives a new copy of a memory page when it tries to make a change to something in that page. Until then, it simply uses the parent's copy. This is called copy-on-write memory management.) Changes to this copy do not affect the parent. When the child tries to change the value of the variable, the parent doesn't see this change.
How would you write a similar program using the clone() system call? Listing 2 gives a very basic program that looks like it copies the behaviour of the program using fork(). The most obvious difference at this stage is the fact that the clone() system call leaves all memory management up to the programmer. The first thing to be done is allocating space for the stack of the new child thread with malloc(). Once this is done, the clone() call is issued to begin a new context of execution, starting at the beginning of the given function. The general signature of this system call is
int __clone(int (*fn) (void *arg), void *child_stack, int flags, void *args)
As you can see, there are several parameters to prepare. The first parameter is a pointer to a function which returns an integer. In C, function names are pointers to functions, so this is easily taken care of. The second parameter is a pointer to the stack space that was set up for the child. You will have to decide how much space is required for the operations the child process will perform. The last parameter is a pointer to the arguments that will pass to the function that the child process will execute. In this case, that is a null pointer, since we aren't passing any arguments to the function.
The third parameter deserves special attention. This is where you can designate the flags which will define how much of the process context will be shared between the child and the parent. As in most C functions, multiple flags are simply read together. The flags available to the clone call are:
CLONE_VM - share memoryCLONE_FILES - share file descriptorsCLONE_SIGHAND - share signal handlersCLONE_VFORK - allow child to signal parent on exitCLONE_PID - share PID (not implemented yet)CLONE_FS - share filesystem
You can see that we've set up our sample program with CLONE_VM and CLONE_FILES. Looking at the output of the program, you can see that the child process will share the address space and file descriptor table with its parent. Any changes made by one process are now visible to the other. If the exact behaviour of fork() was required, all that needs to be changed is which flags are set. This way, you get to choose the exact level of sharing your program will use.
There are a few caveats I should mention in using this system call. Several functions, such as printf(), which are not thread-safe when used with clone(). These functions assume the kind of wrapping that occurs when using thread libraries, like linuxthreads. If you are experimenting with a program and run into segfaults or coredumps, this would be a likely place to look to start your troubleshooting. A possible solution would be to use lower level system calls, such as write() instead of printf(). Also, you should compile programs using the -static switch.
I am in debt to the good folks at Red Hat for pointing out some pitfalls while I stumbled my way through this article. Any errors in this article are entirely the fault of the author, and I would appreciate any corrections that you think should be made.
email: firstname.lastname@example.com


text:
Egg Cartons Recycled into Clever 'Trash Me' Desk Lamps by
The intent of the Trash Me project, created by Victor Vetterlein, is to create a product that is born from the trash and returned to the trash after a useful life cycle. The concept word for the Trash Me design is 'transient.' Each Trash Me lamp is created from four paper egg cartons, blended with water, poured over a mold, and smoothed by hand to form a section. After drying for a few days, the sections are fastened together with aluminum screw posts. A cloth electrical cord with recyclable electrical fixture parts is used for the CFL or LED lighting. A paper bag filled with wood chips provides added weight to stabilize the base. At the end of its life, the Trash Me lamp can be quickly dissembled and the parts reused or recycled back into the trash to be born again as something as new.
596 votes


text:
Anthony Lewis
American journalist (1927-2013)
Anthony Lewis (March 27, 1927, New York City — March 25, 2013, Cambridge, Massachusetts) was a prominent liberal intellectual, writing for The New York Times op-ed page and The New York Review of Books, among other publications. Lewis who is a two-time recipient of the Pulitzer Prize, is credited with creating the field of legal journalism in the United States.
Quotes edit
- The court is the least abstract of institutions. It is nine men, nine very human men, participating in a process that can be impressive or disturbing, grave or funny. And contrary to the general impression, the process is more visible than most of what goes on in government.
- Quoted in Congressional Quarterly's Guide to the U.S. Supreme Court (1979), p. viii.
- Five more times in the succeeding pages of his penciled petition Gideon spoke of the right to counsel. To try a poor man for a felony without giving him a lawyer, he said, was to deprive him of the due process of law.
- Gideon's Trumpet. Vintage. 1989. p. 8. ISBN 9780679723127.
- Against all the odds of inertia and ignorance and fear of state power, Clarence Earl Gideon insisted that he had a right to a lawyer and kept on insisting all the way to the Supreme Court of the United States. His triumph there shows that even the poorest and least powerful of men — a convict with not even a friend to visit him in prison — can take his cause to the highest court in the land and bring about a fundamental change in the law.
- Gideon's Trumpet. Vintage. 1989. p. 218. ISBN 9780679723127.
- The conflict about the meaning of free speech went on through the 1920s, Holmes and Brandeis persisting in their view and expressing it in strongly worded dissents. In one sense it was a curious performance by the two of them, for each had a deep commitment to the Supreme Court as an institution and thought that division among the justices should be avoided when possible.
- Make No Law: The Sullivan Case and the First Amendment. Vintage. 1992. pp. 82-83. ISBN 0679739394.
- Without the foundation of law, this vast country could never have survived as one, could never have absorbed streams of immigrants from myriad cultures. With one terrible exception, the Civil War, law and the Constitution have kept America whole and free.
- "Abroad at Home; Hail And Farewell". New York Times (Boston). 2001-12-15. [Lewis's final column].
- I am an optimist about America. But how can I maintain that optimism after Vietnam, after the murder of so many who fought for civil rights, after the Red scare and after the abusive tactics planned by government today? I can because we have regretted our mistakes in the past, relearning every time that no ruler can be trusted with arbitrary power. And I believe we will again.… But after all, this has always been a country of unbounded optimism, a country that struggles with itself and conquers corrupting habit.… In the end I believe that faith in reason will prevail. But it will not happen automatically. Freedom under law is hard work. If rulers cannot be trusted with arbitrary power, it is up to citizens to raise their voices at injustice.
- "Abroad at Home; Hail And Farewell". New York Times (Boston). 2001-12-15. [Lewis's final column].
- Pulitzer Prizes are the preeminent mark of achievement in American journalism. As the prizes for reporting on Vietnam in defiance of official wishes show, they also point to the press's view of its role in society. That view has changed substantially over the more than eighty years of the Pulitzer Prizes' existence. Exposing official corruption on a local level had always been part of what journalists see as their function. But today, more than ever before, they are ready to write critically about the policies of the federal government, even in the once sacrosanct areas of foreign and national security affairs.
- Written into History: Pulitzer Prize Reporting of the Twentieth Century from The New York Times. Times Books. 2002. pp. ix-x. ISBN 9780805071788.
- The meaning of the First Amendment has been, and will be, shaped by each American generation: by judges, political leaders, citizens. There will always be authorities who try to make their own lives more comfortable by suppressing critical comment.… But I am convinced that the fundamental American commitment to free speech, disturbing speech, is no longer in doubt.
- Freedom for the Thought That We Hate; A Biography of the First Amendment. Basic Books. 2007. p. xv. ISBN 0465039170.
- A final argument for broad freedom of expression is its effect on the character of individuals in a society. Citizens in a free society must have courage — the courage to hear not only unwelcome political speech but novel and shocking ideas in science and the arts.
- Freedom for the Thought That We Hate; A Biography of the First Amendment. Basic Books. 2007. p. 186. ISBN 0465039170.
About edit
- Two-time Pulitzer Prize winner Anthony Lewis is among the great American journalists of the past half century. His coverage of legal issues for The New York Times, where he was a columnist for 32 years, along with his best-selling books (including "Gideon's Trumpet"), have made him one of the most popular commentators on American law.
- Leddy, Chuck (January 8, 2008). "A balance between free speech and fear". The Christian Science Monitor (Boston, Massachusetts): p. 16.
- Lewis is a former New York Times columnist and an authority on the U.S. Constitution.
- Hagan, John F. (November 22, 2003). "Americans being denied rights since 9/11, journalist declares". The Plain Dealer (Cleveland, Ohio): p. B2.
- … Lewis will be remembered most for his unfailing commitment to justice as a concept that must rise above politics. For it is the Constitution, not any party, ideology or official, that merits Americans' constant allegiance.
- Star Tribune staff (December 21, 2001). "Lewis and the law - Powerful writing rooted in respect". Star Tribune: Newspaper of the Twin Cities (Minneapolis, Minnesota): p. 32A.
- Though Lewis' views frequently are well left of center on the political spectrum, his writing is moderate. Lewis is at once passionate and logical - great to argue with in your head.
- Weiss, Richard H. (November 5, 1998). "Times columnist likes to mine a vein of thought". St. Louis Post-Dispatch: p. G1.


text:
If the iPhone has helped me accomplish one thing, it has probably been to make it easier for me to stay away from Emacs.
It works like this:
It is not controversial to assert that Emacs is an environment all its own. You can find libraries and packages that allow Emacs to acknowledge and talk to outside environments, so it's not a closed environment, but it's different enough that there's some fiddling involved to get it chatting with the outside world.
The iPhone could also be considered an environment all its own, but it's an environment built with an eye on a broader context. iPhones have a pretty easy time doing things like talking to iCal or Outlook with a few button clicks, for instance. Now, unlike Emacs, there's a point with the iPhone where no amount of grunting or straining will matter, and if you want it to talk to something else nobody else has bothered to make it talk to, there's an SDK you can download.
All that said, when Emacs and iPhone can both respond to a particular requirement with "there's an [app | elisp package] for that," the iPhone variation will usually involve a quick download and three or four fields in a configuration screen, tops.
When I got an iPhone, I was a pretty heavy Emacs org mode user. The smartphone I had prior to the iPhone was a BlackBerry, and the BlackBerry never really talked to my Mac on any useful level: lost contacts, extra contacts, a new contact for every phone number I had listed for what had once been a single contact, crummy calendar syncing, forget about bookmarks syncing, etc. etc. etc. Because the BlackBerry sucked for me as a Mac user, and because iCal was anemic when it came to todos, org mode was able to fend off everything.
I won't go into a lot of detail about org mode except to say that it's neat. You just open a ".org" file in Emacs and start typing using a pretty simple notation. For instance …
* PracNet
** TODO Look at reviews: can we get user information to the front page? (ASP)
** TODO Look at inside pages: make a toolkit for callouts that can fit into the CSS
When that text appears in an Emacs buffer in org mode, it's nicely color coded. A few keystrokes make it easy to cycle between "TODO" and "DONE" or some other status.
As with all things Emacs, it's very customizable.
Then the iPhone came along and promised me that if I would accept a few small tradeoffs, it would sync up with a lot more of my stuff: bookmarks, addresses, e-mail, etc. etc. etc. I'd have all that stuff in my pocket, and when I returned home my Mac would automagically commune with it to learn what had changed in my absence.
org mode fell by the wayside, and the little ecosystem I'd created within Emacs crumbled because it was no longer a place to live … just a place to visit when I needed to push text around.
So MobileOrg strikes me as fascinating and horrifying at the same time. All it does is this:
You save your Emacs org mode files on a WebDAV server, load MobileOrg onto your iPhone, and you'll have org mode on your iPhone and it'll all sync up, just like Remember the Milk or ToodleDo or any of the other todo services that have "an app for that."
"If you are a MobileMe user, you already have access to a WebDAV server: iDisk," says the MobileOrg site in a manner I cannot help but read as insinuating.
"Sucker … walked away from Emacs and even took the extra step of slurping the MobileMe kool-aid thinking it'd harden your resolve against ever returning. Well … fine … keep your precious iDisk … it will become the tool of your re-liberation."
Less than two years ago, when I was venturing forth from org mode and getting to know the iPhone as a way to keep all my Stuff in sync, MobileOrg would have had me at hello. Now it just gives me the shaking fits.
With Emacs, you don't just go "la la la … I'm gonna add org mode back and call it a day!" You think to yourself, "I love org mode. I wish there was an easy way to turn an e-mail message into a todo …" and the next thing you know you're dealing with how to configure GNUS.
Then you think "All my calendar stuff is in Google calendar … how can I get it into my org mode agenda?" and that means you're off reading this guy's page and just getting angrier and angrier.
Then you go in the kitchen and make a drink, and while you're making it and calming down you think to yourself, if I'm doing all this stuff in Emacs anyhow, what would it hurt to follow Twitter in Emacs?
Now you're not drinking because you're angry … you're drinking because you wonder what happened to you and it makes you sad. But you're drunk, so it seems like a perfectly good idea to build an entire Web site using nothing but Emacs because then you can get a LaTeX version of it for if the asteroids hit and their radiation destroys all HTML. And having decided to do that, part of you thinks about how glad you are you have org mode, so you can organize the lengthy process of making sure you never have to leave Emacs again.
It's knowing what's in store for me as I sit here with MobileOrg on my iPhone and the necessary WebDAV share all set up that makes me read this and just want to spit nails:
At its core, Org-mode is a simple outliner for note-taking and list management. You can learn the basics for using it in five minutes. This may be all you need, and Org-mode will not impose more complex features on you.
That's right … because org-mode is just a collection of lisp running in an editor. It cannot impose more complex features on you. The genius of org-mode is that you will eventually impose more complex features on yourself.


text:
Archive-name: motif-faq/part9 Last-modified: 1 FEB 2002 Posting-Frequency: irregular Organization: Kenton Lee, X/Motif Consultant, http://www.rahul.net/kenton/ URL: http://www.rahul.net/kenton/mfaq.html Version: 8.1 ----------------------------------------------------------------------------- Subject: 293) Why doesn't the Help callback work on some widgets? [Last modified: May 95] Answer: If you press the help key the help callback of the widget with the keyboard focus is called (not the one containing the mouse). You can't get the help callback of a non-keyboard-selectable widget called. To get `context sensitive' help on these, you have to find the mouse, associate its position with a widget and then do the help. The X Resource, Issue 6, has an article on implementing context help in Motif in this manner, that is, using the mouse position to indicate the widget for which context help is desired, as well as using resources to specify the help. The demo program lets you toggle between using the method described in the article and XmTrackingLocate() for comparision purposes. Contributed by: Jay Schmidgall firstname.lastname@example.com (author of the article mentioned above). Thanks to email@example.com (Franklin Chen) for correcting the URL. ----------------------------------------------------------------------------- Subject: 294)* How can I implement "bubble help" or "tool tips" with Motif? [Last modified: Jan 02] Answer: Open Motif 2.2 includes a built-in ToolTips feature. The following material may be of interest to users of earlier versions of Motif. Gary Aviv (firstname.lastname@example.com) informed this maintainer about the free LiteClue widget from Computer Generation, Inc. (http://www.compgen.com/). LiteClue is a widget which pops a one line help message when the user passes the pointer over another "watched" widget. This is known by various names in the industry such as hints, clues, tips, bubble help and balloon help. Technical documentation and source for the LiteClue widget are available from: http://www.compgen.com/widgets/LiteClue.html ftp://ftp.compgen.com/pub/widgets/LiteClue.tar.Z Ken Lee (http://www.rahul.net/kenton/) writes: A simple technique is to popup a shell containing your message whenever an enter event occurs (possibly delayed by a timer) and pop it down again after a leave event. David Lewis (firstname.lastname@example.com) writes: To those resources I should add that the XmHTML sources (HTML parser, browser, etc) have this ToolTip/bubble-help/popup feature, in readily-usable code. In addition, the ICS EnhancementPak widget set (http://www.ics.com) has both a toolbar with built-in popups for its entries and a small library which adds popup capabilities to any widget. ----------------------------------------------------------------------------- Subject: 295) Can I specify a widget in a resource file? Answer: This answer, which uses the Xmu library, is due to David Elliott. If the converter is added, then the name of a widget (a string) can be used in resource files, and will be converted to the appropriate widget. This code, which was basically stolen from the Athena Form widget, adds a String to Widget converter. I wrote it as a general routine that I call at the beginning of all of my programs, and made it so I could add other converters as needed (like String to Unit Type ;-). #include <X11/Intrinsic.h> #include <X11/StringDefs.h> #include <Xm/Xm.h> #include <X11/Xmu/Converters.h> #include <X11/IntrinsicP.h> #include <X11/CoreP.h> void setupConverters() { static XtConvertArgRec parentCvtArgs[] = { {XtBaseOffset, (caddr_t)XtOffset(Widget, core.parent), sizeof(Widget)} }; XtAddConverter(XmRString, XmRWindow, XmuCvtStringToWidget, parentCvtArgs, XtNumber(parentCvtArgs)); } ----------------------------------------------------------------------------- Subject: 296) Why are only some of my translations are being installed? I have a translation table like the following, but only the first ones are getting installed and the rest are ignored. *Text.translations: #override \ Ctrl<Key>a: beginning-of-line() \n\ Ctrl<Key>e: end-of-line() \n\ Ctrl<Key>f: forward-character() \n\ Answer: Most likely, you have a space at the end of one of the lines (the first in this case). Ctrl<Key>a: beginning-of-line() \n\ ^ space here The second backslash in each line is there to protect the real newline character and so you must not follow it with anything other than the newline itself. Otherwise it acts as the end of the resource definition and the remaining lines are not added. ----------------------------------------------------------------------------- Subject: 297) Can I have separate translations for shifted and unshifted keys? [Last modified: Jan 99] Answer: Alec Flett <email@example.com> writes: I've got an addition for the motif FAQ that just solved a problem I've been wrestling with for a month - it's really an addition to #303 "Why are only some of my translations being installed?" On certain platforms you cannot use an upper-case key in combination with the Shift modifier. For example, Meta Shift <Key>F: find-in-list() will not always work because the F is capitalized. The reason for this is because some platforms (such as IRIX) distinguish upper case and lowercase keysyms. Using Jamie Zawinski's xkeycaps program (http://www.jwz.org/xkeycaps/), you will see that on Solaris the "F" key just has one keysym: "F" On IRIX they same key has two: "f" and "F". ----------------------------------------------------------------------------- Subject: 298) What are these "non-existant passive grab" warnings? When I destroy certain widgets I get a stream of messages Warning: Attempt to remove non-existant passive grab Answer: They are meaningless, and you want to ignore them. Do this (from Kee Hinckley) by installing an XtWarning handler that explicitly looks for them and discards them: static void xtWarnCB(String message) { if (asi_strstr(message, "non-existant passive grab", TRUE)) return; ... They come from Xt, and (W. Scott Meeks): "it's something that the designers of Xt decided the toolkit should do. Unfortunately, Motif winds up putting passive grabs all over the place for the menu system. On the one hand, we want to remove all these grabs when menus get destroyed so that they don't leak memory; on the other hand, it's almost impossible to keep track of all the grabs, so we have a conservative strategy of ungrabbing any place where a grab could have been made and we don't explicitly know that there is no grab. The unfortunate side effect is the little passive grab warning messages. We're trying to clean these up where possible, but there are some new places where the warning is generated. Until we get this completely cleaned up (1.2 maybe), your best bet is probably to use a warning handler." ----------------------------------------------------------------------------- Subject: 299) How do I have more buttons than three in a MessageBox? I want to have something like a MessageBox (or other widget) with more than three buttons, but with the same nice appearance. [Last modified: Feb 95] Answer: The Motif 1.2 MessageBox widget allows extra buttons to be added after the OK button. Just create the extra buttons as children of the MessageBox. Similarly with the SelectionBox. Pre-Motif 1.2, you have to do one of the following methods. A SelectionBox is created with four buttons, but the fourth (the Apply button) is unmanaged. To manage it get its widget ID via XmSelectionBoxGetChild(parent, XmDIALOG_APPLY_BUTTON) and then XtManage it. Unmanage all of the other bits in the SelectionBox that you don't want. If you want more than four buttons, try two SelectionBoxes (or similar) together in a container, where all of the unwanted parts of the widgets are unmanaged. Alternatively, build your own dialog: /* Written by Dan Heller. Copyright 1991, O'Reilly && Associates. * This program is freely distributable without licensing fees and * is provided without guarantee or warranty expressed or implied. * This program is -not- in the public domain. This program is * taken from the Motif Programming Manual, O'Reilly Volume 6. */ /* action_area.c -- demonstrate how CreateActionArea() can be used * in a real application. Create what would otherwise be identified * as a PromptDialog, only this is of our own creation. As such, * we provide a TextField widget for input. When the user presses * Return, the Ok button is activated. */ #include <Xm/DialogS.h> #include <Xm/PushBG.h> #include <Xm/PushB.h> #include <Xm/LabelG.h> #include <Xm/PanedW.h> #include <Xm/Form.h> #include <Xm/RowColumn.h> #include <Xm/TextF.h> typedef struct { char *label; void (*callback)(); caddr_t data; } ActionAreaItem; static void do_dialog(), close_dialog(), activate_cb(), ok_pushed(), cancel_pushed(), help(); main(argc, argv) int argc; char *argv[]; { Widget toplevel, button; XtAppContext app; toplevel = XtVaAppInitialize(&app, "Demos", NULL, 0, &argc, argv, NULL, NULL); button = XtVaCreateManagedWidget("Push Me", xmPushButtonWidgetClass, toplevel, NULL); XtAddCallback(button, XmNactivateCallback, do_dialog, NULL); XtRealizeWidget(toplevel); XtAppMainLoop(app); } /* callback routine for "Push Me" button. Actually, this represents * a function that could be invoked by any arbitrary callback. Here, * we demonstrate how one can build a standard customized dialog box. * The control area is created here and the action area is created in * a separate, generic routine: CreateActionArea(). */ static void do_dialog(w, file) Widget w; /* will act as dialog's parent */ char *file; { Widget dialog, pane, rc, label, text_w, action_a; XmString string; extern Widget CreateActionArea(); Arg args[10]; static ActionAreaItem action_items[] = { { "Ok", ok_pushed, NULL }, { "Cancel", cancel_pushed, NULL }, { "Close", close_dialog, NULL }, { "Help", help, "Help Button" }, }; /* The DialogShell is the Shell for this dialog. Set it up so * that the "Close" button in the window manager's system menu * destroys the shell (it only unmaps it by default). */ dialog = XtVaCreatePopupShell("dialog", xmDialogShellWidgetClass, XtParent(w), XmNtitle, "Dialog Shell", /* give arbitrary title in wm */ XmNdeleteResponse, XmDESTROY, /* system menu "Close" action */ NULL); /* now that the dialog is created, set the Close button's * client data, so close_dialog() will know what to destroy. */ action_items[2].data = (caddr_t)dialog; /* Create the paned window as a child of the dialog. This will * contain the control area (a Form widget) and the action area * (created by CreateActionArea() using the action_items above). */ pane = XtVaCreateWidget("pane", xmPanedWindowWidgetClass, dialog, XmNsashWidth, 1, XmNsashHeight, 1, NULL); /* create the control area (Form) which contains a * Label gadget and a List widget. */ rc = XtVaCreateWidget("control_area", xmRowColumnWidgetClass, pane, NULL); string = XmStringCreateLocalized("Type Something:"); XtVaCreateManagedWidget("label", xmLabelGadgetClass, rc, XmNlabelString, string, XmNleftAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_FORM, NULL); XmStringFree(string); text_w = XtVaCreateManagedWidget("text-field", xmTextFieldWidgetClass, rc, NULL); /* RowColumn is full -- now manage */ XtManageChild(rc); /* Set the client data "Ok" and "Cancel" button's callbacks. */ action_items[0].data = (caddr_t)text_w; action_items[1].data = (caddr_t)text_w; /* Create the action area -- we don't need the widget it returns. */ action_a = CreateActionArea(pane, action_items, XtNumber(action_items)); /* callback for Return in TextField. Use action_a as client data */ XtAddCallback(text_w, XmNactivateCallback, activate_cb, action_a); XtManageChild(pane); XtPopup(dialog, XtGrabNone); } /*--------------*/ /* The next four functions are the callback routines for the buttons * in the action area for the dialog created above. Again, they are * simple examples, yet they demonstrate the fundamental design approach. */ static void close_dialog(w, shell) Widget w, shell; { XtDestroyWidget(shell); } /* The "ok" button was pushed or the user pressed Return */ static void ok_pushed(w, text_w, cbs) Widget w, text_w; /* the text widget is the client data */ XmAnyCallbackStruct *cbs; { char *text = XmTextFieldGetString(text_w); printf("String = %s0, text); XtFree(text); } static void cancel_pushed(w, text_w, cbs) Widget w, text_w; /* the text field is the client data */ XmAnyCallbackStruct *cbs; { /* cancel the whole operation; reset to NULL. */ XmTextFieldSetString(text_w, ""); } static void help(w, string) Widget w; String string; { puts(string); } /*--------------*/ /* When Return is pressed in TextField widget, respond by getting * the designated "default button" in the action area and activate * it as if the user had selected it. */ static void activate_cb(text_w, client_data, cbs) Widget text_w; /* user pressed Return in this widget */ XtPointer client_data; /* action_area passed as client data */ XmAnyCallbackStruct *cbs; /* borrow the "event" field from this */ { Widget dflt, action_area = (Widget)client_data; XtVaGetValues(action_area, XmNdefaultButton, &dflt, NULL); if (dflt) /* sanity check -- this better work */ /* make the default button think it got pushed. This causes * "ok_pushed" to be called, but XtCallActionProc() causes * the button appear to be activated as if the user selected it. */ XtCallActionProc(dflt, "ArmAndActivate", cbs->event, NULL, 0); } #define TIGHTNESS 20 Widget CreateActionArea(parent, actions, num_actions) Widget parent; ActionAreaItem *actions; int num_actions; { Widget action_area, widget; int i; action_area = XtVaCreateWidget("action_area", xmFormWidgetClass, parent, XmNfractionBase, TIGHTNESS*num_actions - 1, XmNleftOffset, 10, XmNrightOffset, 10, NULL); for (i = 0; i < num_actions; i++) { widget = XtVaCreateManagedWidget(actions[i].label, xmPushButtonWidgetClass, action_area, XmNleftAttachment, i? XmATTACH_POSITION : XmATTACH_FORM, XmNleftPosition, TIGHTNESS*i, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, i != num_actions-1? XmATTACH_POSITION : XmATTACH_FORM, XmNrightPosition, TIGHTNESS*i + (TIGHTNESS-1), XmNshowAsDefault, i == 0, XmNdefaultButtonShadowThickness, 1, NULL); if (actions[i].callback) XtAddCallback(widget, XmNactivateCallback, actions[i].callback, actions[i].data); if (i == 0) { /* Set the action_area's default button to the first widget * created (or, make the index a parameter to the function * or have it be part of the data structure). Also, set the * pane window constraint for max and min heights so this * particular pane in the PanedWindow is not resizable. */ Dimension height, h; XtVaGetValues(action_area, XmNmarginHeight, &h, NULL); XtVaGetValues(widget, XmNheight, &height, NULL); height += 2 * h; XtVaSetValues(action_area, XmNdefaultButton, widget, XmNpaneMaximum, height, XmNpaneMinimum, height, NULL); } } XtManageChild(action_area); return action_area; } ----------------------------------------------------------------------------- Subject: 300) How do I create a "busy working cursor"? [Last modified: Feb 95] Answer: - in Baudouin's code (following), the idea is to keep in an array an up-to-date list of all shells used in the application, and set for all of them the cursor to a watch or to the default cursor, with the 2 functions provided. - in Dan Heller's code (later), the idea is to turn on the watch cursor for the top-level shell only, popup a working window to possibly abort the callback, and manage some expose events during the callback. - in the FAQ for comp.windows.x, the idea is to bring a large window on top of the application, hide all windows below it, and turn on the watch cursor on this large window. Unmapping the large window resets the default cursor, mapping it turns on the watch cursor. Baudouin Raoult (email@example.com) wrote: void my_SetWatchCursor(w) Widget w; { static Cursor watch = NULL; if(!watch) watch = XCreateFontCursor(XtDisplay(w),XC_watch); XDefineCursor(XtDisplay(w),XtWindow(w),watch); XmUpdateDisplay(w); } void my_ResetCursor(w) Widget w; { XUndefineCursor(XtDisplay(w),XtWindow(w)); XmUpdateDisplay(w); } Answer: A solution with lots of bells and whistles is /* Written by Dan Heller. Copyright 1991, O'Reilly && Associates. * This program is freely distributable without licensing fees and * is provided without guarantee or warrantee expressed or implied. * This program is -not- in the public domain. */ /* busy.c -- demonstrate how to use a WorkingDialog and to process * only "important" events. e.g., those that may interrupt the * task or to repaint widgets for exposure. Set up a simple shell * and a widget that, when pressed, immediately goes into its own * loop. First, "lock" the shell so that a timeout cursor is set on * the shell and pop up a WorkingDialog. Then enter loop ... sleep * for one second ten times, checking between each interval to see * if the user clicked the Stop button or if any widgets need to be * refreshed. Ignore all other events. * * main() and get_busy() are stubs that would be replaced by a real * application; all other functions can be used "as is." */ #include <Xm/MessageB.h> #include <Xm/PushB.h> #include <X11/cursorfont.h> Widget shell; void TimeoutCursors(); Boolean CheckForInterrupt(); main(argc, argv) int argc; char *argv[]; { XtAppContext app; Widget button; XmString label; void get_busy(); shell = XtVaAppInitialize(&app, "Demos", NULL, 0, &argc, argv, NULL, NULL); label = XmStringCreateLocalized( "Boy, is *this* going to take a long time."); button = XtVaCreateManagedWidget("button", xmPushButtonWidgetClass, shell, XmNlabelString, label, NULL); XmStringFree(label); XtAddCallback(button, XmNactivateCallback, get_busy, argv[1]); XtRealizeWidget(shell); XtAppMainLoop(app); } void get_busy(widget) Widget widget; { int n; TimeoutCursors(True, True); for (n = 0; n < 10; n++) { sleep(1); if (CheckForInterrupt()) { puts("Interrupt!"); break; } } if (n == 10) puts("done."); TimeoutCursors(False, NULL); } /* The interesting part of the program -- extract and use at will */ static Boolean stopped; /* True when user wants to stop processing */ static Widget dialog; /* WorkingDialog displayed when timed out */ /* timeout_cursors() turns on the "watch" cursor over the application * to provide feedback for the user that he's going to be waiting * a while before he can interact with the appliation again. */ void TimeoutCursors(on, interruptable) int on, interruptable; { static int locked; static Cursor cursor; extern Widget shell; XSetWindowAttributes attrs; Display *dpy = XtDisplay(shell); XEvent event; Arg args[1]; XmString str; extern void stop(); /* "locked" keeps track if we've already called the function. * This allows recursion and is necessary for most situations. */ on? locked++ : locked--; if (locked > 1 || locked == 1 && on == 0) return; /* already locked and we're not unlocking */ stopped = False; /* doesn't matter at this point; initialize */ if (!cursor) /* make sure the timeout cursor is initialized */ cursor = XCreateFontCursor(dpy, XC_watch); /* if "on" is true, then turn on watch cursor, otherwise, return * the shell's cursor to normal. */ attrs.cursor = on? cursor : None; /* change the main application shell's cursor to be the timeout * cursor (or to reset it to normal). If other shells exist in * this application, they will have to be listed here in order * for them to have timeout cursors too. */ XChangeWindowAttributes(dpy, XtWindow(shell), CWCursor, &attrs); XFlush(dpy); if (on) { /* we're timing out, put up a WorkingDialog. If the process * is interruptable, allow a "Stop" button. Otherwise, remove * all actions so the user can't stop the processing. */ str = XmStringCreateLocalized("Busy. Please Wait."); XtSetArg(args[0], XmNmessageString, str); dialog = XmCreateWorkingDialog(shell, "Busy", args, 1); XmStringFree(str); XtUnmanageChild( XmMessageBoxGetChild(dialog, XmDIALOG_OK_BUTTON)); if (interruptable) { str = XmStringCreateLocalized("Stop"); XtVaSetValues(dialog, XmNcancelLabelString, str, NULL); XmStringFree(str); XtAddCallback(dialog, XmNcancelCallback, stop, NULL); } else XtUnmanageChild( XmMessageBoxGetChild(dialog, XmDIALOG_CANCEL_BUTTON)); XtUnmanageChild( XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON)); XtManageChild(dialog); } else { /* get rid of all button and keyboard events that occured * during the time out. The user shouldn't have done anything * during this time, so flush for button and keypress events. * KeyRelease events are not discarded because accelerators * require the corresponding release event before normal input * can continue. */ while (XCheckMaskEvent(dpy, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | PointerMotionMask | KeyPressMask, &event)) { /* do nothing */; } XtDestroyWidget(dialog); } } /* User Pressed the "Stop" button in dialog. */ void stop(dialog) Widget dialog; { stopped = True; } Boolean CheckForInterrupt() { extern Widget shell; Display *dpy = XtDisplay(shell); Window win = XtWindow(dialog); XEvent event; /* Make sure all our requests get to the server */ XFlush(dpy); /* Let motif process all pending exposure events for us. */ XmUpdateDisplay(shell); /* Check the event loop for events in the dialog ("Stop"?) */ while (XCheckMaskEvent(dpy, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | PointerMotionMask | KeyPressMask | KeyReleaseMask, &event)) { /* got an "interesting" event. */ if (event.xany.window == win) XtDispatchEvent(&event); /* it's in our dialog.. */ else /* uninteresting event--throw it away and sound bell */ XBell(dpy, 50); } return stopped; } ----------------------------------------------------------------------------- Subject: 301) Can I use the hourglass that mwm uses? [Last modified: March 93] Answer: The hourglass used by mwm is hard-coded into code that is subject to OSF copyright. In Motif 1.2 though, the bitmaps for this and other things (information, no_enter, question, warning, working) were made available. The install process will probably add them to /usr/include/X11/bitmaps. Otherwise, just use the watch cursor XC_watch of the previous question, because that has the same semantics. ----------------------------------------------------------------------------- Subject: 302) What order should the libraries be linked in? [Last modified: August 92] Answer: At link time, use the library order -lXm -lXt -lX11. There are two reasons for this (firstname.lastname@example.com): On most systems, the order matters because the linker won't re-scan a library once it is done with it. Thus any references to Xlib calls from Xm will probably be unresolved. The [other] problem is that there are two VendorShell widgets. A dummy is provided in the Xt library, but a widget set will rely on its own being referenced. If you mention Xt first, the linker will choose the wrong one. Motif code will wrongly assume the Motif VendorShell has been class- initialized [and will probably crash]. Xaw has a similar problem, but a softer landing; it only complains about unregistered converters. ----------------------------------------------------------------------------- Subject: 303) How do I use xmkmf for Motif clients? [Last modified: July 96] Answer: This advice comes from firstname.lastname@example.com. For another answer, see the question immediately following this one ("How do I use imake with Motif 2.0?"). There are a number of intractable problems with using X configuration files and xmkmf, while trying to make it easy to build Motif. Not the least of these, but one I've never heard mentioned yet, is that the rules for contructing the names of shared library macros are machine-dependent, and in the various xxxLib.tmpl files. Do we edit all those files to add definitions for XMLIB, DEPXMLIB, etc., or do we put a maze of #ifdefs into the Motif.tmpl file? Please note that, if you install Motif, it overwrites your installed Imake.tmpl with one that includes Motif.tmpl and Motif.rules. With those caveats, I think the following guidelines will help. David Brooks OSF Clients in the X11R5 release use the xmkmf command to build Makefiles. In general, the xmkmf command cannot be used for Motif clients, because of the need to consider the UseInstalledMotif flag separately. Since xmkmf is a simple script that calls imake, it is easy to construct the proper call to imake using the following rules. In the following, replace {MTOP} by the toplevel directory with the Motif source tree, and {XTOP} by the toplevel ("mit") directory with the X source. It is assumed that the directory containing your installed imake is in your PATH. When needed, the imake variables XTop and MTop are normally set in your site.def (to {XTOP} amd {MTOP} respectively); however they may also be set with additional -D arguments to imake. 1. With both X and Motif in their source trees, ensure the imake variables XTop and MTop are set, and use: ${XTOP}/config/imake -I{MTOP}/config 2. With Motif in its source tree, and X installed, ensure MTop is set, and use: imake -I{MTOP}/config -DUseInstalled 3. With both Motif and X installed, and a nonstandard ProjectRoot (see site.def for an explanation of this), use: imake -DUseInstalled -DUseInstalledMotif -I{ProjectRoot}/lib/X11/config or, if the configuration files are in /usr/lib/X11/config: imake -DUseInstalled -DUseInstalledMotif -I/usr/lib/X11/config [Thanks to Paul DuBois (email@example.com) for correcting this.] To build a simple Imakefile, remember to include lines like this: LOCAL_LIBRARIES = XmClientLibs DEPLIBS = XmClientDepLibs Or, for a client that uses uil/mrm, replace these by MrmClientLibs and MrmClientDepLibs, and also use: MSimpleUilTarget(program) to build the client and uid file. Look at the demos for more examples. And Paul Howell <firstname.lastname@example.com> added: i did this, calling the new script "xmmkmf". It passes both -DUseInstalled and -DUseInstalledMotif. and i modified the stock R5 Imake.tmpl to do this: #include <Project.tmpl> #ifdef UseInstalledMotif #include <Motif.tmpl> #endif #include <Imake.rules> #ifdef UseInstalledMotif #include <Motif.rules> #endif the result was something that does both athena and motif rules. and it really works, just that easy! ----------------------------------------------------------------------------- Subject: 304) How do I use imake with Motif 2.0? [Last modified: July 96] Answer: Paul DuBois (firstname.lastname@example.com), the author of the O'Reilly and Associates book, Software Portability with imake, recently wrote some notes on the use of imake to configure Motif (2.0). It has some discussion on the roles of UseInstalled and UseInstalledMotif, for instance, which seem to be murky to many people. The document is available at: http://www.primate.wisc.edu/software/imake-stuff ----------------------------------------------------------------------------- Subject: 305) How do I make context sensitive help? The Motif Style Guide says that an application must initiate context-sensitive help by changing the shape of the pointer to the question pointer. When the user moves the pointer to the component help is wanted on and presses BSelect, any available context sensitive help for the component must be presented, and the pointer reverts from the question pointer. [Last modified: August 92] Answer: A widget that gives context sensitive help would place this help in the XmNhelpCallback function. To trigger this function: (from Martin G C Davies, firstname.lastname@example.com) I use the following callback that is called when the "On Context" help pulldown menu is selected. It does the arrow bit and calls the help callbacks for the widget. It also zips up the widget tree looking for help if needs be. I don't restrict the arrows motion so I can get help on dialog boxes. No prizes for guessing what "popup_message" does. static void ContextHelp( Widget w , Opaque * tag , XmAnyCallbackStruct * callback_struct ) { static Cursor context_cursor = NULL ; Widget context_widget ; if ( context_cursor == NULL ) context_cursor = XCreateFontCursor( display, XC_question_arrow ) ; context_widget = XmTrackingLocate( top_level_widget, context_cursor, FALSE ) ; if ( context_widget != NULL ) /* otherwise its not a widget */ { XmAnyCallbackStruct cb ; cb.reason = XmCR_HELP ; cb.event = callback_struct->event ; /* * If there's no help at this widget we'll track back up the hierarchy trying to find some. */ do { if ( ( XtHasCallbacks( context_widget, XmNhelpCallback ) == XtCallbackHasSome ) ) { XtCallCallbacks( context_widget, XmNhelpCallback, & cb ) ; return ; } else context_widget = XtParent( context_widget ) ; } while ( context_widget != NULL ) ; } popup_message( "No context-sensitive help found0or the selected object." ) ; } Dave Bonnett suggested, to use the following translations for XmText (and XmTextField) widgets to get the same help with key strokes, and to provide an accelerator label in the Context help menu entry. MyApp*XmText*translations: #override\n\ <Key>F1: Help() MyApp*Help_menu*Contextual Help.acceleratorText: F1 MyApp*defaultVirtualBindings: osfBackSpace : <Key>Delete\n\ osfRight : <Key>Right\n\ osfLeft : <Key>Left\n\ osfUp : <Key>Up\n\ osfHelp : <Key>F1\n\ osfDown : <Key>Down ----------------------------------------------------------------------------- Subject: 306) How do I debug a modal interaction? When an application crashes in a modal section (such as in a modal dialog, a menu or when a drag and drop is in action), I cannot access the debugger. [Last modified: January 1993] Answer: Run the debugger on one display while the application writes to another display. ----------------------------------------------------------------------------- Subject: 307) Why can't I install my own colormap using XInstallColormap? [Last modified: Nov 96] Answer: You shouldn't install the colormap yourself using XInstallColormap. See the ICCCM document for all the reasons. Instead put the colormap as an argument on the Shell widget and the window manager will take care of this. When the colormap is installed, unless you have a display with multiple colormaps, the other windows will go "technicolor" and there is no way around this problem. Thanks to Doug Rand (email@example.com) Kenton Lee (http://www.rahul.net/kenton/) adds: Use XtSetWMColormapWindows() to specify non-default colormaps. ----------------------------------------------------------------------------- Subject: 308) How do I install a private colormap? [Last modified: Jan 96] Answer: Mark Buser (firstname.lastname@example.com) writes: If you find that your XAllocNamedColor is failing or XpmCreatePixmapFromData is dieing from XpmColorFaileds, you may have exhausted the number of colormap entries. One way to install a new colormap is the following: Toplevel = XtVaAppInitialize ( &app, ... dpy = XtDisplay (Toplevel); cmap = DefaultColormapOfScreen ( XtScreen( Toplevel) ); /* Detect color errors due to colormap depletion */ if (colors_depleted) { cmap = XCopyColormapAndFree ( dpy, cmap ); /* Run through color allocation again to see if ok now */ } /* Install colormap into toplevel widget. This must be done ** before any child widgets are created. */ XtVaSetValues ( Toplevel, XmNcolormap, cmap, NULL); /* Create any children of toplevel, they will inherit new colormap */ This is only one way to go, there are other possibilities, but this seems to be the simplest. ----------------------------------------------------------------------------- Subject: 309) How do I get correct shadow colors to match other color changes? [Last modified: Sept 95] Answer: Thanks to Craig MacFarlane (email@example.com) for the following explanation and code: You have to make a call to calculate the new shadow colors. The trick is actually getting a value of type Pixel when all you have is the string "Blue". I use the XtConvertAndStore() function to convert from a char * to a Pixel. For example: char *color = "blue"; XrmValue color_value, pixel_value; Pixel background; color_value.size = strlen(color); color_value.addr = (XtPointer) color; pixel_value.size = sizeof(Pixel); pixel_value.addr = (XtPointer) 0; result = XtConvertAndStore(widget, XtRString, &color_value, XtRPixel, &pixel_value); background = (*(Pixel *)pixel_value.addr); You can then use the pixel value obtained by XtConvertAndStore() in the XmGetColors call. XmGetColors calculates appropriate foreground, topshadow, bottomshadow, and select colors for the given background. e.g. XmGetColors(screen, DefaultColormap(display_id, DefaultScreen(display_id)), background, &foreground, &topshadow, &bottomshadow, &select); Then it's trivial to set the shadow colors at the same time you set the foreground and background colors. For example: XtVaSetValues(widget, XmNforeground, foreground, XmNbackground, background, XmNarmColor, select, XmNtopShadowColor, topshadow, XmNbottomShadowColor, bottomshadow, NULL); You'll get asthetically pleasing colors every time. :) Wolfram Gries <firstname.lastname@example.com> adds: The function XmChangeColor() takes a Widget and a Pixel-value for the new background-color and does the calculation of the new shadow-colors on its own. But it seems to me that this function is rather slow, so if you often change the color of your widgets, the XmGetColors()/XmSetColors() approach might be better. ----------------------------------------------------------------------------- Subject: 310) What color algorithm does Motif use? I am told that Motif uses some sort of algorithm that will take a single color that is defined for the "background" and scale it so that the widget remains discriminable from the background, etc. What is the algorithm? [Last modified: Oct 94] Answer: Chris Flatters (firstname.lastname@example.com) writes: Shiz Kobara's book "Visual Design with OSF/Motif", Addison Wesley, 1991, ISBN 0-201-56320-7) is a good source for information of this sort. I haven't seen it in bookshops for a while so it may have gone out of print (which would be a pity). In essence each widget has 4 colours which, to first order, are background select (background * 85%) top shadow (background * 150%) bottom shadow (background * 50%) An additional correction may be applied to the hues of the calculated colours if any of the RGB values saturates. The algorithm works best if the brightest of the RGB components lies in the range 155-175 (on a scale of 0-255). The top shadow becomes darker than the background for light background colours which does not lead to a particularly pleasing effect. ----------------------------------------------------------------------------- Subject: 311) How can you access the superclass widget from which Motif convenience dialogs are subclassed? [Last modified: Oct 94] Answer: Kim Frei (uunet!ask.uniras.dk!kimf) wrote: If you are using Motif 1.2, read about XmTemplateDialog. ----------------------------------------------------------------------------- Subject: 312) Can the Motif 2.0 Notebook widget display non-rectangular "file tabs"? Is it possible to use the Shape extension to fiddle with the shape of the major tabs (XmPushButtons right now) to get non-rectangular buttons, going for that "file tab" look? [Last modified: May 95] Answer: Vania Joloboff <uunet!gr.osf.org!vania> wrote: On the Motif 2.0* CD-ROM, in the demos directory, there is a library of additional widgets lib/Exm. Among the widgets, there is a ExmTabButton especially designed to fit within a Notebook. It has a smooth shape like real tabs in folders. It also a good example on how to use the new traits and the Xme API for widget writers. (Thanks to Ken Lee, http://www.rahul.net/kenton/, for a correction here.) ----------------------------------------------------------------------------- Subject: 313) How does the clipboard mechanism work? [Last modified: Dec 94] A. Doug Rand <firstname.lastname@example.com> writes: Basically there are two selections CLIPBOARD_MANAGER and CLIPBOARD which are used. The Motif clipboard is not a clipboard manager, but xclipboard, or a more functional clipboard client would be. The newest ICCCM (2.0) spells this out. The basic process is that the clipboard manager: 1) Check to see if CLIPBOARD_MANAGER is owned by anyone, abort if it is. 2) Assert ownership of CLIPBOARD_MANAGER and CLIPBOARD 3) When the CLIPBOARD selection is lost, query new owner for data and then retake ownership of CLIPBOARD #3 is done until the application exists. What you do with the data is up to the application. ----------------------------------------------------------------------------- Subject: 314) Why does the xyz application core dump when I cut and paste? Answer: Application crashes when text is cut and pasted into an XmText widget may occur with statically linked executables linked with X11R5 libraries under SunOS. For example, a Netscape README file says: The SunOS 4.1 [Netscape 0.94] distribution also includes a directory called "nls". This directory is a standard part of the MIT X11R5 distribution, but is not included with OpenWindows 3.0 or earlier. We have linked Netscape against the MIT R5 libraries because they are less buggy in general; however, they have one rather serious bug, which is that if this "nls" directory does not exist, the program will dump core any time you try to paste into a text field! So, if you don't have the "nls" directory on your system, you will need to install it first. The usual place is /usr/lib/X11/nls, but you can put it anywhere: just point the $XNLSPATH environment variable at it. Some sites don't have their X libraries installed in /usr/lib/X11/. This doesn't matter. You either need to put the nls directory in /usr/lib/X11/, or every user will need to set this environment variable. So, for example, we do: setenv XNLSPATH /usr/local/x11r5/lib/X11/nls since our X11R5 is not installed in the default location. ----------------------------------------------------------------------------- Subject: 315) Why is XtWindow(widget) == 0? [Last modified: Oct 95] Answer: The window is not created (and is NULL) until the widget is realized. In general, using XtWindow() is a bad idea. In most cases, you can create more robust code by subclassing the widget and putting your window code in new wiget class methods. Ken Lee ----------------------------------------------------------------------------- Subject: 316) How do I debug X protocol errors (e.g., BadWindow, BadMatch) in Motif applications? [Last modified: Jun 98] Answer: For a general tutorial on X protocol errors, see: http://www.rahul.net/kenton/perrors.html Here are two common problems. First, if you get a BadWindow error showing a 0x0 window ID, you're probably calling XtWindow() on a widget that is not realized. See the previous subject. Second, a BadMatch error often indicates that the depth of a window or a pixmap is not correct. You could be using a depth 1 pixmap when you should be using a pixmap with the depth of the associated window. Or, you could be creating a new shell with a depth that does not match its visual type or colormap. Ken Lee ----------------------------------------------------------------------------- Subject: 317) Why doesn't XtNameToWidget (widget, "MyName") work? [Last modified: Apr 95] Answer: The second argument must be a qualified specification (like a resource specification). In most cases, you'll use something like "*MyName". The leading '*' is required. Ken Lee ----------------------------------------------------------------------------- Subject: 318) Why does my callback's client data structure contain incorrect values when the callback is called? I created a structure and used a pointer to it as callback client data. [Last modified: Apr 95] Answer: If your structure is declared as automatic, the callback will probably not be executed within the structure's scope, so the pointer to the structure will become invalid. You can avoid this problem by declaring your structure external or by allocating with malloc or (in C++) new. Ken Lee ----------------------------------------------------------------------------- Subject: 319) How can an application manage events on multiple displays? [Last modified: May 95] Answer: Just put multiple display pointers into one application context. (You normally specify which application context as an argument to XtOpenDisplay()). XtAppNextEvent() and XtAppMainLoop() automatically poll all displays in the application context. Ken Lee ----------------------------------------------------------------------------- Subject: 320) Can a Motif application create windows on mutiple screens (on a multi-screen workstation)? [Last modified: Sep 97] Answer: Multiple screens is simpler than multiple displays, since one X server controls all of the screens. Simply specify the XmNscreen resource when you create your top level (or other) shell widget and the X Toolkit will create the shell on that screen. You should generally also explicitly set your XmNcolormap, XmNdepth, and XmNvisual resources for the new shell, since the defaults may not be valid on the second screen. Ken Lee ----------------------------------------------------------------------------- Subject: 321) Why do I get "Error: attempt to add non-widget child "dsm" to parent"? [Last modified: May 95] Answer: Most likely, you are linking your libraries in the wrong order. You must link -lXm *before* -lXt. Ken Lee Ken Sall (firstname.lastname@example.com) adds: This same error occurs if you combine Motif and Athena widgets in the same application. If you link with "-lXaw" before "- lXm", you get the runtime error. However, if you switch the order of the two libraries, there is no problem. For example: cc mothena.c -o mothena -lXm -lXaw -lXt -lXmu -lX11 ----------------------------------------------------------------------------- Subject: 322) Why do I get link errors about "XShape" symbols? [Last modified: May 95] Answer: You must link with the X extensions library, -lXext, after any widget libraries. For example, cc -o myapp myapp.o -lXm -lXt -lXext -lX11 Ken Lee ----------------------------------------------------------------------------- Subject: 323) Why do I get link errors about "ICE" and "SM" symbols? [Last modified: Sep 97] Answer: You must link with the the X ICE and/or SM libraries. For example, cc -o myapp myapp.o -lXm -lXt -lXext -lICE -lSM -lX11 Ken Lee ----------------------------------------------------------------------------- Subject: 324) Why does my X11R6 program crash with undefined symbol "LowerCase"? [Last modified: May 95] Answer: If you are using Motif version 1.1.[123], then the problem may be a failure to set MotifBC to YES in your site.def. Thanks to Geoffrey Leach, email@example.com ----------------------------------------------------------------------------- Subject: 325) How do I programatically control xwd to dump a specific window? I need a non-interactive way to tell xwd what X window to make an image of... NOT by the traditional point-and-click method. [Last modified: July 95] Answer: Ken Sall (email@example.com) wrote: 1. Get the window id of the toplevel shell widget using the "XtWindow" function. 2. Invoke "xwd" from the program that has access to the window id, such as: Window dumpId; /* returned from XtWindow */ sprintf (cmd_string, "xwd -frame -out tmp.xwd -id 0x%x", dumpId); system (cmd_string); ----------------------------------------------------------------------------- Subject: 326) How can I display an xwd in a window (without using xwud)? [Last modified: Sept 95] Answer: 1. read the xwd file into an XImage 2. create a pixmap and XPutImage the image into the pixmap 3. use the pixmap as the XmNlabelPixmap of a label widget Ken Lee ----------------------------------------------------------------------------- Subject: 327) Can I write a multi-threaded Motif application? [Last modified: May 97] Answer: Motif 2.1 can be compiled to be thread-safe (if libX11 and libXt are also compiled to be thread-safe). Motif releases prior to Motif 2.1 were not thread-safe. In these releases, you can use Motif from one thread and do other things in other threads but you cannot call Motif functions from more than one thread. Try looking in the X FAQ for information on threads: http://www.cis.ohio-state.edu/hypertext/faq/usenet/x-faq/top.html ftp://ftp.x.org/contrib/faqs/FAQ Ken Lee ----------------------------------------------------------------------------- Subject: 328) How can I dump my widget instance tree in a way that reflects the hierarchy? [Last modified: July 97] Answer: Jeremy Jameson (email@example.com) posted this code to c.w.x.m in 5/95. [Note: this code does not consider popup children, which are not listed in the XmNchildren array. To find those, you have to peek at the popup_list in core widget record. - K.Lee 7/97] /******************************************************************************* * dumpWidgetTree( Widget w ) * * This function will recursively descend throught the Widget tree * and print the children and their pointer addresses. * * Jeremy Jameson 5/17/95 * *******************************************************************************/ static void dumpWidgetTree( Widget w ) { WidgetList list = NULL; Cardinal num_children = 0; int i; static int n = 0; Widget child; static char* indent = "-----------------------------------------------------------------------------"; char tmp[256]; *tmp = ' '; if ( n >= strlen( indent ) +1 ) { printf( "ERROR:Widget tree is too deep, not enough indent string ( < %d )!\n", n ); n = 0; return; } strncpy( tmp, indent, n ); tmp[n] = ' '; printf( "%s> Dumping widget tree of %s - %#x \n", tmp, XtName( w ), w ); if ( ! XtIsComposite( w ) ) { printf( "%s> %s is not a subclass of Composite and therefore has no children\n", tmp, XtName( w ) ); return; } XtVaGetValues( w, XmNchildren, &list, XmNnumChildren, &num_children, NULL ); printf( "%s> %s has %d %s\n", tmp, XtName( w ), num_children, num_children == 1 ? "child" : "children" ); for ( i = 1; i <= num_children; i++ ) { child = list[i-1]; printf( "%s> child %2d %20s \t (%#x)\n", tmp, i, XtName( child ), child ); } printf( "\n" ); for ( i = 1; i <= num_children; i++ ) { child = list[i-1]; n += 3; dumpWidgetTree( child ); n -= 3; } printf( "\n" ); } ----------------------------------------------------------------------------- Subject: 329) How do I get the events for gadgets? Or the name of the gadget? [Last modified: July 96] Answer: Get events from the gadget's parent. Ken Lee A related question is "How the name of a gadget an event is directed to?" Daniel Dardailler (email@example.com) writes: Motif 2.0 provides a XmObjectAtPoint public function that support this functionality. For earlier version, something like the undocumented _XmInputInGadget( wid, x, y ) should do it. _XmInputInGadget Given a composite widget and an (x, y) coordinate, see if the (x, y) lies within one of the gadgets contained within the composite. Return the gadget if found, otherwise return NULL. ----------------------------------------------------------------------------- Subject: 330) Can I set the foreground and background colors of gadgets (e.g., convenience dialog buttons)? [Last modified: Nov 96] Answer: Not in Motif 1.x. Gadgets don't have their own colors, they use those of their parents. Notice that Motif's convenience dialogs generally use label gadgets, not widgets, so you cannot customize the colors of individual buttons. Beginning in Motif 2.0, gadgets do have their own color resources. Ken Lee ----------------------------------------------------------------------------- Subject: 331) Can I use a gadget as the parent of a dialog shell? [Last modified: Dec 97] Answer: No. The Core widget class contains the functionality for popup children. Since the Gadget class is not a subclass of Core, gadgets cannot have popup children (like dialogs). ----------------------------------------------------------------------------- Subject: 332) Which other widget features do gadgets lack? [Last modified: Dec 97] Answer: Here's a list from Asente & Swick (p. 397). Note that many of these restrictions are primarily of interest to widget (and gadget) writers, not to application writers. 1. gadgets have no background or border colors or pixmaps 2. gadgets cannot have event handlers 3. gadgets have no translations, accelerators, or actions 4. gadgets cannot have pop-up children 5. gadgets cannot do grabs 6. gadgets cannot redirect the Intrincis keyboard focus or take the X focus 7. gadgets cannot own or request selections 8. gadgets do not need to be and cannot be realized 9. gadgets cannot have their window, display, or screen queried (but there are separate functions for computing these) 10. gadgets have no stacking order ----------------------------------------------------------------------------- Subject: 333) Where can I get the xmon or xscope programs to trace my X protocol? [Last modified: Mar 96] Answer: Both are included in the contrib section of X11R5: ftp://ftp.x.org/pub/R5/ Xmon is also available at: ftp://ftp.x.org/contrib/devel_tools/ and ftp://ftp.crl.research.digital.com/pub/X11/contrib/devel_tools/ Ken Lee ----------------------------------------------------------------------------- Subject: 334) What does the error "Couldn't find per display information" mean? [Last modified: Mar 96] Answer: Xt often needs information about the current X display. It generates this error when it couldn't find the display pointer. Common causes applications accidentally destroying widgets twice or trying to generate fake, incomplete events with XSendEvent(). Ken Lee ----------------------------------------------------------------------------- Subject: 335) Can I set widget fallback resources after I've called XtAppInitialize()? [Last modified: Mar 96] Answer: No. Fallbacks are only checked when displays are initialized. Ken Lee ----------------------------------------------------------------------------- Subject: 336) Can I use the newline character in widget names? [Last modified: Mar 96] Answer: No. Widget names are designed to be used in resource specifications. The Xlib resource file syntax says the only alphanumeric characters (plus '-' and '_') may be used in a resource component name. If you want more than one line of text in a label widget, set the XmNlabelString resource. Ken Lee ----------------------------------------------------------------------------- Subject: 337) Is anybody out there selling Windows95 look-alike widgets? Why isn't there a Widget builder for Motif/X yet? Something like OCX (I believe on Windows95). [Last modified: Mar 96] Answer: David B. Lewis (firstname.lastname@example.com) writes: None that I know of. There are similar widgets available in Motif 2.0. There are similar widgets available in the ICS EnhancementPak. [For the second part of the question...] Because it's very hard to do. I don't know what OCX is, but I can't imagine that the technology is so much better than that used in Xt that it's possible to write something to generate real code. It's trivial, of course, to generate the framework for a widget given only its name, superclass, and resources; but everything else is real code. ----------------------------------------------------------------------------- Subject: 338) How can I convert my OLIT programs to the Motif look & feel? [Last modified: July 96] Answer: Mark Fresolone (email@example.com) writes: There are a number of translator products on the market which translate OLIT source code or DevGuide builder files into Motif source code and builder files. In 1995, MJM Software (Melillo Consulting Inc.) released the MoOLIT 5.1 toolkit, which allows one to simply re-compile Sun or UnixWare OLIT programs, and have them be switchable between the OPENLOOK and Motif look and feels. MoOLIT 5.1 is available on most popular UNIX platforms. More information is available at: http://www.mjm.com/Products/MoOLIT ----------------------------------------------------------------------------- Subject: 339) What does this mean: Warning: Cannot find callback list in XtAddCallback? [Last modified: July 96] Answer: It means that you gave an invalid callback name to XtAddCallback, e.g., using XmNactivateCallback when the widget does not have a callback with that name. Ken Lee ----------------------------------------------------------------------------- Subject: 340) If a single widget has multiple callback functions, are they all executed? If so, in what order? [Last modified: Nov 96] Answer: Yes, they are all executed. The order, however, is not defined by the X Toolkit specifications. If you really want a certain order, you should register a single callback function and have it call your other functions in the order you want. Ken Lee ----------------------------------------------------------------------------- Subject: 341) Why are some widgets still visible after I call XtDestroyWidget() on them? [Last modified: Nov 96] Answer: To avoid memory corruption problems, the X Toolkit uses a 2 phase destroy process. When you call XtDestroyWidget(), the widgets are not really destroyed until after you return to the Xt main loop. Until then, the widget will behave (mostly) as if they were not destroyed. If this is a problem, you should unmanage them as well (you can safely unmanage them after you destroy them and before you return to the main loop). Ken Lee Note: The details of the two-phase destruction are described on the XtCreateWidget(3Xt)/XtDestroyWidget(3Xt) man page. - firstname.lastname@example.com ----------------------------------------------------------------------------- Subject: 342) If I call XtGetValues on a resource that does not exist for a given widget, what value is returned? [Last modified: Nov 96] Answer: No value is returned. Your return variable is not modified. If it was uninitialized (i.e., garbage) before the call to XtGetValues, it will remain uninitialized. Ken Lee ----------------------------------------------------------------------------- Subject: 343) Can I reparent a widget (change its parent)? [Last modified: Aug 97] Answer: Xt does not support reparenting of widgets within the widget hierarchy. This would complicate the hierarchical resource model. You can destroy the old hierarchy and create a new one. On most systems, this is pretty fast for reasonably sized widget hierarchies. Note, however, that X11R6.3 provides an "application group" extension that allows one X client to act as the root of another X client's window hierarchy. See the X11R6.3 documentation for more details. Ken Lee ----------------------------------------------------------------------------- Subject: 344) Are there any "year 2000" issues within Motif? [Last modified: Jun 98] Answer: According to http://www.camb.opengroup.org/tech/desktop/faq/y2k.htm Dear Customer: The Open Group has completed a review of Motif (OSF/Motif) and the X Window System with regard to Year 2000 issues, and has determined that Motif (versions 1.0 through 2.1) and X Window System (X11 Releases 5 through 6.4) source code, as provided directly by The Open Group (or, previously provided by Open Software Foundation, Inc.; or X Consortium in the case of X Window System) does not contain any date-dependent source code. The arrival of the year 2000 should have no effect on the operation of Motif or X Window System source code. Please note, however, that Motif & X Window System object code or applications, or derivative works thereof, which would have been provided to you by a third party, are not covered by the above statement. You are hereby referred to your supplier for statements regarding Year 2000 issues for such third-party products. Very truly yours, The Open Group ----------------------------------------------------------------------------- Subject: 345) Can I suppress or customize Motif warning and error messages? [Last modified: Aug 97] Answer: A better idea is usually to fix problems indicated by the messages. If you must, Motif justs uses Xt's message system which can be customized with XtAppSetWarningHandler and XtAppSetErrorHandler. ----------------------------------------------------------------------------- Subject: 346) TOPIC: Motif FAQ HISTORY and ACKNOWLEDGEMENTS [Last modified: April 97] Answer: History: ------- November 89 to July 93: FAQ was maintained by Jan Newmarch (email@example.com) July 93 to August 94: FAQ was maintained by Brian Dealy (email@example.com) Sept. 94 to April 97: FAQ was maintained by Ken Sall (firstname.lastname@example.com) beginning April 97: FAQ was maintained by Kenton Lee (http://www.rahul.net/kenton/) Acknowledgments: ---------------- This list was compiled using questions and answers posed to comp.windows.x.motif and motif-talk. Some information was excerpted from the comp.windows.x FAQ. To all who contributed one way or the other, thanks! We try to give individual references, but you may recognize something (firstname.lastname@example.com) July 93 to August 94: FAQ was maintained by Brian Dealy (firstname.lastname@example.com) Sept. 94 to April 97: FAQ was maintained by Ken Sall (email@example.com) beginning April 97: FAQ was maintained by Kenton Lee (http://www.rahul.net/kenton/) Acknowledgments: ---------------- This list was compiled using questions and answers posed to comp.windows.x.motif and motif-talk. Some information was excerpted from the comp.windows.x FAQ. To all who contributed one way or the other, thanks! We try to give individual references, but you may recognize something uncredited as your contribution. If we've mangled the words (or, heaven forbid, the code) too much, let the current maintainer know. NOTE: If you are a two-or-more-time contributor to this FAQ and you have a WWW personal home page which you'd like to have listed, see the subject: "Which X and Motif developers have their own home page URLs?" Jan Newmarch, Information Science and Engineering, University of Canberra, PO Box 1, Belconnen, Act 2616 Australia. Tel: (Aust) 6-2522422. Fax: (Aust) 6-2522999 ACSnet: firstname.lastname@example.com ARPA: email@example.com UUCP: {uunet,ukc}!munnari!ise.canberra.edu.au!jan JANET: jan%au.edu.canberra.ise@EAN-RELAY Jan Newmarch maintained this FAQ for a long time and has really helped a great many of us by providing this valuable service. He deserves a big round of applause for his efforts. I use this resource all the time and it has saved me countless hours with manuals and source code trying to relearn what others have already discovered. Jan`s efforts are gratefully acknowledged here. Brian Dealy, SAIC firstname.lastname@example.com Likewise, Brian Dealy of SAIC did an admirable job taking over the Motif FAQ from Jan. A considerable amount of information was added during his tenure and we greatly appreciate Brian's work on the FAQ, as well as his efforts in maintaining the comp.windows.x.motif newsgroup reflector, for the good of all Motif-dom. Ken Sall firstname.lastname@example.com Tel: (301) 953-3330 FAX: (301) 953-2368 Century Computing, Inc. http://www.cen.com/ My thanks to Ken Sall for maintaining the FAQ for 1994-1997. During Ken's tenure the FAQ more than doubled in size. Ken was one of the first FAQ maintainers to change all ftp references to URLs and to incorporate http URLs thoroughout the FAQ. Kenton Lee X/Motif Consultant email@example.com http://www.rahul.net/kenton/ The end.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |