/* * Copyright (c) 2023 The ZMK Contributors * * SPDX-License-Identifier: MIT */ #include #include #include #include #include #include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); const struct device *zmk_behavior_get_binding(const char *name) { return behavior_get_binding(name); } const struct device *z_impl_behavior_get_binding(const char *name) { if (name == NULL || name[0] == '\0') { return NULL; } STRUCT_SECTION_FOREACH(zmk_behavior_ref, item) { if (z_device_is_ready(item->device) && item->device->name == name) { return item->device; } } STRUCT_SECTION_FOREACH(zmk_behavior_ref, item) { if (z_device_is_ready(item->device) && strcmp(item->device->name, name) == 0) { return item->device; } } return NULL; } #if IS_ENABLED(CONFIG_LOG) static int check_behavior_names(const struct device *dev) { ARG_UNUSED(dev); // Behavior names must be unique, but we don't have a good way to enforce this // at compile time, so log an error at runtime if they aren't unique. ptrdiff_t count; STRUCT_SECTION_COUNT(zmk_behavior_ref, &count); for (ptrdiff_t i = 0; i < count; i++) { const struct zmk_behavior_ref *current; STRUCT_SECTION_GET(zmk_behavior_ref, i, ¤t); for (ptrdiff_t j = i + 1; j < count; j++) { const struct zmk_behavior_ref *other; STRUCT_SECTION_GET(zmk_behavior_ref, j, &other); if (strcmp(current->device->name, other->device->name) == 0) { LOG_ERR("Multiple behaviors have the same name '%s'", current->device->name); } } } return 0; } SYS_INIT(check_behavior_names, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); #endif // IS_ENABLED(CONFIG_LOG)