@@ -713,6 +713,57 @@ namespace lvh::detail {
713713 return static_cast <KeyboardKeyCode>(0x41 + (digit - ' A' ));
714714 }
715715
716+ template <std::size_t Count, class SubmitKeyEvent >
717+ OperationStatus submit_keyboard_events (const std::array<KeyboardEvent, Count> &events, SubmitKeyEvent &submit_key_event) {
718+ for (const auto &event : events) {
719+ if (const auto status = submit_key_event (event); !status.ok ()) {
720+ return status;
721+ }
722+ }
723+ return OperationStatus::success ();
724+ }
725+
726+ template <class SubmitKeyEvent >
727+ OperationStatus type_text_with_unicode_hex (std::string_view text, SubmitKeyEvent submit_key_event) {
728+ static constexpr std::array<KeyboardEvent, 6 > unicode_hex_prefix {{
729+ {.key_code = 0xA2 , .pressed = true },
730+ {.key_code = 0xA0 , .pressed = true },
731+ {.key_code = 0x55 , .pressed = true },
732+ {.key_code = 0x55 , .pressed = false },
733+ {.key_code = 0xA0 , .pressed = false },
734+ {.key_code = 0xA2 , .pressed = false },
735+ }};
736+ static constexpr std::array<KeyboardEvent, 2 > unicode_hex_suffix {{
737+ {.key_code = 0x0D , .pressed = true },
738+ {.key_code = 0x0D , .pressed = false },
739+ }};
740+
741+ for (const auto codepoint : decode_utf8 (text)) {
742+ const auto hex = uppercase_hex (codepoint);
743+
744+ if (const auto status = submit_keyboard_events (unicode_hex_prefix, submit_key_event); !status.ok ()) {
745+ return status;
746+ }
747+
748+ for (const auto digit : hex) {
749+ const auto key_code = hex_digit_key_code (digit);
750+ const std::array<KeyboardEvent, 2 > digit_events {{
751+ {.key_code = key_code, .pressed = true },
752+ {.key_code = key_code, .pressed = false },
753+ }};
754+ if (const auto status = submit_keyboard_events (digit_events, submit_key_event); !status.ok ()) {
755+ return status;
756+ }
757+ }
758+
759+ if (const auto status = submit_keyboard_events (unicode_hex_suffix, submit_key_event); !status.ok ()) {
760+ return status;
761+ }
762+ }
763+
764+ return OperationStatus::success ();
765+ }
766+
716767 [[maybe_unused]] int legacy_scroll_steps (std::int32_t distance) {
717768 if (distance == 0 ) {
718769 return 0 ;
@@ -1158,47 +1209,9 @@ namespace lvh::detail {
11581209 }
11591210
11601211 OperationStatus type_text (const KeyboardTextEvent &event) override {
1161- for (const auto codepoint : decode_utf8 (event.text )) {
1162- const auto hex = uppercase_hex (codepoint);
1163-
1164- if (const auto status = submit ({.key_code = 0xA2 , .pressed = true }); !status.ok ()) {
1165- return status;
1166- }
1167- if (const auto status = submit ({.key_code = 0xA0 , .pressed = true }); !status.ok ()) {
1168- return status;
1169- }
1170- if (const auto status = submit ({.key_code = 0x55 , .pressed = true }); !status.ok ()) {
1171- return status;
1172- }
1173- if (const auto status = submit ({.key_code = 0x55 , .pressed = false }); !status.ok ()) {
1174- return status;
1175- }
1176- if (const auto status = submit ({.key_code = 0xA0 , .pressed = false }); !status.ok ()) {
1177- return status;
1178- }
1179- if (const auto status = submit ({.key_code = 0xA2 , .pressed = false }); !status.ok ()) {
1180- return status;
1181- }
1182-
1183- for (const auto digit : hex) {
1184- const auto key_code = hex_digit_key_code (digit);
1185- if (const auto status = submit ({.key_code = key_code, .pressed = true }); !status.ok ()) {
1186- return status;
1187- }
1188- if (const auto status = submit ({.key_code = key_code, .pressed = false }); !status.ok ()) {
1189- return status;
1190- }
1191- }
1192-
1193- if (const auto status = submit ({.key_code = 0x0D , .pressed = true }); !status.ok ()) {
1194- return status;
1195- }
1196- if (const auto status = submit ({.key_code = 0x0D , .pressed = false }); !status.ok ()) {
1197- return status;
1198- }
1199- }
1200-
1201- return OperationStatus::success ();
1212+ return type_text_with_unicode_hex (event.text , [this ](const KeyboardEvent &key_event) {
1213+ return submit (key_event);
1214+ });
12021215 }
12031216
12041217 OperationStatus close () override {
@@ -1952,47 +1965,9 @@ namespace lvh::detail {
19521965 }
19531966
19541967 OperationStatus type_text (const KeyboardTextEvent &event) override {
1955- for (const auto codepoint : decode_utf8 (event.text )) {
1956- const auto hex = uppercase_hex (codepoint);
1957-
1958- if (const auto status = submit ({.key_code = 0xA2 , .pressed = true }); !status.ok ()) {
1959- return status;
1960- }
1961- if (const auto status = submit ({.key_code = 0xA0 , .pressed = true }); !status.ok ()) {
1962- return status;
1963- }
1964- if (const auto status = submit ({.key_code = 0x55 , .pressed = true }); !status.ok ()) {
1965- return status;
1966- }
1967- if (const auto status = submit ({.key_code = 0x55 , .pressed = false }); !status.ok ()) {
1968- return status;
1969- }
1970- if (const auto status = submit ({.key_code = 0xA0 , .pressed = false }); !status.ok ()) {
1971- return status;
1972- }
1973- if (const auto status = submit ({.key_code = 0xA2 , .pressed = false }); !status.ok ()) {
1974- return status;
1975- }
1976-
1977- for (const auto digit : hex) {
1978- const auto key_code = hex_digit_key_code (digit);
1979- if (const auto status = submit ({.key_code = key_code, .pressed = true }); !status.ok ()) {
1980- return status;
1981- }
1982- if (const auto status = submit ({.key_code = key_code, .pressed = false }); !status.ok ()) {
1983- return status;
1984- }
1985- }
1986-
1987- if (const auto status = submit ({.key_code = 0x0D , .pressed = true }); !status.ok ()) {
1988- return status;
1989- }
1990- if (const auto status = submit ({.key_code = 0x0D , .pressed = false }); !status.ok ()) {
1991- return status;
1992- }
1993- }
1994-
1995- return OperationStatus::success ();
1968+ return type_text_with_unicode_hex (event.text , [this ](const KeyboardEvent &key_event) {
1969+ return submit (key_event);
1970+ });
19961971 }
19971972
19981973 OperationStatus close () override {
0 commit comments