feat(core): add event_flags to process_event #7046

- use a constant, KM_KBP_EVENT_FLAG_DEFAULT for 0
- update pascal and python
- update linux and windows
This commit is contained in:
Steven R. Loomis 2022-08-12 09:58:58 -05:00
parent 21a783a6ca
commit e8dff5cf4e
13 changed files with 45 additions and 31 deletions

View file

@ -1052,6 +1052,7 @@ enum km_kbp_tech_value {
* Bit flags to be used with the event_flags parameter of km_kbp_process_event
*/
enum km_kbp_event_flags {
KM_KBP_EVENT_FLAG_DEFAULT = 0, // default value: hardware
KM_KBP_EVENT_FLAG_TOUCH = 1, // set if the event is touch, otherwise hardware
};

View file

@ -277,13 +277,20 @@ class Tech(IntFlag):
KMN = 1
LDML = 2
class EventFlag(IntFlag):
KM_KBP_EVENT_FLAG_DEFAULT = 0
"""default value: hardware"""
KM_KBP_EVENT_FLAG_TOUCH = 1
"""set if the event is touch, otherwise hardware"""
__method(None, 'get_engine_attrs', POINTER(Attributes))
__method(None, 'process_event', Status,
(State_p, Dir.IN, 'state'),
(VirtualKey, Dir.IN, 'vkey'),
(c_uint16, Dir.IN, 'modifier_state'))
(c_uint16, Dir.IN, 'modifier_state'),
(c_uint16, Dir.IN, 'event_flags'))
class Modifier(IntFlag):

View file

@ -114,5 +114,6 @@ class State:
def process_event(vk: VirtualKey,
modifier_state,
state: State,
acts: ActionList):
acts: ActionList,
event_flags):
pass

View file

