@@ -235,6 +235,7 @@ void board_kblight_init(void)
235235#define FN_PRESSED BIT(0)
236236#define FN_LOCKED BIT(1)
237237static uint8_t Fn_key ;
238+ static uint8_t keep_fn_key_code ;
238239
239240void fnkey_shutdown (void ) {
240241 uint8_t current_kb = 0 ;
@@ -263,13 +264,26 @@ void fnkey_startup(void) {
263264}
264265DECLARE_HOOK (HOOK_CHIPSET_STARTUP , fnkey_startup , HOOK_PRIO_DEFAULT );
265266
267+ static void fn_keep_check (int8_t pressed )
268+ {
269+ if (pressed )
270+ keep_fn_key_code = 1 ;
271+ else
272+ keep_fn_key_code = 0 ;
273+ }
274+
266275int hotkey_F1_F12 (uint16_t * key_code , uint16_t lock , int8_t pressed )
267276{
268277 const uint16_t prss_key = * key_code ;
269278
270- if (!(Fn_key & FN_LOCKED ) && lock & FN_PRESSED )
279+ if (!(Fn_key & FN_LOCKED ) &&
280+ (lock & FN_PRESSED ) &&
281+ !keep_fn_key_code )
271282 return EC_SUCCESS ;
272- else if (Fn_key & FN_LOCKED && !(Fn_key & FN_PRESSED ))
283+ else if (Fn_key & FN_LOCKED &&
284+ !(lock & FN_PRESSED ))
285+ return EC_SUCCESS ;
286+ else if (!pressed && !keep_fn_key_code )
273287 return EC_SUCCESS ;
274288
275289 switch (prss_key ) {
@@ -278,33 +292,26 @@ int hotkey_F1_F12(uint16_t *key_code, uint16_t lock, int8_t pressed)
278292 break ;
279293 case SCANCODE_F2 : /* VOLUME_DOWN */
280294 * key_code = SCANCODE_VOLUME_DOWN ;
281-
282295 break ;
283296 case SCANCODE_F3 : /* VOLUME_UP */
284297 * key_code = SCANCODE_VOLUME_UP ;
285-
286298 break ;
287299 case SCANCODE_F4 : /* PREVIOUS_TRACK */
288300 * key_code = SCANCODE_PREV_TRACK ;
289-
290301 break ;
291302 case SCANCODE_F5 : /* PLAY_PAUSE */
292303 * key_code = 0xe034 ;
293-
294304 break ;
295305 case SCANCODE_F6 : /* NEXT_TRACK */
296306 * key_code = SCANCODE_NEXT_TRACK ;
297-
298307 break ;
299308 case SCANCODE_F7 : /* TODO: DIM_SCREEN */
300309 update_hid_key (HID_KEY_DISPLAY_BRIGHTNESS_DN , pressed );
301310 return EC_ERROR_UNIMPLEMENTED ;
302-
303311 break ;
304312 case SCANCODE_F8 : /* TODO: BRIGHTEN_SCREEN */
305313 update_hid_key (HID_KEY_DISPLAY_BRIGHTNESS_UP , pressed );
306314 return EC_ERROR_UNIMPLEMENTED ;
307-
308315 break ;
309316 case SCANCODE_F9 : /* EXTERNAL_DISPLAY */
310317 if (pressed ) {
@@ -319,7 +326,6 @@ int hotkey_F1_F12(uint16_t *key_code, uint16_t lock, int8_t pressed)
319326 case SCANCODE_F10 : /* FLIGHT_MODE */
320327 update_hid_key (HID_KEY_AIRPLANE_MODE , pressed );
321328 return EC_ERROR_UNIMPLEMENTED ;
322-
323329 break ;
324330 case SCANCODE_F11 :
325331 /*
@@ -333,9 +339,11 @@ int hotkey_F1_F12(uint16_t *key_code, uint16_t lock, int8_t pressed)
333339 case SCANCODE_F12 : /* TODO: FRAMEWORK */
334340 /* Media Select scan code */
335341 * key_code = 0xE050 ;
336-
337342 break ;
343+ default :
344+ return EC_SUCCESS ;
338345 }
346+ fn_keep_check (pressed );
339347 return EC_SUCCESS ;
340348}
341349
0 commit comments