Refactor the input part

And add support for moving the canvas with cursor keys.
This commit is contained in:
Přemysl Eric Janouch 2014-10-27 17:20:46 +01:00
parent 50842917f6
commit 28a93ad693
1 changed files with 65 additions and 34 deletions

View File

@ -657,56 +657,39 @@ export_irc (app_context_t *app)
// --- Event handlers ----------------------------------------------------------
static bool
on_key (app_context_t *app, termo_key_t *key)
static void
move_canvas (app_context_t *app, int x, int y)
{
if (key->type == TERMO_TYPE_KEYSYM && key->code.sym == TERMO_SYM_ESCAPE)
return false;
app->corner_x += x;
app->corner_y += y;
if (key->type == TERMO_TYPE_KEY
&& (key->modifiers & TERMO_KEYMOD_CTRL)
&& (key->code.codepoint == 'C' || key->code.codepoint == 'c'))
return false;
app->center_x += x;
app->center_y += y;
if (key->type == TERMO_TYPE_KEY && key->code.codepoint == 'e')
{
export_ansi (app);
return true;
}
if (key->type == TERMO_TYPE_KEY && key->code.codepoint == 'E')
{
export_irc (app);
return true;
}
if (key->type != TERMO_TYPE_MOUSE)
return true;
redraw_canvas (app);
}
static void
on_mouse (app_context_t *app, termo_key_t *key)
{
int screen_y, screen_x, button;
termo_mouse_event_t event;
termo_interpret_mouse (app->tk, key, &event, &button, &screen_y, &screen_x);
if (event != TERMO_MOUSE_PRESS && event != TERMO_MOUSE_DRAG)
return true;
return;
// Middle mouse button, or Ctrl + left mouse button, moves the canvas
if (button == 2 || (button == 1 && key->modifiers == TERMO_KEYMOD_CTRL))
{
if (event == TERMO_MOUSE_DRAG)
{
app->corner_x += app->move_saved_x - screen_x;
app->corner_y += app->move_saved_y - screen_y;
app->center_x += app->move_saved_x - screen_x;
app->center_y += app->move_saved_y - screen_y;
redraw_canvas (app);
}
move_canvas (app,
app->move_saved_x - screen_x,
app->move_saved_y - screen_y);
app->move_saved_x = screen_x;
app->move_saved_y = screen_y;
return true;
return;
}
uint8_t *color;
@ -715,7 +698,7 @@ on_key (app_context_t *app, termo_key_t *key)
else if (button == 3)
color = &app->current_color_right;
else
return true;
return;
int canvas_x = app->corner_x + screen_x;
int canvas_y = app->corner_y + screen_y - TOP_BAR_CUTOFF;
@ -732,6 +715,54 @@ on_key (app_context_t *app, termo_key_t *key)
int pair = (float) screen_x / COLS * PALETTE_WIDTH;
*color = pair + (screen_y - 1) * PALETTE_WIDTH;
}
}
static bool
on_key (app_context_t *app, termo_key_t *key)
{
if (key->type == TERMO_TYPE_KEYSYM)
{
if (key->code.sym == TERMO_SYM_ESCAPE)
return false;
if (key->modifiers)
return true;
switch (key->code.sym)
{
case TERMO_SYM_UP:
move_canvas (app, 0, -1);
break;
case TERMO_SYM_DOWN:
move_canvas (app, 0, 1);
break;
case TERMO_SYM_LEFT:
move_canvas (app, -1, 0);
break;
case TERMO_SYM_RIGHT:
move_canvas (app, 1, 0);
default:
break;
}
return true;
}
if (key->type == TERMO_TYPE_KEY)
{
if ((key->modifiers & TERMO_KEYMOD_CTRL)
&& (key->code.codepoint == 'C' || key->code.codepoint == 'c'))
return false;
if (key->modifiers)
return true;
if (key->code.codepoint == 'e') export_ansi (app);
if (key->code.codepoint == 'E') export_irc (app);
return true;
}
if (key->type == TERMO_TYPE_MOUSE)
on_mouse (app, key);
return true;
}