diff options
Diffstat (limited to 'keyboards/ergodox_infinity/keymaps/narze')
-rw-r--r-- | keyboards/ergodox_infinity/keymaps/narze/config.h | 11 | ||||
-rw-r--r-- | keyboards/ergodox_infinity/keymaps/narze/keymap.c | 532 | ||||
-rw-r--r-- | keyboards/ergodox_infinity/keymaps/narze/readme.md | 19 | ||||
-rw-r--r-- | keyboards/ergodox_infinity/keymaps/narze/rules.mk | 5 |
4 files changed, 185 insertions, 382 deletions
diff --git a/keyboards/ergodox_infinity/keymaps/narze/config.h b/keyboards/ergodox_infinity/keymaps/narze/config.h index 551327a126..bceb14c921 100644 --- a/keyboards/ergodox_infinity/keymaps/narze/config.h +++ b/keyboards/ergodox_infinity/keymaps/narze/config.h @@ -1,14 +1,11 @@ -#ifndef CONFIG_H_ -#define CONFIG_H_ - -#include "../../config.h" +#pragma once #undef TAPPING_TERM #define TAPPING_TERM 150 // Combos not working yet -// #define COMBO_TERM 20 -// #define COMBO_COUNT 1 +#define COMBO_TERM 20 +#define COMBO_COUNT 1 // #define COMBO_ALLOW_ACTION_KEYS #define IGNORE_MOD_TAP_INTERRUPT @@ -16,5 +13,3 @@ #undef MOUSEKEY_DELAY #define MOUSEKEY_DELAY 100 - -#endif diff --git a/keyboards/ergodox_infinity/keymaps/narze/keymap.c b/keyboards/ergodox_infinity/keymaps/narze/keymap.c index d562c4a9de..e48db6f282 100644 --- a/keyboards/ergodox_infinity/keymaps/narze/keymap.c +++ b/keyboards/ergodox_infinity/keymaps/narze/keymap.c @@ -1,93 +1,55 @@ #include QMK_KEYBOARD_H -// #include "debug.h" -#include "action_layer.h" +#include "narze.h" #include "version.h" -#include "eeconfig.h" -#include "eeprom.h" #include "keymap_colemak.h" extern keymap_config_t keymap_config; enum ergodox_layers { - _QWERTY, - _COLEMAK, - _QWOC, - _LOWER, - _RAISE, - _PLOVER, -// Intermediate layers for SuperDuper (Combo keys does not work on Infinity yet) - _SUPER, - _DUPER, - _SUPERDUPER, - _MOUSE, - _ADJUST, - _MDIA, - _SYMB, + _QWERTY, + _COLEMAK, + _QWOC, + _LOWER, + _RAISE, + _PLOVER, + // Intermediate layers for SuperDuper (Combo keys does not work on Infinity yet) + _SUPERDUPER, + _MOUSE, + _ADJUST, + _MDIA, + _SYMB, }; enum ergodox_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - QWOC, - PLOVER, - SUPER, - DUPER, - SUPERDUPER, - MOUSE, - LOWER, - RAISE, - BACKLIT, - EXT_PLV, - SDTOGG, // Toggle SuperDuper - EPRM, - VRSN, - RGB_SLD + QWERTY = SAFE_RANGE, + COLEMAK, + QWOC, + LOWER, + RAISE, + PLOVER, + SUPERDUPER, + MOUSE, + BACKLIT, + EXT_PLV, + SDTOGG, // Toggle SuperDuper + EPRM, + VRSN, + RGB_SLD, + GUI_UNDS, + LSFT_LPRN, + RSFT_RPRN, }; -enum functions { - M_GUI_UNDS, // Simulate GUI_T(KC_UNDS) - M_SFT_PO, // SFT_T(KC_LPRN) - M_SFT_PC, // SFT_T(KC_RPRN) -}; - -// Timer for custom mod tap -static uint16_t m_gui_unds_timer; -static uint16_t m_sft_po_timer; -static uint16_t m_sft_pc_timer; - // Narze : Custom Macros #define HPR_ESC ALL_T(KC_ESC) #define SFT_ENT SFT_T(KC_ENT) -#define SFT_PO F(M_SFT_PO) -#define SFT_PC F(M_SFT_PC) +#define SFT_PO LSFT_LPRN +#define SFT_PC RSFT_RPRN #define GUI_MINS GUI_T(KC_MINS) -#define GUI_UNDS F(M_GUI_UNDS) - -// Combo : SuperDuper layer from S+D (R+S in Colemak) -// #define COMBO_COUNT 1 -// #define SUPERDUPER_COMBO_COUNT 3 -// #define EECONFIG_SUPERDUPER_INDEX (uint8_t *) 19 - -// enum process_combo_event { -// CB_SUPERDUPER, -// }; - -// const uint16_t PROGMEM superduper_combos[SUPERDUPER_COMBO_COUNT][3] = { -// [_QWERTY] = {KC_S, KC_D, COMBO_END}, -// [_COLEMAK] = {KC_R, KC_S, COMBO_END}, -// [_QWOC] = {CM_S, CM_D, COMBO_END}, -// }; - -// combo_t PROGMEM key_combos[COMBO_COUNT] = { -// [CB_SUPERDUPER] = COMBO_ACTION(superduper_combos[_QWERTY]), -// }; - -// volatile bool superduper_enabled = true; -// const uint16_t empty_combo[] = {COMBO_END}; - -// void set_superduper_key_combos(void); -// void clear_superduper_key_combos(void); +enum process_combo_event { + CB_SUPERDUPER, +}; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Qwerty @@ -115,7 +77,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // left hand KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_MDIA, KC_NO), KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, LT(_SYMB, KC_NO), - HPR_ESC, KC_A, LT(_SUPER, KC_S), LT(_DUPER, KC_D), KC_F, KC_G, + HPR_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, SFT_PO, LT(_MOUSE, KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), LT(_RAISE, KC_LBRC),KC_LCTL, KC_LALT, GUI_UNDS, LOWER, KC_ENT, KC_LGUI, @@ -156,7 +118,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // left hand KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_MDIA, KC_NO), KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, LT(_SYMB, KC_NO), - HPR_ESC, KC_A, LT(_SUPER,KC_R), LT(_DUPER,KC_S), KC_T, KC_D, + HPR_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, SFT_PO, LT(_MOUSE, KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), LT(_RAISE, KC_LBRC),KC_LCTL, KC_LALT, GUI_UNDS, LOWER, KC_ENT, KC_LGUI, @@ -177,7 +139,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // left hand KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_MDIA, KC_NO), KC_TAB, CM_Q, CM_W, CM_E, CM_R, CM_T, LT(_SYMB, KC_NO), - HPR_ESC, CM_A, LT(_SUPER,CM_S), LT(_DUPER,CM_D), CM_F, CM_G, + HPR_ESC, CM_A, CM_S, CM_D, CM_F, CM_G, SFT_PO, LT(_MOUSE, CM_Z), CM_X, CM_C, CM_V, CM_B, ALL_T(KC_NO), LT(_RAISE, KC_LBRC),KC_LCTL, KC_LALT, GUI_UNDS, LOWER, KC_ENT, KC_LGUI, @@ -357,47 +319,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______,_______, KC_LSFT ), -// Intermediate keymaps for SuperDuper (Combo keys does not work on Infinity yet) -[_SUPER] = LAYOUT_ergodox( - // left hand - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, DUPER, _______, _______, - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, - _______, _______, - _______, - _______,_______,_______, - // right hand - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, - _______, _______, - _______, - _______,_______, _______ - ), -[_DUPER] = LAYOUT_ergodox( - // left hand - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, - _______, _______, SUPER, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, - _______, _______, - _______, - _______,_______,_______, - // right hand - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, - _______, _______, - _______, - _______,_______, _______ - ), /* Mouse * @@ -452,7 +373,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | | | | | | | | | |SDTogg| | | | | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | | | | | | + * | | | | | | | | | | | BACKLIT| * `----------------------------------' `----------------------------------' * ,-------------. ,-------------. * | | | | | | @@ -477,7 +398,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, KC_DEL, AG_SWAP, QWERTY, COLEMAK, QWOC, PLOVER, _______, _______, SDTOGG, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, + _______, _______, _______, _______, BACKLIT, _______, _______, _______, _______,_______, _______ @@ -569,146 +490,123 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ) }; -void persistant_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - persistant_default_layer_set(1UL<<_QWERTY); - - // key_combos[CB_SUPERDUPER].keys = superduper_combos[_QWERTY]; - // eeprom_update_byte(EECONFIG_SUPERDUPER_INDEX, _QWERTY); - } - return false; - break; - case COLEMAK: - if (record->event.pressed) { - persistant_default_layer_set(1UL<<_COLEMAK); - - // key_combos[CB_SUPERDUPER].keys = superduper_combos[_COLEMAK]; - // eeprom_update_byte(EECONFIG_SUPERDUPER_INDEX, _COLEMAK); - } - return false; - break; - case QWOC: - if (record->event.pressed) { - persistant_default_layer_set(1UL<<_QWOC); - - // key_combos[CB_SUPERDUPER].keys = superduper_combos[_QWOC]; - // eeprom_update_byte(EECONFIG_SUPERDUPER_INDEX, _QWOC); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case SUPER: - if (record->event.pressed) { - layer_on(_SUPER); - update_tri_layer(_SUPER, _DUPER, _SUPERDUPER); - } else { - layer_off(_SUPER); - update_tri_layer(_SUPER, _DUPER, _SUPERDUPER); - } - return false; - break; - case DUPER: - if (record->event.pressed) { - layer_on(_DUPER); - update_tri_layer(_SUPER, _DUPER, _SUPERDUPER); - } else { - layer_off(_DUPER); - update_tri_layer(_SUPER, _DUPER, _SUPERDUPER); - } - return false; - break; - case BACKLIT: - if (record->event.pressed) { - register_code(KC_RSFT); - #ifdef BACKLIGHT_ENABLE - backlight_step(); - #endif - } else { - unregister_code(KC_RSFT); - } - return false; - break; - case PLOVER: - if (record->event.pressed) { - layer_off(_RAISE); - layer_off(_LOWER); - layer_off(_ADJUST); - layer_on(_PLOVER); - if (!eeconfig_is_enabled()) { - eeconfig_init(); - } - keymap_config.raw = eeconfig_read_keymap(); - keymap_config.nkro = 1; - eeconfig_update_keymap(keymap_config.raw); - } - return false; - break; - case EXT_PLV: - if (record->event.pressed) { - layer_off(_PLOVER); - } - return false; - break; - case SDTOGG: - if (record->event.pressed) { - // superduper_enabled = !superduper_enabled; - - // if (superduper_enabled) { - // set_superduper_key_combos(); - // } else { - // clear_superduper_key_combos(); - // } - } - return false; - break; - case EPRM: - if (record->event.pressed) { - eeconfig_init(); - } - return false; - break; - case VRSN: - if (record->event.pressed) { - SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); - } - return false; - break; - case RGB_SLD: - if (record->event.pressed) { - #ifdef RGBLIGHT_ENABLE - rgblight_mode(1); - #endif - } - return false; - break; - } - return true; + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + + set_superduper_key_combo_layer(_QWERTY); + } + return false; + + case COLEMAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + + set_superduper_key_combo_layer(_COLEMAK); + } + return false; + + case QWOC: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWOC); + + set_superduper_key_combo_layer(_QWOC); + } + return false; + + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + + case PLOVER: + if (record->event.pressed) { + layer_off(_RAISE); + layer_off(_LOWER); + layer_off(_ADJUST); + layer_on(_PLOVER); + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + keymap_config.raw = eeconfig_read_keymap(); + keymap_config.nkro = 1; + eeconfig_update_keymap(keymap_config.raw); + } + return false; + + case EXT_PLV: + if (record->event.pressed) { + layer_off(_PLOVER); + } + return false; + + case SDTOGG: + if (record->event.pressed) { + toggle_superduper_mode(); + } + return false; + + case VRSN: + if (record->event.pressed) { + SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + return false; + + case RGB_SLD: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + rgblight_mode(1); + #endif + } + return false; + + // Macros + + // 1. Hold for LGUI, tap for Underscore + case GUI_UNDS: + perform_space_cadet(record, KC_LGUI, KC_LSFT, KC_MINS); + return false; + + // 2. Hold for LSHIFT, tap for Parens open + case LSFT_LPRN: + perform_space_cadet(record, KC_LSFT, KC_LSFT, KC_9); + return false; + + // 3. Hold for RSHIFT, tap for Parens close + case RSFT_RPRN: + perform_space_cadet(record, KC_RSFT, KC_RSFT, KC_0); + return false; + + } + return true; } void matrix_init_user(void) { @@ -716,25 +614,9 @@ void matrix_init_user(void) { } void matrix_setup(void) { - // set_superduper_key_combos(); + set_superduper_key_combos(); } -// void set_superduper_key_combos(void) { -// uint8_t layer = eeprom_read_byte(EECONFIG_SUPERDUPER_INDEX); - -// switch (layer) { -// case _QWERTY: -// case _COLEMAK: -// case _QWOC: -// key_combos[CB_SUPERDUPER].keys = superduper_combos[layer]; -// break; -// } -// } - -// void clear_superduper_key_combos(void) { -// key_combos[CB_SUPERDUPER].keys = empty_combo; -// } - void matrix_scan_user(void) { // uint8_t layer = biton32(layer_state); @@ -758,91 +640,17 @@ void matrix_scan_user(void) { // Combos -// void process_combo_event(uint8_t combo_index, bool pressed) { -// if (pressed) { -// switch(combo_index) { -// case CB_SUPERDUPER: -// layer_on(_SUPERDUPER); -// ergodox_board_led_on(); -// break; -// } -// } else { -// layer_off(_SUPERDUPER); -// ergodox_board_led_off(); -// unregister_mods(MOD_BIT(KC_LGUI) | MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); // Sometimes mods are held, unregister them -// } -// } - -// Macros - -const uint16_t PROGMEM fn_actions[] = { - [M_GUI_UNDS] = ACTION_MACRO_TAP(M_GUI_UNDS), - [M_SFT_PO] = ACTION_MACRO_TAP(M_SFT_PO), - [M_SFT_PC] = ACTION_MACRO_TAP(M_SFT_PC), -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - bool tap_not_interrupted = record->tap.count > 0 && !record->tap.interrupted; - - switch(id) { - // Hold for LGUI, tap for Underscore - case M_GUI_UNDS: - if (record->event.pressed) { - m_gui_unds_timer = timer_read(); - - if (!tap_not_interrupted) { - register_mods(MOD_BIT(KC_LGUI)); +void process_combo_event(uint8_t combo_index, bool pressed) { + if (pressed) { + switch(combo_index) { + case CB_SUPERDUPER: + layer_on(_SUPERDUPER); + ergodox_board_led_on(); + break; } - } else { - if (tap_not_interrupted && timer_elapsed(m_gui_unds_timer) < TAPPING_TERM) { - - add_weak_mods(MOD_BIT(KC_LSFT)); - send_keyboard_report(); - register_code(KC_MINS); - unregister_code(KC_MINS); - del_weak_mods(MOD_BIT(KC_LSFT)); - send_keyboard_report(); - record->tap.count = 0; // ad hoc: cancel tap - } else { - unregister_mods(MOD_BIT(KC_LGUI)); - } - } - break; - // Hold for LSHIFT, tap for Parens open - case M_SFT_PO: - if (record->event.pressed) { - m_sft_po_timer = timer_read(); - - if (!tap_not_interrupted) { - register_mods(MOD_BIT(KC_LSFT)); - } - } else { - if (tap_not_interrupted && timer_elapsed(m_sft_po_timer) < TAPPING_TERM) { - record->tap.count = 0; - return MACRO(D(RSFT), T(9), U(RSFT), END); - } else { - unregister_mods(MOD_BIT(KC_LSFT)); - } - } - break; - // Hold for RSHIFT, tap for Parens close - case M_SFT_PC: - if (record->event.pressed) { - m_sft_pc_timer = timer_read(); - - if (!tap_not_interrupted) { - register_mods(MOD_BIT(KC_RSFT)); - } - } else { - if (tap_not_interrupted && timer_elapsed(m_sft_pc_timer) < TAPPING_TERM) { - record->tap.count = 0; - return MACRO(D(LSFT), T(0), U(LSFT), END); - } else { - unregister_mods(MOD_BIT(KC_RSFT)); - } - } - break; - } - return MACRO_NONE; -}; + } else { + layer_off(_SUPERDUPER); + ergodox_board_led_off(); + unregister_mods(MOD_BIT(KC_LGUI) | MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); // Sometimes mods are held, unregister them + } +} diff --git a/keyboards/ergodox_infinity/keymaps/narze/readme.md b/keyboards/ergodox_infinity/keymaps/narze/readme.md index 03a72f1ac3..f24fc05fe0 100644 --- a/keyboards/ergodox_infinity/keymaps/narze/readme.md +++ b/keyboards/ergodox_infinity/keymaps/narze/readme.md @@ -25,21 +25,22 @@ Press `S+D` simultaneously and hold, then... - It can be activated by holding `/` as well, but it's slower since `LT()` uses `TAPPING_TERM` of 200ms but `S+D` uses `COMBO_TERM` of only 20ms (Can be changed within config.h) ## Build instructions -- `cd /path/to/qmk_firmware` +If your environment is ready to build with `make`, don't use docker since it takes 5m+ to compile. +Use the instructions in Ergodox Infinity's readme. -#### Left side - ``` -docker run -e keymap=narze -e subproject=infinity -e keyboard=ergodox --rm -v $('pwd'):/qmk:rw edasque/qmk_firmware +#### Left side (Docker) +``` +cd /path/to/qmk_firmware +util/docker_build.sh ergodox_infinity:narze avr-objcopy -Iihex -Obinary .build/ergodox_infinity_narze.hex .build/ergodox_infinity_narze_left.bin dfu-util --device 1c11:b007 -D .build/ergodox_infinity_narze_left.bin ``` -#### Right side +#### Right side (Docker) +You have to override `usb_args` in order to pass `MASTER=right` to docker using provided build script. ``` -docker run -e keymap=narze -e subproject=infinity -e keyboard=ergodox -e MASTER=right --rm -v $('pwd'):/qmk:rw edasque/qmk_firmware +cd /path/to/qmk_firmware +usb_args="-e MASTER=right" util/docker_build.sh ergodox_infinity:narze avr-objcopy -Iihex -Obinary .build/ergodox_infinity_narze.hex .build/ergodox_infinity_narze_right.bin dfu-util --device 1c11:b007 -D .build/ergodox_infinity_narze_right.bin ``` - -## TODO -- [ ] Make SuperDuper mode fully-compatible in Windows by swapping GUI with Ctrl diff --git a/keyboards/ergodox_infinity/keymaps/narze/rules.mk b/keyboards/ergodox_infinity/keymaps/narze/rules.mk index bd89bb9d98..4bfa4fde26 100644 --- a/keyboards/ergodox_infinity/keymaps/narze/rules.mk +++ b/keyboards/ergodox_infinity/keymaps/narze/rules.mk @@ -15,10 +15,9 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -# Combos not working yet -COMBO_ENABLE = no +COMBO_ENABLE = yes |