Next Previous Contents

2. การพิมพ์ภาษาไทยผ่านคีย์บอร์ดและการแสดงผลภาษาไทยทางหน้าจอ

ในที่นี้จะแยกเป็นสองส่วนคือ Linux console และ X window. Linux console คือหน้าจอที่สามารถแสดงผลด้วยอักษรเท่านั้น ซึ่งวิธีการติดตั้งภาษาไทยใน Linux console จะแตกต่างกับ X window ในรายละเอียด แต่จะมีหลักการคล้ายกันคือ ถ้าต้องการแสดงผลภาษาไทยก็ให้ติดตั้งฟอนต์, ถ้าต้องการพิมพ์ภาษาไทยก็ให้เตรียมคีย์บอร์ดภาษาไทย.

2.1 Linux console

การแสดงผลภาษาไทยใน Linux console ยังไม่ดีเท่าที่ควร เนื่องจากบน Linux console สามารถแสดงอักษรเป็น cell ได้เท่านั้น. ซึ่งหากต้องการใช้ภาษาไทยใน Linux console ต้องมีการพัฒนาในจุดนี้. อย่างไรก็ตามเพราะว่าเรามักจะใช้ X window ส่วนใหญ่ปัญหาจุดนี้อาจจะไม่สำคัญนัก.

การติดตั้งฟอนต์ภาษาไทย

ผู้อ่านสามารถ download ฟอนต์ภาษาไทยสำหรับ Linux console ซึ่งสร้างโดย คุณไพศาล เตชะจารุวงศ์ได้ที่ ftp ของสื่อไทย.

สมมุติว่าผู้อ่านต้องการติดตั้งฟอนต์ที่ชื่อว่า "phaisan.psf". ให้เอาฟอนต์ที่ต้องการติดตั้งไปไว้ที่ไดเรกทอรี่ /usr/lib/kbd/consolefonts/ แล้วเรียกคำสั่งใช้ฟอนต์ใหม่นี้ด้วยคำสั่ง

% setfont phaisarn.psf
คำสั่งนี้ต้องสั่งจาก Linux console เท่านั้น.

คีย์บอร์ดภาษาไทย

ผู้อ่านสามารถทำคีย์บอร์ดให้มีพฤติกรรมได้ตามที่ต้องการด้วยคำสั่ง loadkeys. โดยปรกติแล้ว loadkeys จะเปลี่ยนพฤติกรรมคีย์บอร์ดตามรายละเอียดที่ระบุในไฟล์ที่อยู่ที่ /usr/lib/kbd/keytables. ผู้อ่านสามารถสร้างไฟล์ US/Thai keyboard-map และบันทึกไว้ในไดเรกทอรี่ดังกล่าวตามตัวอย่าง

# thai.map
# This thai.map was modified by Poonlap Veeratanabutr (poon-v@fedu.uec.ac.jp)
# from us.map. Map Thai Kedmanee keyboard to US keyboard.
# 28 April 1997
# Thai/Us toggle key is AltGr(right alt).
keycode   0 =
keycode   1 = Escape           Escape          
        alt     keycode   1 = Meta_Escape     
keycode   2 = +one              exclam          +0x0e5          plus         
        alt     keycode   2 = Meta_one        
        alt shift keycode 2 = Meta_exclam
keycode   3 = +two              at              +slash          0x0f1              
        control keycode   3 = nul        
        control shift keycode 3 = nul     
        alt     keycode   3 = Meta_two        
        alt shift keycode 3 = Meta_at
keycode   4 = +three            numbersign      +underscore     0x0f2
        control keycode   4 = Escape          
        alt     keycode   4 = Meta_three      
        alt shift keycode 4 = Meta_numbersign
keycode   5 = +four             dollar          +0x0c0          0x0f3
        control keycode   5 = Control_backslash
        alt     keycode   5 = Meta_four      
        alt shift keycode 5 = Meta_dollar 
keycode   6 = +five             percent         +0x0b6          0x0f4
        control keycode   6 = Control_bracketright
        alt     keycode   6 = Meta_five  
        alt shift keycode 6 = Meta_percent     
