kbds.c 3.8 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 alt, caps, ctl, num, shift;
  90. static int collecting, nk;
  91. static Rune kc[5];
  92. if(caps && c<='z' && c>='a')
  93. c += 'A' - 'a';
  94. /*
  95. * character mapping
  96. */
  97. if((c & VKSpecial) == VKSpecial){
  98. c = vnckeys[c & 0xff];
  99. if(c == No)
  100. return;
  101. }
  102. /*
  103. * map an xkeysym onto a utf-8 char
  104. */
  105. if((c & 0xff00) && c < nelem(ksym2utf) && ksym2utf[c] != 0)
  106. c = ksym2utf[c];
  107. /*
  108. * keyup only important for shifts
  109. */
  110. if(keyup){
  111. switch(c){
  112. case Latin:
  113. alt = 0;
  114. break;
  115. case Shift:
  116. shift = 0;
  117. break;
  118. case Ctrl:
  119. ctl = 0;
  120. break;
  121. }
  122. return;
  123. }
  124. /*
  125. * normal character
  126. */
  127. if(!(c & (Spec|KF))){
  128. if(ctl){
  129. c &= 0x1f;
  130. }
  131. if(!collecting){
  132. kbdputc(c);
  133. return;
  134. }
  135. kc[nk++] = c;
  136. c = latin1(kc, nk);
  137. if(c < -1) /* need more keystrokes */
  138. return;
  139. if(c != -1) /* valid sequence */
  140. kbdputc(c);
  141. else /* dump characters */
  142. for(i=0; i<nk; i++)
  143. kbdputc(kc[i]);
  144. nk = 0;
  145. collecting = 0;
  146. return;
  147. }else{
  148. switch(c){
  149. case Caps:
  150. caps ^= 1;
  151. return;
  152. case Num:
  153. num ^= 1;
  154. return;
  155. case Shift:
  156. shift = 1;
  157. return;
  158. case Latin:
  159. alt = 1;
  160. collecting = 1;
  161. nk = 0;
  162. return;
  163. case Ctrl:
  164. ctl = 1;
  165. return;
  166. }
  167. }
  168. USED(shift), USED(alt);
  169. kbdputc(c);
  170. }