141 lines
3.7 KiB
C
141 lines
3.7 KiB
C
#include <utils.h>
|
|
#include <syscalls.h>
|
|
#include <commands.h>
|
|
#include <string.h>
|
|
|
|
static int check_session(unsigned int key, struct dump_s *dump)
|
|
{
|
|
static const unsigned int keys_switch[SESSIONS_SLOT] = {
|
|
KEY_F1, KEY_F2, KEY_F3,
|
|
KEY_F4, KEY_F5, KEY_F6
|
|
};
|
|
size_t i;
|
|
|
|
i = -1;
|
|
while (++i < SESSIONS_SLOT && key != keys_switch[i]);
|
|
if (i < SESSIONS_SLOT){
|
|
dump->current_session = i;
|
|
return (0);
|
|
}
|
|
return (-1);
|
|
}
|
|
|
|
static int check_insert(unsigned int key, struct dump_s *dump, struct session_s *session)
|
|
{
|
|
if (!(key == KEY_OPTN || key == KEY_SHIFT || key == KEY_ALPHA))
|
|
return (-1);
|
|
if (dump->insert.mode == LETTER)
|
|
dump->insert.mode = NUMBER;
|
|
if (key == KEY_OPTN){
|
|
if (session->mode != COMMAND){
|
|
memset(dump->info, '\0', CMD_LENGHT_MAX);
|
|
session->mode = COMMAND;
|
|
save_window(1);
|
|
}
|
|
else
|
|
//TODO: restore FREE mode ?
|
|
session->mode = (session->anchor == 0x00000000) ? UNUSED : NORMAL;
|
|
}
|
|
if (key == KEY_SHIFT)
|
|
dump->insert.mode = (dump->insert.mode == SHIFT) ? NUMBER : SHIFT;
|
|
if (key == KEY_ALPHA){
|
|
if (dump->insert.mode == SHIFT){
|
|
dump->insert.mode = CAPS_LOCK;
|
|
return (0);
|
|
}
|
|
if (dump->insert.mode == CAPS_LOCK){
|
|
dump->insert.mode = NUMBER;
|
|
return (0);
|
|
}
|
|
dump->insert.mode = LETTER;
|
|
}
|
|
return (0);
|
|
}
|
|
|
|
//TODO: find better way to do the job (?)
|
|
static int check_cmd(unsigned int key, struct dump_s *dump, struct session_s *session)
|
|
{
|
|
static const unsigned int keys_alpha[] = {
|
|
KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H,
|
|
KEY_I, KEY_J, KEY_K, KEY_L, KEY_M, KEY_N, KEY_O, KEY_P,
|
|
KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U, KEY_V, KEY_W, KEY_X,
|
|
KEY_Y, KEY_Z
|
|
};
|
|
static const unsigned int keys_number[] = {
|
|
KEY_0, KEY_1, KEY_2, KEY_3, KEY_4,
|
|
KEY_5, KEY_6, KEY_7, KEY_8, KEY_9
|
|
};
|
|
unsigned int *cache;
|
|
size_t size;
|
|
size_t end;
|
|
size_t i;
|
|
char buf;
|
|
|
|
if (session->mode != COMMAND)
|
|
return (-1);
|
|
i = -1;
|
|
size = strlen(dump->insert.cmd);
|
|
end = (dump->insert.mode == NUMBER) ? 10 : 26;
|
|
buf = (dump->insert.mode == NUMBER) ? '0' : 'a';
|
|
cache = (dump->insert.mode == NUMBER) ? (void *)keys_number : (void *)keys_alpha;
|
|
while (++i < end && key != cache[i]);
|
|
if (i >= end)
|
|
return (-1);
|
|
if (size < CMD_LENGHT_MAX){
|
|
buf += i;
|
|
strcat(dump->insert.cmd, &buf);
|
|
}
|
|
dump->history.offset = 0;
|
|
return (0);
|
|
}
|
|
|
|
static int check_arrow(unsigned int key, struct dump_s *dump, struct session_s *session)
|
|
{
|
|
if (key != KEY_UP && key != KEY_DOWN)
|
|
return (-1);
|
|
if (session->mode == COMMAND
|
|
&& ((key == KEY_UP && dump->history.offset < dump->history.deep)
|
|
|| (key == KEY_DOWN && dump->history.offset > 0))){
|
|
if (dump->history.offset == 0)
|
|
strcpy(dump->insert.backup, dump->insert.cmd);
|
|
dump->history.offset += (key == KEY_UP) ? 1 : -1;
|
|
if (dump->history.offset > 0)
|
|
strcpy(dump->insert.cmd,
|
|
history_get(dump->history.list, dump->history.offset - 1));
|
|
else
|
|
strcpy(dump->insert.cmd, dump->insert.backup);
|
|
}
|
|
if (session->mode != UNUSED && session->mode != COMMAND){
|
|
if (key == KEY_UP && session->cursor > 0)
|
|
session->cursor -= INSTRUCTION_SIZE;
|
|
if (key == KEY_DOWN && session->cursor < session->size - LINE_OFFSET)
|
|
session->cursor += INSTRUCTION_SIZE;
|
|
}
|
|
return (0);
|
|
}
|
|
|
|
void key_handling(struct dump_s *dump, struct session_s *session, unsigned int key)
|
|
{
|
|
size_t size;
|
|
|
|
if (check_session(key, dump) == 0
|
|
|| check_insert(key, dump, session) == 0
|
|
|| check_arrow(key, dump, session) == 0
|
|
|| check_cmd(key, dump, session) == 0
|
|
|| session->mode != COMMAND)
|
|
return;
|
|
if (key == KEY_DEL || key == KEY_INS){
|
|
size = strlen(dump->insert.cmd);
|
|
if (size > 0)
|
|
strncpy(dump->insert.cmd, dump->insert.cmd, size - 1);
|
|
}
|
|
if (key == KEY_SPACE)
|
|
strcat(dump->insert.cmd, " ");
|
|
if (key == KEY_QUOTE)
|
|
strcat(dump->insert.cmd, "\"");
|
|
if (key == KEY_ENTER){
|
|
dump->insert.mode = NUMBER;
|
|
command_entry(session, dump);
|
|
}
|
|
}
|