keycode   7 = +six              asciicircum     +0x0d8          0x0d9
        control keycode   7 = Control_asciicircum
        alt     keycode   7 = Meta_six    
        alt shift keycode 7 = Meta_asciicircum    
keycode   8 = +seven            ampersand       +0x0d6          0x0df
        control keycode   8 = Control_underscore
        alt     keycode   8 = Meta_seven      
keycode   9 = +eight            asterisk        +0x0a4          0x0f5
        control keycode   9 = Delete          
        alt     keycode   9 = Meta_eight      
keycode  10 = +nine             parenleft       +0x0b5          0x0d6
        alt     keycode  10 = Meta_nine       
keycode  11 = +zero             parenright      +0x0a8          0x0f7
        alt     keycode  11 = Meta_zero       
keycode  12 = +minus            underscore      +0x0a2          0x0f8
        control keycode  12 = Control_underscore
        control shift keycode 12 = Control_underscore
        alt     keycode  12 = Meta_minus      
keycode  13 = +equal            plus            +0x0aa          0x0f9
        alt     keycode  13 = Meta_equal      
keycode  14 = Delete           Delete           Delete          Delete
        alt     keycode  14 = Meta_Delete     
keycode  15 = Tab              Tab              Tab             Tab
        alt     keycode  15 = Meta_Tab        
keycode  16 = +q        Q       +0x0e6          0x0f0  
keycode  17 = +w        W       +0x0e4          quotedbl
keycode  18 = +e        E       +0x0d3          0x0ae              
keycode  19 = +r        R       +0x0be          0x0b1
keycode  20 = +t        T       +0x0d0          0x0b8
keycode  21 = +y        Y       +0x0d1          0x0ed
keycode  22 = +u        U       +0x0d5          0x0ea
keycode  23 = +i        I       +0x0c3          0x0b3
keycode  24 = +o        O       +0x0b9          0x0cf
keycode  25 = +p        P       +0x0c2          0x0ad
keycode  26 = +bracketleft      braceleft       +0x0ba          0x0b0
        control keycode  26 = Escape          
        alt     keycode  26 = Meta_bracketleft
        alt shift keycode 26 = Meta_braceleft
keycode  27 = +bracketright     braceright      +0x0c5          comma
        control keycode  27 = Control_bracketright
        alt     keycode  27 = Meta_bracketright
        alt shift keycode 27 = Meta_braceright
keycode  28 = Return            Return          Return          Return
        alt     keycode  28 = 0x080d          
keycode  29 = Control           Control         Control         Control
keycode  30 = +a        A       +0x0bf          0x0c4
keycode  31 = +s        S       +0x0cb          0x0a6
keycode  32 = +d        D       +0x0a1          0x0af
keycode  33 = +f        F       +0x0b4          0x0e2
keycode  34 = +g        G       +0x0e0          0x0ac
keycode  35 = +h        H       +0x0e9          0x0e7
keycode  36 = +j        J       +0x0e8          0x0eb
keycode  37 = +k        K       +0x0d2          0x0c9
keycode  38 = +l        L       +0x0ca          0x0c8
keycode  39 = +semicolon        colon           +0x0c7          0x0ab
        alt     keycode  39 = Meta_semicolon  
keycode  40 = +apostrophe       quotedbl        +0x0a7          period
        control keycode  40 = Control_g       
        alt     keycode  40 = Meta_apostrophe 
keycode  41 = +grave            asciitilde      +minus          percent
        control keycode  41 = nul             
        alt     keycode  41 = Meta_grave      
keycode  42 = Shift            Shift            Shift           Shift
keycode  43 = +backslash        bar             +0x0a3          0x0a5
        control keycode  43 = Control_backslash
        alt     keycode  43 = Meta_backslash  
        alt shift keycode 43 = Meta_bar
keycode  44 = +z        Z       +0x0bc          parenleft              
keycode  45 = +x        X       +0x0bb          parenright              
keycode  46 = +c        C       +0x0e1          0x0a9
keycode  47 = +v        V       +0x0cd          0x0ce
keycode  48 = +b        B       +0x0d4          0x0da
keycode  49 = +n        N       +0x0d7          0x0ec
keycode  50 = +m        M       +0x0b7          question              
keycode  51 = +comma    less    +0x0c1          0x0b2
        alt     keycode  51 = Meta_comma      
        alt shift keycode 51 = Meta_less
