Skip to content

Commit

Permalink
Merge pull request #10115 from keymanapp/feat/core/action-struct-to-q…
Browse files Browse the repository at this point in the history
…ueue

feat(core): action struct to action items conversion
  • Loading branch information
mcdurdin committed Dec 12, 2023
2 parents 37a8e96 + 802f225 commit e65d5c5
Show file tree
Hide file tree
Showing 8 changed files with 446 additions and 17 deletions.
6 changes: 3 additions & 3 deletions core/include/keyman/keyman_core_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -582,7 +582,7 @@ typedef struct {
km_core_usv* output;

// list of options to persist, terminated with KM_CORE_OPTIONS_END
km_core_option_item* persist_options;
km_core_option_item * persist_options;

// issue a beep, 0 = no, 1 = yes
km_core_bool do_alert;
Expand Down Expand Up @@ -611,7 +611,7 @@ A pointer to a `km_core_actions` object, which must be freed with
```c
*/
KMN_API
km_core_actions*
km_core_actions const *
km_core_state_get_actions(
km_core_state const *state
);
Expand All @@ -630,7 +630,7 @@ returned by `km_core_state_get_actions`.
KMN_API
km_core_status
km_core_actions_dispose(
km_core_actions* actions
km_core_actions const * actions
);

/*
Expand Down
41 changes: 40 additions & 1 deletion core/src/action.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
#include "state.hpp"
#include "option.hpp"

km_core_actions * km::core::action_item_list_to_actions_object(
km_core_actions const * km::core::action_item_list_to_actions_object(
km_core_action_item const *action_items
) {
assert(action_items != nullptr);
Expand Down Expand Up @@ -138,3 +138,42 @@ km_core_actions * km::core::action_item_list_to_actions_object(

return actions.release();
}


// TODO: this is effectively the inverse of action_item_list_to_actions_object,
// and perhaps we should consider changing that function to be a member
// of state also, so that we can move memory management into state?
bool km::core::state::set_actions(
km_core_actions const &actions
) {
_actions.clear();

// number of codepoints (not codeunits!) to delete from app context.

for(unsigned int i = 0; i < actions.code_points_to_delete; i++) {
_actions.push_backspace(KM_CORE_BT_CHAR, 0); // expected value is not known
}

for(auto output = actions.output; *output; output++) {
_actions.push_character(*output);
}

for(auto opt = actions.persist_options; opt->scope; opt++) {
km::core::option opt0(static_cast<km_core_option_scope>(opt->scope), opt->key, opt->value);
_actions.push_persist(opt0);
}

if(actions.do_alert) {
_actions.push_alert();
}

if(actions.emit_keystroke) {
_actions.push_emit_keystroke();
}

if(actions.new_caps_lock_state != KM_CORE_CAPS_UNCHANGED) {
_actions.push_capslock(actions.new_caps_lock_state == KM_CORE_CAPS_ON);
}

return true;
}
3 changes: 2 additions & 1 deletion core/src/action.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,12 @@
#pragma once

#include <keyman/keyman_core_api.h>
#include <state.hpp>

namespace km {
namespace core
{
km_core_actions* action_item_list_to_actions_object(
km_core_actions const *action_item_list_to_actions_object(
km_core_action_item const *action_items
);
} // namespace core
Expand Down
8 changes: 3 additions & 5 deletions core/src/km_core_action_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,26 +19,24 @@

using namespace km::core;

km_core_actions* km_core_state_get_actions(
km_core_actions const * km_core_state_get_actions(
km_core_state const *state
) {
assert(state);
if(!state) {
return nullptr;
}

km_core_actions* actions = nullptr;
auto action_items = km_core_state_action_items(state, nullptr);
if(!action_items) {
return nullptr;
}

actions = action_item_list_to_actions_object(action_items);
return actions;
return action_item_list_to_actions_object(action_items);
}

km_core_status km_core_actions_dispose(
km_core_actions* actions
km_core_actions const * actions
) {
if(actions == nullptr) {
return KM_CORE_STATUS_OK;
Expand Down
12 changes: 11 additions & 1 deletion core/src/state.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -152,8 +152,18 @@ class state
void imx_deregister_callback();

void imx_callback(uint32_t imx_id);
};

// This is intended to be used to take the actions given in the actions
// parameter, and load them into the _actions member of this class. Used by
// keyboard processors to set the output actions, and is a long-term
// replacement for the actions()::push_*() functions. Note that the
// km_core_actions struct does not include information about markers, which
// are maintained separately in the _ctxt member of this class, and the
// corresponding marker-backspace action items are never used here.
bool set_actions(
km_core_actions const &actions
);
};
} // namespace core
} // namespace km

Expand Down
12 changes: 6 additions & 6 deletions core/tests/unit/kmnkbd/action_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ void test_two_backspaces() {
end_action_item()
};

km_core_actions *actions = km::core::action_item_list_to_actions_object(action_items);
km_core_actions const *actions = km::core::action_item_list_to_actions_object(action_items);

assert(actions->code_points_to_delete == 1);
assert(std::u32string(actions->output) == U"");
Expand Down Expand Up @@ -65,7 +65,7 @@ void test_marker_text_interleaved() {
end_action_item()
};

km_core_actions *actions = km::core::action_item_list_to_actions_object(action_items);
km_core_actions const *actions = km::core::action_item_list_to_actions_object(action_items);

assert(actions->code_points_to_delete == 0);
assert(std::u32string(actions->output) == U"ABD");
Expand All @@ -88,7 +88,7 @@ void test_alert() {
end_action_item()
};

km_core_actions *actions = km::core::action_item_list_to_actions_object(action_items);
km_core_actions const *actions = km::core::action_item_list_to_actions_object(action_items);

assert(actions->code_points_to_delete == 0);
assert(std::u32string(actions->output) == U"");
Expand All @@ -111,7 +111,7 @@ void test_emit_keystroke() {
end_action_item()
};

km_core_actions *actions = km::core::action_item_list_to_actions_object(action_items);
km_core_actions const *actions = km::core::action_item_list_to_actions_object(action_items);

assert(actions->code_points_to_delete == 0);
assert(std::u32string(actions->output) == U"");
Expand All @@ -135,7 +135,7 @@ void test_invalidate_context() {
end_action_item()
};

km_core_actions *actions = km::core::action_item_list_to_actions_object(action_items);
km_core_actions const *actions = km::core::action_item_list_to_actions_object(action_items);

assert(actions->code_points_to_delete == 0);
assert(std::u32string(actions->output) == U"");
Expand Down Expand Up @@ -164,7 +164,7 @@ void test_persist_opt() {
end_action_item()
};

km_core_actions *actions = km::core::action_item_list_to_actions_object(action_items);
km_core_actions const *actions = km::core::action_item_list_to_actions_object(action_items);

assert(actions->code_points_to_delete == 0);
assert(std::u32string(actions->output) == U"");
Expand Down
Loading

0 comments on commit e65d5c5

Please sign in to comment.