Implement de/focus event parsing

So far there is no way to set it up, I'm not sure how to go about it.
This commit is contained in:
Přemysl Eric Janouch 2020-09-14 15:38:49 +02:00
parent 78c0cd443d
commit 0bfb13655c
Signed by: p
GPG Key ID: A0420B94F92B9493
6 changed files with 69 additions and 1 deletions

View File

@ -147,6 +147,7 @@ set (project_tests
30mouse
31position
32modereport
33focus
39csi)
if (BUILD_TESTING)

View File

@ -1,5 +1,5 @@
Copyright (c) 2007-2014 Paul Evans <leonerd@leonerd.org.uk>
Copyright (c) 2014 Přemysl Eric Janouch <p@janouch.name>
Copyright (c) 2014-2020 Přemysl Eric Janouch <p@janouch.name>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -331,6 +331,33 @@ handle_csi_m (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
return TERMO_RES_NONE;
}
//
// Handler for CSI I / CSI O focus events
//
static termo_result_t
handle_csi_IO (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
{
(void) tk;
(void) arg;
(void) args;
switch (cmd &= 0xff)
{
case 'I':
key->type = TERMO_TYPE_FOCUS;
key->code.focused = true;
return TERMO_RES_KEY;
case 'O':
key->type = TERMO_TYPE_FOCUS;
key->code.focused = false;
return TERMO_RES_KEY;
default:
return TERMO_RES_NONE;
}
return TERMO_RES_NONE;
}
termo_result_t
termo_interpret_mouse (termo_t *tk, const termo_key_t *key,
termo_mouse_event_t *event, int *button, int *line, int *col)
@ -671,6 +698,9 @@ register_keys (void)
csi_handlers['M' - 0x20] = &handle_csi_m;
csi_handlers['m' - 0x20] = &handle_csi_m;
csi_handlers['I' - 0x20] = &handle_csi_IO;
csi_handlers['O' - 0x20] = &handle_csi_IO;
csi_handlers['R' - 0x20] = &handle_csi_R;
csi_handlers['y' - 0x20] = &handle_csi_y;

View File

@ -156,6 +156,9 @@ print_key (termo_t *tk, termo_key_t *key)
ev, button, line, col);
break;
}
case TERMO_TYPE_FOCUS:
fprintf (stderr, "%s\n", key->code.focused ? "Focused" : "Defocused");
break;
case TERMO_TYPE_POSITION:
{
int line, col;
@ -1572,6 +1575,8 @@ termo_strfkey_generic (termo_t *tk, char *buffer, size_t len,
}
break;
}
case TERMO_TYPE_FOCUS:
l = snprintf (buffer + pos, len - pos, "Focus(%d)", key->code.focused);
case TERMO_TYPE_POSITION:
l = snprintf (buffer + pos, len - pos, "Position");
break;
@ -1826,6 +1831,8 @@ termo_keycmp (termo_t *tk,
return cmp;
break;
}
case TERMO_TYPE_FOCUS:
return key1.code.focused - key2.code.focused;
case TERMO_TYPE_POSITION:
{
int line1, col1, line2, col2;

View File

@ -97,6 +97,7 @@ enum termo_type
TERMO_TYPE_MOUSE,
TERMO_TYPE_POSITION,
TERMO_TYPE_MODEREPORT,
TERMO_TYPE_FOCUS,
// add other recognised types here
TERMO_TYPE_UNKNOWN_CSI = -1
@ -159,6 +160,7 @@ struct termo_key
uint32_t codepoint; // TERMO_TYPE_KEY
int number; // TERMO_TYPE_FUNCTION
termo_sym_t sym; // TERMO_TYPE_KEYSYM
int focused; // TERMO_TYPE_FOCUS
// TERMO_TYPE_MODEREPORT
// opaque, see termo_interpret_modereport()

28
tests/33focus.c Normal file
View File

@ -0,0 +1,28 @@
#include "../termo.h"
#include "taplib.h"
int
main (int argc, char *argv[])
{
termo_t *tk;
termo_key_t key;
plan_tests (6);
tk = termo_new_abstract ("vt100", NULL, 0);
termo_push_bytes (tk, "\e[I", 3);
is_int (termo_getkey (tk, &key), TERMO_RES_KEY,
"getkey yields RES_KEY for focus in");
is_int (key.type, TERMO_TYPE_FOCUS, "key.type for focus in");
is_int (key.code.focused, 1, "focused indicator for focus in");
termo_push_bytes (tk, "\e[O", 3);
is_int (termo_getkey (tk, &key), TERMO_RES_KEY,
"getkey yields RES_KEY for focus out");
is_int (key.type, TERMO_TYPE_FOCUS, "key.type for focus out");
is_int (key.code.focused, 0, "focused indicator for focus out");
termo_destroy (tk);
return exit_status ();
}