keycode  52 = +period           greater         +0x0e3          0x0cc
        alt     keycode  52 = Meta_period     
        alt shift keycode 52 = Meta_greater
keycode  53 = +slash            question        +0x0bd          0x0c6
        control keycode  53 = Delete          
        alt     keycode  53 = Meta_slash      
keycode  54 = Shift            Shift            Shift           Shift
keycode  55 = KP_Multiply     
keycode  56 = Alt              Alt              Alt             Alt 
keycode  57 = space            space            space           space
        control keycode  57 = nul             
        alt     keycode  57 = Meta_space      
keycode  58 = Caps_Lock        Caps_Lock        Caps_Lock       Caps_Lock
keycode  59 = F1               F11              Console_13      
        control keycode  59 = F1              
        alt     keycode  59 = Console_1       
        control alt     keycode  59 = Console_1       
keycode  60 = F2               F12              Console_14      
        control keycode  60 = F2              
        alt     keycode  60 = Console_2       
        control alt     keycode  60 = Console_2       
keycode  61 = F3               F13              Console_15      
        control keycode  61 = F3              
        alt     keycode  61 = Console_3       
        control alt     keycode  61 = Console_3       
keycode  62 = F4               F14              Console_16      
        control keycode  62 = F4              
        alt     keycode  62 = Console_4       
        control alt     keycode  62 = Console_4       
keycode  63 = F5               F15              Console_17      
        control keycode  63 = F5              
        alt     keycode  63 = Console_5       
        control alt     keycode  63 = Console_5       
keycode  64 = F6               F16              Console_18      
        control keycode  64 = F6              
        alt     keycode  64 = Console_6       
        control alt     keycode  64 = Console_6       
keycode  65 = F7               F17              Console_19      
        control keycode  65 = F7              
        alt     keycode  65 = Console_7       
        control alt     keycode  65 = Console_7       
keycode  66 = F8               F18              Console_20      
        control keycode  66 = F8              
        alt     keycode  66 = Console_8       
        control alt     keycode  66 = Console_8       
keycode  67 = F9               F19              Console_21      
        control keycode  67 = F9              
        alt     keycode  67 = Console_9       
        control alt     keycode  67 = Console_9       
keycode  68 = F10              F20              Console_22      
        control keycode  68 = F10             
        alt     keycode  68 = Console_10      
        control alt     keycode  68 = Console_10      
keycode  69 = Num_Lock        
keycode  70 = Scroll_Lock      Show_Memory      Show_Registers  
        control keycode  70 = Show_State      
        alt     keycode  70 = Scroll_Lock     
keycode  71 = KP_7            
        alt     keycode  71 = Ascii_7         
keycode  72 = KP_8            
        alt     keycode  72 = Ascii_8         
keycode  73 = KP_9            
        alt     keycode  73 = Ascii_9         
keycode  74 = KP_Subtract     
keycode  75 = KP_4            
        alt     keycode  75 = Ascii_4         
keycode  76 = KP_5            
        alt     keycode  76 = Ascii_5         
keycode  77 = KP_6            
        alt     keycode  77 = Ascii_6         
keycode  78 = KP_Add          
keycode  79 = KP_1            
        alt     keycode  79 = Ascii_1         
keycode  80 = KP_2            
        alt     keycode  80 = Ascii_2         
keycode  81 = KP_3            
        alt     keycode  81 = Ascii_3         
keycode  82 = KP_0            
        alt     keycode  82 = Ascii_0         
keycode  83 = KP_Period       
        altgr   control keycode  83 = Boot            
        control alt     keycode  83 = Boot            
keycode  84 = Last_Console    
keycode  85 =
keycode  86 = less             greater          bar             
        alt     keycode  86 = Meta_less       
keycode  87 = F11              F11              Console_23      
        control keycode  87 = F11             
        alt     keycode  87 = Console_11      
        control alt     keycode  87 = Console_11      
keycode  88 = F12              F12              Console_24      
        control keycode  88 = F12             
        alt     keycode  88 = Console_12      
        control alt     keycode  88 = Console_12      