@ -73,7 +73,7 @@ void setup(const char *keyboard) {
void test_debugging_disabled() {
setup("000 - null keyboard.kmx");
try_status(km_kbp_state_debug_set(test_state, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_S, KM_KBP_MODIFIER_SHIFT, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_S, KM_KBP_MODIFIER_SHIFT, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(debug_items(test_state, {
km_kbp_state_debug_item{KM_KBP_DEBUG_END}
}));
@ -91,7 +91,7 @@ void test_debugging_no_rule_match() {
setup("000 - null keyboard.kmx");
DEBUG_GROUP gp = {u"Main"};
try_status(km_kbp_state_debug_set(test_state, 1));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_S, KM_KBP_MODIFIER_SHIFT, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_S, KM_KBP_MODIFIER_SHIFT, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(debug_items(test_state, {
km_kbp_state_debug_item{KM_KBP_DEBUG_BEGIN, KM_KBP_DEBUG_FLAG_UNICODE, {KM_KBP_VKEY_S, KM_KBP_MODIFIER_SHIFT, 'S'}},
km_kbp_state_debug_item{KM_KBP_DEBUG_GROUP_ENTER, 0, {}, {u"", &gp}},
@ -112,7 +112,7 @@ void test_debugging_function_key() {
setup("000 - null keyboard.kmx");
DEBUG_GROUP gp = {u"Main"};
try_status(km_kbp_state_debug_set(test_state, 1));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_F1, 0, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_F1, 0, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(debug_items(test_state, {
km_kbp_state_debug_item{KM_KBP_DEBUG_BEGIN, KM_KBP_DEBUG_FLAG_UNICODE, {KM_KBP_VKEY_F1, 0, 0}},
km_kbp_state_debug_item{KM_KBP_DEBUG_GROUP_ENTER, 0, {}, {u"", &gp}},
@ -138,7 +138,7 @@ void test_basic_rule_matches() {
// 'DE' + 'F' > U+0E04 U+0E05 U+0E06
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_D, KM_KBP_MODIFIER_SHIFT, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_D, KM_KBP_MODIFIER_SHIFT, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(debug_items(test_state, {
km_kbp_state_debug_item{KM_KBP_DEBUG_BEGIN, KM_KBP_DEBUG_FLAG_UNICODE, {KM_KBP_VKEY_D, KM_KBP_MODIFIER_SHIFT, 'D'}},
km_kbp_state_debug_item{KM_KBP_DEBUG_GROUP_ENTER, 0, {}, {u"", &gp}},
@ -151,7 +151,7 @@ void test_basic_rule_matches() {
{KM_KBP_IT_END}
}));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_E, KM_KBP_MODIFIER_SHIFT, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_E, KM_KBP_MODIFIER_SHIFT, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(debug_items(test_state, {
km_kbp_state_debug_item{KM_KBP_DEBUG_BEGIN, KM_KBP_DEBUG_FLAG_UNICODE, {KM_KBP_VKEY_E, KM_KBP_MODIFIER_SHIFT, 'E'}},
km_kbp_state_debug_item{KM_KBP_DEBUG_GROUP_ENTER, 0, {}, {u"", &gp}},
@ -164,7 +164,7 @@ void test_basic_rule_matches() {
{KM_KBP_IT_END}
}));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_F, KM_KBP_MODIFIER_SHIFT, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_F, KM_KBP_MODIFIER_SHIFT, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(debug_items(test_state, {
km_kbp_state_debug_item{KM_KBP_DEBUG_BEGIN, KM_KBP_DEBUG_FLAG_UNICODE, {KM_KBP_VKEY_F, KM_KBP_MODIFIER_SHIFT, 'F'}},
km_kbp_state_debug_item{KM_KBP_DEBUG_GROUP_ENTER, 0, {}, {u"", &gp}},
@ -208,7 +208,7 @@ void test_multiple_groups() {
// '12' -> 'abc'
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_1, 0, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_1, 0, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(debug_items(test_state, {
km_kbp_state_debug_item{KM_KBP_DEBUG_BEGIN, KM_KBP_DEBUG_FLAG_UNICODE, {KM_KBP_VKEY_1, 0, '1'}},
km_kbp_state_debug_item{KM_KBP_DEBUG_GROUP_ENTER, 0, {}, {u"", &gp}},
@ -238,7 +238,7 @@ void test_multiple_groups() {
{KM_KBP_IT_END}
}));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_2, 0, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_2, 0, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(debug_items(test_state, {
km_kbp_state_debug_item{KM_KBP_DEBUG_BEGIN, KM_KBP_DEBUG_FLAG_UNICODE, {KM_KBP_VKEY_2, 0, '2'}},
km_kbp_state_debug_item{KM_KBP_DEBUG_GROUP_ENTER, 0, {}, {u"", &gp}},
@ -287,7 +287,7 @@ void test_store_offsets() {
// 'ab' -> 'ex'
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_A, 0, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_A, 0, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(debug_items(test_state, {
km_kbp_state_debug_item{KM_KBP_DEBUG_BEGIN, KM_KBP_DEBUG_FLAG_UNICODE, {KM_KBP_VKEY_A, 0, 'a'}},
km_kbp_state_debug_item{KM_KBP_DEBUG_GROUP_ENTER, 0, {}, {u"", &gp}},
@ -307,7 +307,7 @@ void test_store_offsets() {
{KM_KBP_IT_END}
}));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_B, 0, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_B, 0, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(debug_items(test_state, {
km_kbp_state_debug_item{KM_KBP_DEBUG_BEGIN, KM_KBP_DEBUG_FLAG_UNICODE, {KM_KBP_VKEY_B, 0, 'b'}},
km_kbp_state_debug_item{KM_KBP_DEBUG_GROUP_ENTER, 0, {}, {u"", &gp}},
@ -361,7 +361,7 @@ void test_set_option() {
// '1' -> set_option
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_1, 0, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_1, 0, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(debug_items(test_state, {
km_kbp_state_debug_item{KM_KBP_DEBUG_BEGIN, KM_KBP_DEBUG_FLAG_UNICODE, {KM_KBP_VKEY_1, 0, '1'}},
km_kbp_state_debug_item{KM_KBP_DEBUG_GROUP_ENTER, 0, {}, {u"", &gp}},

View file

@ -156,20 +156,20 @@ int main(int argc, char * argv[])
DISABLE_WARNING_POP
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_S,
KM_KBP_MODIFIER_SHIFT, 1, 0));
KM_KBP_MODIFIER_SHIFT, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(action_items(test_state, {{KM_KBP_IT_CHAR, {0,}, {km_kbp_usv('S')}}, {KM_KBP_IT_END}}));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_I,
KM_KBP_MODIFIER_SHIFT, 1, 0));
KM_KBP_MODIFIER_SHIFT, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(action_items(test_state, {{KM_KBP_IT_CHAR, {0,}, {km_kbp_usv('I')}}, {KM_KBP_IT_END}}));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_L, 0, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_L, 0, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(action_items(test_state, {{KM_KBP_IT_CHAR, {0,}, {km_kbp_usv('l')}}, {KM_KBP_IT_END}}));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_BKSP, 0, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_BKSP, 0, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(action_items(test_state, {{KM_KBP_IT_BACK, {0,}, {0}}, {KM_KBP_IT_END}}));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_L,
KM_KBP_MODIFIER_SHIFT, 1, 0));
KM_KBP_MODIFIER_SHIFT, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(action_items(test_state, {{KM_KBP_IT_CHAR, {0,}, {km_kbp_usv('L')}}, {KM_KBP_IT_END}}));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_F2, 0, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_F2, 0, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(action_items(test_state, {{KM_KBP_IT_PERSIST_OPT, {0,},
{uintptr_t(&expected_persist_opt)}}, {KM_KBP_IT_END}}));

View file

@ -218,7 +218,7 @@ run_test(const km::kbp::path &source, const km::kbp::path &compiled) {
}
for (auto key_down = 1; key_down >= 0; key_down--) {
try_status(km_kbp_process_event(test_state, p.vk, p.modifier_state | test_source.caps_lock_state(), key_down, 0));
try_status(km_kbp_process_event(test_state, p.vk, p.modifier_state | test_source.caps_lock_state(), key_down, KM_KBP_EVENT_FLAG_DEFAULT));
for (auto act = km_kbp_state_action_items(test_state, nullptr); act->type != KM_KBP_IT_END; act++) {
apply_action(test_state, *act, text_store, test_context, options, test_source);

View file

@ -214,26 +214,26 @@ void test_queue_actions (const km::kbp::path &source_keyboard) {
km_kbp_state_imx_register_callback(test_state, test_imx_callback, (void*)&g_extract_imx_map);
// Key Press that doesn't trigger a call back
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_S,KM_KBP_MODIFIER_SHIFT, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_S,KM_KBP_MODIFIER_SHIFT, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(action_items(test_state, {{KM_KBP_IT_CHAR, {0,}, {km_kbp_usv('S')}}, {KM_KBP_IT_END}}));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_BKSP, 0, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_BKSP, 0, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(action_items(test_state, {{KM_KBP_IT_CHAR, {0,}, {km_kbp_usv('X')}}, {KM_KBP_IT_ALERT, {0,}, {0}}, {KM_KBP_IT_END}}));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_ESC, 0, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_ESC, 0, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(action_items(test_state, { {KM_KBP_IT_CHAR, {0,}, {km_kbp_usv('Y')}},
{KM_KBP_IT_MARKER, {0,}, {1}},
{KM_KBP_IT_CHAR, {0,}, {km_kbp_usv('A')}},
{KM_KBP_IT_END}}));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_1, 0, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_1, 0, 1, KM_KBP_EVENT_FLAG_DEFAULT));
km_kbp_action_item bksp_a = {KM_KBP_IT_BACK};
bksp_a.backspace.expected_type = KM_KBP_BT_CHAR;
bksp_a.backspace.expected_value = 'A';
assert(action_items(test_state, {bksp_a,{KM_KBP_IT_CHAR, {0,}, {km_kbp_usv('Z')}}, {KM_KBP_IT_END}}));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_2, 0, 1, 0));
try_status(km_kbp_process_event(test_state, KM_KBP_VKEY_2, 0, 1, KM_KBP_EVENT_FLAG_DEFAULT));
assert(action_items(test_state, {{KM_KBP_IT_INVALIDATE_CONTEXT, {0,}, {0}}, {KM_KBP_IT_END}}));
km_kbp_state_imx_deregister_callback(test_state);

View file

@ -190,7 +190,7 @@ run_test(const km::kbp::path &source, const km::kbp::path &compiled) {
}
for (auto key_down = 1; key_down >= 0; key_down--) {
try_status(km_kbp_process_event(test_state, p.vk, p.modifier_state | test_source.caps_lock_state(), key_down, 0)); // TODO-LDML: for now. Should send touch and hardware events.
try_status(km_kbp_process_event(test_state, p.vk, p.modifier_state | test_source.caps_lock_state(), key_down, KM_KBP_EVENT_FLAG_DEFAULT)); // TODO-LDML: for now. Should send touch and hardware events.
for (auto act = km_kbp_state_action_items(test_state, nullptr); act->type != KM_KBP_IT_END; act++) {
apply_action(test_state, *act, text_store, test_context, test_source);

View file

@ -462,7 +462,7 @@ begin
if not SetKeyEventContext then
Exit(False);
if km_kbp_process_event(FDebugCore.State, Message.WParam, modifier, 1) = KM_KBP_STATUS_OK then
if km_kbp_process_event(FDebugCore.State, Message.WParam, modifier, 1, KM_KBP_EVENT_FLAG_DEFAULT) = KM_KBP_STATUS_OK then
begin
// Process keystroke
Result := True;

View file

@ -307,9 +307,14 @@ km_kbp_process_event(
state: pkm_kbp_state;
vk: km_kbp_virtual_key;
modifier_state: uint16_t;
is_key_down: uint8_t
is_key_down: uint8_t;
event_flags: uint16_t;
): km_kbp_status; cdecl; external kmnkbp0 delayed;
const
KM_KBP_EVENT_FLAG_DEFAULT = 0; // default value: hardware
KM_KBP_EVENT_FLAG_TOUCH = 1; // set if the event is touch, otherwise hardware
// keyboardprocessor_vkeys.h

View file

@ -110,7 +110,7 @@ var
begin
context := km_kbp_state_context(FCore.State);
km_kbp_context_clear(context);
if km_kbp_process_event(FCore.State, vk.vkey, vk.kmshift, 1) = KM_KBP_STATUS_OK then
if km_kbp_process_event(FCore.State, vk.vkey, vk.kmshift, 1, KM_KBP_EVENT_FLAG_DEFAULT) = KM_KBP_STATUS_OK then
begin
FEvents.Clear;
FEvents.AddStateItems(FCore.State, vk.vkey, vk.kmshift);

View file

@ -838,7 +838,7 @@ ibus_keyman_engine_process_key_event(
km_kbp_context *context = km_kbp_state_context(keyman->state);
g_free(get_current_context_text(context));
g_message("DAR: ibus_keyman_engine_process_key_event - km_mod_state=0x%x", km_mod_state);
km_kbp_status event_status = km_kbp_process_event(keyman->state, keycode_to_vk[keycode], km_mod_state, isKeyDown);
km_kbp_status event_status = km_kbp_process_event(keyman->state, keycode_to_vk[keycode], km_mod_state, isKeyDown, KM_KBP_EVENT_FLAG_DEFAULT);
context = km_kbp_state_context(keyman->state);
g_message("after process key event");
g_free(get_current_context_text(context));

View file

@ -112,7 +112,7 @@ Process_Event_Core(PKEYMAN64THREADDATA _td) {
// Mask the bits supported according to `km_kbp_modifier_state` enum, update the mask if this enum is expanded.
if (KM_KBP_STATUS_OK != km_kbp_process_event(
_td->lpActiveKeyboard->lpCoreKeyboardState, _td->state.vkey,
static_cast<uint16_t>(Globals::get_ShiftState() & (KM_KBP_MODIFIER_MASK_ALL | KM_KBP_MODIFIER_MASK_CAPS)), (uint8_t)_td->state.isDown)) {
static_cast<uint16_t>(Globals::get_ShiftState() & (KM_KBP_MODIFIER_MASK_ALL | KM_KBP_MODIFIER_MASK_CAPS)), (uint8_t)_td->state.isDown), KM_KBP_EVENT_FLAG_DEFAULT) {
SendDebugMessageFormat(0, sdmGlobal, 0, "ProcessEvent CoreProcessEvent Result:False %d ", FALSE);
return FALSE;
}