- break;
- /* Keymap Reset default layer */
- case (OP_RESET | ON_PRESS):
- if (event.pressed) {
- default_layer_set(action.layer.val);
- }
- break;
- case (OP_RESET | ON_RELEASE):
- if (!event.pressed) {
- default_layer_set(action.layer.val);
- }
- break;
- case (OP_RESET | ON_BOTH):
- default_layer_set(action.layer.val);
- break;
-
- /* Keymap Bit invert */
- case OP_INV:
- /* with tap toggle */
- if (event.pressed) {
- if (tap_count < TAPPING_TOGGLE) {
- debug("KEYMAP_INV: tap toggle(press).\n");
- keymap_invert(action.layer.val);
- }
- } else {
- if (tap_count <= TAPPING_TOGGLE) {
- debug("KEYMAP_INV: tap toggle(release).\n");
- keymap_invert(action.layer.val);
- }
- }
- break;
- case (OP_INV | ON_PRESS):
- if (event.pressed) {
- keymap_invert(action.layer.val);
- }
- break;
- case (OP_INV | ON_RELEASE):
- if (!event.pressed) {
- keymap_invert(action.layer.val);
- }
- break;
- case (OP_INV | ON_BOTH):
- keymap_invert(action.layer.val);
- break;
-
- /* Keymap Bit on */
- case OP_ON:
- if (event.pressed) {
- keymap_on(action.layer.val);
- } else {
- keymap_off(action.layer.val);
- }
- break;
- case (OP_ON | ON_PRESS):
- if (event.pressed) {
- keymap_on(action.layer.val);
- }
- break;
- case (OP_ON | ON_RELEASE):
- if (!event.pressed) {
- keymap_on(action.layer.val);
- }
- break;
- case (OP_ON | ON_BOTH):
- keymap_on(action.layer.val);
- break;
-
- /* Keymap Bit off */
- case OP_OFF:
- if (event.pressed) {
- keymap_off(action.layer.val);
- } else {
- keymap_on(action.layer.val);
- }
- break;
- case (OP_OFF | ON_PRESS):
- if (event.pressed) {
- keymap_off(action.layer.val);
- }
- break;
- case (OP_OFF | ON_RELEASE):
- if (!event.pressed) {
- keymap_off(action.layer.val);
- }
- break;
- case (OP_OFF | ON_BOTH):
- keymap_off(action.layer.val);
- break;
-
- /* Keymap Bit set */
- case OP_SET:
- if (event.pressed) {
- keymap_set(action.layer.val);
- } else {
- keymap_clear();
- }
- break;
- case (OP_SET | ON_PRESS):
- if (event.pressed) {
- keymap_set(action.layer.val);
- }
- break;
- case (OP_SET | ON_RELEASE):
- if (!event.pressed) {
- keymap_set(action.layer.val);
- }
- break;
- case (OP_SET | ON_BOTH):
- keymap_set(action.layer.val);
- break;
-
- /* Keymap Bit invert with tap key */
- default:
- if (event.pressed) {
- if (tap_count > 0) {
- debug("KEYMAP_TAP_KEY: Tap: register_code\n");
- register_code(action.layer.code);
- } else {
- debug("KEYMAP_TAP_KEY: No tap: On on press\n");
- keymap_on(action.layer.val);
- }
- } else {
- if (tap_count > 0) {
- debug("KEYMAP_TAP_KEY: Tap: unregister_code\n");
- unregister_code(action.layer.code);
- } else {
- debug("KEYMAP_TAP_KEY: No tap: Off on release\n");
- keymap_off(action.layer.val);
- }
+ }
+ } else {
+ /* Layer Bitwise Operation */
+ if (event.pressed ? (action.layer_bitop.on & ON_PRESS) :
+ (action.layer_bitop.on & ON_RELEASE)) {
+ uint8_t shift = action.layer_bitop.part*4;
+ uint32_t bits = ((uint32_t)action.layer_bitop.bits)<<shift;
+ uint32_t mask = (action.layer_bitop.xbit) ? ~(((uint32_t)0xf)<<shift) : 0;
+ switch (action.layer_bitop.op) {
+ case OP_BIT_AND: layer_and(bits | mask); break;
+ case OP_BIT_OR: layer_or(bits | mask); break;
+ case OP_BIT_XOR: layer_xor(bits | mask); break;
+ case OP_BIT_SET: layer_and(mask); layer_or(bits); break;