keycode  89 =
keycode  90 =
keycode  91 =
keycode  92 =
keycode  93 =
keycode  94 =
keycode  95 =
keycode  96 = KP_Enter        
keycode  97 = Control         
keycode  98 = KP_Divide       
keycode  99 = Control_backslash
        control keycode  99 = Control_backslash
        alt     keycode  99 = Control_backslash
keycode 100 = AltGr_Lock           
keycode 101 = Break           
keycode 102 = Find            
keycode 103 = Up              
keycode 104 = Prior           
        shift   keycode 104 = Scroll_Backward 
keycode 105 = Left            
        alt     keycode 105 = Decr_Console
keycode 106 = Right
        alt     keycode 106 = Incr_Console
keycode 107 = Select          
keycode 108 = Down            
keycode 109 = Next            
        shift   keycode 109 = Scroll_Forward  
keycode 110 = Insert          
keycode 111 = Remove          
        altgr   control keycode 111 = Boot            
        control alt     keycode 111 = Boot            
keycode 112 =
keycode 113 =
keycode 114 =
keycode 115 =
keycode 116 =
keycode 117 =
keycode 118 =
keycode 119 =
keycode 120 =
keycode 121 =
keycode 122 =
keycode 123 =
keycode 124 =
keycode 125 =
keycode 126 =
keycode 127 =
string F1 = "\033[[A"
string F2 = "\033[[B"
string F3 = "\033[[C"
string F4 = "\033[[D"
string F5 = "\033[[E"
string F6 = "\033[17~"
string F7 = "\033[18~"
string F8 = "\033[19~"
string F9 = "\033[20~"
string F10 = "\033[21~"
string F11 = "\033[23~"
string F12 = "\033[24~"
string F13 = "\033[25~"
string F14 = "\033[26~"
string F15 = "\033[28~"
string F16 = "\033[29~"
string F17 = "\033[31~"
string F18 = "\033[32~"
string F19 = "\033[33~"
string F20 = "\033[34~"
string Find = "\033[1~"
string Insert = "\033[2~"
string Remove = "\033[3~"
string Select = "\033[4~"
string Prior = "\033[5~"
string Next = "\033[6~"
string F21 = ""
string F22 = ""
string F23 = ""
string F24 = ""
string F25 = ""
string F26 = ""
สมมติว่าผู้อ่านบันทึกไฟล์ตัวอย่างเป็นชื่อ thai.map. จากนั้นสามารถเซ็ตคีย์บอร์ดภาษาไทยจาก Linux console ได้ด้วยคำสั่ง
% loadkeys thai.map
keycode คือตัวเลขที่ได้รับจากคีย์บอรด์เมื่อกดคีย์นั้นๆ. จากไฟล์ thai.map บรรทัดที่เขียนว่า
keycode 100 = AltGr_Lock           
เป็นการกำหนดให้คีย์ที่เป็นตัวสลับคีย์บอร์ดระหว่างภาษาไทยกับภาษาอังกฤษคือ keycode 100 ซึ่งหมายถึง Alt คีย์ที่อยู่ทางขวาของคีย์บอร์ด(Right-Alt)นั่นเอง. เราลองมาดูส่วนอื่นๆของไฟล์นี้อีกเล็กน้อย, ตัวอย่าง
keycode  30 = +a        A       +0x0bf          0x0c4
AltGr_Lock จะเกี่ยวข้องกับข้อความเหล่านี้คือ เวลากดคีย์ที่มีค่า keycode เป็น 30 ก็จะได้ผลลัพธ์เป็น "a". ถ้ากดคีย์นี้พร้อมกับ Shift ก็จะได้ผลลัพธ์เป็น "A". ถ้ากดคีย์ Right-Alt ก็จะเปลี่ยนมาใช้รหัสตัวที่สามคือ เมื่อกด "a" ผลลัพธ์ที่ได้จะเป็น "ฟ"(0x0bf) และถ้ากด "a" กับ Shift จะได้ผลลัพธ์เป็น "ฤ"(0x0c4). ถ้ากด Right-Alt อีกทีจะเป็นการเปลี่ยนมาใช้คีย์บอร์ดภาษาอังกฤษอย่างเดิม.

2.2 X Window system

การติดตั้งฟอนต์ภาษาไทย

ผู้อ่านสามารถ download ฟอนต์ภาษาไทยสำหรับ X window ซึ่งโดยทั่วๆไปจะอยู่ในรูปของ .bdf หรือ .pcf จากอินเทอร์เน็ต. ผู้อ่านยังสามารถใช้ฟอนต์แบบเปลี่ยนขนาดได้เช่น Type1 หรือ TrueType ซึ่งจะไม่อธิบายในที่นี้.

ต่อไปนี้เป็นตัวอย่างการติดตั้งฟอนต์ในไดเรกทอรี่ /usr/X11R6/lib/X11/fonts/misc/ ซึ่งเป็น default directory ของฟอนต์ใน X window. ผู้อ่านต้อง login เป็น root และนำฟอนต์ที่ download มาไปไว้ที่ /usr/X11R6/lib/X11/fonts/misc/ หลังจากนั้นให้เปลี่ยนไดเรกทอรี่ไปที่ไดเรกทอรี่นั้นแล้วสั่งคำสั่ง

% mkfontdir
% xset fp rehash
ถ้าผู้อ่านไม่ได้เอาฟอนต์ใหม่ไว้ที่ไดเรกทอรี่ดังกล่าว, ผู้อ่านต้องใช้คำสั่ง xset เพิ่มไดเรกทอรี่ใหม่นั้นใน font path. ในกรณีนี้กรุณาอ่าน man page ของ xset เพิ่มเติม. หลังจากที่ใส่ฟอนต์ใหม่แล้ว, สามารถเช็คว่าสามารถใช้ฟอนต์ใหม่ได้หรือไม่โดยสั่งคำสั่ง xlsfonts เพื่อแสดงชื่อฟอนต์ที่มีในระบบ. ถ้ายังใช้ไม่ได้, อาจต้อง start X window ใหม่อีกครั้ง.

คีย์บอร์ดภาษาไทย

การทำคีย์บอร์ดภาษาไทยสามารถทำได้ 2 วิธีคือ ใช้ X Keyboard Extension protocol (XKB) หรือ xmodmap. ซึ่งผู้เขียนแนะนำให้ใช้ XKB เพราะสามารถเซ็ตได้ตอนที่ติดตั้ง X server.

การทำคีย์บอร์ดภาษาไทยด้วย XKB

การเซ็ต XKB โดยผ่านโปรแกรมเซ็ต X server.

ในช่วงที่ติดตั้ง X server โดยใช้ xf86config หรือโปรแกรมติดตั้ง X server อื่นๆ โปรแกรมจะถามว่าจะใช้ XKB หรือไม่, ให้ตอบตกลงและเลือกคีย์บอร์ดภาษาไทยจากรายการที่มีให้. เมื่อ configure เสร็จแล้วสามารถใช้ภาษาไทยได้โดยกดคีย์ LeftAlt และ RightShift พร้อมๆกัน. จากนั้นผู้ใช้สามารถพิมพ์ภาษาไทยลงในโปรแกรมที่ใช้ฟอนต์ภาษาไทยได้ทันที. ถ้าต้องการใช้คีย์บอร์ดภาษาอังกฤษให้กด LeftAlt และ LeftShift เพื่อเปลี่ยนคีย์บอร์ดให้อยู่ในสภาพเดิม. คีย์ที่กดนี้เป็น default ของระบบซึ่งผู้ใช้สามารถเปลี่ยนเป็นการกดคีย์อื่นๆได้.

XF86Setup เป็นโปรแกรมเซ็ต X server แบบ graphical user interface ที่มากับ Xfree86. ผู้อ่านสามารถเลือกคีย์ที่เปลี่ยนภาษาไทยได้จากโปรแกรมนี้.

คีย์แมป(keymap) สำหรับภาษาไทยที่ใช้กับ Xfree86-3.2 มีที่ผิดอยู่คือไม่สามารถพิมพ์ตัว "ถ" และ "ศ"ได้. ถ้าผู้อ่านประสบปัญหาเช่นนี้สามารถแก้ไขได้โดย เพิ่มบรรทัดต่อไปนี้

    key <AE05> {     [], [   paragraph,      ocircumflex     ]       };
