diff --git a/src/platform/linux/uhid_backend.cpp b/src/platform/linux/uhid_backend.cpp index 5a350a0..504304c 100644 --- a/src/platform/linux/uhid_backend.cpp +++ b/src/platform/linux/uhid_backend.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -348,6 +349,13 @@ namespace lvh::detail { destination[length] = 0; } + template + void copy_string(std::array &destination, std::string_view source) { + const auto length = std::min(source.size(), Size - 1); + std::memcpy(destination.data(), source.data(), length); + destination[length] = 0; + } + std::optional read_first_line(const std::filesystem::path &path) { std::ifstream file {path}; if (!file) { @@ -524,7 +532,7 @@ namespace lvh::detail { } if (key_code >= 0x30 && key_code <= 0x39) { - static constexpr int digit_keys[] { + static constexpr std::array digit_keys { KEY_0, KEY_1, KEY_2, @@ -539,7 +547,7 @@ namespace lvh::detail { return digit_keys[key_code - 0x30]; } if (key_code >= 0x41 && key_code <= 0x5A) { - static constexpr int letter_keys[] { + static constexpr std::array letter_keys { KEY_A, KEY_B, KEY_C, @@ -570,7 +578,7 @@ namespace lvh::detail { return letter_keys[key_code - 0x41]; } if (key_code >= 0x60 && key_code <= 0x69) { - static constexpr int keypad_digit_keys[] { + static constexpr std::array keypad_digit_keys { KEY_KP0, KEY_KP1, KEY_KP2, @@ -600,7 +608,7 @@ namespace lvh::detail { return KEY_KPSLASH; } if (key_code >= 0x70 && key_code <= 0x87) { - static constexpr int function_keys[] { + static constexpr std::array function_keys { KEY_F1, KEY_F2, KEY_F3, diff --git a/tests/fixtures/linux_backend_test_hooks.cpp b/tests/fixtures/linux_backend_test_hooks.cpp index 04abcc0..d8f4a48 100644 --- a/tests/fixtures/linux_backend_test_hooks.cpp +++ b/tests/fixtures/linux_backend_test_hooks.cpp @@ -752,9 +752,9 @@ namespace lvh::detail::test { } // namespace std::string linux_copy_string_char_buffer(const std::string &source) { - char destination[5] {}; + std::array destination {}; copy_string(destination, source); - return destination; + return destination.data(); } int linux_key_code(KeyboardKeyCode key_code) { @@ -899,8 +899,8 @@ namespace lvh::detail::test { } LinuxInputSubmissionResult linux_uinput_keyboard_submit_pipe(const KeyboardEvent &event) { - int descriptors[2] {-1, -1}; - if (::pipe(descriptors) != 0) { + std::array descriptors {-1, -1}; + if (::pipe(descriptors.data()) != 0) { return {system_error_status(ErrorCode::backend_failure, "failed to create pipe", errno), {}}; } @@ -917,8 +917,8 @@ namespace lvh::detail::test { } OperationStatus linux_uinput_user_device_pipe() { - int descriptors[2] {-1, -1}; - if (::pipe(descriptors) != 0) { + std::array descriptors {-1, -1}; + if (::pipe(descriptors.data()) != 0) { return system_error_status(ErrorCode::backend_failure, "failed to create pipe", errno); } @@ -948,8 +948,8 @@ namespace lvh::detail::test { } LinuxInputSubmissionResult linux_uinput_mouse_submit_pipe(const MouseEvent &event) { - int descriptors[2] {-1, -1}; - if (::pipe(descriptors) != 0) { + std::array descriptors {-1, -1}; + if (::pipe(descriptors.data()) != 0) { return {system_error_status(ErrorCode::backend_failure, "failed to create pipe", errno), {}}; } @@ -962,8 +962,8 @@ namespace lvh::detail::test { } LinuxInputSubmissionResult linux_uinput_touchscreen_contact_pipe(const TouchContact &contact) { - int descriptors[2] {-1, -1}; - if (::pipe(descriptors) != 0) { + std::array descriptors {-1, -1}; + if (::pipe(descriptors.data()) != 0) { return {system_error_status(ErrorCode::backend_failure, "failed to create pipe", errno), {}}; } @@ -979,8 +979,8 @@ namespace lvh::detail::test { } LinuxInputSubmissionResult linux_uinput_trackpad_contact_pipe(const TouchContact &contact) { - int descriptors[2] {-1, -1}; - if (::pipe(descriptors) != 0) { + std::array descriptors {-1, -1}; + if (::pipe(descriptors.data()) != 0) { return {system_error_status(ErrorCode::backend_failure, "failed to create pipe", errno), {}}; } @@ -1002,8 +1002,8 @@ namespace lvh::detail::test { } LinuxInputSubmissionResult linux_uinput_pen_tablet_tool_pipe(const PenToolState &state) { - int descriptors[2] {-1, -1}; - if (::pipe(descriptors) != 0) { + std::array descriptors {-1, -1}; + if (::pipe(descriptors.data()) != 0) { return {system_error_status(ErrorCode::backend_failure, "failed to create pipe", errno), {}}; } @@ -1022,8 +1022,8 @@ namespace lvh::detail::test { } LinuxInputSubmissionResult linux_uinput_trackpad_multi_contact_pipe() { - int descriptors[2] {-1, -1}; - if (::pipe(descriptors) != 0) { + std::array descriptors {-1, -1}; + if (::pipe(descriptors.data()) != 0) { return {system_error_status(ErrorCode::backend_failure, "failed to create pipe", errno), {}}; } @@ -1048,8 +1048,8 @@ namespace lvh::detail::test { } OperationStatus linux_uinput_touchscreen_invalid_contacts() { - int descriptors[2] {-1, -1}; - if (::pipe(descriptors) != 0) { + std::array descriptors {-1, -1}; + if (::pipe(descriptors.data()) != 0) { return system_error_status(ErrorCode::backend_failure, "failed to create pipe", errno); } @@ -1074,14 +1074,14 @@ namespace lvh::detail::test { } LinuxInputSubmissionResult linux_uinput_pen_tablet_transition_pipe() { - int descriptors[2] {-1, -1}; - if (::pipe(descriptors) != 0) { + std::array descriptors {-1, -1}; + if (::pipe(descriptors.data()) != 0) { return {system_error_status(ErrorCode::backend_failure, "failed to create pipe", errno), {}}; } UinputPenTablet pen_tablet {descriptors[1]}; auto status = OperationStatus::success(); - const PenToolType tools[] { + constexpr std::array tools { PenToolType::pen, PenToolType::eraser, PenToolType::brush, @@ -1131,8 +1131,8 @@ namespace lvh::detail::test { LinuxUhidRoundTripResult linux_uhid_socketpair_roundtrip() { LinuxUhidRoundTripResult result; - int descriptors[2] {-1, -1}; - if (::socketpair(AF_UNIX, SOCK_STREAM, 0, descriptors) != 0) { + std::array descriptors {-1, -1}; + if (::socketpair(AF_UNIX, SOCK_STREAM, 0, descriptors.data()) != 0) { result.create_status = system_error_status(ErrorCode::backend_failure, "failed to create socketpair", errno); result.submit_status = result.create_status; result.close_status = result.create_status; @@ -1213,8 +1213,8 @@ namespace lvh::detail::test { LinuxUhidRoundTripResult linux_dualsense_uhid_socketpair_reports() { LinuxUhidRoundTripResult result; - int descriptors[2] {-1, -1}; - if (::socketpair(AF_UNIX, SOCK_STREAM, 0, descriptors) != 0) { + std::array descriptors {-1, -1}; + if (::socketpair(AF_UNIX, SOCK_STREAM, 0, descriptors.data()) != 0) { result.create_status = system_error_status(ErrorCode::backend_failure, "failed to create socketpair", errno); result.submit_status = result.create_status; result.close_status = result.create_status; @@ -1281,8 +1281,8 @@ namespace lvh::detail::test { LinuxUhidRoundTripResult linux_dualsense_bluetooth_uhid_socketpair_reports() { LinuxUhidRoundTripResult result; - int descriptors[2] {-1, -1}; - if (::socketpair(AF_UNIX, SOCK_STREAM, 0, descriptors) != 0) { + std::array descriptors {-1, -1}; + if (::socketpair(AF_UNIX, SOCK_STREAM, 0, descriptors.data()) != 0) { result.create_status = system_error_status(ErrorCode::backend_failure, "failed to create socketpair", errno); result.submit_status = result.create_status; result.close_status = result.create_status;