Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.21 KB | None | 0 0
  1. #include "common.h"
  2. #include "keyboard.h"
  3.  
  4. void CheckKeyboard(void *n)
  5. /* Read keyboard states and save it */
  6. {
  7.     State *s;
  8.     s = (State *)n;
  9.     if(bioskey(1))
  10.     /* Key pressed, save it! */
  11.     {
  12.         s -> keyboard . key = bioskey(0);
  13.         s -> keyboard . modifier = bioskey(2);
  14.         s -> iskeyboard = 1;
  15.     }
  16.     else
  17.     /* Use -1 as flag to implicate no key pressed */
  18.     {
  19.         s -> keyboard . key = -1;
  20.         s -> keyboard . modifier = -1;
  21.     }
  22. }
  23.    
  24. void LoadKeyBinding(void *n)
  25. /* Load-time initialization for key bindings */
  26. {
  27.     State *s;
  28.     KeyBinding *kb;
  29.     kb = ALLOC(sizeof(KeyBinding));
  30.     s = (State *)n;
  31.     InitKeyBinding(kb);
  32.     s -> keybinding = kb;
  33. }
  34.  
  35. void InitKeyBinding(KeyBinding *kb)
  36. /* Initialize a key binding struct */
  37. {
  38.     kb -> event = ALLOC(sizeof(Event));
  39.     InitEvent(kb -> event);
  40.     kb -> key . key = -1;
  41.     kb -> key . modifier = -1;
  42.     kb -> next = NULL;
  43. }
  44.  
  45. void AddKeyBinding(void *n, KeyboardState key, Event *event)
  46. /* Add a key binding with an event */
  47. {
  48.     State *s;
  49.     KeyBinding *kb, *kbtmp;
  50.     s = (State *)n;
  51.     kb = s -> keybinding;
  52.    
  53.     while(kb -> next != NULL)
  54.     /* Go to the rear of the linked list */
  55.         kb = kb -> next;
  56.    
  57.     if(kb -> key . key == -1)
  58.     /* An empty item */
  59.     {
  60.         kb -> key . key = key . key;
  61.         kb -> key . modifier = key . modifier;
  62.         kb -> event = event;
  63.     }
  64.     else
  65.     /* Create a new item to save it */
  66.     {
  67.         kbtmp = ALLOC(sizeof(KeyBinding));
  68.         InitKeyBinding(kbtmp);
  69.         kbtmp -> key . key = key . key;
  70.         kbtmp -> key . modifier = key . modifier;
  71.         kbtmp -> event = event;
  72.         kb -> next = kbtmp;
  73.     }
  74. }
  75.  
  76. KeyboardState KBState(int key, int modifier)
  77. /* Simply packaging a key binding into a KeyboardState struct */
  78. {
  79.     KeyboardState kb;
  80.     kb . key = key;
  81.     kb . modifier = modifier;
  82.     return kb;
  83. }
  84.  
  85. void CheckKeyBinding(void *n)
  86. /* Check if matches a key binding */
  87. {
  88.     State *s;
  89.     KeyBinding *kb;
  90.     s = (State *)n;
  91.     kb = s -> keybinding;
  92.     while(kb -> event -> func != NULL)
  93.     {
  94.         if('A' <= kb -> key . key && kb -> key . key <= 'Z')
  95.             kb -> key . key = s -> map . chs[kb -> key . key - 'A'];
  96.         /* Fix for alphabets */
  97.            
  98.         if(((s -> keyboard . key & 0xFF00) == kb -> key . key) && (
  99.             (kb -> key . modifier == NOMOD &&
  100.             !(s -> keyboard . modifier & CTRL) && !(s -> keyboard . modifier & ALT))
  101.             || (s -> keyboard . modifier & kb -> key . modifier)))
  102.         /* Perfectly matched! */
  103.             DoEvent(kb -> event, n);
  104.            
  105.         else if(s -> keyboard . key != -1)
  106.         /* This is for debugging only */
  107.             if(DEBUG)
  108.                 printf("%x|%x|%x\n", s -> keyboard . key & 0xFF00,
  109.                        s -> keyboard . key & 0xFF, s -> keyboard . modifier);
  110.         if(kb -> next == NULL)
  111.             break;
  112.            
  113.         kb = kb -> next;
  114.     }
  115. }
  116.  
  117. void LoadKeyMap(void *n)
  118. /* Load A-Z Keymappings (Recorded manually by Felix Yan) */
  119. {
  120.     State *s;
  121.     int chs[26]={0x1e00, 0x3000, 0x2e00, 0x2000, 0x1200, 0x2100, 0x2200, 0x2300, 0x1700,
  122.                  0x2400, 0x2500, 0x2600, 0x3200, 0x3100, 0x1800, 0x1900, 0x1000, 0x1300,
  123.                  0x1f00, 0x1400, 0x1600, 0x2f00, 0x1100, 0x2d00, 0x1500, 0x2c00};
  124.     int num[10]={0x0b00, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600, 0x0700, 0x0800, 0x0900,
  125.                  0x0a00};
  126.     int i;
  127.     s = (State *)n;
  128.     for(i = 0; i < 26; i ++)
  129.         s -> map . chs[i] = chs[i];
  130.     for(i = 0; i < 10; i ++)
  131.         s -> nummap . num[i] = num[i];
  132.     /* Save it to the main state */
  133. }
  134.  
  135. void CheckChar(void *n, int key, int shift, int chipunc, int fullwidth, char *punc)
  136. /* Check if a character should be inserted to text */
  137. {
  138.     State *s;
  139.     s = (State *)n;
  140.     if((s -> keyboard . key & 0xFF00) == key && (((s -> keyboard . modifier & LEFTSHIFT) ||
  141.        (s -> keyboard . modifier & RIGHTSHIFT)) && shift ||
  142.        !((s -> keyboard . modifier & LEFTSHIFT) || (s -> keyboard . modifier & RIGHTSHIFT)) && !shift) &&
  143.        s -> chipunc == chipunc && s -> fullwidth == fullwidth
  144.        && !(s -> keyboard . modifier & CTRL) && !(s -> keyboard . modifier & ALT))
  145.     /* An ugly judgment to make sure key is correct */
  146.     {
  147.         Insert(n, punc);
  148.         /* Insert the punc to text */
  149.        
  150.         s -> keyboard . key = -1;
  151.         /* Clear the key */
  152.     }
  153. }
  154.  
  155. void CharInput(void *n)
  156. /* Fetch & switch characters (Recorded manually by Felix Yan) */
  157. {
  158.     int i;
  159.    
  160.     char tmp[3] = {0};
  161.     /* Temp string to save the characters that should be added to text */
  162.    
  163.     char lf[52] = {"abcdefghijklmnopqrstuvwxyz"};
  164.     char cf[52] = {"ABCDEFGHIJKLMNOPQRSTUVWXYZ"};
  165.     /* Lower-case and upper-case full-width letters */
  166.    
  167.     State *s;
  168.     s = (State *)n;
  169.     if(!s -> isedit || s -> ispinyin)
  170.     /* Not editable or in pinyin input state */
  171.         return;
  172.        
  173.     CheckChar(n, 0x3900, 0, 0, 1, " ");
  174.     CheckChar(n, 0x3900, 0, 1, 1, " ");
  175.     CheckChar(n, 0x3900, 0, 0, 0, " ");
  176.     CheckChar(n, 0x3900, 0, 1, 0, " ");
  177.    
  178.     CheckChar(n, 0x200, 0, 0, 1, "1");
  179.     CheckChar(n, 0x200, 0, 1, 1, "1");
  180.     CheckChar(n, 0x200, 0, 0, 0, "1");
  181.     CheckChar(n, 0x200, 0, 1, 0, "1");
  182.     CheckChar(n, 0x200, 1, 0, 0, "!");
  183.     CheckChar(n, 0x200, 1, 1, 0, "!");
  184.     CheckChar(n, 0x200, 1, 1, 1, "!");
  185.     CheckChar(n, 0x200, 1, 0, 1, "!");
  186.    
  187.     CheckChar(n, 0x300, 0, 0, 1, "2");
  188.     CheckChar(n, 0x300, 0, 1, 1, "2");
  189.     CheckChar(n, 0x300, 0, 0, 0, "2");
  190.     CheckChar(n, 0x300, 0, 1, 0, "2");
  191.     CheckChar(n, 0x300, 1, 0, 0, "@");
  192.     CheckChar(n, 0x300, 1, 1, 0, "·");
  193.     CheckChar(n, 0x300, 1, 1, 1, "·");
  194.     CheckChar(n, 0x300, 1, 0, 1, "@");
  195.    
  196.     CheckChar(n, 0x400, 0, 0, 1, "3");
  197.     CheckChar(n, 0x400, 0, 1, 1, "3");
  198.     CheckChar(n, 0x400, 0, 0, 0, "3");
  199.     CheckChar(n, 0x400, 0, 1, 0, "3");
  200.     CheckChar(n, 0x400, 1, 0, 0, "#");
  201.     CheckChar(n, 0x400, 1, 1, 0, "#");
  202.     CheckChar(n, 0x400, 1, 0, 1, "#");
  203.     CheckChar(n, 0x400, 1, 1, 1, "#");
  204.    
  205.     CheckChar(n, 0x500, 0, 0, 1, "4");
  206.     CheckChar(n, 0x500, 0, 1, 1, "4");
  207.     CheckChar(n, 0x500, 0, 0, 0, "4");
  208.     CheckChar(n, 0x500, 0, 1, 0, "4");
  209.     CheckChar(n, 0x500, 1, 0, 0, "$");
  210.     CheckChar(n, 0x500, 1, 1, 0, "¥");
  211.     CheckChar(n, 0x500, 1, 0, 1, "$");
  212.     CheckChar(n, 0x500, 1, 1, 1, "¥");
  213.    
  214.     CheckChar(n, 0x600, 0, 0, 1, "5");
  215.     CheckChar(n, 0x600, 0, 1, 1, "5");
  216.     CheckChar(n, 0x600, 0, 0, 0, "5");
  217.     CheckChar(n, 0x600, 0, 1, 0, "5");
  218.     CheckChar(n, 0x600, 1, 0, 0, "%");
  219.     CheckChar(n, 0x600, 1, 1, 0, "%");
  220.     CheckChar(n, 0x600, 1, 0, 1, "%");
  221.     CheckChar(n, 0x600, 1, 1, 1, "%");
  222.    
  223.     CheckChar(n, 0x700, 0, 0, 1, "6");
  224.     CheckChar(n, 0x700, 0, 1, 1, "6");
  225.     CheckChar(n, 0x700, 0, 0, 0, "6");
  226.     CheckChar(n, 0x700, 0, 1, 0, "6");
  227.     CheckChar(n, 0x700, 1, 0, 0, "^");
  228.     CheckChar(n, 0x700, 1, 1, 0, "……");
  229.     CheckChar(n, 0x700, 1, 0, 1, "^");
  230.     CheckChar(n, 0x700, 1, 1, 1, "……");
  231.    
  232.     CheckChar(n, 0x800, 0, 0, 1, "7");
  233.     CheckChar(n, 0x800, 0, 1, 1, "7");
  234.     CheckChar(n, 0x800, 0, 0, 0, "7");
  235.     CheckChar(n, 0x800, 0, 1, 0, "7");
  236.     CheckChar(n, 0x800, 1, 0, 0, "&");
  237.     CheckChar(n, 0x800, 1, 1, 0, "&");
  238.     CheckChar(n, 0x800, 1, 0, 1, "&");
  239.     CheckChar(n, 0x800, 1, 1, 1, "&");
  240.    
  241.     CheckChar(n, 0x900, 0, 0, 1, "8");
  242.     CheckChar(n, 0x900, 0, 1, 1, "8");
  243.     CheckChar(n, 0x900, 0, 0, 0, "8");
  244.     CheckChar(n, 0x900, 0, 1, 0, "8");
  245.     CheckChar(n, 0x900, 1, 0, 0, "*");
  246.     CheckChar(n, 0x900, 1, 1, 0, "*");
  247.     CheckChar(n, 0x900, 1, 0, 1, "*");
  248.     CheckChar(n, 0x900, 1, 1, 1, "*");
  249.    
  250.     CheckChar(n, 0xa00, 0, 0, 1, "9");
  251.     CheckChar(n, 0xa00, 0, 1, 1, "9");
  252.     CheckChar(n, 0xa00, 0, 0, 0, "9");
  253.     CheckChar(n, 0xa00, 0, 1, 0, "9");
  254.     CheckChar(n, 0xa00, 1, 0, 0, "(");
  255.     CheckChar(n, 0xa00, 1, 1, 0, "(");
  256.     CheckChar(n, 0xa00, 1, 0, 1, "(");
  257.     CheckChar(n, 0xa00, 1, 1, 1, "(");
  258.    
  259.     CheckChar(n, 0xb00, 0, 0, 1, "0");
  260.     CheckChar(n, 0xb00, 0, 1, 1, "0");
  261.     CheckChar(n, 0xb00, 0, 0, 0, "0");
  262.     CheckChar(n, 0xb00, 0, 1, 0, "0");
  263.     CheckChar(n, 0xb00, 1, 0, 0, ")");
  264.     CheckChar(n, 0xb00, 1, 1, 0, ")");
  265.     CheckChar(n, 0xb00, 1, 0, 1, ")");
  266.     CheckChar(n, 0xb00, 1, 1, 1, ")");
  267.    
  268.     CheckChar(n, 0xc00, 0, 0, 0, "-");
  269.     CheckChar(n, 0xc00, 0, 0, 1, "-");
  270.     CheckChar(n, 0xc00, 0, 1, 0, "-");
  271.     CheckChar(n, 0xc00, 0, 1, 1, "-");
  272.     CheckChar(n, 0xc00, 1, 0, 0, "_");
  273.     CheckChar(n, 0xc00, 1, 0, 1, "_");
  274.     CheckChar(n, 0xc00, 1, 1, 0, "——");
  275.     CheckChar(n, 0xc00, 1, 1, 1, "——");
  276.    
  277.     CheckChar(n, 0xd00, 0, 0, 0, "=");
  278.     CheckChar(n, 0xd00, 0, 0, 1, "=");
  279.     CheckChar(n, 0xd00, 0, 1, 0, "=");
  280.     CheckChar(n, 0xd00, 0, 1, 1, "=");
  281.     CheckChar(n, 0xd00, 1, 0, 0, "+");
  282.     CheckChar(n, 0xd00, 1, 0, 1, "+");
  283.     CheckChar(n, 0xd00, 1, 1, 0, "+");
  284.     CheckChar(n, 0xd00, 1, 1, 1, "+");
  285.    
  286.     CheckChar(n, 0x2900, 0, 0, 0, "`");
  287.     CheckChar(n, 0x2900, 0, 0, 1, "`");
  288.     CheckChar(n, 0x2900, 0, 1, 0, "`");
  289.     CheckChar(n, 0x2900, 0, 1, 1, "`");
  290.     CheckChar(n, 0x2900, 1, 0, 0, "~");
  291.     CheckChar(n, 0x2900, 1, 0, 1, "~");
  292.     CheckChar(n, 0x2900, 1, 1, 0, "~");
  293.     CheckChar(n, 0x2900, 1, 1, 1, "~");
  294.    
  295.     CheckChar(n, 0x1a00, 0, 0, 0, "[");
  296.     CheckChar(n, 0x1a00, 0, 0, 1, "[");
  297.     CheckChar(n, 0x1a00, 0, 1, 0, "[");
  298.     CheckChar(n, 0x1a00, 0, 1, 1, "[");
  299.     CheckChar(n, 0x1a00, 1, 0, 0, "{");
  300.     CheckChar(n, 0x1a00, 1, 0, 1, "{");
  301.     CheckChar(n, 0x1a00, 1, 1, 0, "{");
  302.     CheckChar(n, 0x1a00, 1, 1, 1, "{");
  303.    
  304.     CheckChar(n, 0x1b00, 0, 0, 0, "]");
  305.     CheckChar(n, 0x1b00, 0, 0, 1, "]");
  306.     CheckChar(n, 0x1b00, 0, 1, 0, "]");
  307.     CheckChar(n, 0x1b00, 0, 1, 1, "]");
  308.     CheckChar(n, 0x1b00, 1, 0, 0, "}");
  309.     CheckChar(n, 0x1b00, 1, 0, 1, "}");
  310.     CheckChar(n, 0x1b00, 1, 1, 0, "}");
  311.     CheckChar(n, 0x1b00, 1, 1, 1, "}");
  312.    
  313.     CheckChar(n, 0x2b00, 0, 0, 0, "\\");
  314.     CheckChar(n, 0x2b00, 0, 0, 1, "\");
  315.     CheckChar(n, 0x2b00, 0, 1, 0, "、");
  316.     CheckChar(n, 0x2b00, 0, 1, 1, "、");
  317.     CheckChar(n, 0x2b00, 1, 0, 0, "|");
  318.     CheckChar(n, 0x2b00, 1, 0, 1, "|");
  319.     CheckChar(n, 0x2b00, 1, 1, 0, "|");
  320.     CheckChar(n, 0x2b00, 1, 1, 1, "|");
  321.    
  322.     CheckChar(n, 0x2700, 0, 0, 0, ";");
  323.     CheckChar(n, 0x2700, 0, 0, 1, ";");
  324.     CheckChar(n, 0x2700, 0, 1, 0, ";");
  325.     CheckChar(n, 0x2700, 0, 1, 1, ";");
  326.     CheckChar(n, 0x2700, 1, 0, 0, ":");
  327.     CheckChar(n, 0x2700, 1, 0, 1, ":");
  328.     CheckChar(n, 0x2700, 1, 1, 0, ":");
  329.     CheckChar(n, 0x2700, 1, 1, 1, ":");
  330.    
  331.     CheckChar(n, 0x2800, 0, 0, 0, "'");
  332.     CheckChar(n, 0x2800, 0, 0, 1, "'");
  333.     CheckChar(n, 0x2800, 0, 1, 0, "'");
  334.     CheckChar(n, 0x2800, 0, 1, 1, "'");
  335.     CheckChar(n, 0x2800, 1, 0, 0, "\"");
  336.     CheckChar(n, 0x2800, 1, 0, 1, """);
  337.     CheckChar(n, 0x2800, 1, 1, 0, """);
  338.     CheckChar(n, 0x2800, 1, 1, 1, """);
  339.    
  340.     CheckChar(n, 0x3300, 0, 0, 0, ",");
  341.     CheckChar(n, 0x3300, 0, 0, 1, ",");
  342.     CheckChar(n, 0x3300, 0, 1, 0, ",");
  343.     CheckChar(n, 0x3300, 0, 1, 1, ",");
  344.     CheckChar(n, 0x3300, 1, 0, 0, "<");
  345.     CheckChar(n, 0x3300, 1, 0, 1, "<");
  346.     CheckChar(n, 0x3300, 1, 1, 0, "《");
  347.     CheckChar(n, 0x3300, 1, 1, 1, "《");
  348.    
  349.     CheckChar(n, 0x3400, 0, 0, 0, ".");
  350.     CheckChar(n, 0x3400, 0, 0, 1, ".");
  351.     tmp[0] = LeftChar(n);
  352.     if('0' <= tmp[0] && tmp[0] <= '9')
  353.         CheckChar(n, 0x3400, 0, 1, 0, ".");
  354.     else
  355.         CheckChar(n, 0x3400, 0, 1, 0, "。");
  356.     CheckChar(n, 0x3400, 0, 1, 1, "。");
  357.     CheckChar(n, 0x3400, 1, 0, 0, ">");
  358.     CheckChar(n, 0x3400, 1, 0, 1, ">");
  359.     CheckChar(n, 0x3400, 1, 1, 0, "》");
  360.     CheckChar(n, 0x3400, 1, 1, 1, "》");
  361.    
  362.     CheckChar(n, 0x3500, 0, 0, 0, "/");
  363.     CheckChar(n, 0x3500, 0, 0, 1, "/");
  364.     CheckChar(n, 0x3500, 0, 1, 0, "、");
  365.     CheckChar(n, 0x3500, 0, 1, 1, "、");
  366.     CheckChar(n, 0x3500, 1, 0, 0, "?");
  367.     CheckChar(n, 0x3500, 1, 0, 1, "?");
  368.     CheckChar(n, 0x3500, 1, 1, 0, "?");
  369.     CheckChar(n, 0x3500, 1, 1, 1, "?");
  370.    
  371.     for(i = 0; i < 26; i ++)
  372.     /* Check letters */
  373.     {
  374.         memset(tmp, 0, 3);
  375.        
  376.         if(!s -> chinese)
  377.         {
  378.             tmp[0] = 'a' + i;
  379.             CheckChar(n, s -> map . chs[i], 0, 0, 0, tmp);
  380.             CheckChar(n, s -> map . chs[i], 0, 1, 0, tmp);
  381.            
  382.             tmp[0] = lf[i * 2];
  383.             tmp[1] = lf[i * 2 + 1];
  384.             CheckChar(n, s -> map . chs[i], 0, 0, 1, tmp);
  385.             CheckChar(n, s -> map . chs[i], 0, 1, 1, tmp);
  386.         }
  387.        
  388.         memset(tmp, 0, 3);
  389.        
  390.         tmp[0] = 'A' + i;
  391.         CheckChar(n, s -> map . chs[i], 1, 0, 0, tmp);
  392.         CheckChar(n, s -> map . chs[i], 1, 1, 0, tmp);
  393.        
  394.         tmp[0] = cf[i * 2];
  395.         tmp[1] = cf[i * 2 + 1];
  396.         CheckChar(n, s -> map . chs[i], 1, 0, 1, tmp);
  397.         CheckChar(n, s -> map . chs[i], 1, 1, 1, tmp);
  398.     }
  399. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement