Logo Search packages:      
Sourcecode: fcitx version File versions  Download package

KeyList.c

/***************************************************************************
 *   Copyright (C) 2002~2005 by Yuking                                     *
 *   yuking_net@sohu.com                                                   *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#include "KeyList.h"
#include "xim.h"

//键盘扫描码列表,只用于快速切换键
/* KEYCODE_LIST    keyCodeList[] = {
    {"LCTRL", L_CTRL}
    ,
    {"RCTRL", R_CTRL}
    ,
    {"LSHIFT", L_SHIFT}
    ,
    {"RSHIFT", R_SHIFT}
    ,
    {"LSUPER", L_SUPER}    
    ,
    {"RSUPER", R_SUPER}
    ,
    {"\0", 0}
}; */

KEY_LIST        keyList[] = {
    {"TAB", 9}
    ,
    {"ENTER", 13}
    ,
    {"LCTRL", 227}
    ,
    {"LSHIFT", 225}
    ,
    {"LALT", 233}
    ,
    {"RCTRL", 228}
    ,
    {"RSHIFT", 226}
    ,
    {"RALT", 234}
    ,
    {"INSERT", 8099}
    ,
    {"HOME", 8080}
    ,
    {"PGUP", 8085}
    ,
    {"END", 8087}
    ,
    {"PGDN", 8086}
    ,
    {"SHIFT_TAB", 11032}
    ,
    {"CTRL_CTRL", 300}
    ,
    {"CTRL_LSHIFT", 301}
    ,
    {"CTRL_LALT", 302}
    ,
    {"CTRL_RSHIFT", 303}
    ,
    {"CTRL_RALT", 304}
    ,
    {"SHIFT_LCTRL", 305}
    ,
    {"SHIFT_SHIFT", 306}
    ,
    {"SHIFT_LALT", 307}
    ,
    {"SHIFT_RCTRL", 308}
    ,
    {"SHIFT_RALT", 309}
    ,
    {"ALT_LCTRL", 310}
    ,
    {"ALT_LSHIFT", 311}
    ,
    {"ALT_ALT", 312}
    ,
    {"ALT_RCTRL", 313}
    ,
    {"ALT_RSHIFT", 314}
    ,
    {"\0", 0}
};

