5
5
*/
6
6
7
7
#include <sys/util.h>
8
+ #include <bluetooth/bluetooth.h>
8
9
#include <logging/log.h>
9
10
LOG_MODULE_DECLARE (zmk , CONFIG_ZMK_LOG_LEVEL );
10
11
@@ -119,7 +120,17 @@ bool is_active_layer(uint8_t layer, zmk_keymap_layers_state_t layer_state) {
119
120
return (layer_state & BIT (layer )) == BIT (layer ) || layer == _zmk_keymap_layer_default ;
120
121
}
121
122
122
- int zmk_keymap_apply_position_state (int layer , uint32_t position , bool pressed , int64_t timestamp ) {
123
+ int invoke_locally (struct zmk_behavior_binding * binding , struct zmk_behavior_binding_event event ,
124
+ bool pressed ) {
125
+ if (pressed ) {
126
+ return behavior_keymap_binding_pressed (binding , event );
127
+ } else {
128
+ return behavior_keymap_binding_released (binding , event );
129
+ }
130
+ }
131
+
132
+ int zmk_keymap_apply_position_state (zmk_position_state_changed_source_t source , int layer ,
133
+ uint32_t position , bool pressed , int64_t timestamp ) {
123
134
struct zmk_behavior_binding * binding = & zmk_keymap [layer ][position ];
124
135
const struct device * behavior ;
125
136
struct zmk_behavior_binding_event event = {
@@ -134,24 +145,50 @@ int zmk_keymap_apply_position_state(int layer, uint32_t position, bool pressed,
134
145
behavior = device_get_binding (binding -> behavior_dev );
135
146
136
147
if (!behavior ) {
137
- LOG_DBG ("No behavior assigned to %d on layer %d" , position , layer );
148
+ LOG_WRN ("No behavior assigned to %d on layer %d" , position , layer );
138
149
return 1 ;
139
150
}
140
151
141
- if (pressed ) {
142
- return behavior_keymap_binding_pressed (binding , event );
143
- } else {
144
- return behavior_keymap_binding_released (binding , event );
152
+ enum behavior_locality locality = BEHAVIOR_LOCALITY_CENTRAL ;
153
+ int err = behavior_get_locality (behavior , & locality );
154
+ if (err ) {
155
+ LOG_ERR ("Failed to get behavior locality %d" , err );
156
+ return err ;
157
+ }
158
+
159
+ switch (locality ) {
160
+ case BEHAVIOR_LOCALITY_CENTRAL :
161
+ return invoke_locally (binding , event , pressed );
162
+ case BEHAVIOR_LOCALITY_EVENT_SOURCE :
163
+ #if IS_ENABLED (CONFIG_ZMK_SPLIT ) && IS_ENABLED (CONFIG_ZMK_BLE ) && \
164
+ IS_ENABLED (CONFIG_ZMK_SPLIT_BLE_ROLE_CENTRAL )
165
+ if (!bt_addr_le_cmp (source , BT_ADDR_LE_NONE )) {
166
+ return invoke_locally (binding , event , pressed );
167
+ } else {
168
+ return zmk_split_bt_invoke_behavior (source , binding , event , pressed );
169
+ }
170
+ #else
171
+ return invoke_locally (binding , event , pressed );
172
+ #endif
173
+ case BEHAVIOR_LOCALITY_GLOBAL :
174
+ #if IS_ENABLED (CONFIG_ZMK_SPLIT ) && IS_ENABLED (CONFIG_ZMK_BLE ) && \
175
+ IS_ENABLED (CONFIG_ZMK_SPLIT_BLE_ROLE_CENTRAL )
176
+ zmk_split_bt_invoke_behavior (BT_ADDR_LE_ANY , binding , event , pressed );
177
+ #endif
178
+ return invoke_locally (binding , event , pressed );
145
179
}
180
+
181
+ return - ENOTSUP ;
146
182
}
147
183
148
- int zmk_keymap_position_state_changed (uint32_t position , bool pressed , int64_t timestamp ) {
184
+ int zmk_keymap_position_state_changed (zmk_position_state_changed_source_t source , uint32_t position ,
185
+ bool pressed , int64_t timestamp ) {
149
186
if (pressed ) {
150
187
zmk_keymap_active_behavior_layer [position ] = _zmk_keymap_layer_state ;
151
188
}
152
189
for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1 ; layer >= _zmk_keymap_layer_default ; layer -- ) {
153
190
if (is_active_layer (layer , zmk_keymap_active_behavior_layer [position ])) {
154
- int ret = zmk_keymap_apply_position_state (layer , position , pressed , timestamp );
191
+ int ret = zmk_keymap_apply_position_state (source , layer , position , pressed , timestamp );
155
192
if (ret > 0 ) {
156
193
LOG_DBG ("behavior processing to continue to next layer" );
157
194
continue ;
@@ -210,7 +247,8 @@ int zmk_keymap_sensor_triggered(uint8_t sensor_number, const struct device *sens
210
247
int keymap_listener (const struct zmk_event_header * eh ) {
211
248
if (is_position_state_changed (eh )) {
212
249
const struct position_state_changed * ev = cast_position_state_changed (eh );
213
- return zmk_keymap_position_state_changed (ev -> position , ev -> state , ev -> timestamp );
250
+ return zmk_keymap_position_state_changed (ev -> source , ev -> position , ev -> state ,
251
+ ev -> timestamp );
214
252
#if ZMK_KEYMAP_HAS_SENSORS
215
253
} else if (is_sensor_event (eh )) {
216
254
const struct sensor_event * ev = cast_sensor_event (eh );
0 commit comments