kbds.c 3.3 KB

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