goKey.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. // Copyright 2016 The go-vgo Project Developers. See the COPYRIGHT
  2. // file at the top-level directory of this distribution and at
  3. // https://github.com/go-vgo/robotgo/blob/master/LICENSE
  4. //
  5. // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
  6. // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
  7. // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
  8. // option. This file may not be copied, modified, or distributed
  9. // except according to those terms.
  10. #include "../base/types.h"
  11. // #include "keycode.h"
  12. // #include "keypress.h"
  13. #include "keypress_c.h"
  14. #include "keycode_c.h"
  15. int keyboardDelay = 10;
  16. struct KeyNames{
  17. const char* name;
  18. MMKeyCode key;
  19. }key_names[] = {
  20. { "backspace", K_BACKSPACE },
  21. { "delete", K_DELETE },
  22. { "enter", K_RETURN },
  23. { "tab", K_TAB },
  24. { "escape", K_ESCAPE },
  25. { "up", K_UP },
  26. { "down", K_DOWN },
  27. { "right", K_RIGHT },
  28. { "left", K_LEFT },
  29. { "home", K_HOME },
  30. { "end", K_END },
  31. { "pageup", K_PAGEUP },
  32. { "pagedown", K_PAGEDOWN },
  33. { "f1", K_F1 },
  34. { "f2", K_F2 },
  35. { "f3", K_F3 },
  36. { "f4", K_F4 },
  37. { "f5", K_F5 },
  38. { "f6", K_F6 },
  39. { "f7", K_F7 },
  40. { "f8", K_F8 },
  41. { "f9", K_F9 },
  42. { "f10", K_F10 },
  43. { "f11", K_F11 },
  44. { "f12", K_F12 },
  45. { "f13", K_F13 },
  46. { "f14", K_F14 },
  47. { "f15", K_F15 },
  48. { "f16", K_F16 },
  49. { "f17", K_F17 },
  50. { "f18", K_F18 },
  51. { "f19", K_F19 },
  52. { "f20", K_F20 },
  53. { "f21", K_F21 },
  54. { "f22", K_F22 },
  55. { "f23", K_F23 },
  56. { "f24", K_F24 },
  57. { "command", K_META },
  58. { "alt", K_ALT },
  59. { "control", K_CONTROL },
  60. { "shift", K_SHIFT },
  61. { "right_shift", K_RIGHTSHIFT },
  62. { "space", K_SPACE },
  63. { "printscreen", K_PRINTSCREEN },
  64. { "insert", K_INSERT },
  65. { "menu", K_MENU },
  66. { "audio_mute", K_AUDIO_VOLUME_MUTE },
  67. { "audio_vol_down", K_AUDIO_VOLUME_DOWN },
  68. { "audio_vol_up", K_AUDIO_VOLUME_UP },
  69. { "audio_play", K_AUDIO_PLAY },
  70. { "audio_stop", K_AUDIO_STOP },
  71. { "audio_pause", K_AUDIO_PAUSE },
  72. { "audio_prev", K_AUDIO_PREV },
  73. { "audio_next", K_AUDIO_NEXT },
  74. { "audio_rewind", K_AUDIO_REWIND },
  75. { "audio_forward", K_AUDIO_FORWARD },
  76. { "audio_repeat", K_AUDIO_REPEAT },
  77. { "audio_random", K_AUDIO_RANDOM },
  78. { "numpad_0", K_NUMPAD_0 },
  79. { "numpad_1", K_NUMPAD_1 },
  80. { "numpad_2", K_NUMPAD_2 },
  81. { "numpad_3", K_NUMPAD_3 },
  82. { "numpad_4", K_NUMPAD_4 },
  83. { "numpad_5", K_NUMPAD_5 },
  84. { "numpad_6", K_NUMPAD_6 },
  85. { "numpad_7", K_NUMPAD_7 },
  86. { "numpad_8", K_NUMPAD_8 },
  87. { "numpad_9", K_NUMPAD_9 },
  88. { "lights_mon_up", K_LIGHTS_MON_UP },
  89. { "lights_mon_down", K_LIGHTS_MON_DOWN },
  90. { "lights_kbd_toggle",K_LIGHTS_KBD_TOGGLE },
  91. { "lights_kbd_up", K_LIGHTS_KBD_UP },
  92. { "lights_kbd_down", K_LIGHTS_KBD_DOWN },
  93. { NULL, K_NOT_A_KEY } /* end marker */
  94. };
  95. int CheckKeyCodes(char* k, MMKeyCode *key)
  96. {
  97. if (!key) return -1;
  98. if (strlen(k) == 1)
  99. {
  100. *key = keyCodeForChar(*k);
  101. return 0;
  102. }
  103. *key = K_NOT_A_KEY;
  104. struct KeyNames* kn = key_names;
  105. while (kn->name)
  106. {
  107. if (strcmp(k, kn->name) == 0)
  108. {
  109. *key = kn->key;
  110. break;
  111. }
  112. kn++;
  113. }
  114. if (*key == K_NOT_A_KEY)
  115. {
  116. return -2;
  117. }
  118. return 0;
  119. }
  120. int CheckKeyFlags(char* f, MMKeyFlags* flags)
  121. {
  122. if (!flags) return -1;
  123. if (strcmp(f, "alt") == 0)
  124. {
  125. *flags = MOD_ALT;
  126. }
  127. else if(strcmp(f, "command") == 0)
  128. {
  129. *flags = MOD_META;
  130. }
  131. else if(strcmp(f, "control") == 0)
  132. {
  133. *flags = MOD_CONTROL;
  134. }
  135. else if(strcmp(f, "shift") == 0)
  136. {
  137. *flags = MOD_SHIFT;
  138. }
  139. else if(strcmp(f, "none") == 0)
  140. {
  141. *flags = (MMKeyFlags) MOD_NONE;
  142. }
  143. else
  144. {
  145. return -2;
  146. }
  147. return 0;
  148. }
  149. int GetFlagsFromValue(char* value[], MMKeyFlags* flags, int num){
  150. if (!flags) {return -1;}
  151. int i;
  152. for ( i= 0; i <num; i++){
  153. MMKeyFlags f = MOD_NONE;
  154. const int rv = CheckKeyFlags(value[i], &f);
  155. if (rv) return rv;
  156. *flags = (MMKeyFlags)(*flags | f);
  157. }
  158. return 0;
  159. // return CheckKeyFlags(fstr, flags);
  160. }
  161. // If it's not an array, it should be a single string value.
  162. char* key_Tap(char *k, char* keyArr[], int num, int keyDelay){
  163. MMKeyFlags flags = MOD_NONE;
  164. // MMKeyFlags flags = 0;
  165. MMKeyCode key;
  166. switch(GetFlagsFromValue(keyArr, &flags, num)){
  167. // switch (CheckKeyFlags(akey, &flags)){
  168. case -1:
  169. return "Null pointer in key flag.";
  170. break;
  171. case -2:
  172. return "Invalid key flag specified.";
  173. break;
  174. }
  175. switch(CheckKeyCodes(k, &key)){
  176. case -1:
  177. return "Null pointer in key code.";
  178. break;
  179. case -2:
  180. return "Invalid key code specified.";
  181. break;
  182. default:
  183. tapKeyCode(key, flags);
  184. microsleep(keyDelay);
  185. }
  186. return "0";
  187. }
  188. char* key_tap(char *k, char *akey, char *keyT, int keyDelay){
  189. MMKeyFlags flags = (MMKeyFlags) MOD_NONE;
  190. // MMKeyFlags flags = 0;
  191. MMKeyCode key;
  192. // char *k;
  193. // k = *kstr;
  194. if (strcmp(akey, "null") != 0){
  195. if (strcmp(keyT, "null") == 0){
  196. switch (CheckKeyFlags(akey, &flags)){
  197. case -1:
  198. return "Null pointer in key flag.";
  199. break;
  200. case -2:
  201. return "Invalid key flag specified.";
  202. break;
  203. }
  204. }else{
  205. char* akeyArr[2] = {akey, keyT};
  206. switch(GetFlagsFromValue(akeyArr, &flags, 2)){
  207. case -1:
  208. return "Null pointer in key flag.";
  209. break;
  210. case -2:
  211. return "Invalid key flag specified.";
  212. break;
  213. }
  214. }
  215. }
  216. switch(CheckKeyCodes(k, &key)){
  217. case -1:
  218. return "Null pointer in key code.";
  219. break;
  220. case -2:
  221. return "Invalid key code specified.";
  222. break;
  223. default:
  224. tapKeyCode(key, flags);
  225. microsleep(keyDelay);
  226. }
  227. return "0";
  228. }
  229. char* key_toggle(char *k, char *d, char *akey, char *keyT){
  230. MMKeyFlags flags = (MMKeyFlags) MOD_NONE;
  231. MMKeyCode key;
  232. bool down;
  233. // char *k;
  234. // k = *kstr;
  235. if (d != 0){
  236. // char *d;
  237. // d = *dstr;
  238. if (strcmp(d, "down") == 0){
  239. down = true;
  240. }else if (strcmp(d, "up") == 0){
  241. down = false;
  242. }else{
  243. return "Invalid key state specified.";
  244. }
  245. }
  246. if (strcmp(akey, "null") != 0){
  247. if (strcmp(keyT, "null") == 0){
  248. switch (CheckKeyFlags(akey, &flags)){
  249. case -1:
  250. return "Null pointer in key flag.";
  251. break;
  252. case -2:
  253. return "Invalid key flag specified.";
  254. break;
  255. }
  256. }else{
  257. char* akeyArr[2] = {akey, keyT};
  258. switch (GetFlagsFromValue(akeyArr, &flags, 2))
  259. {
  260. case -1:
  261. return "Null pointer in key flag.";
  262. break;
  263. case -2:
  264. return "Invalid key flag specified.";
  265. break;
  266. }
  267. }
  268. }
  269. switch(CheckKeyCodes(k, &key)){
  270. case -1:
  271. return "Null pointer in key code.";
  272. break;
  273. case -2:
  274. return "Invalid key code specified.";
  275. break;
  276. default:
  277. toggleKeyCode(key, down, flags);
  278. microsleep(keyboardDelay);
  279. }
  280. return "0";
  281. }
  282. void type_string(char *str){
  283. typeStringDelayed(str, 0);
  284. }
  285. void type_string_delayed(char *str, size_t cpm){
  286. typeStringDelayed(str, cpm);
  287. }
  288. void set_keyboard_delay(size_t val){
  289. keyboardDelay = val;
  290. }