ลงในไฟล์ /usr/X11R6/lib/X11/xkb/symbols/th ตามตัวอย่างข้างล่าง
.................
    key <AE03> {        [], [       minus,      ograve          ]       };
    key <AE04> {        [], [      Agrave,      oacute          ]       };
    key <AE05> {     [], [   paragraph,      ocircumflex     ]       };
    key <AE06> {        [], [    Ooblique,      Ugrave          ]       };
    key <AE07> {        [], [  Odiaeresis,      ssharp          ]       };
.................
และเปลี่ยนบรรทัด
    key <AC08> {        [], [      Ograve,      eacute          ]       };
ให้เป็น
    key <AC08> {        [], [      Ograve,      Eacute          ]       };

เพื่อเป็นการบอกสภาพคีย์บอร์ดว่าตอนนี้เป็นคีย์บอร์ดภาษาอะไรอยู่ ผู้อ่านสามารถใช้โปรแกรม xkbvled เป็นตัวบอกสถานะของคีย์บอร์ดได้. นอกจากนี้ยังมี XKB utilities อื่นๆอีกได้แก่ setxkbmap, xkbcomp เป็นต้น.

การเซ็ต XKB โดยการแก้ไฟล์ XF86Config.

อีกวิธีหนึ่งที่ใช้เซ็ต XKB คือการแก้ไฟล์ XF86Config โดยตรง. ต่อไปนี้เป็นตัวอย่างบางส่วนของไฟล์ /usr/X11R6/lib/X11/XF86Config ซึ่งเกี่ยวกับคีย์บอร์ด. ตามตัวอย่างบอกให้ X server ใช้ XKB และคีย์ที่เปลี่ยนภาษาไทยเป็นแบบ default.

Section "Keyboard"
   Protocol        "Standard"
   AutoRepeat      500 5
   LeftAlt         Meta
   RightAlt        Meta
   ScrollLock      Compose
   RightCtl        Control
#  XkbDisable
   XkbKeycodes     "xfree86"
   XkbTypes        "default"
   XkbCompat       "default"
   XkbSymbols      "us(pc101)"
   XkbGeometry     "pc"
   XkbRules        "xfree86"
   XkbModel        "pc101"
   XkbLayout       "th"
EndSection

การทำคีย์บอร์ดภาษาไทยโดยใช้ xmodmap

ผู้อ่านสามารถทำคีย์บอร์ดภาษาไทยได้อีกวิธีหนึ่งคือใช้ xmodmap แมปคีย์บอร์ดที่ใช้อยู่ให้เป็นภาษาไทย. โดยปรกติเมื่อใช้ X server ด้วยคำสั่ง startx, X server จะเรียกคำสั่งที่เขียนไว้ใน .xinitrc ก่อน ซึ่งไฟล์นี้เป็นไฟล์ที่ผู้ใช้สร้างขึ้นเองในโฮมไดเรกทอรี่(home directory). ถ้าไม่มีไฟล์นี้ X server จะไปรันคำสั่งที่เขียนในไฟล์ /usr/X11R6/lib/X11/xinit/xinitrc. สำหรับผู้ใช้ที่ login จาก xdm (X Display Manager) ก็มีหลักการคล้ายกันคือ X server จะเรียกคำสั่งที่อยู่ในไฟล์ .xsession, ถ้าไม่มีไฟล์นี้ก็จะไปหาไฟล์ของระบบ. เราเรียกไฟล์ .xinitrc และ .xsession ว่าเป็น initialization file.

#!/bin/sh
# $XConsortium: xinitrc.cpp,v 1.4 91/08/22 11:41:34 rws Exp $

userresources=$HOME/.Xresources
usermodmap=$HOME/.Xmodmap
sysresources=/usr/X11R6/lib/X11/xinit/.Xresources
sysmodmap=/usr/X11R6/lib/X11/xinit/.Xmodmap

# merge in defaults and keymaps

if [ -f $sysresources ]; then
    xrdb -merge $sysresources
fi

if [ -f $sysmodmap ]; then
    xmodmap $sysmodmap
