|
From: Kirk R. <ki...@br...> - 2000-03-10 12:19:27
|
The Last time around, I put in a really nice, trust me nice!, description of the status of speakup with 2.3.x. Unfortunately, I forget what all I said. So I'll just post this and let the electrons fly. Let us know when the cvs is ready for withdrawals! 'grin' Kirk ------------------------------------------------------------------------ diff -urN linux-2.3.8/Documentation/Configure.help linux/Documentation/Configure.help --- linux-2.3.8/Documentation/Configure.help Thu Jun 17 04:11:35 1999 +++ linux/Documentation/Configure.help Wed Jun 23 14:58:03 1999 @@ -8961,7 +8961,63 @@ If you are asked this question, something is wrong with config scripts. Zilog serial driver is always enabled in sparc architecture. -Double Talk PC internal speech card support +Speakup console speech output for Linux +CONFIG_SPEAKUP + Choosing this Option will include support for console speech output. + + Speakup provides access to Linux for the visually impaired community. + It does this by sending console output to a number of different + hardware speech synthesizers. It provides access to Linux by Making + screen review functions available such as are used in comercial screen + review packages for the MSDOS and MSWINDOWS world. + + The drivers supplied under this option are not standard devices in the + /dev/ sence of the meaning. They can be thought of as a video card + for the blind. They are used by speakup and only speakup. + + For more information about speakup and its drivers check out + http://www.braille.uwo.ca/speakup, or read the Documentation in + linux/Documentation/speakup. + + The current synthesizers supported are: + DoubleTalk PC Internal synthesizer, + LiteTalk/DoubleTalk-LT external serial synthesizers, + Speakout external synthesizer, + Accent PC internal synthesizer. + + If you do not have one of these synths, say 'N' to this option. + +DoubleTalk driver for speakup. +CONFIG_SPEAKUP_DTLK + The DoubleTalk synthesizer is made by RC Systems. It is an internal + ISA card which uses no interrupts. Do not confuse this driver with + the standard DoubleTalk driver included in the kernel. + + If you don't have a DoubleTalk card say 'N' here. + +LiteTalk/DoubleTalk-LT driver for speakup. +CONFIG_SPEAKUP_LTLK + This driver is for the LiteTalk synthesizer made by MicroTalk or the + DoubleTalk-LT synthesizer made by RC Systems. These are serial + drivers for those external synths. + + If you don't have a LiteTalk or DoubleTalk-LT, say 'N' here. + +Speakout driver for speakup. +CONFIG_SPEAKUP_SPKOUT + This driver is for the Speakout external serial synthesizer made by + GW Micro. + + If you don't have a Speakout, say 'N' here. + +Accent PC driver for speakup. +CONFIG_SPEAKUP_ACNTPC + This driver is for the Accent PC internal synthesizer made by Aicom + Corp. + + If you Don't have an Accent PC, say 'N' here. + +Double Talk PC internal speech card support CONFIG_DTLK This driver is for the DoubleTalk PC, a speech synthesizer manufactured by RC Systems (http://www.rcsys.com/). It is also diff -urN linux-2.3.8/Documentation/speakup/DefaultKeyAssignments linux/Documentation/speakup/DefaultKeyAssignments --- linux-2.3.8/Documentation/speakup/DefaultKeyAssignments Wed Dec 31 19:00:00 1969 +++ linux/Documentation/speakup/DefaultKeyAssignments Tue Sep 21 08:51:40 1999 @@ -0,0 +1,43 @@ +This file is intended to give you an overview of the default keys used +by speakup for it's review functions. You may change them to be +anything you want but that will take some familiarity with key +mapping. + +We have remapped the insert or zero key on the keypad to act as a +shift key. Well, actually as an altgr key. So in the following list +InsKeyPad-period means hold down the insert key like a shift key and +hit the keypad period. + +KeyPad-8 Say current Line +InsKeyPad-8 say from top of screen to reading cursor. +KeyPad-7 Say Previous Line (UP one line) +KeyPad-9 Say Next Line (down one line) +KeyPad-5 Say Current Word +InsKeyPad-5 Spell Current Word +KeyPad-4 Say Previous Word (left one word) +InsKeyPad-4 say from left edge of line to reading cursor. +KeyPad-6 Say Next Word (right one word) +InsKeyPad-6 Say from reading cursor to right edge of line. +KeyPad-2 Say Current Letter +InsKeyPad-2 say current letter phonetically +KeyPad-1 Say Previous Character (left one letter) +KeyPad-3 Say Next Character (right one letter) +KeyPad-plus Say Entire Screen +InsKeyPad-plus Say from reading cursor line to bottom of screen. +KeyPad-Minus Park reading cursor (toggle) +InsKeyPad-minus Say character hex and decimal value. +KeyPad-period Say Position (current line, position and console) +InsKeyPad-period say colour attributes of current position. +InsKeyPad-9 Move reading cursor to top of screen (insert pgup) +InsKeyPad-3 Move reading cursor to bottom of screen (insert pgdn) +InsKeyPad-7 Move reading cursor to left edge of screen (insert home) +InsKeyPad-1 Move reading cursor to right edge of screen (insert end) +KeyPad-Enter Shut Up (until another key is hit) and sync reading cursor +InsKeyPad-Enter Shut Up (until toggled back on) and sync cursors +InsKeyPad-star n<x|y> go to line (y) or column (x). Where 'n' is any + allowed value for the row or column for your current screen. + +Hitting any key while speakup is outputting speech will quiet the +synth until it has caught up with what is being printed on the +console. + diff -urN linux-2.3.8/Documentation/speakup/INSTALLATION linux/Documentation/speakup/INSTALLATION --- linux-2.3.8/Documentation/speakup/INSTALLATION Wed Dec 31 19:00:00 1969 +++ linux/Documentation/speakup/INSTALLATION Tue Nov 23 08:04:38 1999 @@ -0,0 +1,104 @@ +This document assumes you have had some experience with kernel +compilation and installation. If you have not, I recommend you get +the kernel source and read the README and various documents in the +linux/Documentation directory. In particular the Changes file to make +sure you have the appropriate utilities needed for installing a 2.2.xx +or 2.3xx kernel. It isn't as difficult as you might think. The +kernel README is intimidating the first time but once you get the +steps down, it's really pretty easy. Getting through the "make +config" is the tedious bit. + +The first thing to do is to place a copy of the patch in the /usr/src +directory which is the directory the linux tree is located in as well. +To apply the patch if you are using speakup-0.08-patch say, type the +following at your shell prompt: + +patch -p0 <speakup-0.08-patch + +Note the less-than sign before the patch file name. The patch program +will give a running commentary on the patch hunks being applied. It +will give a summary of the hunks which succeeded or failed in being +applied. Hopefully all hunks will succeed. Depending on how +experienced you are with kernel compiling and hacking will determine +whether you should bother looking at any failed patches. If this +happens, you should probably write to the speakup mailing list for +help or myself. + +If all of the patch hunks apply successfully then just continue with +the standard steps to compile the kernel with: + +make mrproper +make config + +When you get to the section console speech output, answer 'y' to the +CONFIG_SPEAKUP prompt. You will be given a submenu with the list of +synthesizers which are currently supported. You can only choose one +of the synths, so just type dtlk or whatever is the correct string for +the synthesizer you have. + +I have placed the speakup configuration options in make config just +before the DoubleTalk PC driver included by Jim Van Zandt. I recommend +you say no to that option after returning from the speakup menu. I +have not tried configuring them both in, but I wouldn't be at all +surprised if it didn't work. + +If all goes well up to this point you can continue with the compiling +process by doing: + +make dep >dep.file 2>&1 & +make zImage >cc.file 2>&1 & + +I always redirect output to the files dep.file and cc.file so I can +look over the compilation record to make sure there are no errors and +warnings. + +Okay, you are ready to install the newly compiled kernel. Make sure +you make an linux.old entry in your lilo.conf file so you can recover +if it blows up. next move the zImage from +/usr/src/linux/arch/i386/boot to wherever your kernel lives. Also +move the System.map from /usr/src/linux to where your System.map +lives. On our systems we use debian so we create an vmlinuz-speakup +and System.map-speakup in our /boot directory and set the symbolic +links vmlinuz and System.map in the root (/) directory to point to the +images. Now type lilo to tell lilo to build the new booter file and +install it. + +As of version 0.07, the keymap for speakup is automatically built in +at compile time. If you have other keymaps installed at boot time, +you might want to consider removing them before you reboot the system. +Also if you have compiled the kernel prior to applying the speakup +patch, you have to remove the defkeymap.c file which is in the +linux/drivers/char directory. This file is not rebuilt if one already +exists. So if you find you have no review functions upon rebooting, +you know where to check first. + +If everything has gone OK up until now, cross your fingers and type: + +shutdown -r now + +Your system should start talking to you as soon as it starts booting. +It will talk and talk and ... well, you might want to hit the +keypad-enter key to tell it to shut up. You should also read the +DefaultKeyAssignments file to learn the various review functions +available. + +As of Speakup-0.05, there are accompanying utilities which will allow +you to load and dump speakups configuration information. These +utilities are in the subdirectory load_spk-version and have their own +README and INSTALL files. You should read through these files before +building the utilities and installing them. The utilities are based +on the idea of loadkeys so they work somewhat the same. The +configuration file commands are a little weird to get used to at +first, but once you understand them you'll hopefully realize they are +very flexible. + +I have probably managed to overlook a whole whack of things because +this is the, enter version number here, draft. Don't worry we'll get +it right eventually. If you like the package you really should get on +the mailing list and start participating in it's development. + + Kirk + +email: ki...@br... +phone: (519) 679-6845 (home) + diff -urN linux-2.3.8/Documentation/speakup/README-0.08 linux/Documentation/speakup/README-0.08 --- linux-2.3.8/Documentation/speakup/README-0.08 Wed Dec 31 19:00:00 1969 +++ linux/Documentation/speakup/README-0.08 Tue Nov 23 08:34:31 1999 @@ -0,0 +1,94 @@ +Welcome to the speakup project for the Speakup speech package for Linux. + +Speakup is written by Kirk Reiser and Andy Berdan. It is licensed +under the GPL. If you don't already know, the GPL stands for the GNU +Public License. Which basically states that this code is free to +copy, modify and distribute to anyone interested in playing with it. +The one thing you may not do is turn any part of it into proprietary +or commercial code without the permission of the author. That's me. + +If you are interested in being involved with the development of speech +output for Linux you can subscribe to the Speakup mailing list by +sending a message to lis...@br... with the line: + +subscribe speakup (YourFirstName YourLastName) + +in the body of the message. + +We are at a very early stage in the development of this package. +Hopefully changes will happen often and many. The current files in +this directory are: + +BUGS # the currently known bugs +COPYING # The GPL +Changes # The fixes and goodies since last release +DefaultKeyAssignments # speakup's default review keys +INSTALLATION # for installing speakup +README # this file +speakupmap.map # keyboard map for speakup functions. +keymap-tutorial # a tutorial on how to layout the keyboard +load_spk-0.6 # directory with the loadspk and dumpspk utilities. +speakup-0.08-patch # patches to kernel versions 2.2.7 and above. +speakup-0.08-announcement the announcement for the current release + +Read the INSTALLATION file to learn how to apply the patches and the +default.map for the keyboard. You should also read the Changes file. +It really has any new things I've added since last time. + +There is no documentation in any of these files to instruct you what +to do if something goes wrong with the patching or compilation. If +you would like that information you will need to subscribe to the +mailing list and ask for help, or write me ki...@br... for +help. I suggest the mailing list because I will probably tire quickly +of answering the same questions over and over. You could always +decide to wait until this package gets out of the alpha stage and +there will be more documentation by that time. + +There also is a speakup reflector for the Speak Freely package, which +many of us hang out on and discuss all sorts of topics from speakup +problems to ALSA driver installation and just about anything else +you'd like to talk about. The reflector is at lwl.braille.uwo.ca:4074 +with it's lwl page at lwl.braille.uwo.ca/speakup.html. Come and join +us, it's fun! + +Acknowledgements: + +I am really very new at kernel hacking and screen review package +writing, so I have depended heavily on other folks kindness to help me +a long. No doubt I will continue to abuse them freely and others +before this is a really good speech solution for Linux. (Oh Well!, +somebody's got to do it.) + +Theodore Ts'o. He gave me a good discussion of unicode and UTF and +the like. He doesn't even remember writing me about it. + +Alan Cox. He has answered many questions about scheduling and wait +queues and timers along with code fragments and so on. I just wish I +understood it all totally. + +Martin Mares. He pointed me in the right direction to figuring out +the colour attributes and other useful tidbits. + +Paul McDermott. He really is the catalyst for me to actually get +this all working. Besides I like seeing him bounce around and get all +excited every time I have something new working. + +John Covici, He was the first person to actually attempt writing +another synthesizer driver for speakup. It was the Speakout driver so +it was also the first serial driver. + +Brian Borowski, he was the first person to actually write a speakup +function other than Andy and I. + +Gene Collins, he was very helpful debugging the current release prior +to its public showing. He has also worked hard educating others on +the list and writing the ALSA mini howto. + +There are probably many more I am forgetting right now. I guess I'll +just have to add you all later. + + +Happy Hacking! + + Kirk + diff -urN linux-2.3.8/Documentation/speakup/README.loadspk linux/Documentation/speakup/README.loadspk --- linux-2.3.8/Documentation/speakup/README.loadspk Wed Dec 31 19:00:00 1969 +++ linux/Documentation/speakup/README.loadspk Wed Jun 23 14:58:04 1999 @@ -0,0 +1,80 @@ +Speakup v0.07 & Loadspk v0.03 +----------------------------- + +Speakup and Loadspk work very closely together. Each one more or less depends +on the other to work flawlessly. + +So, when changing any synth symbol headers, (symbol*.h), you must also change +the corresponding headers in the loadspk source (same names). They both +include standard definitions which get translated into the kernel proper +and/or into the client programs. + +Required defines (in both kernel and loadspk): +---------------------------------------------- + VERSION_x where 'x' is one of the synth names displayed + NUM_STATIC_x in symbols.h (DTLK,ACNTPC or SPKOUT) + NUM_XTEND_x + NUM_ALIAS_x + + STATIC_STR_x + XTEND_STR_x + ALIAS_STR_x + +Required only in kernel: +------------------------ + DEFAULT_STATIC_x + DEFAULT_XTEND_x + +------------------------------------------------------------------------- + +All of these get built into the various larger structures, depending on +which synth is specified/detected. Take a look at symbols.h (in either the +kernel or loadspk source) if you're curious. + +------------------------------------------------------------------------- + +The spk_variable Structure + +struct spk_variable { + char *id; /* command as displayed in loadspk/dumpspk */ + char *param; /* value of the parameter to the command */ + char *build; /* a string, describing how to construct the + * string sent to the synth, with the character '_' + * to be filled in with the parameter. eg. "\x01_P" + * will convert to "\x01+30P", if param is "+30" + */ + int flags; + char valid[33]; /* "-1"-terminated set of valid values for param + * an empty set { -1 }, signifies that it is a string + * literal variable + */ +}; + +Usage examples: +--------------- + +Example 1. + +{ "rate", "9", "\x1bR_", HARD_DIRECT, "0123456789ABCDEFGH\xff" } + +would allow loadspk to use the command: + rate = $ +where '$' was any of 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H +and, upon input, would immediately send "\x1bR$" to the hardware device, +as well as setting the appropriate variable in Speakup. If $ is empty, +"\x1bR9" is sent to the synth. + + + +Example 2. + +{ "pitch", "50", "\x1_p", (NUMERIC | HARD_DIRECT | USE_RANGE), { 0, 99, -1 } } + +would correspond to loadspk using the command: + pitch = $ +where '$' was a string representing a numeric value in the range 0-99. It would +also be sent directly to the hardware as an ascii string (the NUMERIC flag +ensures this). If 'pitch=' was entered, then "01h 50p" would be sent to the +synth (that is, ctrl-A followed by "50p"). + + diff -urN linux-2.3.8/Documentation/speakup/keymap-tutorial linux/Documentation/speakup/keymap-tutorial --- linux-2.3.8/Documentation/speakup/keymap-tutorial Wed Dec 31 19:00:00 1969 +++ linux/Documentation/speakup/keymap-tutorial Thu Apr 29 12:24:18 1999 @@ -0,0 +1,140 @@ + Speakup Keymap Tutorial + +This is meant to be a basic tutorial on how to change the Linux keymap +file to assign speakup review functions to desired keys. It is not +intended to be a replacement for the loadkeys(8) or keymap(5) man +pages. + +The basic lay-out of the keymap file is a series of lines with the +following fields. The keyword keycode indicates this is the start of +a new key assignment. It is then followed by a number which +represents the actual key on the keyboard. That number is followed by +the equals '=' operator and finally a list of keywords representing +key names such as keypad5. Each line can have quite a few key +functions on it. They are interpreted by loadkeys in order and +assigned to key shift states depending on the order they are +encountered. So for example, the first value after the equals is the +keys unshifted state, while the second is the keys shifted state. If +you wish to learn the order they are interpreted in read the +loadkeys(8) and keymap(5) man pages. + +You can have subsequent lines which are indented and start with +another keyword for the various shifted states. This way you can +assign some of the states without having to specify them all in order +up until you get to the one you want to assign. + +In speakup, we have assigned the insert key on the number pad to the +altgr keyword. This is not required; you could choose any other +shifted state keyword. We used altgr because it typically represents +the right hand alt key. In Linux each shift key is separate and +independent, so the left shift and the right shift keys are not +necessarily the same. The altgr key is not really used for anything +important, so we steel it. + +Here are the default key assignments for the number eight on the +keypad: + +keycode 72 = KP_8 + alt keycode 72 = Ascii_8 + +As you can see, the first line starts with keycode followed by 72 +which is the actual number assigned to the key when the keyboard port +is read. The KP_8 after the equal sign, is the symbolic representation +of the function called when that key is hit. + +The second line is the same format except it starts with the keyword +alt which is indented. That means that the function at the end of +that line Ascii_8 is applied to the alt-shifted eight key. + +Now here are the speakup assignments for that key: + +keycode 72 = 0x0d0a + altgr keycode 72 = 0x0d20 +#keycode 72 = KP_8 + alt keycode 72 = Ascii_8 + +Notice that the only thing which has changed on the first line is the +function called when the key is struck. It is a hexadecimal number +identifying the function called in a look up table. It is not a +symbolic representation yet because that means we need to change the +loadkeys program to understand our symbolic names. We will do this in +the future but for now it is more expedient to just use the table +indices. You will find a table at the bottom of this document +listing the review functions and their corresponding hex lookups. + +The 0x0d0a in the first line above is speakup's say line function. +The second line ends with 0x0d20 which is speakup's read from top of +screen to reading cursor line. + +The third line is the original key assignment commented out with a +number-sign '#' at the beginning. I do that so I can easily find the +keys I want to affect by symbolic name. Otherwise I would need to +keep a look up table for all the keycodes. I recommend you do this as +well or you'll be very sorry at some point in the future. + +The forth line is just the standard key assignment for the left hand +alt key. + +Now let's say we want to design a different keyboard layout. I'll use +an example for the JAWS style keypad because I've specifically been +asked to help with that. JAWS uses the eight on the keypad to move up +a line or the speakup function to read previous line. JAWS also uses +the keypad_8 key in a shifted mode to read the current line. I +apologize if these are not quite right. It has been a long time since +I used JAWS. So we would have the following two lines: + +keycode 72 = 0x0d0b + altgr keycode 72 = 0x0d0a + +The hex value 0x0d0b in the first line is speakup's SAY_PREVIOUS_LINE +function. The 0x0d0a in the second line is the same say_line function +as we had earlier. So when the number eight is hit on the keypad +speakup will read the previous line and when the number eight is +shifted with the insert key on the keypad it will read the current +line. + +As you can tell, it is not really very difficult to reassign the keys +to different review functions. + +Once you have carefully edited the keymap file, called default.map in +the speakup distribution, you copy it into the /etc/kbd directory. +Make sure you back up the original default.map from that directory +first, if there is one. Then you run loadkeys to load the new map +into the kernel: + +loadkeys /etc/kbd/default.map + +If you wish to build your new keyboard lay-out into the kernel, after +testing it, copy the default.map file into the drivers/char directory, +with the name defkeymap.map, of your Linux source tree. Then rm the +defkeymap.c file and recompile the kernel. Because there is no +defkeymap.c `make' will rebuild it on the next compile. + +Here is a list of the available speakup review functions at this point +in time. + +SAY_CHAR 0x0d04 /* say this character */ +SAY_PREV_CHAR 0x0d05 /* say character left of this char */ +SAY_NEXT_CHAR 0x0d06 /* say char right of this char */ +SAY_WORD 0x0d07 /* say this word under reading cursor */ +SAY_PREV_WORD 0x0d08 +SAY_NEXT_WORD 0x0d09 +SAY_LINE 0x0d0a /* say this line */ +SAY_PREV_LINE 0x0d0b /* say line above this line */ +SAY_NEXT_LINE 0x0d0c +TOP_EDGE 0x0d0d /* move to top edge of screen */ +BOTTOM_EDGE 0x0d0e +LEFT_EDGE 0x0d0f +RIGHT_EDGE 0x0d10 +SAY_PHONETIC_CHAR 0x0d11 /* say this character phonetically */ +SPELL_WORD 0x0d12 /* spell this word letter by letter */ +SAY_SCREEN 0x0d14 +SAY_POSITION 0x0d1b +SPEECH_OFF 0x0d1c +SAY_ATTRIBUTES 0x0d1d +SPEAKUP_PARKED 0x0d1e +SAY_FROM_TOP 0x0d20 +SAY_TO_BOTTOM 0x0d21 +SAY_FROM_LEFT 0x0d22 +SAY_TO_RIGHT 0x0d23 + diff -urN linux-2.3.8/MAINTAINERS linux/MAINTAINERS --- linux-2.3.8/MAINTAINERS Thu Jun 3 11:26:42 1999 +++ linux/MAINTAINERS Wed Jun 23 14:58:04 1999 @@ -728,6 +728,13 @@ W: http://www.geog.ubc.ca/s_linux.html S: Maintained +SPEAKUP Console speech output +P: Kirk Reiser +M: ki...@br... +L: sp...@br... +W: http://www.braille.uwo.ca/speakup +S: Maintained + SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER P: Roger Wolff M: R.E...@Bi... diff -urN linux-2.3.8/arch/alpha/config.in linux/arch/alpha/config.in --- linux-2.3.8/arch/alpha/config.in Tue Jun 22 13:46:52 1999 +++ linux/arch/alpha/config.in Wed Jun 30 12:40:31 1999 @@ -262,6 +262,7 @@ define_bool CONFIG_PCI_CONSOLE y fi source drivers/video/Config.in + source drivers/char/speakup/Config.in endmenu fi diff -urN linux-2.3.8/arch/arm/config.in linux/arch/arm/config.in --- linux-2.3.8/arch/arm/config.in Thu Jun 17 04:11:35 1999 +++ linux/arch/arm/config.in Wed Jun 30 12:41:13 1999 @@ -193,6 +193,7 @@ fi bool 'Support Frame buffer devices' CONFIG_FB source drivers/video/Config.in + source drivers/char/speakup/Config.in endmenu fi diff -urN linux-2.3.8/arch/i386/config.in linux/arch/i386/config.in --- linux-2.3.8/arch/i386/config.in Mon Jun 7 20:02:23 1999 +++ linux/arch/i386/config.in Wed Jun 30 12:20:24 1999 @@ -188,6 +188,7 @@ bool 'Support for frame buffer devices (EXPERIMENTAL)' CONFIG_FB fi source drivers/video/Config.in + source drivers/char/speakup/Config.in endmenu fi diff -urN linux-2.3.8/arch/m68k/config.in linux/arch/m68k/config.in --- linux-2.3.8/arch/m68k/config.in Tue May 11 12:57:14 1999 +++ linux/arch/m68k/config.in Wed Jun 30 12:41:49 1999 @@ -443,6 +443,7 @@ define_bool CONFIG_FB y fi source drivers/video/Config.in + source drivers/char/speakup/Config.in endmenu fi diff -urN linux-2.3.8/arch/mips/config.in linux/arch/mips/config.in --- linux-2.3.8/arch/mips/config.in Mon Feb 1 15:03:20 1999 +++ linux/arch/mips/config.in Wed Jun 30 12:42:45 1999 @@ -194,6 +194,7 @@ comment 'Console drivers' source drivers/video/Config.in +source drivers/char/speakup/Config.in mainmenu_option next_comment comment 'Sound' diff -urN linux-2.3.8/arch/ppc/config.in linux/arch/ppc/config.in --- linux-2.3.8/arch/ppc/config.in Tue Jun 8 13:52:26 1999 +++ linux/arch/ppc/config.in Wed Jun 30 12:43:08 1999 @@ -173,6 +173,7 @@ mainmenu_option next_comment comment 'Console drivers' source drivers/video/Config.in +source drivers/char/speakup/Config.in endmenu source drivers/char/Config.in diff -urN linux-2.3.8/arch/sparc/config.in linux/arch/sparc/config.in --- linux-2.3.8/arch/sparc/config.in Mon Mar 15 19:10:43 1999 +++ linux/arch/sparc/config.in Wed Jun 30 12:43:26 1999 @@ -45,6 +45,7 @@ bool 'PROM console' CONFIG_PROM_CONSOLE bool 'Support Frame buffer devices' CONFIG_FB source drivers/video/Config.in + source drivers/char/speakup/Config.in endmenu # Global things across all Sun machines. diff -urN linux-2.3.8/arch/sparc64/config.in linux/arch/sparc64/config.in --- linux-2.3.8/arch/sparc64/config.in Thu Apr 22 22:24:51 1999 +++ linux/arch/sparc64/config.in Wed Jun 30 12:44:40 1999 @@ -31,6 +31,7 @@ bool 'PROM console' CONFIG_PROM_CONSOLE bool 'Support Frame buffer devices' CONFIG_FB source drivers/video/Config.in +source drivers/char/speakup/Config.in endmenu # Global things across all Sun machines. diff -urN linux-2.3.8/drivers/char/Makefile linux/drivers/char/Makefile --- linux-2.3.8/drivers/char/Makefile Sat May 22 18:02:48 1999 +++ linux/drivers/char/Makefile Wed Jun 23 14:58:04 1999 @@ -18,6 +18,11 @@ # FONTMAPFILE = cp437.uni +# +# This file contains the default keymap +# +KEYMAPFILE = defkeymap.map + L_TARGET := char.a M_OBJS := L_OBJS := tty_io.o n_tty.o tty_ioctl.o mem.o random.o @@ -489,6 +494,12 @@ endif +ifeq ($(CONFIG_SPEAKUP),y) +SUB_DIRS += speakup +L_OBJS += speakup/spk.o +KEYMAPFILE = speakup/speakupmap.map +endif + include $(TOPDIR)/Rules.make fastdep: @@ -501,6 +512,6 @@ consolemap_deftbl.o: consolemap_deftbl.c $(TOPDIR)/include/linux/types.h -defkeymap.c: defkeymap.map - loadkeys --mktable defkeymap.map > defkeymap.c +defkeymap.c: $(KEYMAPFILE) + loadkeys --mktable $(KEYMAPFILE) > defkeymap.c diff -urN linux-2.3.8/drivers/char/console.c linux/drivers/char/console.c --- linux-2.3.8/drivers/char/console.c Tue May 11 17:37:40 1999 +++ linux/drivers/char/console.c Fri Nov 5 11:44:52 1999 @@ -91,6 +91,9 @@ #include <linux/config.h> #include <linux/version.h> #include <linux/tqueue.h> +#ifdef CONFIG_SPEAKUP /* console speech output */ +#include <linux/speakup.h> +#endif /* speakup */ #ifdef CONFIG_APM #include <linux/apm_bios.h> #endif @@ -146,6 +149,15 @@ static void set_cursor(int currcons); static void hide_cursor(int currcons); +#ifdef CONFIG_SPEAKUP /* console speech output */ +extern unsigned long speakup_init(unsigned long, unsigned int); +extern void speakup_allocate(unsigned int); /* new review structures */ +extern void speakup_date(unsigned int); +extern void say_curr_char(unsigned int); +extern void say_curr_line(unsigned int); +extern struct spk_t *this[]; +#endif /* speakup */ + static int printable = 0; /* Is console ready for printing? */ int do_poke_blanked_console = 0; @@ -653,6 +665,9 @@ screenbuf = (unsigned short *) q; kmalloced = 1; vc_init(currcons, video_num_lines, video_num_columns, 1); +#ifdef CONFIG_SPEAKUP /* console speech output */ + speakup_allocate(currcons); /* speakup needs more too. */ +#endif /* speakup */ } return 0; } @@ -833,6 +848,12 @@ y = new_y; pos = origin + y*video_size_row + (x<<1); need_wrap = 0; +#ifdef CONFIG_SPEAKUP /* console speech output */ + if ((this[currcons] != NULL) && !spk_parked) + speakup_date(currcons); + /*if ((this[currcons] != NULL) && !spk_shut_up && IS_FG) + speakup_check(currcons);*/ +#endif /* speakup */ } /* for absolute user moves, when decom is set */ @@ -899,6 +920,12 @@ pos -= 2; x--; need_wrap = 0; +#ifdef CONFIG_SPEAKUP /* console speech output */ + if (!spk_parked && IS_FG) speakup_date(currcons); + if (!spk_shut_up && IS_FG) { + speakup_check(currcons); + } +#endif /* speakup */ } } @@ -983,6 +1010,13 @@ } scr_memsetw(start, video_erase_char, 2 * count); need_wrap = 0; +#ifdef CONFIG_SPEAKUP /* console speech output */ + /* if (!spk_parked && IS_FG) speakup_date(currcons); + if (!spk_shut_up && IS_FG) { + say_curr_char(currcons); + spk_skip (count); + }*/ +#endif /* speakup */ } static void csi_X(int currcons, int vpar) /* erase the following vpar positions */ @@ -997,6 +1031,13 @@ if (DO_UPDATE) sw->con_clear(vc_cons[currcons].d, y, x, 1, count); need_wrap = 0; +#ifdef CONFIG_SPEAKUP /* console speech output */ + /* if (!spk_parked && IS_FG) speakup_date(currcons); + if (!spk_shut_up && IS_FG) { + say_curr_char(currcons); + spk_skip (count); + }*/ +#endif /* speakup */ } static void default_attr(int currcons) @@ -1406,6 +1447,7 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c) { +char buf[80]; /* * Control characters can be used in the _middle_ * of an escape sequence. @@ -1431,6 +1473,9 @@ return; case 10: case 11: case 12: lf(currcons); +#ifdef CONFIG_SPEAKUP /* console speech output */ + if (!spk_shut_up && IS_FG) spkup_write("\n",1); +#endif /* speakup */ if (!is_kbd(lnm)) return; case 13: @@ -1639,7 +1684,12 @@ if (par[0]) par[0]--; gotoxay(currcons,x,par[0]); return; - case 'H': case 'f': + case 'f': + if (par[0]) par[0]--; + if (par[1]) par[1]--; + gotoxay(currcons,par[1],par[0]); + return; + case 'H': if (par[0]) par[0]--; if (par[1]) par[1]--; gotoxay(currcons,par[1],par[0]); @@ -1880,6 +1930,7 @@ if (vc_state == ESnormal && ok) { /* Now try to find out how to display it */ tc = conv_uni_to_pc(vc_cons[currcons].d, tc); + if ( tc == -4 ) { /* If we got -4 (not found) then see if we have defined a replacement character (U+FFFD) */ @@ -1902,9 +1953,15 @@ if (need_wrap) { cr(currcons); lf(currcons); +#ifdef CONFIG_SPEAKUP /* console speech output */ + if (!spk_shut_up && IS_FG) spkup_write("\n",1); +#endif /* speakup */ } if (decim) insert_char(currcons, 1); +#ifdef CONFIG_SPEAKUP /* console speech output */ + if (!spk_shut_up && IS_FG) spkup_write((char *) &tc,1); +#endif /* speakup */ scr_writew(himask ? ((attr << 8) & ~himask) + ((tc & 0x100) ? himask : 0) + (tc & 0xff) : (attr << 8) + tc, @@ -1919,6 +1976,9 @@ } else { x++; draw_to = (pos+=2); +#ifdef CONFIG_SPEAKUP /* console speech output */ + if (!spk_parked && IS_FG) speakup_date(currcons); +#endif /* speakup */ } continue; } @@ -1926,6 +1986,9 @@ do_con_trol(tty, currcons, c); } FLUSH +#ifdef CONFIG_SPEAKUP /* console speech output */ + if (!spk_parked && IS_FG) speakup_date(currcons); +#endif /* speakup */ enable_bh(CONSOLE_BH); return n; #undef FLUSH @@ -1950,6 +2013,11 @@ /* we only changed when the console had already been allocated - a new console is not created in an interrupt routine */ +#ifdef CONFIG_SPEAKUP /* console speech output */ + if (!this[want_console]->parked + && this[want_console]->reading_y == -1) + speakup_date(want_console); +#endif /* speakup */ } want_console = -1; } @@ -2010,6 +2078,9 @@ /* Contrived structure to try to emulate original need_wrap behaviour * Problems caused when we have need_wrap set on '\n' character */ +#ifdef CONFIG_SPEAKUP /* console speech output */ + if (!spk_shut_up && IS_FG) spkup_write(b, count); +#endif /* speakup */ while (count--) { c = *b++; if (c == 10 || c == 13 || c == 8 || need_wrap) { @@ -2055,7 +2126,9 @@ } set_cursor(currcons); poke_blanked_console(); - +#ifdef CONFIG_SPEAKUP /* console speech output */ + if ((this[currcons] != NULL) && !spk_parked) speakup_date(currcons); +#endif /* speakup */ quit: clear_bit(0, &printing); } @@ -2215,6 +2288,7 @@ static void con_flush_chars(struct tty_struct *tty) { struct vt_struct *vt = (struct vt_struct *)tty->driver_data; + /*char stc[2]; kirk*/ set_cursor(vt->vc_num); } @@ -2358,6 +2432,10 @@ master_display_fg = vc_cons[currcons].d; set_origin(currcons); save_screen(currcons); +#ifdef CONFIG_SPEAKUP /* console speech output */ + kmem_start = speakup_init(kmem_start, currcons); +#endif /* speakup */ + gotoxy(currcons,x,y); csi_J(currcons, 0); update_screen(fg_console); diff -urN linux-2.3.8/drivers/char/keyboard.c linux/drivers/char/keyboard.c --- linux-2.3.8/drivers/char/keyboard.c Sat May 22 15:57:24 1999 +++ linux/drivers/char/keyboard.c Wed Aug 11 14:58:20 1999 @@ -41,6 +41,7 @@ #include <linux/vt_kern.h> #include <linux/kbd_ll.h> #include <linux/sysrq.h> +#include <linux/delay.h> /* for mdelay() */ #define SIZE(x) (sizeof(x)/sizeof((x)[0])) @@ -104,6 +105,24 @@ typedef void (*k_hand)(unsigned char value, char up_flag); typedef void (k_handfn)(unsigned char value, char up_flag); + +#ifdef CONFIG_SPEAKUP + +extern int speakup_diacr(unsigned char,unsigned int); +extern void spk_savekey(unsigned char ch); +extern void spk_control(int,int); + +static k_handfn + do_self, do_fn, do_spec, do_pad, do_dead, do_cons, do_cur, do_shift, + do_meta, do_ascii, do_lock, do_lowercase, do_slock, + do_spkup, do_dead2, do_ignore; + +static k_hand key_handler[17] = { + do_self, do_fn, do_spec, do_pad, do_dead, do_cons, do_cur, do_shift, + do_meta, do_ascii, do_lock, do_lowercase, do_slock, + do_spkup, do_dead2, do_ignore, do_ignore +}; +#else static k_handfn do_self, do_fn, do_spec, do_pad, do_dead, do_cons, do_cur, do_shift, do_meta, do_ascii, do_lock, do_lowercase, do_slock, do_dead2, @@ -114,6 +133,7 @@ do_meta, do_ascii, do_lock, do_lowercase, do_slock, do_dead2, do_ignore, do_ignore }; +#endif /* Key types processed even in raw modes */ @@ -141,7 +161,11 @@ 255, SIZE(func_table) - 1, SIZE(spec_fn_table) - 1, NR_PAD - 1, NR_DEAD - 1, 255, 3, NR_SHIFT - 1, 255, NR_ASCII - 1, NR_LOCK - 1, 255, - NR_LOCK - 1, 255 +#ifdef CONFIG_SPEAKUP + NR_LOCK - 1, NR_SPKUP - 1, 255, 255 +#else + NR_LOCK - 1, 255, 255 +#endif }; const int NR_TYPES = SIZE(max_vals); @@ -260,6 +284,12 @@ raw_mode = 1; /* Most key classes will be ignored */ } +#ifdef CONFIG_SPEAKUP /* console speech output */ + if (!up_flag) + speakup_reset(fg_console); +#endif /* speakup */ + + /* * Small change in philosophy: earlier we defined repetition by * rep = keycode == prev_keycode; @@ -515,6 +545,120 @@ compute_shiftstate(); } +#ifdef CONFIG_SPEAKUP /* console speech output */ +static void do_spkup(unsigned char value, char up_flag) +{ + spk_savekey(0); /* clear! brzzzot */ + if (up_flag) + return; /* do nothing on key release */ + + switch(value) { + case (QUICK_QUIET): + /* -x- */ + spkup_write("\x18",1); + return; + case (LINE_QUIET): + return; + case (FULL_QUIET): + spkup_write("\x18",1); + speakup_shut_up(fg_console); + return; + case (SAY_CHAR): + say_curr_char(fg_console); + return; + case (SAY_PREV_CHAR): + say_prev_char(fg_console); + return; + case (SAY_NEXT_CHAR): + say_next_char(fg_console); + return; + case (SAY_WORD): + say_curr_word(fg_console); + return; + case (SAY_PREV_WORD): + say_prev_word(fg_console); + return; + case (SAY_NEXT_WORD): + say_next_word(fg_console); + return; + case (SAY_LINE): + say_curr_line(fg_console); + return; + case (SAY_PREV_LINE): + say_prev_line(fg_console); + return; + case (SAY_NEXT_LINE): + say_next_line(fg_console); + return; + case (TOP_EDGE): + top_edge(fg_console); + return; + case (BOTTOM_EDGE): + bottom_edge(fg_console); + return; + case (LEFT_EDGE): + left_edge(fg_console); + return; + case (RIGHT_EDGE): + right_edge(fg_console); + return; + case (SAY_PHONETIC_CHAR): + say_phonetic_char(fg_console); + return; + case (SPELL_WORD): + spell_word(fg_console); + return; + case (SPELL_PHONETIC_WORD): + return; + case (SAY_SCREEN): + say_screen(fg_console); + return; + case (SAY_WINDOW): + return; + case (SET_SPEED): + return; + case (SET_PITCH): + return; + case (SET_PUNCTUATION): + return; + case (SET_VOICE): + return; + case (SET_TONE): + return; + case (SAY_POSITION): + say_position(fg_console); + return; + case (SAY_CHAR_NUM): + say_char_num(fg_console); + return; + case (SPEECH_OFF): + speakup_off(fg_console); + return; + case (SAY_ATTRIBUTES): + say_attributes(fg_console); + return; + case (SPEAKUP_PARKED): + speakup_parked(fg_console); + return; + case (SAY_FROM_TOP): + say_from_top(fg_console); + return; + case (SAY_TO_BOTTOM): + say_to_bottom(fg_console); + return; + case (SAY_FROM_LEFT): + say_from_left(fg_console); + return; + case (SAY_TO_RIGHT): + say_to_right(fg_console); + return; + default: + spkup_write("SpeakUp: Invalid command",26); + return; +} +} +#endif /* speakup */ + static void do_spec(unsigned char value, char up_flag) { if (up_flag) @@ -525,6 +669,29 @@ !(SPECIALS_ALLOWED_IN_RAW_MODE & (1 << value))) return; spec_fn_table[value](); + +#ifdef CONFIG_SPEAKUP /* console speech output */ + /* let there be speech! */ + switch (value) { + case KVAL(K_CAPS): + if (vc_kbd_led(kbd ,VC_CAPSLOCK)) + spkup_write("caps lock on",13); + else + spkup_write("caps lock off",14); + break; + case KVAL(K_NUM): + if (vc_kbd_led(kbd ,VC_NUMLOCK)) + spkup_write("numm lock on",13); + else + spkup_write("numm lock off",14); + break; + case KVAL(K_HOLD): + if (vc_kbd_led(kbd ,VC_SCROLLOCK)) + spkup_write("scroll lock on",15); + else + spkup_write("scroll lock off",16); + } +#endif /* speakup */ } static void do_lowercase(unsigned char value, char up_flag) @@ -538,7 +705,11 @@ return; /* no action, if this is a key release */ if (diacr) +#ifdef CONFIG_SPEAKUP + if ((value = handle_diacr(value)) == 0xff) return; +#else value = handle_diacr(value); +#endif if (dead_key_next) { dead_key_next = 0; @@ -546,6 +717,9 @@ return; } +#ifdef CONFIG_SPEAKUP + spk_savekey(value); +#endif put_queue(value); } @@ -555,8 +729,14 @@ #define A_TILDE '~' #define A_DIAER '"' #define A_CEDIL ',' + +#ifdef CONFIG_SPEAKUP +static unsigned char ret_diacr[NR_DEAD] = + {A_GRAVE, A_ACUTE, A_CFLEX, A_TILDE, A_DIAER, A_CEDIL,'$'}; +#else static unsigned char ret_diacr[NR_DEAD] = {A_GRAVE, A_ACUTE, A_CFLEX, A_TILDE, A_DIAER, A_CEDIL }; +#endif /* Obsolete - for backwards compatibility only */ static void do_dead(unsigned char value, char up_flag) @@ -575,6 +755,13 @@ if (up_flag) return; +#ifdef CONFIG_SPEAKUP + if (value == '$') { + kd_mksound(150,5); + mdelay(10); + kd_mksound(250,7); + } +#endif diacr = (diacr ? handle_diacr(value) : value); } @@ -591,6 +778,14 @@ int d = diacr; int i; + #ifdef CONFIG_SPEAKUP + if (d == '$') { + if (speakup_diacr(ch,fg_console)) + diacr = 0; + return 0xff; + } + #endif + diacr = 0; for (i = 0; i < accent_table_size; i++) { @@ -644,7 +839,7 @@ do_fn(KVAL(K_REMOVE), 0); return; case KVAL(K_P0): - do_fn(KVAL(K_INSERT), 0); + do_fn(KVAL(K_INSERT), 0); return; case KVAL(K_P1): do_fn(KVAL(K_SELECT), 0); @@ -704,6 +899,12 @@ clr_vc_kbd_led(kbd, VC_CAPSLOCK); } +#ifdef CONFIG_SPEAKUP + /* shift = 0, altgr = 1, ctrl=2, alt=3 */ + if (!up_flag) + spk_control(fg_console,value); +#endif + if (up_flag) { /* handle the case that two shift or control keys are depressed simultaneously */ @@ -792,6 +993,7 @@ if (up_flag || rep) return; chg_vc_kbd_lock(kbd, value); + } static void do_slock(unsigned char value, char up_flag) diff -urN linux-2.3.8/drivers/char/speakup/BUGS linux/drivers/char/speakup/BUGS --- linux-2.3.8/drivers/char/speakup/BUGS Wed Dec 31 19:00:00 1969 +++ linux/drivers/char/speakup/BUGS Tue Nov 23 08:08:01 1999 @@ -0,0 +1,12 @@ +Well, there are probably just thousands to squash, but these are the +ones I think of as bugs. + +It doesn't speak the first character deleted when back spacing. + +The screen appears to lock up when you change consoles while a process +is outputting to it. I haven't been able to nail this one down yet. + +I define bugs as things which aren't working correctly although +they've been implemented. NOT features which haven't been added yet. + + Kirk diff -urN linux-2.3.8/drivers/char/speakup/COPYING linux/drivers/char/speakup/COPYING --- linux-2.3.8/drivers/char/speakup/COPYING Wed Dec 31 19:00:00 1969 +++ linux/drivers/char/speakup/COPYING Thu Apr 29 12:24:18 1999 @@ -0,0 +1,358 @@ + + NOTE! This copyright does *not* cover user programs that use kernel + services by normal system calls - this is merely considered normal use + of the kernel, and does *not* fall under the heading of "derived work". + Also note that the GPL below is copyrighted by the Free Software + Foundation, but the instance of code that it refers to (the Linux + kernel) is copyrighted by me and others who actually wrote it. + + Linus Torvalds + +---------------------------------------- + +This is included for completeness of GPL for the speakup project. +Speakup is a screen review and speech synthesizer set of drivers and +patches for the Linux kernel. (Kirk Reiser) + +------------------------------------------------------------------------ + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) 19yy <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, I... [truncated message content] |