kbds.c 3.2 KB

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