int GetKey (unsigned char iKeyCode, int iKeyState, int iCount)
{
    if (!iCount) {            //是SHIFT、CTRL、ALT或它们的组合,或其它诸如HOME、END之类的键
      if (iKeyState == KEY_NONE) {
          if (iKeyCode >= 80 && iKeyCode <= 99) //上、下、左、右、HOME、END、PGUP、PGDN、INSERT等
            return 8000 + iKeyCode;
          if (iKeyCode >= 225 && iKeyCode <= 233)     //单按SHIFT、CTRL、ALT
            return 9000 + iKeyCode;
      }
      else if (iKeyState == KEY_CTRL_COMP) {
          switch (iKeyCode) {
          case K_LCTRL:
            return CTRL_CTRL;
          case K_LSHIFT:
            return CTRL_LSHIFT;
          case K_LALT:
            return CTRL_LALT;
          case K_RCTRL:
            return CTRL_CTRL;
          case K_RSHIFT:
            return CTRL_RSHIFT;
          case K_RALT:
            return CTRL_RALT;
          default:
            return iKeyCode + 10000;
          }
      }
      else if (iKeyState == KEY_SHIFT_COMP) {
          switch (iKeyCode) {
          case K_LCTRL:
            return SHIFT_LCTRL;
          case K_LSHIFT:
            return SHIFT_SHIFT;
          case K_LALT:
            return SHIFT_LALT;
          case K_RCTRL:
            return SHIFT_RCTRL;
          case K_RSHIFT:
            return SHIFT_SHIFT;
          case K_RALT:
            return SHIFT_RALT;
          default:
            return iKeyCode + 11000;
          }
      }
      else if (iKeyState == KEY_ALT_COMP) {
          switch (iKeyCode) {
          case K_LCTRL:
            return ALT_LCTRL;
          case K_LSHIFT:
            return ALT_LSHIFT;
          case K_LALT:
            return ALT_ALT;
          case K_RCTRL:
            return ALT_RCTRL;
          case K_RSHIFT:
            return ALT_RSHIFT;
          case K_RALT:
            return ALT_ALT;
          default:
            return iKeyCode + 12000;
          }
      }
    }
    else {
      if (iKeyState == KEY_NONE) {
          //小键盘的数字也要处理成与大键盘上一样      
          if (iKeyCode >= 176 && iKeyCode <= 185)
            iKeyCode -= 128;
      }
      else {
          //由于大小写字母有区别,此处应该将其处理为等同;
          if (iKeyState < KEY_SCROLLLOCK && (iKeyCode >= 97 && iKeyCode <= 122))
            iKeyCode -= 32;

          if (iKeyState == KEY_CTRL_COMP)
            return iKeyCode + 1000;
          if (iKeyState == KEY_SHIFT_COMP) {
            //只处理空格
            if (iKeyCode == 32)
                return iKeyCode + 2000;
          }
          if (iKeyState == KEY_ALT_COMP)
            return iKeyCode + 3000;
          if (iKeyState == KEY_CTRL_SHIFT_COMP)
            return iKeyCode + 4000;
          if (iKeyState == KEY_CTRL_ALT_COMP)
            return iKeyCode + 5000;
          if (iKeyState == KEY_ALT_SHIFT_COMP)
            return iKeyCode + 6000;
          if (iKeyState == KEY_CTRL_ALT_SHIFT_COMP)
            return iKeyCode + 7000;
          if (iKeyState == KEY_SUPER_COMP)
            return iKeyCode + 8000;
      }
    }

    return iKeyCode;
}

/*
 * 根据字串来判断键
 * 主要用于从设置文件中读取热键设定
 * 返回-1表示用户设置的热键不支持,一般是因为拼写错误或该热键不在列表中
 */
