kbds.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /*
  2. * This file is part of the UCB release of Plan 9. It is subject to the license
  3. * terms in the LICENSE file found in the top-level directory of this
  4. * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
  5. * part of the UCB release of Plan 9, including this file, may be copied,
  6. * modified, propagated, or distributed except according to the terms contained
  7. * in the LICENSE file.
  8. */
  9. #include <u.h>
  10. #include <libc.h>
  11. #include "compat.h"
  12. #include "kbd.h"
  13. #include "ksym2utf.h"
  14. enum
  15. {
  16. VKSpecial = 0xff00,
  17. /*
  18. * plan 9 key mappings
  19. */
  20. Spec= 0xF800,
  21. PF= Spec|0x20, /* num pad function key */
  22. View= Spec|0x00, /* view (shift window up) */
  23. KF= 0xF000, /* function key (begin Unicode private space) */
  24. Shift= Spec|0x60,
  25. Break= Spec|0x61,
  26. Ctrl= Spec|0x62,
  27. Latin= Spec|0x63,
  28. Caps= Spec|0x64,
  29. Num= Spec|0x65,
  30. Middle= Spec|0x66,
  31. No= 0x00, /* peter */
  32. Home= KF|13,
  33. Up= KF|14,
  34. Pgup= KF|15,
  35. Print= KF|16,
  36. Left= KF|17,
  37. Right= KF|18,
  38. End= '\r',
  39. Down= View,
  40. Pgdown= KF|19,
  41. Ins= KF|20,
  42. Del= 0x7F,
  43. Scroll= KF|21,
  44. Esc = 0x1b,
  45. Delete = 0x7f,
  46. };
  47. static Rune vnckeys[] =
  48. {
  49. [0x00] No, No, No, No, No, No, No, No,
  50. [0x08] '\b', '\t', '\r', No, No, '\n', No, No,
  51. [0x10] No, No, No, No, Scroll, No, No, No,
  52. [0x18] No, No, No, Esc, No, No, No, No,
  53. [0x20] No, No, No, No, No, No, No, No,
  54. [0x28] No, No, No, No, No, No, No, No,
  55. [0x30] No, No, No, No, No, No, No, No,
  56. [0x38] No, No, No, No, No, No, No, No,
  57. [0x40] No, No, No, No, No, No, No, No,
  58. [0x48] No, No, No, No, No, No, No, No,
  59. [0x50] Home, Left, Up, Right, Down, Pgup, Pgdown, No,
  60. [0x58] No, No, No, No, No, No, No, No,
  61. [0x60] No, Print, No, Ins, No, No, No, No,
  62. [0x68] No, No, No, Break, No, No, No, No,
  63. [0x70] No, No, No, No, No, No, No, No,
  64. [0x78] No, No, No, No, No, No, No, Num,
  65. [0x80] No, No, No, No, No, No, No, No,
  66. [0x88] No, No, No, No, No, No, No, No,
  67. [0x90] No, No, No, No, No, No, No, No,
  68. [0x98] No, No, No, No, No, No, No, No,
  69. [0xa0] No, No, No, No, No, No, No, No,
  70. [0xa8] No, No, '*', '+', No, '-', '.', '/',
  71. [0xb0] '0', '1', '2', '3', '4', '5', '6', '7',
  72. [0xb8] '8', '9', No, No, No, '=', No, No,
  73. [0xc0] No, No, No, No, No, No, No, No,
  74. [0xc8] No, No, No, No, No, No, No, No,
  75. [0xd0] No, No, No, No, No, No, No, No,
  76. [0xd8] No, No, No, No, No, No, No, No,
  77. [0xe0] No, Shift, Shift, Ctrl, Ctrl, Caps, Caps, No,
  78. [0xe8] No, Latin, Latin, No, No, No, No, No,
  79. [0xf0] No, No, No, No, No, No, No, No,
  80. [0xf8] No, No, No, No, No, No, No, Delete,
  81. };
  82. /*
  83. * keyboard interrupt
  84. */
  85. void
  86. vncputc(int keyup, int c)
  87. {
  88. int i;
  89. static int esc1, esc2;
  90. static int alt, caps, ctl, num, shift;
  91. static int collecting, nk;
  92. static Rune kc[5];
  93. if(caps && c<='z' && c>='a')
  94. c += 'A' - 'a';
  95. /*
  96. * character mapping
  97. */
  98. if((c & VKSpecial) == VKSpecial){
  99. c = vnckeys[c & 0xff];
  100. if(c == No)
  101. return;
  102. }
  103. /*
  104. * map an xkeysym onto a utf-8 char
  105. */
  106. if((c & 0xff00) && c < nelem(ksym2utf) && ksym2utf[c] != 0)
  107. c = ksym2utf[c];
  108. /*
  109. * keyup only important for shifts
  110. */
  111. if(keyup){
  112. switch(c){
  113. case Latin:
  114. alt = 0;
  115. break;
  116. case Shift:
  117. shift = 0;
  118. break;
  119. case Ctrl:
  120. ctl = 0;
  121. break;
  122. }
  123. return;
  124. }
  125. /*
  126. * normal character
  127. */
  128. if(!(c & (Spec|KF))){
  129. if(ctl){
  130. c &= 0x1f;
  131. }
  132. if(!collecting){
  133. kbdputc(c);
  134. return;
  135. }
  136. kc[nk++] = c;
  137. c = latin1(kc, nk);
  138. if(c < -1) /* need more keystrokes */
  139. return;
  140. if(c != -1) /* valid sequence */
  141. kbdputc(c);
  142. else /* dump characters */
  143. for(i=0; i<nk; i++)
  144. kbdputc(kc[i]);
  145. nk = 0;
  146. collecting = 0;
  147. return;
  148. }else{
  149. switch(c){
  150. case Caps:
  151. caps ^= 1;
  152. return;
  153. case Num:
  154. num ^= 1;
  155. return;
  156. case Shift:
  157. shift = 1;
  158. return;
  159. case Latin:
  160. alt = 1;
  161. collecting = 1;
  162. nk = 0;
  163. return;
  164. case Ctrl:
  165. ctl = 1;
  166. return;
  167. }
  168. }
  169. kbdputc(c);
  170. }