+
+ case ACT_OVERLAY:
+ switch (action.layer.code) {
+ // Overlay Invert bit4
+ case OP_INV4 | 0:
+ if (action.layer.val == 0) {
+ // NOTE: reserved for future use
+ overlay_clear();
+ } else {
+ overlay_set(overlay_stat ^ action.layer.val);
+ }
+ break;
+ case OP_INV4 | 1:
+ if (action.layer.val == 0) {
+ // on pressed
+ if (event.pressed) overlay_clear();
+ } else {
+ overlay_set(overlay_stat ^ action.layer.val<<4);
+ }
+ break;
+ case OP_INV4 | 2:
+ if (action.layer.val == 0) {
+ // on released
+ if (!event.pressed) overlay_clear();
+ } else {
+ overlay_set(overlay_stat ^ action.layer.val<<8);
+ }
+ break;
+ case OP_INV4 | 3:
+ if (action.layer.val == 0) {
+ // on both
+ overlay_clear();
+ } else {
+ overlay_set(overlay_stat ^ action.layer.val<<12);
+ }
+ break;
+
+ /* Overlay Bit invert */
+ case OP_INV:
+ /* with tap toggle */
+ if (event.pressed) {
+ if (tap_count < TAPPING_TOGGLE) {
+ debug("OVERLAY_INV: tap toggle(press).\n");
+ overlay_invert(action.layer.val);
+ }
+ } else {
+ if (tap_count <= TAPPING_TOGGLE) {
+ debug("OVERLAY_INV: tap toggle(release).\n");
+ overlay_invert(action.layer.val);
+ }
+ }
+ break;
+ case (OP_INV | ON_PRESS):
+ if (event.pressed) {
+ overlay_invert(action.layer.val);
+ }
+ break;
+ case (OP_INV | ON_RELEASE):
+ if (!event.pressed) {
+ overlay_invert(action.layer.val);
+ }
+ break;
+ case (OP_INV | ON_BOTH):
+ overlay_invert(action.layer.val);
+ break;
+
+ /* Overlay Bit on */
+ case OP_ON:
+ if (event.pressed) {
+ overlay_on(action.layer.val);
+ } else {
+ overlay_off(action.layer.val);
+ }
+ break;
+ case (OP_ON | ON_PRESS):
+ if (event.pressed) {
+ overlay_on(action.layer.val);
+ }
+ break;
+ case (OP_ON | ON_RELEASE):
+ if (!event.pressed) {
+ overlay_on(action.layer.val);
+ }
+ break;
+ case (OP_ON | ON_BOTH):
+ overlay_on(action.layer.val);
+ break;
+
+ /* Overlay Bit off */
+ case OP_OFF:
+ if (event.pressed) {
+ overlay_off(action.layer.val);
+ } else {
+ overlay_on(action.layer.val);
+ }
+ break;
+ case (OP_OFF | ON_PRESS):
+ if (event.pressed) {
+ overlay_off(action.layer.val);
+ }
+ break;
+ case (OP_OFF | ON_RELEASE):
+ if (!event.pressed) {
+ overlay_off(action.layer.val);
+ }
+ break;
+ case (OP_OFF | ON_BOTH):
+ overlay_off(action.layer.val);
+ break;
+
+ /* Overlay Bit set */
+ case OP_SET:
+ if (event.pressed) {
+ overlay_move(action.layer.val);
+ } else {
+ overlay_clear();
+ }
+ break;
+ case (OP_SET | ON_PRESS):
+ if (event.pressed) {
+ overlay_move(action.layer.val);
+ }
+ break;
+ case (OP_SET | ON_RELEASE):
+ if (!event.pressed) {
+ overlay_move(action.layer.val);
+ }
+ break;
+ case (OP_SET | ON_BOTH):
+ overlay_move(action.layer.val);
+ break;
+
+ /* Overlay Bit invert with tap key */
+ default:
+ if (event.pressed) {
+ if (tap_count > 0) {
+ debug("OVERLAY_TAP_KEY: Tap: register_code\n");
+ register_code(action.layer.code);
+ } else {
+ debug("OVERLAY_TAP_KEY: No tap: On on press\n");
+ overlay_on(action.layer.val);
+ }
+ } else {
+ if (tap_count > 0) {
+ debug("OVERLAY_TAP_KEY: Tap: unregister_code\n");
+ unregister_code(action.layer.code);
+ } else {
+ debug("OVERLAY_TAP_KEY: No tap: Off on release\n");
+ overlay_off(action.layer.val);
+ }
+ }
+ break;
+ }