/* Copyright (c) 2002,2003,2004,2009 James M. Kretchmar
*
* This file is part of Owl.
*
* Owl 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 3 of the License, or
* (at your option) any later version.
*
* Owl 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 Owl. If not, see .
*
* ---------------------------------------------------------------
*
* As of Owl version 2.1.12 there are patches contributed by
* developers of the the branched BarnOwl project, Copyright (c)
* 2006-2008 The BarnOwl Developers. All rights reserved.
*/
#include
#include
#include "owl.h"
static const char fileIdent[] = "$Id$";
static struct _owl_keypress_specialmap {
int kj;
char *ks;
} specialmap[] = {
#ifdef KEY_CODE_YES
{ KEY_CODE_YES, "CODE_YES" },
#endif
{ KEY_MIN, "MIN" },
{ KEY_BREAK, "BREAK" },
{ KEY_DOWN, "DOWN" },
{ KEY_UP, "UP" },
{ KEY_LEFT, "LEFT" },
{ KEY_RIGHT, "RIGHT" },
{ KEY_HOME, "HOME" },
{ KEY_BACKSPACE, "BACKSPACE" },
{ KEY_F0, "F0" },
{ KEY_F(1), "F1" },
{ KEY_F(2), "F2" },
{ KEY_F(3), "F3" },
{ KEY_F(4), "F4" },
{ KEY_F(5), "F5" },
{ KEY_F(6), "F6" },
{ KEY_F(7), "F7" },
{ KEY_F(8), "F8" },
{ KEY_F(9), "F9" },
{ KEY_F(10), "F10" },
{ KEY_F(11), "F11" },
{ KEY_F(12), "F12" },
{ KEY_DL, "DL" },
{ KEY_IL, "IL" },
{ KEY_DC, "DC" },
{ KEY_IC, "IC" },
{ KEY_EIC, "EIC" },
{ KEY_CLEAR, "CLEAR" },
{ KEY_EOS, "EOS" },
{ KEY_EOL, "EOL" },
{ KEY_SF, "SF" },
{ KEY_SR, "SR" },
{ KEY_NPAGE, "NPAGE" },
{ KEY_PPAGE, "PPAGE" },
{ KEY_STAB, "STAB" },
{ KEY_CTAB, "CTAB" },
{ KEY_CATAB, "CATAB" },
{ KEY_ENTER, "ENTER" },
{ KEY_SRESET, "SRESET" },
{ KEY_RESET, "RESET" },
{ KEY_PRINT, "PRINT" },
{ KEY_LL, "LL" },
{ KEY_A1, "A1" },
{ KEY_A3, "A3" },
{ KEY_B2, "B2" },
{ KEY_C1, "C1" },
{ KEY_C3, "C3" },
{ KEY_BTAB, "BTAB" },
{ KEY_BEG, "BEG" },
{ KEY_CANCEL, "CANCEL" },
{ KEY_CLOSE, "CLOSE" },
{ KEY_COMMAND, "COMMAND" },
{ KEY_COPY, "COPY" },
{ KEY_CREATE, "CREATE" },
{ KEY_END, "END" },
{ KEY_EXIT, "EXIT" },
{ KEY_FIND, "FIND" },
{ KEY_HELP, "HELP" },
{ KEY_MARK, "MARK" },
{ KEY_MESSAGE, "MESSAGE" },
{ KEY_MOVE, "MOVE" },
{ KEY_NEXT, "NEXT" },
{ KEY_OPEN, "OPEN" },
{ KEY_OPTIONS, "OPTIONS" },
{ KEY_PREVIOUS, "PREVIOUS" },
{ KEY_REDO, "REDO" },
{ KEY_REFERENCE, "REFERENCE" },
{ KEY_REFRESH, "REFRESH" },
{ KEY_REPLACE, "REPLACE" },
{ KEY_RESTART, "RESTART" },
{ KEY_RESUME, "RESUME" },
{ KEY_SAVE, "SAVE" },
{ KEY_SBEG, "SBEG" },
{ KEY_SCANCEL, "SCANCEL" },
{ KEY_SCOMMAND, "SCOMMAND" },
{ KEY_SCOPY, "SCOPY" },
{ KEY_SCREATE, "SCREATE" },
{ KEY_SDC, "SDC" },
{ KEY_SDL, "SDL" },
{ KEY_SELECT, "SELECT" },
{ KEY_SEND, "SEND" },
{ KEY_SEOL, "SEOL" },
{ KEY_SEXIT, "SEXIT" },
{ KEY_SFIND, "SFIND" },
{ KEY_SHELP, "SHELP" },
{ KEY_SHOME, "SHOME" },
{ KEY_SIC, "SIC" },
{ KEY_SLEFT, "SLEFT" },
{ KEY_SMESSAGE, "SMESSAGE" },
{ KEY_SMOVE, "SMOVE" },
{ KEY_SNEXT, "SNEXT" },
{ KEY_SOPTIONS, "SOPTIONS" },
{ KEY_SPREVIOUS, "SPREVIOUS" },
{ KEY_SPRINT, "SPRINT" },
{ KEY_SREDO, "SREDO" },
{ KEY_SREPLACE, "SREPLACE" },
{ KEY_SRIGHT, "SRIGHT" },
{ KEY_SRSUME, "SRSUME" },
{ KEY_SSAVE, "SSAVE" },
{ KEY_SSUSPEND, "SSUSPEND" },
{ KEY_SUNDO, "SUNDO" },
{ KEY_SUSPEND, "SUSPEND" },
{ KEY_UNDO, "UNDO" },
{ KEY_MOUSE, "MOUSE" },
#ifdef KEY_RESIZE
{ KEY_RESIZE, "RESIZE" },
#endif
{ KEY_MAX, "MAX" },
{ ' ', "SPACE" },
{ 27, "ESCAPE" },
{ 127, "DELETE" },
{ '\r', "CR" },
{ '\n', "LF" },
{ 0, NULL }
};
#define OWL_CTRL(key) ((key)&037)
/* OWL_META is definied in owl.h */
/* returns 0 on success */
int owl_keypress_tostring(int j, int esc, char *buff, int bufflen)
{
char kb[64], kb2[2];
struct _owl_keypress_specialmap *sm;
*kb = '\0';
for (sm = specialmap; sm->kj!=0; sm++) {
if (j == OWL_META(sm->kj) || (esc && j == sm->kj)) {
strcat(kb, "M-");
strcat(kb, sm->ks);
break;
} else if (j == sm->kj) {
strcat(kb, sm->ks);
break;
}
}
if (!*kb) {
if (j&OWL_META(0)) {
strcat(kb, "M-");
j &= ~OWL_META(0);
}
if ((OWL_CTRL(j) == j)) {
strcat(kb, "C-");
j |= 0x40;
if (isupper(j)) j = tolower(j);
}
if (isascii(j)) {
kb2[0] = j;
kb2[1] = 0;
strcat(kb, kb2);
}
}
if (!*kb) {
/* not a valid key */
strncpy(buff, "INVALID", bufflen);
return(-1);
}
strncpy(buff, kb, bufflen);
return(0);
}
/* returns ERR on failure, else a keycode */
int owl_keypress_fromstring(char *kb)
{
struct _owl_keypress_specialmap *sm;
int ismeta=0, isctrl=0;
int j = ERR;
while (*kb && kb[1] == '-' && (kb[0] == 'C' || kb[0] == 'M')) {
if ((kb[0] == 'C') && (kb[1] == '-')) {
isctrl = 1;
kb+=2;
}
if ((kb[0] == 'M') && (kb[1] == '-')) {
ismeta = 1;
kb+=2;
}
}
if (isascii(kb[0]) && !kb[1]) {
j = kb[0];
} else {
for (sm = specialmap; sm->kj!=0; sm++) {
if (!strcmp(sm->ks, kb)) {
j = sm->kj;
}
}
}
if (j==ERR) return(ERR);
if (isctrl) {
j = OWL_CTRL(j);
}
if (ismeta) {
j = OWL_META(j);
}
return(j);
}