summaryrefslogtreecommitdiff
path: root/tvision/doc/Linux.txt
diff options
context:
space:
mode:
Diffstat (limited to 'tvision/doc/Linux.txt')
-rw-r--r--tvision/doc/Linux.txt274
1 files changed, 274 insertions, 0 deletions
diff --git a/tvision/doc/Linux.txt b/tvision/doc/Linux.txt
new file mode 100644
index 0000000..722d45b
--- /dev/null
+++ b/tvision/doc/Linux.txt
@@ -0,0 +1,274 @@
+Driver: Linux
+Author: Salvador E. Tropea, Robert Hoehne
+Status: Complete
+Revision: $Revision: 1.6 $
+
+ This is the driver for the Linux console. It can't be used for X or
+other UNIX terminals. This driver is used when the terminal can be
+identified as "console" or "linux*".
+
+1. INTRODUCTION
+2. THE KEYBOARD
+3. ENCODINGS AND FONTS
+4. SECONDARY FONT AND SYSTEMS WITH 512 CHARACTERS
+5. CONFIGURATION VARIABLES
+
+1. INTRODUCTION
+
+ This driver is quite complex and you could need to configure your system
+and/or Turbo Vision to get all the features or to even get it working. This
+is a bad thing, but that's how Linux is implemented.
+ Two important things affects the behavior of this driver:
+
+1) If the user have rights to write to the /dev/vcsa* devices. Usually users
+don't have access to these devices. This is because somebody logged in your
+system could write to your screen to make you do something wrong or expose
+important information. Lamentably these devices doesn't check if the owner is
+who opened the device, a simple rights test is done. When the user can write
+to this device the performance of the library is much better. I recommend
+using it unless your system is used by a lot of untrusted persons.
+2) If you are running the application in a real console or not. Note that
+sometimes you can be using the real console but through a program that starts
+their child processes in a way that they aren't really attached to the
+console. A common case is the "midnight commander" program, it runs the
+commands you type in something like /dev/pts/N. You can find it using the tty
+command. Currently Turbo Vision can bypass applications like midnight
+commander, but some stuff (like the keyboard) lose functionality.
+
+ To solve the first point I recommend creating a group for the /dev/vcsa*
+devices, something like:
+
+ $ addgroup vcs
+
+ Then add the user/s you want to give access to the device:
+
+ $ addgroup user vcs
+
+ Finally change the /dev/vcs* right and owner like this:
+
+ $ chown root.vcs /dev/vcs*
+ $ chmod 0660 /dev/vcs*
+
+ In this way you can control which users can read or write the screen using
+these devices.
+ The second point is simple: run the application without using programs like
+midnight commander.
+ When the application runs in the real console you can:
+
+1) Change the fonts.
+2) Find information about the screen and input encoding.
+3) Get good information about keyboard modifiers (shift, control, alt, etc.).
+
+
+2. THE KEYBOARD
+
+ The library uses the keyboard in "cook mode", this is much more safe than
+using "raw mode" and in this way all the keyboard configuration is honored.
+But this have a drawback: the information from the keyboard is incomplete and
+some keys are used by the kernel.
+ To solve the first issue this driver uses a Linux IOCTL that return the
+current state of keyboard modifiers (like shift). The IOCTLs only work if the
+process owns the real console. It won't work if you run the application using
+a remote connection (i.e. ssh) or something like midnight commander.
+ The second problem is more complex. Some common keys, like Shift+PgUp or
+Alt+Function_key, are used for special purposes. IMHO this is a bad idea, but
+is a fact. In order to solve this problem this driver modifies the kernel
+tables a little bit. When you switch to another console or normally exit the
+application this reverted. If it fails the solution is to reload the keyboard
+map. Use the loadkeys command for it.
+ For this reason you can't switch to another console using Alt+Fx, use
+Ctrl+Alt+Fx, as you do when running X.
+ Note that this driver *doesn't* uses ncurses nor parses the terminal
+description. It means this: if you force Delete to report a strange escape
+sequence and put this information in the terminfo database it won't work. It
+will work for other applications, but not for this driver.
+ Why not ncurses? ncurses is bulky and unpredictable, we had too much
+problems using ncurses. Currently ncurses is only used by the generic UNIX
+driver.
+ Why not reading terminfo/termcap information? this information usually have
+errors and needs a lot of code.
+
+
+3. ENCODINGS AND FONTS
+
+ Linux have a complex and flexible mechanism to support the different text
+encondings (code pages). But this is wrongly used by the console-tools
+(formerly kbd) tools and Linux distributions. This generates a lot of
+problems. Another issue is that Linux kernel is wrongly designed, you have
+services to setup things but you don't have the mechanism to know (and save)
+the current state. It gets even worst when you use escape sequences and you
+don't have access to the IOCTLs.
+ The first thing you must understand is that code pages concept doesn't
+exist for the Linux kernel. This is quite different to DOS, Windows, MacOS,
+etc. where you have fixed encodings with known names. What Linux understands
+are just translation tables. Usually people uses some tables that are quite
+common, but sometimes these tables changes or are just adjusted by a vendor.
+A complete explanation about this topic is outside the scope of this
+document, If you want to know more about this topic read the html
+documentation included with console-tools. What I'll describe here is just a
+simplification.
+
+3.1 TABLES TO TRANSLATE WHAT?
+
+ Most applications, Turbo Vision applications included, uses 8 bits
+characters. It gives 256 possible combinations, but: what exactly means each
+one? it depends on the system. To avoid problems some standars exists. DOS
+uses some IBM/ANSI encodings like code page 437, 850, 866, etc., Windows uses
+another set of code pages created by Microsoft (code pages 1250, 1251, etc.)
+and most UNIX systems uses enconding described in the ISO 8859 standard.
+ In this way a document is:
+
+1) Compact, each character/letter needs one byte.
+2) Exchangeable, you can use documents from other system just knowing which
+encoding is used.
+
+ But this scheme isn't enough to represent all possible characters of
+languages like chinese, japanese, etc. To represent these things you need an
+extended system. Unicode is a really complex mechanism to achieve it. Unicode
+implies a lot of complex things, but the most widely used thing is the
+ability to reprsent the most common languages used in the world using a
+standarized mechanism.
+ The Linux kernel currently uses Unicode (16 bits variant) for internal
+purposes. You can also enter text using the UTF-8 mechanism, that's a special
+way to encode Unicode using variable length characters.
+ What Linux does is: when a character is received by the kernel it is
+converted into Unicode (first table), it is processed and when the kernel
+needs to print it the value is converted to 1 byte (second table, this isn't
+in fact a table).
+ The first conversion is from the application encoding to Unicode and the
+second is from Unicode to the screen encoding.
+ Here you can see the first complexity: the application can be encoded in a
+way and the screen in another. For stupid reasons is quite common to use it
+in Linux systems. The reasons are all stupid and the result is a waste of
+performance and added complexity.
+ You can skip this paragraph if you don't want to know about some of the
+stupid things common to almost all Linux systems. One of the problems people
+faced in the past was that VGA video controller uses 8 pixels width fonts,
+but they are represented as 9 pixels in the screen. What's in the 9th column?
+It depends on the value to represent, usually it is filled with a blank
+column, it helps to keep the characters visually separated. But a particular
+range of values uses the same information found in the 8th column. This range
+corresponds to the graphics used for frames in the code page 437, that's
+because the boards have a 437 encoding by default. This range is used by ISO
+8859 standard and the result is that linux encodings have the frames in the
+range where the 9th column is blanked. This generates ugly frames. The real
+solution for that is to just modifiy the VGA registers to create a video mode
+where characters have 8 pixels. It also have a plus: you gain a couple of
+columns that could be used by the kernel and/or the user. But lamentably
+people uses a wrong approach. Instead of it a tweaked encoding is used. This
+is the difference between lat1 and lat1u fonts. Another lamentably fact is
+that newer packages (Debian Potato and Woody for example) have files called
+lat1* that are in fact the tweacked lat1u* files. Another stupid thing is the
+fact that most Linux distros doesn't load a font, all of them should load ISO
+8859-1 because that's what the applications uses by default. Usually distros
+just let the 437 default BIOS encoding, it only generates confusion and
+avoids the use of a bypass for the translations. The bypass is possible
+because ISO 8859-1 is a subset of Unicode (the first 256 values).
+ Ok, again in the topic: the first table is what is called ACM (Application
+Charset Map) and the second is called SFM (Screen Font Map).
+ The first is a real table, it maps one to one. A value from the application
+(8 bits) is translated into an Unicode value (16 bits in this case). The
+second isn't a real table because more than one Unicode value can be
+represented by the same drawing (similar or identical, remmember Unicode is
+much more than an encoding). Things are even more complex because a table
+with 65536 entries isn't a good idea. For this reason this map is more
+complex and the kernel doesn't use a table.
+
+3.2 WHY IS THAT A PROBLEM IF ALL LINUX APPLICATIONS WORKS OK?
+
+ The main problem appears when you want to access to the screen using the
+/dev/vcs* devices. In this case you are bypassing the kernel translation.
+ Another problem appears if you have to know more about the text you are
+handling. The C locales mechanism is useless because it only covers really
+standard code pages.
+ Most Linux applications:
+1) Uses a slow screen output, after all most of them have a crappy look.
+2) Doesn't really know much about encodings, just know how to draw the
+frames.
+
+3.3 WHAT'S THE PROBLEM?
+
+ At first sight it just looks complex, but not impossible. After all doesn't
+really matters if these tables follows an standard or not if you can analyze
+them.
+ But things are more complex. This information is only available using
+IOCTLs so you can't do it when using a remote console. Currently the library
+just does a guess using the contents of the LANG environment variable. If
+this guess is wrongly done just use the the configuration file (tvrc).
+ Another problem is that some maps wrongly done. The KOI8-R is a good
+example. Here the ACM doesn't translate the input into Unicode, instead the
+text passes without change (or a very small change in some systems, to make
+things even worst). It works because the SFM is also wrong and in fact is a
+KOI-8R->Screen conversion and not Unicode->Screen. You get a table that is
+supposed to be encoded in Unicode but it isn't.
+ The driver anlyze the code page and tries to figure out what encodings are
+used but it can fail. If it doesn't work for your system please contact me
+and we will try to find some solution.
+
+3.4 HOW TO FORCE THE ENCODINGS
+
+ If you know how your system is encoded look for the closest code page
+supported by Turbo Vision, they are defined in codepage.cc, and create a
+configuration file indicating the encoding.
+ The configuration variables used for it are: AppCP and ScrCP. The first is
+the equivalent to the ACM and the second is like the SFM.
+ To force KOI8-R you can use:
+
+[TV]
+{
+ [Linux]
+ {
+ AppCP=100000
+ ScrCP=100000
+ }
+}
+
+
+4. SECONDARY FONT AND SYSTEMS WITH 512 CHARACTERS
+
+ Linux supports loading an extended font with 512 characters instead of 256.
+This isn't currently supported by this driver because things are all 8 bits.
+I don't really know the result. If you use such a system please contact me.
+ Turbo Vision now supports loading fonts and you can use it if you are
+running in the Linux console. TV also supports loading a secondary font. This
+can be used for very special cases. To achieve it the driver uses a 512
+characters font, the first 256 for the primary font and the other 256 for the
+secondary. By default this is disabled because the kernel reduces the colors
+to 8 when you load a 512 characters font. This is quite logical when the 512
+symbols belongs to one big encoding but really annoying when they are two
+different fonts. To enable it use the UseSecondaryFont configuration
+variable.
+ Note: The PC VGA controller uses eight bits for color attributes. Four are
+used for the foreground color and the other four for the background color. It
+gives sixteen colors. But the most significant bit of each color have a
+second meaning that can be optionally enabled. The fourth bit of the
+background is used for blinking and the fourth bit of the foreground is used
+to select a second set of characters. This is why Linux reduces the colors to
+eight, but the bit still working, you can still using sixteen colors. The
+last is what TV uses. What Linux does is to redefine the colors to be the
+same and disables any attempt to reprogram the palette entries to these
+colors.
+
+
+5. CONFIGURATION VARIABLES
+
+ This driver supports the following variables:
+
+* AppCP, ScrCP and InpCP. The point 3 explains the first two. The InpCP is to
+force the encoding of the keyboard and isn't usually needed.
+* UseSecondaryFont explained in 4.
+* LoadSecondaryFont: Request a secondary font to the application (must
+provide a call back).
+* UseVCS. This is one by default and can be used to disable the use of
+/dev/vcsa* devices.
+* UseMDA. This is one by default and can be used to disable the use of the
+monochrome display.
+* PatchKeys. This is one by default and can be used to disable the keyboard
+patching explained in 2.
+* BrokenCursorShape. This is one by default and can be used to indicate we
+are using a broken console where the cursor shape can't be changed. This
+happends with some frame buffer consoles that fails to implement it.
+
+ An example of configuration file is shown in 3.4.
+ Read the ConfigFile.txt for more information about configuration files.
+