static void putChangedKey(uint8_t xKeyidx, bool xIsDown, uint8_t xCol, uint8_t xRow){ applyKeyDownForFullLED(xKeyidx, xCol, xRow, xIsDown); // 빈 키코드는 LED 반응 이외의 기능 없음; if(xKeyidx == KEY_NONE ) return; // fn 키가 눌렸을 경우 해당 위치의 키는 무시한다. uint8_t gLayer, gKeyIndex, gFnIndex; if(getBeyondFN()) { gLayer = getBeyondFN(); }else{ gLayer = LAYER_NORMAL; } if(isFnPosition(xCol, xRow)) { // 현재 레이어에서 눌린 FN키가 듀얼 액션 키이면, 변경된 레이어의 키를 듀얼 액션 키로 강제 치환시켜서 진행 gKeyIndex = getCurrentKeyindex(gLayer, xRow, xCol); // fn key는 하나만 눌릴 수 있도록 처리; if(xIsDown) { // dual action key라면 FN을 추출; gFnIndex = getDualActionDownKeyIndexWhenIsCompounded(gKeyIndex, true); // DBG1(0x32, (uchar *)&gFnIndex, 1); setFnPressed(gFnIndex); } else { setFnPressed(KEY_NONE); clearFnPosition(); } IF_IS_DUAL_ACTION_KEY(gKeyIndex) { xKeyidx = gKeyIndex; } else { return; } }
static void putChangedKey(uint8_t xKeyidx, bool xIsDown, uint8_t xCol, uint8_t xRow){ applyKeyDownForFullLED(xKeyidx, xCol, xRow, xIsDown); // 빈 키코드는 LED 반응 이외의 기능 없음; if(xKeyidx == KEY_NONE ) return; // fn 키가 눌렸을 경우 해당 위치의 키는 무시한다. uint8_t gLayer, gKeyIndex, gFnIndex; gLayer = getCurrentFnLayer(); DBG1(0xC2, (uchar *)&gLayer, 1); if(isFnPosition(xCol, xRow) /* -> */ && (xIsDown || (!xIsDown && isFnPressed())) /* <- */) // 키 입력 동안 레이어 토글이 변경될 경우 FN 키와 같은 위치의 키들은 up 신호가 무시 되어 계속 눌려진 상태가 된다. 이를 패치. // 이 경우 fnPressed가 false 상태로 진행되므로 이를 확인 { // 현재 레이어에서 눌린 FN키가 듀얼 액션 키이면, 변경된 레이어의 키를 듀얼 액션 키로 강제 치환시켜서 진행 gKeyIndex = getCurrentKeyindex(gLayer, xRow, xCol); // fn key는 하나만 눌릴 수 있도록 처리; if(xIsDown) { // dual action key라면 FN을 추출; gFnIndex = getDualActionDownKeyIndexWhenIsCompounded(gKeyIndex, true); // DBG1(0x32, (uchar *)&gFnIndex, 1); setFnPressed(gFnIndex); } else { setFnPressed(KEY_NONE); clearFnPosition(); } IF_IS_DUAL_ACTION_KEY(gKeyIndex) { xKeyidx = gKeyIndex; } else { return;
// 키를 누르거나 땔때 FN 및 LED등 을 컨트롤한다. bool applyFN(uint8_t xKeyidx, uint8_t xCol, uint8_t xRow, bool xIsDown) { // DEBUG_PRINT(("applyFN : %d xIsDown : %d\n", xKeyidx, xIsDown)); applyKeyDownForFullLED(xKeyidx, xCol, xRow, xIsDown); if(isFnKey(xKeyidx)) return false; setDualAction(xKeyidx, xIsDown); // 듀얼액션 키의 기본 키를 가져온다. xKeyidx = getDualActionDefaultKey(xKeyidx); if(isFnKey(xKeyidx)) return false; if(xIsDown) { if((xKeyidx == KEY_BEYOND_FN || xKeyidx == KEY_BEYOND_FN3) || (_isExtraFNDown && xKeyidx == BEYOND_FN_CANCEL_KEY)){ // beyond_fn을 활성화; if( xKeyidx == BEYOND_FN_CANCEL_KEY ) { // 취소만 가능한 키 _beyondFnIndex = false; }else{ if(_beyondFnIndex == 0){ if(xKeyidx == KEY_BEYOND_FN){ _beyondFnIndex = LAYER_FN2; }else{ _beyondFnIndex = LAYER_FN3; } }else{ if(xKeyidx == KEY_BEYOND_FN){ if(_beyondFnIndex == LAYER_FN2){ _beyondFnIndex = LAYER_NORMAL; }else{ _beyondFnIndex = LAYER_FN2; } }else if(xKeyidx == KEY_BEYOND_FN3){ if(_beyondFnIndex == LAYER_FN3){ _beyondFnIndex = LAYER_NORMAL; }else{ _beyondFnIndex = LAYER_FN3; } } } } #ifndef DISABLE_FN2_TOGGLE_LED_BLINK if(isBeyondFnLedEnabled() == false){ if(_beyondFnIndex == 0){ blinkOnce(100); }else{ blinkOnce(100); _delay_ms(80); blinkOnce(70); } } #endif if(isBeyondFnLedEnabled()){ setLed(LED_STATE_NUM, isBeyondFN()); } return 0; }else if(_isQuickMacroDown && isEepromMacroKey(xKeyidx)){ _quickMacroIndex = xKeyidx - KEY_MAC1; _isReadyQuickMacro = true; return 0; }else if(xKeyidx == EXTRA_FN){ _isExtraFNDown = true; }else if((_isExtraFNDown && xKeyidx == LED_KEY)){ uint8_t gModi = getModifierDownBuffer(); if(gModi == 0x02 || gModi == 0x20){ changeFullLedState(FULL_LED_MODE2); }else{ changeFullLedState(FULL_LED_MODE1); } return 0; }else if(xKeyidx == KEY_LED){ changeFullLedState(FULL_LED_MODE1); return 0; }else if(xKeyidx == KEY_LED2){ changeFullLedState(FULL_LED_MODE2); return 0; }else if(xKeyidx == KEY_LED_UP){ uint8_t gModi = getModifierDownBuffer(); if(gModi == 0x02 || gModi == 0x20){ increaseLedBrightness(FULL_LED_MODE2); }else{ increaseLedBrightness(FULL_LED_MODE1); } return 0; }else if(xKeyidx == KEY_LED_DOWN){ uint8_t gModi = getModifierDownBuffer(); if(gModi == 0x02 || gModi == 0x20){ reduceLedBrightness(FULL_LED_MODE2); }else{ reduceLedBrightness(FULL_LED_MODE1); } return 0; }else if(xKeyidx == KEY_LED_ON_OFF){ _ledOff ^= true; if(_ledOff == false){ turnOnLedAll(); }else{ turnOffLedAll(); } }else if(xKeyidx == KEY_QUICK_MACRO){ if(isQuickMacro()){ stopQuickMacro(); }else{ _isQuickMacroDown = true; } return 0; } }else{ // up if(xKeyidx == KEY_BEYOND_FN){ // beyond_fn return 0; }else if(xKeyidx == EXTRA_FN){ _isExtraFNDown = false; }else if(xKeyidx == KEY_QUICK_MACRO){ _isQuickMacroDown = false; return 0; } } return 1; }