From 3d0582d7bec23efbd38c34896df1e9dec4d11147 Mon Sep 17 00:00:00 2001 From: Chris M Date: Wed, 7 Jun 2023 19:12:46 +1000 Subject: [PATCH] Added Remove Row Opcode to the KLM * Removed blank row from Sixty percent (Mini) keyboards * Resolves #3404 --- Controllers/RazerController/RazerDevices.cpp | 3 +- .../KeyboardLayoutManager.cpp | 51 +++++++++++++++++++ KeyboardLayoutManager/KeyboardLayoutManager.h | 2 + 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/Controllers/RazerController/RazerDevices.cpp b/Controllers/RazerController/RazerDevices.cpp index d7c1a9a6..ca105a13 100644 --- a/Controllers/RazerController/RazerDevices.cpp +++ b/Controllers/RazerController/RazerDevices.cpp @@ -778,8 +778,7 @@ keyboard_keymap_overlay_values razer_huntsman_mini_layout | Edit Keys | | Zone, Row, Column, Value, Key, OpCode, | \*---------------------------------------------------------------------------------------------------------*/ - { 0, 0, 0, 0, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, }, // Swap out Backtick - { 0, 0, 1, 0, KEY_EN_ESCAPE, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, }, // Insert Escape and shift row 0 + { 0, 0, 0, 0, KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, }, // Shift row 0 { 0, 1, 0, 0, KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, }, // Shift row 1 { 0, 2, 0, 0, KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, }, // Shift row 2 { 0, 3, 0, 0, KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, }, // Shift row 3 diff --git a/KeyboardLayoutManager/KeyboardLayoutManager.cpp b/KeyboardLayoutManager/KeyboardLayoutManager.cpp index 762b5e36..216cb21f 100644 --- a/KeyboardLayoutManager/KeyboardLayoutManager.cpp +++ b/KeyboardLayoutManager/KeyboardLayoutManager.cpp @@ -372,10 +372,18 @@ KeyboardLayoutManager::KeyboardLayoutManager(KEYBOARD_LAYOUT layout, KEYBOARD_SI SwapKeys(values.regional_overlay.find(layout)->second); } + /*---------------------------------------------------------------------*\ + | Size specific fixes | + \*---------------------------------------------------------------------*/ switch(size) { case KEYBOARD_SIZE::KEYBOARD_SIZE_SIXTY: + /*-------------------------------------------------------------*\ + | Remove the empty Function row and swap in the Escape key | + \*-------------------------------------------------------------*/ name = KEYBOARD_NAME_SIXTY; + RemoveRow(0); + SwapKey(keyboard_zone_fn_row[0]); break; case KEYBOARD_SIZE::KEYBOARD_SIZE_SEVENTY_FIVE: @@ -443,6 +451,10 @@ void KeyboardLayoutManager::OpCodeSwitch(key_set change_keys) //SwapKey(change_keys[chg_key_idx]); break; + case KEYBOARD_OPCODE_REMOVE_ROW: + RemoveRow(change_keys[chg_key_idx].row); + break; + default: LOG_DEBUG(LOG_MSG_MISSING_OPCODE, KLM_CLASS_NAME, change_keys[chg_key_idx].opcode, change_keys[chg_key_idx].name, change_keys[chg_key_idx].row, change_keys[chg_key_idx].col); @@ -698,6 +710,45 @@ void KeyboardLayoutManager::RemoveKey(keyboard_led rmv_key) } } +void KeyboardLayoutManager::RemoveRow(uint8_t rmv_row) +{ + /*---------------------------------------------------------------------*\ + | Check row is valid to remove | + \*---------------------------------------------------------------------*/ + if(rmv_row >= rows) + { + LOG_DEBUG("[%s] Removing row %d failed as rows currently = %d", KLM_CLASS_NAME, rmv_row, rows); + return; + } + + /*---------------------------------------------------------------------*\ + | Loop through and remove any keys in the row | + \*---------------------------------------------------------------------*/ + unsigned int key_idx = 0; + + for(/*key_idx*/; key_idx < keymap.size() && rmv_row > keymap[key_idx].row; key_idx++) + { + if(rmv_row == keymap[key_idx].row) + { + LOG_DEBUG("[%s] Removing %s @ %02d, %02d from row %d", KLM_CLASS_NAME, keymap[key_idx].name, keymap[key_idx].row, keymap[key_idx].col, rmv_row); + keymap.erase(keymap.begin() + key_idx); + } + } + + /*---------------------------------------------------------------------*\ + | Loop through the remaining rows and adjust row number | + \*---------------------------------------------------------------------*/ + if(rmv_row < keymap[key_idx].row) + { + for(/*key_idx*/; key_idx < keymap.size(); key_idx++) + { + keymap[key_idx].row--; + } + + LOG_DEBUG("[%s] Remove row %d successful", KLM_CLASS_NAME, rmv_row); + } +} + std::string KeyboardLayoutManager::GetName() { diff --git a/KeyboardLayoutManager/KeyboardLayoutManager.h b/KeyboardLayoutManager/KeyboardLayoutManager.h index 1c69b2c8..17e07342 100644 --- a/KeyboardLayoutManager/KeyboardLayoutManager.h +++ b/KeyboardLayoutManager/KeyboardLayoutManager.h @@ -60,6 +60,7 @@ enum KEYBOARD_OPCODE KEYBOARD_OPCODE_SWAP_ONLY = 1, KEYBOARD_OPCODE_REMOVE_SHIFT_LEFT = 2, KEYBOARD_OPCODE_INS_SHFT_ADJACENT = 3, + KEYBOARD_OPCODE_REMOVE_ROW = 4, }; typedef struct @@ -132,6 +133,7 @@ private: void SwapKey(keyboard_led keys); void SwapKeys(std::vector keys); void RemoveKey(keyboard_led keys); + void RemoveRow(uint8_t row); KEYBOARD_LAYOUT layout; KEYBOARD_SIZE physical_size;