int ParseKey (char *strKey)
{
    char           *p;
    int             iKeyCode;
    int             iKeyState = 0;
    int             iCount = 0;

    iKeyCode = GetKeyList (strKey);
    if (iKeyCode != -1)
      return iKeyCode;

    if (!strncmp (strKey, "CTRL_ALT_SHIFT_", 15)) {
      iKeyState = KEY_CTRL_ALT_SHIFT_COMP;
      p = strKey + 15;
      iKeyCode = GetKeyList (p);
      if (iKeyCode != -1)
          iCount = 0;
      else {
          iCount = 1;
          if (!strcmp (p, "SPACE"))
            iKeyCode = ' ';
          else if (!strcmp (p, "DELETE"))
            iKeyCode = DELETE;
          else if (strlen (p) == 1)
            iKeyCode = p[0];
          else
            return -1;
      }
    }
    else if (!strncmp (strKey, "CTRL_ALT_", 9)) {
      iKeyState = KEY_CTRL_ALT_COMP;
      p = strKey + 9;
      iKeyCode = GetKeyList (p);
      if (iKeyCode != -1)
          iCount = 0;
      else {
          iCount = 1;
          if (!strcmp (p, "SPACE"))
            iKeyCode = ' ';
          else if (!strcmp (p, "DELETE"))
            iKeyCode = DELETE;
          else if (strlen (p) == 1)
            iKeyCode = p[0];
          else
            return -1;
      }
    }
    else if (!strncmp (strKey, "CTRL_SHIFT_", 11)) {
      iKeyState = KEY_CTRL_SHIFT_COMP;
      p = strKey + 11;
      iKeyCode = GetKeyList (p);
      if (iKeyCode != -1)
          iCount = 0;
      else {
          iCount = 1;
          if (!strcmp (p, "SPACE"))
            iKeyCode = ' ';
          else if (!strcmp (p, "DELETE"))
            iKeyCode = DELETE;
          else if (strlen (p) == 1)
            iKeyCode = p[0];
          else
            return -1;
      }
    }
    else if (!strncmp (strKey, "ALT_SHIFT_", 10)) {
      iKeyState = KEY_ALT_SHIFT_COMP;
      p = strKey + 10;
      iKeyCode = GetKeyList (p);
      if (iKeyCode != -1)
          iCount = 0;
      else {
          iCount = 1;
          if (!strcmp (p, "SPACE"))
            iKeyCode = ' ';
          else if (!strcmp (p, "DELETE"))
            iKeyCode = DELETE;
          else if (strlen (p) == 1)
            iKeyCode = p[0];
          else
            return -1;
      }
    }
    else if (!strncmp (strKey, "CTRL_", 5)) {
      iKeyState = KEY_CTRL_COMP;
      p = strKey + 5;
      iKeyCode = GetKeyList (p);
      if (iKeyCode != -1)
          iCount = 0;
      else {
          iCount = 1;
          if (!strcmp (p, "SPACE"))
            iKeyCode = ' ';
          else if (!strcmp (p, "DELETE"))
            iKeyCode = DELETE;
          else if (strlen (p) == 1)
            iKeyCode = p[0];
          else
            return -1;
      }
    }
    else if (!strncmp (strKey, "ALT_", 4)) {
      iKeyState = KEY_ALT_COMP;
      p = strKey + 4;
      iKeyCode = GetKeyList (p);
      if (iKeyCode != -1)
          iCount = 0;
      else {
          iCount = 1;
          if (!strcmp (p, "SPACE"))
            iKeyCode = ' ';
          else if (!strcmp (p, "DELETE"))
            iKeyCode = DELETE;
          else if (strlen (p) == 1)
            iKeyCode = p[0];
          else
            return -1;
      }
    }
    else if (!strncmp (strKey, "SHIFT_", 6)) {
      iKeyState = KEY_SHIFT_COMP;
      p = strKey + 6;
      iKeyCode = GetKeyList (p);
      if (iKeyCode != -1)
          iCount = 0;
      else {
          iCount = 1;
          if (!strcmp (p, "SPACE"))
            iKeyCode = ' ';
          else if (!strcmp (p, "DELETE"))
            iKeyCode = DELETE;
          else if (strlen (p) == 1)
            iKeyCode = p[0];
          else
            return -1;
      }
    }
    else if (!strncmp (strKey, "SUPER_", 6)) {
      iKeyState = KEY_SUPER_COMP;
      p = strKey + 6;
      iKeyCode = GetKeyList (p);
      if (iKeyCode != -1)
          iCount = 0;
      else {
          iCount = 1;
          if (!strcmp (p, "SPACE"))
            iKeyCode = ' ';
          else if (!strcmp (p, "DELETE"))
            iKeyCode = DELETE;
          else if (strlen (p) == 1)
            iKeyCode = p[0];
          else
            return -1;
      }
    }
    else {
      if (strlen (strKey) == 1)
          return strKey[0];
      else
          return -1;
    }

    return GetKey (iKeyCode, iKeyState, iCount);
}

int GetKeyList (char *strKey)
{
    int             i;

    i = 0;
    for (;;) {
      if (!keyList[i].code)
          break;
      if (!strcmp (strKey, keyList[i].strKey))
          return keyList[i].code;
      i++;
    }

    return -1;
}

/*
int GetKeyCodeList (char *strKey)
{
    int             i;

    i = 0;
    for (;;) {
      if (!keyCodeList[i].code)
          break;
      if (!strcmp (strKey, keyCodeList[i].strKey))
          return keyCodeList[i].code;
      i++;
    }

    return -1;
}
*/

Generated by  Doxygen 1.6.0   Back to index