302 lines
6.3 KiB
C
302 lines
6.3 KiB
C
/*
|
|
* SuperInput demo - A new way to type text on casio fx calculators !
|
|
* Copyright (C) 2022 Mibi88
|
|
*
|
|
* 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, see https://www.gnu.org/licenses/.
|
|
*/
|
|
|
|
#include <gint/display.h>
|
|
#include <gint/keyboard.h>
|
|
|
|
#define INSZ 20
|
|
#define INSZS1 (INSZ-1)
|
|
|
|
unsigned char input[INSZ], keyc;
|
|
int pos, lenght, shift, alpha, inchar, key;
|
|
|
|
void shiftstrpartright(int start){
|
|
unsigned char c;
|
|
unsigned char copy[INSZ];
|
|
for(int i=0;i<INSZ;i++){
|
|
copy[i] = input[i];
|
|
}
|
|
for(int i=start;i<INSZS1;i++){
|
|
c = copy[i];
|
|
input[i+1] = c;
|
|
}
|
|
}
|
|
void shiftstrpartleft(int start){
|
|
unsigned char c;
|
|
for(int i=start;i<INSZS1;i++){
|
|
c = input[i+1];
|
|
input[i] = c;
|
|
}
|
|
input[INSZS1] = ' ';
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
for(int i=0;i<INSZ;i++){
|
|
input[i] = ' ';
|
|
}
|
|
pos = 0;
|
|
lenght = 0;
|
|
shift = 0;
|
|
alpha = 1;
|
|
key = 0;
|
|
clearevents();
|
|
int opt = 0xDC;
|
|
while(!keydown(KEY_EXIT)){
|
|
key = getkey_opt(opt, NULL).key;
|
|
inchar = 1;
|
|
keyc = ' ';
|
|
if(alpha){
|
|
if(!shift){
|
|
switch(key){
|
|
case KEY_SQUARE:
|
|
keyc = '\''; break;
|
|
case KEY_POWER:
|
|
keyc = '^'; break;
|
|
case KEY_XOT:
|
|
keyc = 'a'; break;
|
|
case KEY_LOG:
|
|
keyc = 'b'; break;
|
|
case KEY_LN:
|
|
keyc = 'c'; break;
|
|
case KEY_SIN:
|
|
keyc = 'd'; break;
|
|
case KEY_COS:
|
|
keyc = 'e'; break;
|
|
case KEY_TAN:
|
|
keyc = 'f'; break;
|
|
case KEY_FRAC:
|
|
keyc = 'g'; break;
|
|
case KEY_FD:
|
|
keyc = 'h'; break;
|
|
case KEY_LEFTP:
|
|
keyc = 'i'; break;
|
|
case KEY_RIGHTP:
|
|
keyc = 'j'; break;
|
|
case KEY_COMMA:
|
|
keyc = 'k'; break;
|
|
case KEY_ARROW:
|
|
keyc = 'l'; break;
|
|
case KEY_7:
|
|
keyc = 'm'; break;
|
|
case KEY_8:
|
|
keyc = 'n'; break;
|
|
case KEY_9:
|
|
keyc = 'o'; break;
|
|
case KEY_4:
|
|
keyc = 'p'; break;
|
|
case KEY_5:
|
|
keyc = 'q'; break;
|
|
case KEY_6:
|
|
keyc = 'r'; break;
|
|
case KEY_MUL:
|
|
keyc = 's'; break;
|
|
case KEY_DIV:
|
|
keyc = 't'; break;
|
|
case KEY_1:
|
|
keyc = 'u'; break;
|
|
case KEY_2:
|
|
keyc = 'v'; break;
|
|
case KEY_3:
|
|
keyc = 'w'; break;
|
|
case KEY_ADD:
|
|
keyc = 'x'; break;
|
|
case KEY_SUB:
|
|
keyc = 'y'; break;
|
|
case KEY_0:
|
|
keyc = 'z'; break;
|
|
case KEY_DOT:
|
|
keyc = ' '; break;
|
|
case KEY_EXP:
|
|
keyc = '"'; break;
|
|
case KEY_NEG:
|
|
keyc = '_'; break;
|
|
case KEY_EXE:
|
|
keyc = '\n'; break;
|
|
default:
|
|
inchar = 0; break;
|
|
};
|
|
}else{
|
|
switch(key){
|
|
case KEY_SQUARE:
|
|
keyc = '!'; break;
|
|
case KEY_POWER:
|
|
keyc = '?'; break;
|
|
case KEY_XOT:
|
|
keyc = 'A'; break;
|
|
case KEY_LOG:
|
|
keyc = 'B'; break;
|
|
case KEY_LN:
|
|
keyc = 'C'; break;
|
|
case KEY_SIN:
|
|
keyc = 'D'; break;
|
|
case KEY_COS:
|
|
keyc = 'E'; break;
|
|
case KEY_TAN:
|
|
keyc = 'F'; break;
|
|
case KEY_FRAC:
|
|
keyc = 'G'; break;
|
|
case KEY_FD:
|
|
keyc = 'H'; break;
|
|
case KEY_LEFTP:
|
|
keyc = 'I'; break;
|
|
case KEY_RIGHTP:
|
|
keyc = 'J'; break;
|
|
case KEY_COMMA:
|
|
keyc = 'K'; break;
|
|
case KEY_ARROW:
|
|
keyc = 'L'; break;
|
|
case KEY_7:
|
|
keyc = 'M'; break;
|
|
case KEY_8:
|
|
keyc = 'N'; break;
|
|
case KEY_9:
|
|
keyc = 'O'; break;
|
|
case KEY_4:
|
|
keyc = 'P'; break;
|
|
case KEY_5:
|
|
keyc = 'Q'; break;
|
|
case KEY_6:
|
|
keyc = 'R'; break;
|
|
case KEY_MUL:
|
|
keyc = 'S'; break;
|
|
case KEY_DIV:
|
|
keyc = 'T'; break;
|
|
case KEY_1:
|
|
keyc = 'U'; break;
|
|
case KEY_2:
|
|
keyc = 'V'; break;
|
|
case KEY_3:
|
|
keyc = 'W'; break;
|
|
case KEY_ADD:
|
|
keyc = 'X'; break;
|
|
case KEY_SUB:
|
|
keyc = 'Y'; break;
|
|
case KEY_0:
|
|
keyc = 'Z'; break;
|
|
case KEY_DOT:
|
|
keyc = ' '; break;
|
|
case KEY_EXP:
|
|
keyc = '#'; break;
|
|
case KEY_NEG:
|
|
keyc = '$'; break;
|
|
case KEY_EXE:
|
|
keyc = '\n'; break;
|
|
default:
|
|
inchar = 0; break;
|
|
};
|
|
}
|
|
}else{
|
|
switch(key){
|
|
case KEY_SQUARE:
|
|
keyc = '%'; break;
|
|
case KEY_POWER:
|
|
keyc = '\\'; break;
|
|
case KEY_XOT:
|
|
keyc = '{'; break;
|
|
case KEY_LOG:
|
|
keyc = '}'; break;
|
|
case KEY_LN:
|
|
keyc = '['; break;
|
|
case KEY_SIN:
|
|
keyc = ']'; break;
|
|
case KEY_COS:
|
|
keyc = '~'; break;
|
|
case KEY_TAN:
|
|
keyc = '@'; break;
|
|
case KEY_FRAC:
|
|
keyc = '<'; break;
|
|
case KEY_FD:
|
|
keyc = '>'; break;
|
|
case KEY_LEFTP:
|
|
keyc = '('; break;
|
|
case KEY_RIGHTP:
|
|
keyc = ')'; break;
|
|
case KEY_COMMA:
|
|
keyc = ','; break;
|
|
case KEY_ARROW:
|
|
keyc = '='; break;
|
|
case KEY_7:
|
|
keyc = '7'; break;
|
|
case KEY_8:
|
|
keyc = '8'; break;
|
|
case KEY_9:
|
|
keyc = '9'; break;
|
|
case KEY_4:
|
|
keyc = '4'; break;
|
|
case KEY_5:
|
|
keyc = '5'; break;
|
|
case KEY_6:
|
|
keyc = '6'; break;
|
|
case KEY_MUL:
|
|
keyc = '*'; break;
|
|
case KEY_DIV:
|
|
keyc = '/'; break;
|
|
case KEY_1:
|
|
keyc = '1'; break;
|
|
case KEY_2:
|
|
keyc = '2'; break;
|
|
case KEY_3:
|
|
keyc = '3'; break;
|
|
case KEY_ADD:
|
|
keyc = '+'; break;
|
|
case KEY_SUB:
|
|
keyc = '-'; break;
|
|
case KEY_0:
|
|
keyc = '0'; break;
|
|
case KEY_DOT:
|
|
keyc = '.'; break;
|
|
case KEY_EXP:
|
|
keyc = ';'; break;
|
|
case KEY_NEG:
|
|
keyc = '|'; break;
|
|
case KEY_EXE:
|
|
keyc = '\n'; break;
|
|
default:
|
|
inchar = 0; break;
|
|
};
|
|
}
|
|
if(inchar && lenght < INSZS1){
|
|
shiftstrpartright(pos);
|
|
input[pos] = keyc;
|
|
pos++;
|
|
lenght++;
|
|
}
|
|
if(key == KEY_LEFT && pos > 0){
|
|
pos--;
|
|
}else if(key == KEY_RIGHT && pos < lenght){
|
|
pos++;
|
|
}
|
|
if(key == KEY_SHIFT){
|
|
shift = !shift;
|
|
}else if(key == KEY_ALPHA){
|
|
alpha = !alpha;
|
|
}else if(key == KEY_DEL && pos > 0){
|
|
shiftstrpartleft(pos-1);
|
|
lenght--;
|
|
pos--;
|
|
}
|
|
dclear(C_WHITE);
|
|
dtext(1, 1, C_BLACK, (char*)input);
|
|
dline(pos*6, 1, pos*6, 7, C_BLACK);
|
|
dupdate();
|
|
clearevents();
|
|
}
|
|
return 1;
|
|
}
|