2019-02-21 20:58:38 +01:00
|
|
|
//---
|
|
|
|
// gint:keysc:getkey - High-level keyboard monitoring function
|
|
|
|
//---
|
|
|
|
|
|
|
|
#include <gint/keyboard.h>
|
2021-03-05 14:49:24 +01:00
|
|
|
#include <gint/drivers/keydev.h>
|
2020-05-10 16:36:21 +02:00
|
|
|
#include <gint/gint.h>
|
2019-02-21 20:58:38 +01:00
|
|
|
#include <gint/defs/types.h>
|
|
|
|
|
|
|
|
#ifdef FX9860G
|
|
|
|
#include <gint/drivers/t6k11.h>
|
|
|
|
#endif
|
|
|
|
|
2021-05-05 14:46:47 +02:00
|
|
|
/* Feature function */
|
|
|
|
static getkey_feature_t feature_function = NULL;
|
2020-08-05 11:50:32 +02:00
|
|
|
|
|
|
|
/* getkey(): Wait for a key press */
|
2019-02-21 20:58:38 +01:00
|
|
|
key_event_t getkey(void)
|
|
|
|
{
|
|
|
|
return getkey_opt(GETKEY_DEFAULT, NULL);
|
|
|
|
}
|
|
|
|
|
2020-08-05 11:50:32 +02:00
|
|
|
/* getkey_opt(): Enhanced getkey() */
|
2019-02-21 20:58:38 +01:00
|
|
|
key_event_t getkey_opt(int opt, volatile int *timeout)
|
|
|
|
{
|
2021-03-05 14:49:24 +01:00
|
|
|
keydev_t *d = keydev_std();
|
2022-07-24 22:57:18 +02:00
|
|
|
keydev_transform_t tr = keydev_transform(d);
|
2021-03-05 14:49:24 +01:00
|
|
|
key_event_t e;
|
|
|
|
|
2022-04-23 14:34:41 +02:00
|
|
|
int o = KEYDEV_TR_REPEATS +
|
|
|
|
KEYDEV_TR_DELETE_MODIFIERS +
|
|
|
|
KEYDEV_TR_DELETE_RELEASES +
|
|
|
|
(opt & (GETKEY_MOD_SHIFT + GETKEY_MOD_ALPHA));
|
2022-07-24 22:57:18 +02:00
|
|
|
keydev_set_transform(d, (keydev_transform_t){ o, tr.repeater });
|
2021-03-05 14:49:24 +01:00
|
|
|
|
|
|
|
while(1)
|
2019-02-21 20:58:38 +01:00
|
|
|
{
|
2021-03-05 14:49:24 +01:00
|
|
|
e = keydev_read(d);
|
|
|
|
if(e.type == KEYEV_NONE && timeout && *timeout) break;
|
2019-02-21 20:58:38 +01:00
|
|
|
|
2022-07-24 22:57:18 +02:00
|
|
|
/* Skip repeat events that are not enabled by options */
|
|
|
|
if(e.type == KEYEV_HOLD && !(opt & GETKEY_REP_ALL))
|
|
|
|
{
|
|
|
|
if(!(opt & GETKEY_REP_ARROWS))
|
|
|
|
continue;
|
|
|
|
if(e.key != KEY_LEFT && e.key != KEY_RIGHT &&
|
|
|
|
e.key != KEY_UP && e.key != KEY_DOWN)
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2019-02-21 20:58:38 +01:00
|
|
|
#ifdef FX9860G
|
2021-03-05 14:49:24 +01:00
|
|
|
/* Backlight toggle */
|
2022-07-24 22:57:18 +02:00
|
|
|
if((opt & GETKEY_BACKLIGHT) && e.type == KEYEV_DOWN &&
|
2021-03-05 14:49:24 +01:00
|
|
|
e.key == KEY_OPTN && e.shift && !e.alpha)
|
2022-07-24 22:57:18 +02:00
|
|
|
{
|
2019-02-21 20:58:38 +01:00
|
|
|
t6k11_backlight(-1);
|
2022-07-24 22:57:18 +02:00
|
|
|
continue;
|
|
|
|
}
|
2019-02-21 20:58:38 +01:00
|
|
|
#endif
|
|
|
|
|
2021-03-05 14:49:24 +01:00
|
|
|
/* Return-to-menu */
|
2022-07-24 22:57:18 +02:00
|
|
|
if((opt & GETKEY_MENU) && e.type == KEYEV_DOWN &&
|
2021-03-05 14:49:24 +01:00
|
|
|
e.key == KEY_MENU && !e.shift && !e.alpha)
|
2022-07-24 22:57:18 +02:00
|
|
|
{
|
2020-05-10 14:03:41 +02:00
|
|
|
gint_osmenu();
|
2022-07-24 22:57:18 +02:00
|
|
|
continue;
|
|
|
|
}
|
2021-03-05 14:49:24 +01:00
|
|
|
|
2022-07-24 22:57:18 +02:00
|
|
|
if(e.type == KEYEV_DOWN || e.type == KEYEV_HOLD)
|
2021-05-05 14:46:47 +02:00
|
|
|
{
|
|
|
|
/* Custom global features */
|
|
|
|
bool accepted = false;
|
|
|
|
if((opt & GETKEY_FEATURES) && feature_function)
|
|
|
|
accepted = feature_function(e);
|
2022-07-24 22:57:18 +02:00
|
|
|
/* Return if the event has not been accepted yet */
|
2021-05-05 14:46:47 +02:00
|
|
|
if(!accepted) break;
|
|
|
|
}
|
2019-02-21 20:58:38 +01:00
|
|
|
}
|
2021-03-05 14:49:24 +01:00
|
|
|
|
2022-07-24 22:57:18 +02:00
|
|
|
/* Restore previous transform settings */
|
|
|
|
keydev_set_transform(d, tr);
|
2021-03-05 14:49:24 +01:00
|
|
|
return e;
|
2019-02-21 20:58:38 +01:00
|
|
|
}
|
|
|
|
|
2022-07-24 22:57:18 +02:00
|
|
|
/* getkey_feature_function(): Get the current feature function */
|
|
|
|
getkey_feature_t getkey_feature_function(void)
|
2019-02-21 20:58:38 +01:00
|
|
|
{
|
2022-07-24 22:57:18 +02:00
|
|
|
return feature_function;
|
2019-02-21 20:58:38 +01:00
|
|
|
}
|
2020-08-05 11:50:32 +02:00
|
|
|
|
2022-07-24 22:57:18 +02:00
|
|
|
/* getkey_set_feature_function(): Set the global feature function */
|
|
|
|
void getkey_set_feature_function(getkey_feature_t function)
|
2020-08-05 11:50:32 +02:00
|
|
|
{
|
2022-07-24 22:57:18 +02:00
|
|
|
feature_function = function;
|
2020-08-05 11:50:32 +02:00
|
|
|
}
|
2021-01-31 12:19:39 +01:00
|
|
|
|
2022-07-24 22:57:18 +02:00
|
|
|
/* Deprecated repeat functions */
|
|
|
|
|
|
|
|
void getkey_repeat(int first, int next)
|
2021-01-31 12:19:39 +01:00
|
|
|
{
|
2022-07-24 22:57:18 +02:00
|
|
|
keydev_set_standard_repeats(keydev_std(), first * 1000, next * 1000);
|
2021-01-31 12:19:39 +01:00
|
|
|
}
|
2021-05-05 14:46:47 +02:00
|
|
|
|
2022-07-24 22:57:18 +02:00
|
|
|
getkey_profile_t getkey_repeat_profile(void)
|
2021-05-05 14:46:47 +02:00
|
|
|
{
|
2022-07-24 22:57:18 +02:00
|
|
|
return keydev_transform(keydev_std()).repeater;
|
2021-05-05 14:46:47 +02:00
|
|
|
}
|
|
|
|
|
2022-07-24 22:57:18 +02:00
|
|
|
/* getkey_set_repeat_profile(): Set the repeat profile function */
|
|
|
|
void getkey_set_repeat_profile(getkey_profile_t profile)
|
2021-05-05 14:46:47 +02:00
|
|
|
{
|
2022-07-24 22:57:18 +02:00
|
|
|
keydev_transform_t tr = keydev_transform(keydev_std());
|
|
|
|
tr.repeater = profile;
|
|
|
|
keydev_set_transform(keydev_std(), tr);
|
2021-05-05 14:46:47 +02:00
|
|
|
}
|