fi

if [ -f $userresources ]; then
    xrdb -merge $userresources
fi

if [ -f $usermodmap ]; then
    xmodmap $usermodmap
fi
...
ตัวอย่างไฟล์ข้างต้นคือไฟล์ /usr/X11R6/lib/X11/xinit/xinitrc จะเห็นได้ว่ามีการเรียกคำสั่ง xmodmap เพื่อเซ็ตคีย์บอร์ดทุกครั้งที่ใช้ X window. ในกรณีนี้ผู้อ่านสามารถเตรียมไฟล์ .Xmodmap สำหรับคีย์บอร์ดภาษาไทยได้ดังนี้
!
! Linux/XFree86 Thai Kedmanee layout (based on US keyboard)
! by poon-v@fedu.uec.ac.jp
! Use ScrollLock to switch to Thai keyboard.
! This file will work with XFree86 only.
!

keycode 0x09 =  Escape
keycode 0x43 =  F1
keycode 0x44 =  F2
keycode 0x45 =  F3
keycode 0x46 =  F4
keycode 0x47 =  F5
keycode 0x48 =  F6
keycode 0x49 =  F7
keycode 0x4A =  F8
keycode 0x4B =  F9
keycode 0x4C =  F10
keycode 0x5F =  F11
keycode 0x60 =  F12
keycode 0x6F =  Print
keycode 0x4E =  Mode_switch     XF86ModeLock
keycode 0x6E =  Pause
keycode 0x31 =  grave           asciitilde      minus           percent
keycode 0x0A =  1               exclam          0x0e5           plus
keycode 0x0B =  2               at              slash           0x0f1
keycode 0x0C =  3               numbersign      underscore      0x0f2
keycode 0x0D =  4               dollar          0x0c0           0x0f3
keycode 0x0E =  5               percent         0x0b6           0x0f4
keycode 0x0F =  6               asciicircum     0x0d8           0x0d9
keycode 0x10 =  7               ampersand       0x0d6           0x0df
keycode 0x11 =  8               asterisk        0x0a4           0x0f5
keycode 0x12 =  9               parenleft       0x0b5           0x0f6
keycode 0x13 =  0               parenright      0x0a8           0x0f7
keycode 0x14 =  minus           underscore      0x0a2           0x0f8
keycode 0x15 =  equal           plus            0x0aa           0x0f9
keycode 0x33 =  backslash       bar             0x0a3           0x0a5
keycode 0x16 =  BackSpace
keycode 0x6A =  Insert
keycode 0x61 =  Home
keycode 0x63 =  Prior
keycode 0x4D =  Num_Lock
keycode 0x70 =  KP_Divide
keycode 0x3F =  KP_Multiply
keycode 0x52 =  KP_Subtract
keycode 0x17 =  Tab
keycode 0x18 =  q               Q               0x0e6           0x0f0
keycode 0x19 =  w               W               0x0e4           quotedbl
keycode 0x1A =  e               E               0x0d3           0x0ae
keycode 0x1B =  r               R               0x0be           0x0b1
keycode 0x1C =  t               T               0x0d0           0x0b8
keycode 0x1D =  y               Y               0x0d1           0x0ed
keycode 0x1E =  u               U               0x0d5           0x0ea
keycode 0x1F =  i               I               0x0c3           0x0b3
keycode 0x20 =  o               O               0x0b9           0x0cf
keycode 0x21 =  p               P               0x0c2           0x0ad
keycode 0x22 =  bracketleft     braceleft       0x0ba           0x0b0
keycode 0x23 =  bracketright    braceright      0x0c5           comma
keycode 0x24 =  Return
keycode 0x6B =  Delete
keycode 0x67 =  End
keycode 0x69 =  Next
keycode 0x4F =  KP_7
keycode 0x50 =  KP_8
keycode 0x51 =  KP_9
keycode 0x56 =  KP_Add
keycode 0x42 =  Caps_Lock
keycode 0x26 =  a               A               0x0bf           0x0c4
keycode 0x27 =  s               S               0x0cb           0c0a6
keycode 0x28 =  d               D               0x0a1           0x0af
keycode 0x29 =  f               F               0x0b4           0x0e2
keycode 0x2A =  g               G               0x0e0           0x0ac
keycode 0x2B =  h               H               0x0e9           0x0e7
keycode 0x2C =  j               J               0x0e8           0x0eb
keycode 0x2D =  k               K               0x0d2           0x0c9
keycode 0x2E =  l               L               0x0ca           0x0c8
keycode 0x2F =  semicolon       colon           0x0c7           0x0ab
keycode 0x30 =  apostrophe      quotedbl        0x0a7           period
keycode 0x53 =  KP_4
keycode 0x54 =  KP_5
keycode 0x55 =  KP_6
keycode 0x32 =  Shift_L
keycode 0x34 =  z               Z               0x0bc           parenleft
keycode 0x35 =  x               X               0x0bb           parenright
keycode 0x36 =  c               C               0x0e1           0x0a9
keycode 0x37 =  v               V               0x0cd           0x0ce
keycode 0x38 =  b               B               0x0d4           0x0da
keycode 0x39 =  n               N               0x0d7           0x0ec
keycode 0x3A =  m               M               0x0b7           question
keycode 0x3B =  comma           less            0x0c1           0x0b2
keycode 0x3C =  period          greater         0x0e3           0x0cc
keycode 0x3D =  slash           question        0x0bd           0x0c6
keycode 0x3E =  Shift_R
keycode 0x62 =  Up
keycode 0x57 =  KP_1
keycode 0x58 =  KP_2
keycode 0x59 =  KP_3
keycode 0x6C =  KP_Enter
keycode 0x25 =  Control_L
keycode 0x40 =  Alt_L           Meta_L
keycode 0x41 =  space
keycode 0x71 =  Alt_R           Meta_R
keycode 0x6D =  Control_R
keycode 0x64 =  Left
keycode 0x68 =  Down
keycode 0x66 =  Right
keycode 0x5A =  KP_0
keycode 0x5B =  KP_Decimal

