Well, as you may have noticed, I've done a little bit of sprucing up around here. In the interest of good net_person_ship I dropped the big .gif's in favor of more modest sized icons. It really wads my shorts to do a bit of surfin' and try loading up some graphics-bloated techno-wannabee webpage only to discover after 5 minutes of loading up 170KB of graphics that there's ABSOLUTELY NOTHING of substance there... just some self-congratulatory pointer to the next bloated nothin'-burger vapor-page!
And so, in the interests of more substance I did a bit of drawing using Dave Koblas' excellent graphics program XPaint 2.1.1 and sketched out a more ecologically sound .gif image. Man, I felt kinda good about it... made me want to go out and do something green like hug a whale or chain myself to a tree somewhere :-)
(and no offense to the Mother-Earth-News-y kind of folks who do that stuff...)
Anyway, if you grew fond of the previous logo... sorry man, it's GHANDI! Also, I wanted to write up a Quick-FAQ to answer a couple questions:
BUT!! don't fret! I've included a section on how to use your trustly ol' browser to do this for you...
I just started school once again and so, depending upon the semester and the coursework, I'm trying to get them out about once a month.
You bet! If anyone has any ideas, suggestions, or tips I'd be happy to include them. A number of you have already written with suggestions and I've tried to include them where appropriate.
So, what would be helpful? Anything!
If you've run across something you think is pretty cool -- a great web site, an awesome piece of software, a groovy (hmmm... I thought groovy died out in 1969...) UNIX trick (and you couldn't convince Dave Letterman to let you air it on latenight TV...) -- drop me a note!
Which leads me to a final point...
Make LINUX just a bit more fun...
I've been running Linux now for about a year or so and it's been a HUGE amount of fun. But it took a bit of reading and digging to start understanding what it was all about. Pretty soon, I made this profound discovery:
KNOWLEDGE = FUN
Pretty simple, eh?
And so, that's what this is all about. Trying to share ideas and discoveries so that you can start making LINUX do all those great things that you've wanted it to do. Which is why I really appreciate all the notes and ideas.
Well, as promised in the last issue, this one's got a lot of ideas for fixin' up and tinkering with X Window and, specificially, FVWM which is one cool hombre of a window manager and the one that is generally installed with Slackware, for all of us Slackware fans.
I've also thrown in a new section called Quick Tips which are, just as the name implies...
Finally, since there were a few of you that DID ask about getting a copy of the Linux Gazette, either in HTML or ASCII format, I've included a section on how to do this for yourself...
sort of along the lines of "give a man a fish -- feed him for a day, teach a man to fish..."
Anyway, it's pretty easy to do and very helpful if you come across something you want to have a hardcopy of.
And so... Enjoy!
Well, once again, I really want to thank the number of people who've dropped me a note. I've tried hard to answer as many of these as I could personally. I wanted to share a couple of these.
Justin Gaither wrote:
Just found you. Looks great. I plan to be an avid reader.
Do you plan to continue free access? or will it go the way of Linux Journal?
Where is the Sept issue?
This very practical piece of advice came from Stephen Brown:
Great stuff. I was running Linux for several months (and will be again shortly), and I always wondered about that stupid motd thing. I was considering calling an exorcist, but deleted Linux instead (that was not the reason...honest (g).
Anyway, here's a suggestion. Put your most recent issue at the top of the main page. For
example, list your issues like this:
This makes it more intuitive I think. Just an idea. Keep up the good work though. I'll definitely be coming back.
For all you gaming advocates out there, Mark <firstname.lastname@example.org> wrote:
I read your 'Linux toys' section and noted a lack of games. One suggestion I have is for a game called abuse. It's a platform-type game (unlike DOOM), but the graphics, sound, and speed are quite impressive. Available in both X and SVGALIB formats, it can be found at sunsite or its mirrors at: /pub/Linux/games/video/linux-abuse.0.3.2.tar.gz (BTW, it's a 2MB file - and portions of the game are written in Lisp)
Enjoy and keep up the good work!
I'd like to reiterate that I truly appreciate folks taking the time to write a note, especially those with ideas and suggestions. I've found that there's a LOT of really great ideas written up in the various comp.os.linux newsgroups and that new software for the Linux, and other flavors of PC UN*X, system comes out almost daily.
I've tried to make the Gazette one more means of disseminating this information to the Linux Community. Feelin' kinda patriotic about it...? Go ahead! drop a note and add your ideas and suggestions... then go celebrate and burn a couple Windows disks! You'll feel much better about yourself ;-)
[Caveat! This is NOT meant to insult anyone's intelligence! Honest. I've simply included it this month since I can't offer a downloadable version of the Linux Gazette and there have been a few folks who wanted to know how they could get a copy of it to set up on their machines at home. Since there's generally little harm in stating the obvious, I'll proceed...]
Well, as promised, here's a short section on how to save a hardcopy of all those cool and nifty web sites you've recently been visiting. You know... like the 'ol Linux Gazette :-)
This is too easy and once you know how, you can fill up your HD with all kinds of great stuff that you've scavenged from the 'Net. You see, the two most popular browsers around -- Mosaic, and all of its children, and Netscape both easily save HTML documents to disk in one of three formats:
This makes saving stuff very easy to do. You simply load up the document that you're interested in... say... the current edition of the Linux Gazette, and then you click on the FILE menu, which then offers to let you do a save as.... That's the baby you'll want.
Now, you'll be given the choice of formats in which to save the document. If you want to browse it later on using a Web browser, save it as source. If you've got LOTS of harddrive real estate and a PostScript printer (what are YOU doing with a PostScript printer!) or have ghostscript up and running and your printer has enough memory to print at a decent resolution (remember, to print at 300 dpi you'll need at least 1.5MB of printer memory if you're planning to use use ghostscript) then save the document as postscript. And finally, if you want a plain 'ol text version that you can look at or print up later on, simply save the file as text.
Pretty easy, eh?
Well, that's not all yet!
If you're using Netscape you have another small, but too-way-cool trick up your sleeve. You can also save the images as well! To do this, just click on an image using the RIGHT mouse button. A pop-up menu appears and down at the bottom of the menu you'll see the choice:
Save this image as...
Bingo! That's what you'll want. If you use the default name, it will be the same as the one in the HTML source.
Ah ha! you say...
Yup, you got it... you can save the document as a source file and then save the images to disk and voila!... instant full text and inline image laden document browsable in the comfort of your own home even when you're not connected.
So, want to practice? OK, go ahead and save this file and then go through and save all those itsy-bitsy .GIF images and you'll have your own copy. I'll tell you, too, that I've set up the files so that the source HTML documents are in one directory (fiskhtml) and the images and miscellaneous stuff each are in their own directories at the same level:
So, if you want to set up a repository of Gazette files, simply make three directories -- fiskhtml, gx, and misc -- and then put *.html in the fiskhtml (or whatever you want to call it) directory, *.GIF's in the gx directory, and all the rest of the stuff in the misc directory. That way, all the images will load up without your having to edit the source file.
That should help the majority of you! Now, for the few of you using Lynx I'm afraid I'm not going to be much help. I do have Lynx on my system and I've used it a bit. I can't say that I'm enamoured with it. It will save documents to disk, but so far, I've not had much success getting it to work reliably for me. I installed a precompiled binary with the config files. The documentation was a bit scant and so I haven't used it much.
So... if there are any Lynx users out there, drop me a note and let me know how things are going!
Well, as the name implies, this is a selection of quick tips which are fast and easy try out.
As usual, most of this stuff has been culled from a variety of sources: newsgroups, books, FAQ's, HOWTO's, LDP stuff, manpages (yes Virginia, there really is useful stuff in those manpages...) and README's. Wanna make LINUX fun...?
Got any ideas or suggestions? Pass 'em along...
Hey, you know that LINUX 1.2.x will give you up to 63 virtual terminals and that you can ALT-Fn to them easily. (you know... ALT-F1 to the first, ALT-F2 to the second...) But did you know that you can also do this from the keyboard?
Yup, if you've installed the kbd package (which is included with the basic Slackware distribution) not only can you map out your keyboard to whatever you choose, but you can also use the little prog chvt that'll let you switch from vt to vt.
Just type in: chvt 3 to change to the 3rd virtual terminal, chvt 4 to change to the 4th virtual terminal, and so forth. Easy. AND, if you are a single-letter-command type of person, you can just alias it to: alias j='chvt' and then type in j 3 to jump to the third vt.
You know how after you've been using several vt's for a while and want to exit out that typing in logout still leaves you with a bit of a screen mess.
Well, there was a newsgroup thread a while back that bantered about the question of how to clean up after this so that you started with a nice fresh display after logging out. Several ideas were offered but the one that seemed the easiest was simply to add the following to /etc/profile:
alias exit='clear && logout'
Pretty simple, eh? All it does is invoke two commands whenever you decide to logout of a vt... the first simply clears the screen and then proceeds to run logout. Nice and tidy. If you didn't want to make this a global alias (since /etc/profile sets the environment for ALL logins) you could as easily put it in your ~/.bash_profile or ~/.cshrc so that it is invoked only for a specific user.
Well, you're really getting tired of having your LINUX BOX referred to as WussyCakes just because your techno-dweebe buddies got on when you weren't around and changed your hostname and you can't figure out how to get it back.
Relax. This one's easy...
I'm not sure if this one will work if you haven't compiled in TCPIP networking support into your kernel... but you can give it a try. The quickest way to to this is simply to invoke the program hostname. If you invoke it without any arguments, then it'll display your current hostname. If you invoke it as
hostname SuperBadHombreLINUXBoxthen it'll happily set your hostname to "SuperBadHombreLINUXBox" which is probably not the greatest idea... but it can be done. Also, if you invoke it as hostname -f you'll get the full DNS name of your box such as "MyLinuxBox.MyUniversity.Edu". If you need a bit of quick help, just read the manpage or simply invoke it with the " -h " option to get a quick summary of command line options.
A more permanent solution is simply to edit the /etc/HOSTNAME file. The way this works (again, at least with the Slackware distribution...) is that there's a stanza in the /etc/rc.d/rc.M file that reads the hostname from /etc/HOSTNAME and passes it to the hostname program each time you boot the system. Ever wondered where the "darkstar" name came from...
# If there's no /etc/HOSTNAME, fall back on this default: if [ ! -r /etc/HOSTNAME ]; then echo "darkstar.frop.org" > /etc/HOSTNAME fi # Set the hostname. This might not work correctly if TCP/IP is not # compiled in the kernel. /bin/hostname `cat /etc/HOSTNAME | cut -f1 -d .`you'll find these stanzas in the rc.M file. Looking at it quickly you'll see that it first tests for the presence of the /etc/HOSTNAME file (the first if...fi statement). If there's no /etc/HOSTNAME file present, it decides to call your box "darkstar.frop.org" by creating the /etc/HOSTNAME file for you and then feeding this information to the hostname program.
So... all you have to do is decide on some too-way-cool name for your box, edit the /etc/HOSTNAME file and then run the final command:
/bin/hostname `cat /etc/HOSTNAME | cut -f1 -d .`to immediately set the new hostname.
Like I said, this is too easy...
While we're rooting around the /etc/rc.d/rc.M file...
There's another really handy little program that does all kinds of fun stuff... setterm. Now, like a lot of great little UNIX progs, you can really hose yourself if you recklessly start messing with this... it probably won't permanently break anything, or then again, it might... ;-), but, what's cool about it is that it'll let you set a terminal color scheme, AND, how long it waits until it blanks your screen.
You know, you walk away and come back after a coke and bag 'o Nachos and find that some kindly UNIX gnome has blanked your screen for you so you don't burn a hole in your phosphors. Well, you can set that time-out to whatever you want.
You'll find the line:
# Screen blanks after 15 minutes idle time. /bin/setterm -blank 15in the rc.M file. Simply change the " -15 " to whatever value in minutes that you want. Editing the file makes the change permanent and takes effect the next time you boot the system. To change it right away, simply type in setterm -blank n where " n " is whatever time in minutes you want to wait for screen blanking.
Here's a great little program that I just ran across a couple days ago. I recently had to reinstall Linux (as well as DOS, OS/2 Warp, Win 3.1...) after deciding to upgrade to a 850MB second HD. I won't go into all the horrific details, but it was a bit of a mess for a few days...
Anyway, during the installation, as I watched the Slackware installation dialog boxes merrily flip by... one of the utility programs caught my eye. So, I jotted down the name of the program, and after installation was done, tried running the thing... splitvt.
This is a too-way-cool little program that'll let you run two shells in a split screen fashion. " So what's so cool about that..." you ask, since you've already told us that we've got 63 virtual terminals to choose from? Well, you're right, except that it lets you run two programs and watch the output from the same screen.
For example, if you read the manpage for it, it gives you a suggested ~/.splitvtrc run-command file that would fire up a split screen with two login shells, and run the program top in the bottom half. That way, you'll have a dynamic display of your current CPU and memory usage while you merrily work away at some task in the top screen. If you've ever used the split screen function in the VIM editor, you'll know what I mean.
I tried using it with a couple PPP login scripts I've been working on. I have one script that does auto-redial to the local university's PPP comm server (see last month's Linux Gazette for the file) and another one, which I recently wrote, that hangs around waiting for the /var/run/ppp0.PID file to appear, indicating a PPP connection had been established. Once it finds it, it automatically updates the /etc/hosts file (since the school does dynamic IP addressing), POP's my mail from the mail server and plunks it in the /var/spool/mail/root file, and then starts periodically pinging the gateway host to keep the connection up. Running it in the split screen let's me see what's going on with both progs as they run.
The beauty of this program is that it's really simple to use and set up. The man page is clearly written and gives an example rc file. You can also configure it to start up running two programs automatically, but specifying
run -upper first_program run -lower second_programin the ~/.splitvtrc file. I'm sure that there are some fun things that can be done with this. We'll see...
Welcome to the wonderful world of FVWM and of X! There's so much cool stuff that you can do with X Window and the various window managers such as fvwm, twm, mwm, olvwm, gwm, and so on that it boggles the mind. And when was the last time your mind was boggled...?
As most of you know, the fvwm program stands for F.... Virtual Window Manager. The meaning of the " F... " has apparently been lost somewhere in antiquity with no original manuscripts extant to shed light on its true meaning. Still, if you read the docs, there have been suggestions that it might stand for " Feeble, Fun, Fantastic ... ". Who knows.
What is known is that it is one awesome window manager written specifically for the LINUX OS and based upon the code of one of the original window managers -- twm (which, BTW, stands for Tabbed Window Manager). It is reported to have a much more modest memory appetite than the original twm and is a LOT more customizable.
Just how customizable is something that I'll probably be spending a couple issues of the Gazette writing about.
It is just too way COOL!
Anyway, I'm going to make a couple modest assumptions:
Now, let's see what we can do with it.
First, the file you'll want to edit to do all kinds of fun stuff is either:
/usr/X11R6/lib/X11/fvwm/system.fvwmrc OR, ~/.fvwmrcMost fvwm distributions come with all kinds of goodies, including a very nicely commented and organized system.fvwmrc file. It is a good default to start with and is well commented enough that you can make a lot of adjustments right from that file.
ONE CAVEAT!! Don't forget to have or make a backup of the original file, as well as any that are modified that actually work! That way, if something breaks, you'll have a backup. If you don't make a backup somewhere, you'll be digging through piles of disks or scouring your CD looking for a copy of the initialization file.
Be prudent. Practice safe X.
There's one other suggestion that holds for messing around with ANYTHING with Linux... consider a notebook and pen essential hackers equipment.
Why? Because sooner or later you'll stumble across some absolutely awesome utility, gadget, or doodad (doodad??) and you'll spend a hour reading the manpage, going over the README's, and hacking away at the command line options to get it to do just what you want it to do... and it works GREAT!
Then, a couple weeks later, you're hanging around with a couple bud's and you decide to impress them with your LINUX wizardry... Yup, they're going to be PRETTY impressed with you when you show them... uhhh...hmmm, now how did I do that...?
You get the point.
Write this stuff down.
Anyway, with that said, you're ready to hack! One of the first things you'll probably want to do is configure your desktop. This is one of the greatest examples of the process of " step-wise refinement " that I can think of. Over the course of a couple months you'll probably change your setup a couple dozen times or more as you discover things that you can do with fvwm.
And so, let's begin!
So, how do you get all kinds of cool stuff to come popping up when you fire up X?
Glad you asked.
There are a couple ways to do this, but one of the easiest is to let fvwm do it for you. Without getting too bogged down in discussing the concept of " built-in functions ", suffice it to say that fvwm is more than willing to manage getting programs up and running each time it starts.
Parenthetically, once you've gotten X and fvwm up and running there are four basic means of getting programs running:
Since this deals with the programs that are started at the time of initialization I'll stick to how to do this using the system.fvwmrc or your ~/.fvwmrc file.
So, AFTER you've made a backup of the original fvwmrc file go to the section entitled " Stuff to do at startup ". In mine, it now looks something like this:
############################################################################# # # START-UP CONFIGURATION # # Functions: InitFunction # RestartFunction # # Stuff to do at start-up # This is an example of a complex function definition. It is a special case # in that "InitFunction" is called when fvwm is started for the first # time and is generally used to start modules, set background patterns, # and begin programs. "RestartFunction" is called whenever fvwm is # restarted and generally starts modules and sets background patterns. # It probably should NOT be used to start programs. # # This defines the fvwm complex functions "InitFunction" and "RestartFunction" Function "InitFunction" # Module "I" FvwmBanner # Exec "I" xpmroot /usr/include/X11/pixmaps/fvwm.xpm & # To begin with, get the FVWM GoodStuff button bar running Module "I" GoodStuff # Module "I" FvwmPager 0 3 # Then, the analog clock - Swallowed by GoodStuff Exec "I" exec xclock -bg SaddleBrown -fg HotPink -hd white -g 140x160-145+138 & Wait "I" xclock # Make sure the xmailbox prog is up and running - swallowed by GoodStuff Exec "I" exec xmailbox & Wait "I" xmailbox # Now, fire up xload - swallowed by GoodStuff Exec "I" exec xload -bg SaddleBrown -fg HotPink -nolabel -jumpscroll 1 -update 2 -geometry 80x80+100+100 & Wait "I" xload # Next, the digital clock Exec "I" exec xclock -d -g 232x50+793+5 -bg SaddleBrown -fg white -update 1 & Wait "I" xclock # Now, start up xcalendar Exec "I" exec xcalendar -g 345x382+793+372 & Wait "I" xcalendar # Xman program, which we'll use without a titlebar Exec "I" exec xman -g +793+274 & Wait "I" xman # Finally, fire up a full screen xterm Exec "I" exec xterm -sb -sl 500 -j -ls -fn 9x15 -g 84x48+4+4 & Wait "I" xterm EndFunction Function "RestartFunction" # Exec "I" xsetroot -solid "#266294" # Module "I" GoodStuff # Module "I" FvwmPager 0 3 EndFunction # # End of STARTUP configuration ##############################################################################All the stuff between the Function "InitFunction" and EndFunction defines what programs fvwm will start up at initialization.
The easiest way to configure this is to use one of the programs as an example! There are three basic patterns:
The function Exec is one of fvwm's built in functions that will execute a command. This is probably the one that you'll use the most often. For example, let's say that you want to add some great new program to your start up... you've discovered the program xmailbox (which really is is a great program) and you decide that you want to start this up every time you start X.
This is easy.
First, get out your pen and notebook.
Once you start up X and fvwm you'll need one of those handy-dandy xterms to get stuff going. Presuming you've installed xmailbox you can invoke it at the command line in an xterm. Just type in xmailbox & and it's up and running! It'll probably be in the form of an outline which will allow you to put it somewhere. Ok, drop it somewhere.
Now, using the left mouse button you can generally resize your application if it has those little " L " shaped handles at each of the four corners. Clicking on one of these corners allows you to resize the window; clicking and dragging on the titlebar or one of the side borders allows you to move the window around.
When you move the window, you'll notice a little blue window up in the upper left hand corner with a couple numbers, such as +5 +180. Those indicate where the upper lefthand corner of the window is located relative to the root window. Keeping in mind that the upper lefthand corner of the root window (the "desktop") is 0,0 then every window is some distance in pixels from the left and the top of the desktop.
When you get the application window where you want it, write those numbers down. You'll need them.
Since we're talking about placing windows on your desktop, this is a good place to digress for a moment and talk about...
The basic idea is pretty simple. When you set up the XF86Config file you had to indicate the size of the "virtual desktop". This meant that if your video card had enough RAM, you could make the desktop screen larger than the physical screen of your monitor. For example, I've got a Cirrus CL-G5428 card and am running X at about 800x600. Yet my virtual desktop is max'd at 1152x900. So, when I move the mouse around, the desktop shifts.
Anyway, those dimensions are in pixels... my entire desktop is 1152 pixels wide by 900 pixels high. For all you math type folks, that's
x = 1152 on the horizontal axis
y = 900 on the vertical axis
This is the basis of geometry. The "+" sign means the distance in pixels from the LEFT or TOP of the screen and a "-" sign means the distance from the RIGHT or BOTTOM of the screen.
Actually, that's a bit of a lie. If you use the "+" sign, it indicates distance in pixels of the left border of your application window to the left border of the screen or the top border of your application window to the top border of your screen.
If you use the "-" sign, it really indicates the distance in pixels of the right border of your application window to the right border of your screen , or the bottom border of your application window to the bottom window of the screen.
To convince yourself of that try a simple experiment: enter the following commands in an xterm window and see where the window ends up:
Try these out and it'll help you get the concept of placing windows. Keep in mind that the basic format is +/- Horizontal +/- Vertical placement.
For example, if you wanted to put xmailbox 20 pixels from the left border and 100 pixels from the top border, you'd indicate this by typing in:
xmailbox -geometry +20+100 &If you're using the stock fvwmrc file, you should also have another very handy little gadget called FVWMWinList. This keeps track of all your apps that are opened. One of the cool things that it includes is the geometry of the window -- this includes the location and the size.
So, once you've placed xmailbox where you want it, and used the handles at the four corners to make it larger or smaller, click the right mouse button to get the FvwmWinList to pop up. From there, you should see a listing of all your programs, including xmailbox!
Now, write down the numbers, which might be something like "0:+20+100x60x100". Let's decipher this:
The FvwmWinList module displays a series of buttons with two pieces of information: the name of the application (actually, the window title), and the window geometry. It is the window geometry that we'll be interested in. The size and the location of the window are indicated by the series of numbers following the "0:". The first two numbers indicate the location of the window. Geometry is always in the form:
+/- Xposition +/- Yposition
So, in this case, it's 20 pixels from the left border and 100 pixels from the top.
And finally, the window size is 60 pixels wide, by 100 pixels high. The size of a window is always in the form:
Width x Height
PHEW!! Almost done...
So after this minor digression, let's see where we stand. You've written down the location and the size of the window, now it's time to edit the fvwmrc file. If you want to start a program, the basic form is:
Exec "I" exec program_name [-options] -geometry WidthxHeight+xpos+ypos &So, to start up xmailtool with no options, you'd include a line like:
Exec "I" exec xmailtool -geometry 60x100+20+100 &in the above section and voila!, there it is.
To further customize this, you can add ANY options that you'd normally type in at the command line. One important point! Don't forget to put the ampersand " & " at the end of the command line.
So, now you can go back and do the same for ANY other program! Jot down the geometry of the window, any command line options, exit out of X, edit your system.fvwmrc or your ~/.fvwmrc file and restart X!
So what's the "Wait" thingy for...? Well, if you want a program to be started using the method described above, you'll probably want to put a stanza below it with the following form:
Wait "I" xmailbox
You don't need an ampersand (&) at the end of the line. What this does, is force fvwm to wait until a window with the title "xmailbox" is drawn on the screen. It essentially keeps fvwm from just plowing ahead with the rest of the initialization stuff while your poor program is trying to load up.
So what happens if you don't do this?
This is what the docs recommend... and they're the guys that wrote this thing... I don't know, maybe something aweful happens... maybe it crashes, or dumps core, or maybe Tammie Fae gets her own talk show, or maybe another Democr... (ok, ok... I'll desist...)
If you want to fire up one of the modules such as the GoodStuff button bar or the FVWMPager, you use a similar format:
Module "I" GoodStuffNotice that you don't need the ampersand at the end of the line. I'll be messing around with GoodStuff and FVWMPager a little later on, so I'll hold off mentioning much about either of them right now.
Well, that's pretty much it! It really is a LOT easier to do, than to explain. The best suggestion is to experiment. And don't forget that notebook... :-)
FVWM gives you LOTS of ways to launch programs and one of the easiest and most flexible is to add your programs to the popup menu that you can call up by clicking the Left mouse button on any free space in your root window. The default menus are pretty useful, until you begin to notice two problems:
Again, the same caveats and such hold here as in the previous section... you'll need (i) to make a backup of the fvwmrc file BEFORE you start hacking away on it, and (ii) you'll want to have pen and notebook handy to jot down commandline options and geometry stuff as well as notes to yourself.
Once you've done this, you're ready to start!
First you'll need to make sure that you've jotted down the command line stuff that you'll want for your program. Do you need it? Nope. You can usually get away with just invoking most programs without any information at all. There are usually default resources already defined and the app will work just fine.
But, if you want to customize an application's appearance such as change the font it uses, or the background/foreground color scheme, or you want to invoke it with a series of specific options, or you want it a certain size or in a certain location... if you want any of these, you'll need to tinker around with invoking the program from an xterm using various options until you get it just the way you want it.
Again, to use an example, suppose you wanted to add a bunch of graphics programs to the popup menu. You've added xpaint, xbmbrowser, and pixmap programs and you want to create a popup menu for them. You've also decided that you want xbmbrower and pixmap to start up full screen at a size of 790x590 pixels. Ok, armed with this you're ready to go.
First, however, a couple concepts.
Basically, the way to handle creating Popup menus using fvwm involves three steps:
So, let's proceed.
First, let's create the submenu for the graphics apps you want. To define a popup function for fvwm you'll use the following format:
Popup "Popup_Name" Title "Popup_Menu_Title" Exec "Menu_Item" exec program_name [-options] & Exec "Menu_Item" exec program_name [-options] & Exec "Menu_Item" exec program_name [-options] & Exec "Menu_Item" exec program_name [-options] & Nop "" Exec "Menu_Item" exec program_name [-options] & Exec "Menu_Item" exec program_name [-options] & Exec "Menu_Item" exec program_name [-options] & Exec "Menu_Item" exec program_name [-options] & EndPopupOk, so what's going on here...
The function is defined by the reserved words Popup and EndPopup. Everything in between them defines that particular popup menu.
After Popup you'll give this submenu a name (Popup_Name) that needs to be enclosed with double quotes. This is the name that the submenu will be invoked by. We'll see this is a moment.
Next, You can give the submenu a title that will appear at the top of the popup menu listing. For our graphics submenus you could call it simply "Graphics Programs".
After this, you'll enter the application information. Each stanza takes the form Exec, followed by the name that you want to appear in the menu listing (this is also enclosed in double quotes), and then finally, the exec statement that launches the program using the options that you've decided upon.
AND DON'T FORGET THE & AT THE END!
The Nop entry is a special sort of entry. It does, as the name implies, nothing. Well, that's not completely true.
If you include an entry such as:
which has no spaces at all between the double quotes, it'll put a horizontal dividing line between the entries. This is very nifty as well as admirably tidy.
However, if you put a single space between the double quotes, it'll just leave a space between the two entries... there won't be a horizontal dividing line placed.
So, for our example programs, you'd enter:
Popup "Graphics" Title "Graphics Programs" Exec "Pixmap" exec pixmap -g 790x590 & Exec "XbmBrowser" exec xbmbrowser -g 790x590 & Exec "XPaint" exec xpaint & EndPopupNotice that if you'd wanted to place, for example, the pixmap application in the upper left hand corner (+0+0), then you would have changed the entry to:
Exec "Pixmap" exec pixmap -g790x590+0+0 &
So, now you've defined the submenu. You can continue to add other items in this same fashion. How many should you add... well, the default fvwmrc puts ALL of the screensaver apps in a single submenu. When I click on it there's a HUGE list that goes scrolling down to the bottom of the screen. After about the first dozen or so programs, you might want to think about setting up another submenu for other programs. You're an adult... use your discretion...
Now, let's see how you call up those submenus.
As mentioned before, the stock fvwm distribution has a default fvwmrc that defines a pretty handy default popup menu. Mine has been morphed into something that currently looks like this:
# Main Menu Definition # # This is bound to the left mouse button and is invoked as the top-most # menu. Popup "FVWM Menu" Title "FVWM Menu" Exec "XCalc" exec xcalc -g 565+195 & Exec "XTerm" exec xterm -sb -sl 500 -j -ls -fn 9x15 & Exec "Xman" exec xman & Exec "Xconsole" exec xconsole -g 720x70+410+795 & Nop "" Popup "Applications" Applications Nop "" Popup "Desktop" Desktop Nop "" Popup "Editors" Editors Nop "" Popup "Games" Games Nop "" Popup "Graphics" Graphics Nop "" Popup "Modules" Modules Nop "" Popup "Network" Network Nop "" Popup "Shells" Shells Nop "" Popup "X_Utilities" X_Utilities Nop "" Popup "Screensaver" Screensaver Nop "" Popup "Lock Screen" Screenlock Nop "" Popup "Exit Fvwm" Quit-Verify Nop "" Refresh "Refresh Screen" EndPopup
To call up a submenu, you simply add a stanza that's in the form:
Popup "Menu_Item_Name" Popup_Nameremember that when you first defined a submenu you put the name of the submenu in double quotes after the Popup declaration? Well, here's where you'll need it.
The entry Menu_Item_Name is whatever you want to have appear on the menu listing. Often, as you can see by the example above, it'll be the same name as whatever you've called the submenu. No harm in doing that, although they CAN be different as in the "Exit Fvwm" entries demonstrates.
So that's it!
See, it wasn't so bad... You can easily use the default entries as a template for your customizations. Want to delete an entry? You can either physically delete it or, which may be the better part of valor, you can simple comment it out using a "#" sign.
A couple final points:
Yup, you sure can. Use the " Popup Menu_Item_Name Popup_Name" format in the submenu.
Just remember! You MUST define a menu BEFORE you can include it as a submenu somewhere else. You'll notice that all of the submenus were defined BEFORE the final, topmost menu was defined. That's because, if you wanted to include a popup menu called "MyFavoritePrograms" and you hadn't defined it yet, fvwm would complain severely.
Do you have any other programs that you use all the time? Maybe you're constantly looking up manpages and need the xman program handy. Or maybe you frequently use a calendar program like xcalendar.
In either case, if you need something frequently, or often need to start multiple copies of the program... keep it handy.
In other words, if you want to be able to invoke a single program with various options, simply create a line for each of the differnt ways you want to invoke the program.
One of the best examples of this is the "XTerm" menus that are included with the stock fvwm distribution. These series of entries call up an xterm with different sized fonts, ranging from quite small to truly myopic!
Customize, man, customize!
This goes almost without saying... but, if you add EVERY program you've loaded up to your menu, it'll stop being very useful. Add the programs that you'll really use.
The corollary is similar: if a program requires input before it will run, it may not be very handy to put that program on the menu.
For example, the really impressive graphics program ImageMagick allows you to display images in a huge variety of formats, which you can then manipulate and save to a different format. Thing is, you'll probably be invoking it with the name of the file you want to display. It's a lot easier to invoke this program from an xterm command line.
By this, I mean, you should put all your editors under the "Editors" menu, and the various xterms under the "XTerms" menu. You'll find that as you begin adding more and more programs that putting them into some kind of logical order will really make finding them quickly much easier.
Also, it seems obvious, but it gets overlooked... put the programs that you use most often AT THE TOP OF THE LIST. Man, it's taken me months to discover that it's a LOT easier to click on the Graphics submenu and then immediately hit the xpaint program if it's at the top of the list.
Never fail to state the obvious...
Also, use the Nop option to help visually separate dissimilar items. You'll notice that this is done in the default setup and it works quite well.
Well, that's it! Now, have fun!!
Of all the excellent things that you can do with or to fvwm, one of the most useful is getting to know the fvwm Pager. This is that handy little gadget that sits up (by default, anyway) in the upper left hand corner of the screen. If you click on one of those little windows... poof! there you are.
Well, like most of the rest of fvwm, this thing is eminently customizable! So, what can you do with/to it?
And, customizing this stuff is easy! Promise.
Ok, so once again, you'll need to be armed with pen and notebook, and you should make a backup of the fvwmrc you're about to hack away on. Once that's done you can quickly and easily do almost anything you want with it.
So, let's edit.
This is what the entry in my fvwmrc looks like:
########################################################################### # # VIRTUAL DESKTOP CONFIGURATION # # Set up the VIRTUAL DESKTOP AND PAGER # Define the virtual desktop size in units of the physical screen size. # syntax: DeskTopSize HorizontalxVertical # DeskTopSize 3x2 # Define the virtual desktop scale in terms of a reduction factor DeskTopScale 36 # Pager X_Location Y_Location # Enables the fvwm PAGER at X_Location Y_Location. Miniature versions of # all non-sticky windows on the virtual desktop are shown in the pager # with the color of the miniature version the same as the color of the # full-size window's borders # Button actions: # Button 1 move desktop viewport to selected page # Button 2 move selected window anywhere on the desktop # Button 3 move top-left corner of viewport to the location pressed # dragging Button 3 will cause the viewport to scroll. # Pager -5 5 # # End of VIRTUAL DESKTOP and PAGER configuration ##############################################################################
If you copy something like this into your ~/.fvwmrc or system.fvwmrc file you're pretty much home free! Let's see what's going on:
First, define the desktop size. I've set mine to 3x2 since I use one of the "virtual desktops" as my "homebase" if you will, and use the other five as work area. I'll be discussing the rationale behind doing this in later sections. For the moment, suffice it to say that you can set up as many virtual desktops as you like.
Simply put in the number of desktops you want in each row (Horizontal) by the number of columns you want (Vertical). For example, if you wanted a virtual desktop 7 across and 3 high you'd simply put:
Now, instead of entering the actual size of the window in pixels, as you do with MOST (but not all as we'll see) windows, you enter the reduction factor by which you want the pager reduced. I didn't pick the number 36, it was the default value, but it seems to work well. If you wanted to make the pager larger, simply decrease the reduction factor to, say, 30 and see how it looks. Experiment with it until you find a size that you like.
Now, enter the location (geometry) in which you'd like to put the pager. You'll notice here that I've put it at the coordinates -5 5. Like most of the geometry entries, this places the pager 5 pixels from the right border of the screen and 5 pixels down from the top of the screen. If you aren't sure what this means, puruse the section on Window Geometry.
So, now that you've added lots of desktops, made the pager just the right size, and put it just where you wanted it to be... you ask " what the heck can I do with this thing?"
Aweful glad you asked!
The obvious thing that you can do with this is to switch to another virtual desktop. you just use the left mouse button and click on the desktop to which you want to move. Simple.
What you may not have realized is that the other two mouse buttons have been defined to perform a couple other operations (again, presuming that you're using the stock fvwmrc file). The right button allows you to change the viewport.
So what's a viewport?
Basically, it's the location on the virtual desktop that is currently in focus, if you will. These best way to learn what this means is to try it.
Go ahead... try it!
What you'll discover is that instead of smoothly jumping from one virtual desktop to the next you'll "pass through walls" as it were. You'll be able to change the focus to any point on the virtual desktop, regardless of where the desktop "boundries" are located. Experience it.
Finally, the middle button will allow you pick up a window on the virtual desktop (that is, within the pager window) and move it anywhere on the virtual desktop. Again, to appreciate it, you have to try it. Put a couple xterms on one of your desktops and then use the middle mouse button to drag-n-drop one of those xterms to another location. It may not be the most useful of the functions... but it makes a great party trick ;-)
One of the great things about fvwm is that not only can you tinker around with some fairly complex stuff, but also, there are innumerable little changes that you can make to it. These aren't overwhelming, but they can make using fvwm a LOT more fun.
Here are a couple ideas for ways that you can customize fvwm. The first three deal with things that add or change the functionality to those ubiquitous window buttons. I won't go into all the details of creating buttons or binding new functions to them, that's for another time. But, until then, try these one's out!
I'm sure that most of you have noticed that most all of the windows under fvwm and X have a single button on the left and two on the right. Well, like everything in X, these are eminently customizable, including creating new ones, deleting them, binding new functions to them, creating new popup menus for them.
It's too way cool.
One of the more helpful things that can be done is clicking on the right-most button will cause the application window to go full screen.
Well, it's supposed to anyway. On mine, it didn't. And I didn't have a clue as to why it didn't... until I did a bit of reading in the 'ol manpages.
Adjusting the Maximize function so that it actually enlarges your apps to full screen is pretty easy to do and forever makes life easier! Here's what you'll need to do...
In the fvwmrc file, you'll find an entry for the Maximize function that allows you to set its action. In mine, it looks something like this:
# This function sets the pattern of maximization. The values after the mouse # action field are: # Horizontal_Maximization Vertical_Maximization # # These are in reference to the *entire* desktop, so that "100 100" enlarges the # application to the size of the entire *virtual desktop* - i.e., to 1152 x 900. # # Therefore, we'll set these up so that: # single click maximizes to screen size (about 800x600) # double click maximizes to full virtual desktop size (1152x900) # motion maximizes vertically *only* Function "maximize_func" Maximize "Motion" 0 85 Maximize "Click" 69 85 Maximize "DoubleClick" 100 100 EndFunction
So, what's going on here?
Well, this is in the section of the fvwmrc that defines complex fuctions. What is germane to this discussion is that this function has been bound to the right-most titlebar button so that a mouse action on that button can do, in this case, one of three things.
There are three mouse actions that you can perform:
What you can see is that in each case, the Maximize function is being invoked, but in different ways. A single click causes the window to be maximized to 69% of the horizontal width of the desktop and 85% of the vertical height.
Why in the world is it doing THAT!?
Thanks for asking...
Remember that I said that I'm running a virtual desktop of 1152 x 900. That gives me a desktop that's 1152 pixels wide by 900 pixels high. But, if you check the modeline for the resolution I'm currently using, you'll see that I can only view about 800 x 600 pixels at a time. The rest is "off-screen" if you will.
Now, are you getting the picture?
A full screen application occupies only the 800 x 600 pixels that I view at any one time, yet fvwm knows that my "virtual desktop" is actually 1152 x 900 pixels. Fvwm uses the size of my virtual desktop as the size to which windows are maximized.
So, in order for apps on my system to be full screen without extending beyond what I can see, I simply maximize them to 69% of 1152 (horizontal) and 85% of 900 (vertical). You can do a bit of math and make a fair estimate of what values you'll need for your system. Simply compare the size of the virtual desktop with the actual size of the viewable area taken from the modeline you're using.
For example, suppose that you were running a virtual desktop of 1000 x 800 pixels and the viewable area you were using came out to be around 640 x 500 pixels. To maximize a window to occupy full screen you'd need to set the horizontal value to 640 / 1000 = 64%, and the vertical value to 500 / 800 = 63%.
In practice, I tried this and found that it worked fairly well, but still needed a bit of tinkering to get it right. It's a matter of trial and error after you've made an initial estimate.
Once you get this value right, your apps will happily expand up to full screen whenever you single click on the rightmost button. Which brings up a very important point and one that I'll probably make again elsewhere:
If you are running a virtual desktop that's larger than your viewable area (such as having a virtual desktop of 1152 x 900 when you're running at a resolution of 800 x 600) AND you want to use this maximize funciton, you should put all of your peripheral apps, such as the pager, clocks, and other sundries, on the right hand side of the screen.
Why is this important?
Simple. You'll find that the maximize function is very handy. You fire up a program, position it where you want, and then decide that you want to use it full screen. When you maximize it, it is enlarged full screen, AND THE UPPER LEFT HAND CORNER IS POSITIONED AT +0+0.
Thus, the window is flush up against the top and left sides. If you put all the other windows on the right side, you'll discover that they won't get covered up when you maximize a window. Since you'll eventually, if you haven't already, find yourself making all kinds of modifications to your desktop, it's important to plan out where things should go.
It's a matter of efficiency.
Anyway, what do the other mouse actions do? Well, if you double click on the rightmost button the window will be maximized to the FULL VIRTUAL DESKTOP size. This hummer will be BIG! There are times when you'll want to do this, especially if you're working with a graphics program and are editing a large image file.
The other mouse action is a bit less intuitive, but still pretty easy. All you do is a "baby drag-n-drop". That is, you push the button down, and you ever-so-slightly move the mouse as though you were going to drag it somewhere. This triggers the "motion" event. In this case, the window is maximized only vertically (0 85) to the height of the viewable screen size. If you want to be able to maximize horizontally only, simply change the entry to, for example, 69 0, and the window will be maximized horizontally. Entering a "0" for either the horizontal or the vertical entry simply causes the window not to be resized in that direction.
Believe me, once you've got this set and working for you, life becomes good!
You've discovered already that by clicking on the leftmost titlebar button of a window, you're presented with a popup menu that lets you perform several different window actions such as "Move, Resize, Raise, Lower, (Un)Stick" and so forth. You can use this menu to terminate a program if it does not voluntarily do so.
Keep in mind that a "Delete" and a "Destroy" are similar, but not identical functions. The Delete fuction sends a signal to the application to quietly quit and close down the window. This is the more graceful way to request a program to end itself. The other method involves a more violent Destroy action, which simply kills the application.
So, what's the big deal... the end result is the same, isn't it? Not exactly. You see, many programs will perform several actions during the course of their operation. They may set up temporary files or alter certain environmental variables, or set up lock files. When a program quits, at least one that's well behaved, it generally cleans up after itself. It'll delete temporary files, delete lock files, and generally mop up after itself. Deleting causes the application to go about the process of quitting in this manner, if you will. Destroying, on the other hand, simply terminates the program, no matter what it happens to be doing.
So where is all this going...
Well, there's a nice, easy way to close an application that fvwm provides. It is one of the built-in fuctions called "Close". This first attempts to close an application by signalling it to quit gracefully. If that doesn't work, it simply terminates the application. Either way, the app is GHANDI.
In the section of the fvwmrc that defines menu bindings you should find something that looks like this:
# Menu acts like normal twm menu if you just hold the button down, # but if you click instead, the menu stays up, motif style Function "window_ops_func" PopUp "Click" Window Ops2 PopUp "Motion" Window Ops2 # Motif would add Close "DoubleClick"In the stock fvwmrc file, this last line is commented out. Simply remove the "#" to uncomment it. Then, if you want to close an application, all you have to do is double click on the left button. Saves your having to pop up the menu and try Delete, and then Destroy.
Like I said, it's worth about 2¢ :-)
There's an option in the fvwmrc file that allows you to hide window icons. Normally, when you make an icon out of a window, there's a cute little icon sitting down at the bottom of desktop. Double clicking on it returns it to its former size and location.
So why would you want to hide the icons?
Well, if you've opened up several apps and start making icons out of them, you'll quickly discover that there are icons all over. At this point, you're all thinking... "Yup, just as I thought... this guy is seriously anal..."
How'd you know :-)
It's strictly a matter of taste, but I've preferred to keep track of iconified windows by using the FvwmWinList function. Clicking on the right button anywhere on the root window will bring up the WindowList containing a listing of all the applications -- both those that are windowed and those that are iconified. Clicking on one of these entries automatically restores the window. Also, I find that it's easier and faster to restore programs from the window list than to hunt for the icon.
Again, strictly a matter of preference.
If you want to give this a try, you'll find an entry in fvwmrc that looks like:
# SuppressIcons prevents icon windows from being created or drawn. # If you uncomment this, and make sure that the WindowList is bound to # something, it works pretty much like an icon manager. SuppressIconssimply uncomment the "SuppressIcons" and you're all set.
There's another little alteration that you can make that I've found that I really like a lot. It's the way menus are presented. To really get the feel for this you'll need to do some quick and easy tinkering. You'll find an entry in the fvwmrc file under the "MWM Emulation" heading. It'll look something like this:
# MWMMenus affects minor aspects for the look-and-feel of MWM. # This option triggers a few other MWM-style options, such as centering # the resize/size window on the screen instead of leaving it in the # upper left, and switches the resize-on-initial-placement trigger # action to shift-button-1 instead of the TWM-style press-button-2 MWMMenusBy uncommenting the "MWMMenus" entry, you'll find a couple things have happened:
Again, another 2¢ tip! :-)
Well, for all of you who've read last month's Gazette about a sendmail-less email setup for standalone boxes...
I received the following message from Roman Mitnitski:
From: Roman Mitnitski <email@example.com>
Subject: New application for your toy list
I beleive you should add this mail-reader to your
Linux Toys list. It's a way-cool, nice-looking, very functional
X11 based pop3-capable mail reader.
Get it from
And he wasn't kidding!
I've been using this now for the last couple weeks and for everyone that has gotten the willies from even the thought of having to set up sendmail simply for a standalone system...
Take heart... help is here!
For anyone that has simple email needs, and by that I mean that you're running Linux on a standalone system or small LAN with access to a POP mail server, you have to give this thing a whirl! It is really awesome!
The XFMail program is based upon the Xforms widgets -- a set of freely available widgets designed to make X application development faster and less complicated. You'll need to install the XForm libs before you can set up XFMail. Still, the end result is VERY much worth it!
Since this month's Gazette is getting a bit large now, I won't go into the steps required to install and compile the XForms libs and the XFMail program. I found that on a stock Slackware 2.2.0 setup with GCC 2.6.3 and XFree86 3.1.1, that everything compiled pretty much without a hitch (you will, however, have to edit the Makefile for XFMail and indicate where the XForms libs were installed, since the default locations were different than where XForms actually installed itself).
This is admittedly still Beta software, and so the old warning that BETA == BUGS still holds. Still, I've found that this software has been pretty stable, VERY easy to configure and use, and has been kind to my mail... that is, it's managed NOT to eat any of it yet... :-)
The list of features really is quite impressive and includes:
It does have a few drawbacks, however:
Still, you need to check this thing out. And if you've been jealous of your Win31-touting buddies because they're running Eudora... well, your time has come. Give this great program a shot!
Let me know if any of you have trouble getting it installed. Seriously. I probably can't fix it for you, but I'd be happy to describe how I got this set up on my system.
Just do it.
You'll be happy that you did!
Colophon: [from the Gk. kolophon summit, finishing touch] an inscription placed at the end of a book or manuscript usu. with facts relative to its production.
I have unabashedly stolen this concept from the great folks at O'Reilly publishing. If you've ever read one of their great nutshell series books you'll likely find a small colophon at the end of the book. If you're looking for truly well written and well researched material on UNIX, these are the guys to go to.
Anyway, I just wanted to wrap up with a few comments and closing thoughts.
I've had a huge amount of fun writing this. I really have.
Doing the reading and tinkering necessary to write this up has been a truly educational experience. I am FAR from achieving gurudom in any of this... you can easily find most all of what I've written about in the README's and manpages (although, maybe not in as lucid a fashion... ;-)
Since I'm trying to keep these at between 70k and 80k in size, I wasn't able to include a third of what I'd hoped to get in. So what's still to come...? Much more FVWM and X stuff including:
And I still haven't forgotten about writing up fly8! It's one of the nicest flight sim's I've seen (take this with a grain of salt... I'm NO gamer...). I'd also like to write about a few of the networking apps I've used and found VERY helpful.
In the long term... who knows?
There's a HUGE amount of stuff to write about the whole topic of shell scripting, which, if you haven't tried it yet, opens up some truly powerful features to you. FORGET what you've learned about the anemic and infantile MSDOG batch file setups, Linux offers some impressively powerful tools in the form of shell scripting.
Let me also commend a couple Web sites to you:
Finally, let me put a plug in for another LINUX Web Author...Scott Dowdle
I recieved this letter from Scott a little while ago...
Date: Sat, 02 Sep 1995 16:53:23 CDT From: Phil <firstname.lastname@example.org> To: <email@example.com> Subject: Silicon Times Reports? Hello, This is Scott Dowdle in Great Falls, Montana... and I'm a fellow Linux user. I'm "hooked" too. It just so happens that I've gotten myself involved with a digital magazine that has been around for over 8 years... called Silicon Times Report, or STReport or STR for short. STR has allowed me to start writing a Linux column... [snip] and he offered to let me start a Linux column. Check out STR at http://www.streport.com Hope to hear from you ASAP, Scott Dowdle - Great Falls, Montana
Scott basically began writing a column for the Silicon Times Report a little while ago after writing the editor and complaining that the ezine was WAY too Microsoft oriented. In response, the guy offered to let him write an article about LINUX!
So, go take a look! You'll probably need to do this with a Windows (ugghhh...) box, since I believe that the STR uses the Adobe Acrobat reader which you can ftp from STR. Scott sent a clipping of one of his recent articles and I'd very much recommend your supporting him. Drop him a note!
And finally, I wanted to say once again that I REALLY do appreciate folks writing and offering ideas and suggestions as well as the encouragement that a number of you have offered. Each issue takes on the order of 20 hours or so of writing and research to flesh out. It's definitely enjoyable and I'll admit to being a bit loquacious at times... but I appreciate the encouragement and I'm always glad to hear that someone's found something useful here.
Also, I apologize to anyone whom I promised to include something they sent and it didn't make it in this issue. The 'ol home system underwent a somewhat rocky upgrade here recently and a few things got mislaid. Be patient, I'll eventually get this act together... :-)
Anyway, hope you've enjoyed!
(Post-colophon... Sunday, 24 Sept 1995, I just got a note from the publisher of the Linux Journal with a correction: their phone number is (206) 782-7733. This is the number you'll want to call to order this excellent journal. The previous number, (206) 782-7191, is their FAX number. I as also informed that they're in the midst of putting previous articles online, so they will soon become browseable. I'll be adding links to these in the upcoming editions of the Gazette, but wanted to get the word out about these very worthy offerings. -John