clear Shift
clear Lock
clear Control
clear Mod1
clear Mod2
clear Mod3
clear Mod4
clear Mod5

add    Shift   = Shift_L Shift_R
add    Lock    = Caps_Lock
add    Control = Control_L Control_R
add    Mod1    = Alt_L Alt_R
add    Mod2    = Mode_switch
ให้บันทึกตัวอย่างไฟล์นี้เป็นชื่อ .Xmodmap ในโฮมไดเรกทอรี่ ไฟล์นี้สามารใช้ได้จากไฟล์ xinitrc หรือเรียกคำสั่ง xmodmap โดยตรงดังนี้
% xmodmap ~/.Xmodmap

จากตัวอย่างไฟล์ .Xmodmap ดังกล่าว, คีย์ที่ใช้สลับคีย์บอร์ดภาษาไทยกับอังกฤษคือ Scroll Lock (keycode 0x4E),

keycode 0x4E =  Mode_switch     XF86ModeLock
XF86ModeLock เป็น keysym พิเศษของ XFree86 X server ใช้สำหรับล็อกคีย์บอร์ดให้เป็นภาษาไทย. keycode ที่ใช้ในที่นี้เป็นตัวเลขเฉพาะของ XFree86 X server เพราะฉะนั้นถ้าใช้ commercial X server อื่นๆ ค่าของ keycode จะเปลี่ยนไปด้วย. ในกรณีที่ต้องการหาค่า keycode ของคีย์บอร์ดให้ใช้โปรแกรม xev. ผู้อ่านสามารถอ่านข้อมูลเพิ่มเติมได้จาก man page ของ X, xev และ xmodmap.

หมายเหตุ: ถ้าผู้อ่านใช้ XFree86 เวอร์ชั่น 3.1.2D เป็นต้นไป ต้องใส่คำสั่ง XkbDisable ในไฟล์ XF86Config เพื่อให้สามารถใช้ xmodmap ได้ตามตัวอย่าง

.....
Section "Keyboard"
   Protocol        "Standard"
   AutoRepeat      500 5
   LeftAlt         Meta
   RightAlt        ModeShift
   ScrollLock      ModeLock
   RightCtl        Compose
   XkbDisable
EndSection
.....


Next Previous Contents