Skip to content

Commit

Permalink
Simple extended space cadet (qmk#5277)
Browse files Browse the repository at this point in the history
* Simplifying and Extending Space Cadet to work on Ctrl and Alt keys

* PR Review feedback

* Reverting back to keycodes
  • Loading branch information
XScorpion2 authored and drashna committed Apr 30, 2019
1 parent c941ef0 commit 38c65e4
Show file tree
Hide file tree
Showing 6 changed files with 192 additions and 120 deletions.
6 changes: 6 additions & 0 deletions common_features.mk
Original file line number Diff line number Diff line change
Expand Up @@ -343,3 +343,9 @@ ifeq ($(strip $(OLED_DRIVER_ENABLE)), yes)
QUANTUM_LIB_SRC += i2c_master.c
SRC += oled_driver.c
endif

SPACE_CADET_ENABLE ?= yes
ifeq ($(strip $(SPACE_CADET_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_space_cadet.c
OPT_DEFS += -DSPACE_CADET_ENABLE
endif
146 changes: 146 additions & 0 deletions quantum/process_keycode/process_space_cadet.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
/* Copyright 2019 Jack Humbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "process_space_cadet.h"

#ifndef TAPPING_TERM
#define TAPPING_TERM 200
#endif

// ********** OBSOLETE DEFINES, STOP USING! (pls?) **********
// Shift / paren setup
#ifndef LSPO_KEY
#define LSPO_KEY KC_9
#endif
#ifndef RSPC_KEY
#define RSPC_KEY KC_0
#endif

// Shift / Enter setup
#ifndef SFTENT_KEY
#define SFTENT_KEY KC_ENT
#endif

#ifdef DISABLE_SPACE_CADET_MODIFIER
#ifndef LSPO_MOD
#define LSPO_MOD KC_TRNS
#endif
#ifndef RSPC_MOD
#define RSPC_MOD KC_TRNS
#endif
#else
#ifndef LSPO_MOD
#define LSPO_MOD KC_LSFT
#endif
#ifndef RSPC_MOD
#define RSPC_MOD KC_RSFT
#endif
#endif
// **********************************************************

// Shift / paren setup
#ifndef LSPO_KEYS
#define LSPO_KEYS KC_LSFT, LSPO_MOD, LSPO_KEY
#endif
#ifndef RSPC_KEYS
#define RSPC_KEYS KC_RSFT, RSPC_MOD, RSPC_KEY
#endif

// Control / paren setup
#ifndef LCPO_KEYS
#define LCPO_KEYS KC_LCTL, KC_LCTL, KC_9
#endif
#ifndef RCPO_KEYS
#define RCPO_KEYS KC_RCTL, KC_RCTL, KC_0
#endif

// Alt / paren setup
#ifndef LAPO_KEYS
#define LAPO_KEYS KC_LALT, KC_LALT, KC_9
#endif
#ifndef RAPO_KEYS
#define RAPO_KEYS KC_RALT, KC_RALT, KC_0
#endif

// Shift / Enter setup
#ifndef SFTENT_KEYS
#define SFTENT_KEYS KC_RSFT, KC_TRNS, SFTENT_KEY
#endif

static uint8_t sc_last = 0;
static uint16_t sc_timer = 0;

void perform_space_cadet(keyrecord_t *record, uint8_t normalMod, uint8_t tapMod, uint8_t keycode) {
if (record->event.pressed) {
sc_last = normalMod;
sc_timer = timer_read ();
if (IS_MOD(normalMod)) {
register_mods(MOD_BIT(normalMod));
}
}
else {
if (IS_MOD(normalMod)) {
unregister_mods(MOD_BIT(normalMod));
}

if (sc_last == normalMod && timer_elapsed(sc_timer) < TAPPING_TERM) {
if (IS_MOD(tapMod)) {
register_mods(MOD_BIT(tapMod));
}
tap_code(keycode);
if (IS_MOD(tapMod)) {
unregister_mods(MOD_BIT(tapMod));
}
}
}
}

bool process_space_cadet(uint16_t keycode, keyrecord_t *record) {
switch(keycode) {
case KC_LSPO: {
perform_space_cadet(record, LSPO_KEYS);
return false;
}
case KC_RSPC: {
perform_space_cadet(record, RSPC_KEYS);
return false;
}
case KC_LCPO: {
perform_space_cadet(record, LCPO_KEYS);
return false;
}
case KC_RCPC: {
perform_space_cadet(record, RCPO_KEYS);
return false;
}
case KC_LAPO: {
perform_space_cadet(record, LAPO_KEYS);
return false;
}
case KC_RAPC: {
perform_space_cadet(record, RAPO_KEYS);
return false;
}
case KC_SFTENT: {
perform_space_cadet(record, SFTENT_KEYS);
return false;
}
default: {
sc_last = 0;
break;
}
}
return true;
}
21 changes: 21 additions & 0 deletions quantum/process_keycode/process_space_cadet.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/* Copyright 2019 Jack Humbert
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once

#include "quantum.h"

void perform_space_cadet(keyrecord_t *record, uint8_t normalMod, uint8_t tapMod, uint8_t keycode);
bool process_space_cadet(uint16_t keycode, keyrecord_t *record);
123 changes: 3 additions & 120 deletions quantum/quantum.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,6 @@
#include "outputselect.h"
#endif

#ifndef TAPPING_TERM
#define TAPPING_TERM 200
#endif

#ifndef BREATHING_PERIOD
#define BREATHING_PERIOD 6
#endif
Expand Down Expand Up @@ -196,30 +192,6 @@ void reset_keyboard(void) {
bootloader_jump();
}

// Shift / paren setup

#ifndef LSPO_KEY
#define LSPO_KEY KC_9
#endif
#ifndef RSPC_KEY
#define RSPC_KEY KC_0
#endif

#ifndef LSPO_MOD
#define LSPO_MOD KC_LSFT
#endif
#ifndef RSPC_MOD
#define RSPC_MOD KC_RSFT
#endif

// Shift / Enter setup
#ifndef SFTENT_KEY
#define SFTENT_KEY KC_ENT
#endif

static bool shift_interrupted[2] = {0, 0};
static uint16_t scs_timer[2] = {0, 0};

/* true if the last press of GRAVE_ESC was shifted (i.e. GUI or SHIFT were pressed), false otherwise.
* Used to ensure that the correct keycode is released if the key is released.
*/
Expand Down Expand Up @@ -328,6 +300,9 @@ bool process_record_quantum(keyrecord_t *record) {
#endif
#ifdef TERMINAL_ENABLE
process_terminal(keycode, record) &&
#endif
#ifdef SPACE_CADET_ENABLE
process_space_cadet(keycode, record) &&
#endif
true)) {
return false;
Expand Down Expand Up @@ -685,92 +660,6 @@ bool process_record_quantum(keyrecord_t *record) {
return false;
}
break;
case KC_LSPO: {
if (record->event.pressed) {
shift_interrupted[0] = false;
scs_timer[0] = timer_read ();
register_mods(MOD_BIT(KC_LSFT));
}
else {
#ifdef DISABLE_SPACE_CADET_ROLLOVER
if (get_mods() & MOD_BIT(RSPC_MOD)) {
shift_interrupted[0] = true;
shift_interrupted[1] = true;
}
#endif
if (!shift_interrupted[0] && timer_elapsed(scs_timer[0]) < TAPPING_TERM) {
#ifdef DISABLE_SPACE_CADET_MODIFIER
unregister_mods(MOD_BIT(KC_LSFT));
#else
if( LSPO_MOD != KC_LSFT ){
unregister_mods(MOD_BIT(KC_LSFT));
register_mods(MOD_BIT(LSPO_MOD));
}
#endif
register_code(LSPO_KEY);
unregister_code(LSPO_KEY);
#ifndef DISABLE_SPACE_CADET_MODIFIER
if( LSPO_MOD != KC_LSFT ){
unregister_mods(MOD_BIT(LSPO_MOD));
}
#endif
}
unregister_mods(MOD_BIT(KC_LSFT));
}
return false;
}

case KC_RSPC: {
if (record->event.pressed) {
shift_interrupted[1] = false;
scs_timer[1] = timer_read ();
register_mods(MOD_BIT(KC_RSFT));
}
else {
#ifdef DISABLE_SPACE_CADET_ROLLOVER
if (get_mods() & MOD_BIT(LSPO_MOD)) {
shift_interrupted[0] = true;
shift_interrupted[1] = true;
}
#endif
if (!shift_interrupted[1] && timer_elapsed(scs_timer[1]) < TAPPING_TERM) {
#ifdef DISABLE_SPACE_CADET_MODIFIER
unregister_mods(MOD_BIT(KC_RSFT));
#else
if( RSPC_MOD != KC_RSFT ){
unregister_mods(MOD_BIT(KC_RSFT));
register_mods(MOD_BIT(RSPC_MOD));
}
#endif
register_code(RSPC_KEY);
unregister_code(RSPC_KEY);
#ifndef DISABLE_SPACE_CADET_MODIFIER
if ( RSPC_MOD != KC_RSFT ){
unregister_mods(MOD_BIT(RSPC_MOD));
}
#endif
}
unregister_mods(MOD_BIT(KC_RSFT));
}
return false;
}

case KC_SFTENT: {
if (record->event.pressed) {
shift_interrupted[1] = false;
scs_timer[1] = timer_read ();
register_mods(MOD_BIT(KC_RSFT));
}
else if (!shift_interrupted[1] && timer_elapsed(scs_timer[1]) < TAPPING_TERM) {
unregister_mods(MOD_BIT(KC_RSFT));
register_code(SFTENT_KEY);
unregister_code(SFTENT_KEY);
}
else {
unregister_mods(MOD_BIT(KC_RSFT));
}
return false;
}

case GRAVE_ESC: {
uint8_t shifted = get_mods() & ((MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)
Expand Down Expand Up @@ -825,12 +714,6 @@ bool process_record_quantum(keyrecord_t *record) {
return false;
}
#endif

default: {
shift_interrupted[0] = true;
shift_interrupted[1] = true;
break;
}
}

return process_action_kb(record);
Expand Down
4 changes: 4 additions & 0 deletions quantum/quantum.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,10 @@ extern uint32_t default_layer_state;
#include "process_terminal_nop.h"
#endif

#ifdef SPACE_CADET_ENABLE
#include "process_space_cadet.h"
#endif

#ifdef HD44780_ENABLE
#include "hd44780.h"
#endif
Expand Down
12 changes: 12 additions & 0 deletions quantum/quantum_keycodes.h
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,18 @@ enum quantum_keycodes {
HPT_DWLI,
HPT_DWLD,

// Left control, open paren
KC_LCPO,

// Right control, close paren
KC_RCPC,

// Left control, open paren
KC_LAPO,

// Right control, close paren
KC_RAPC,

// always leave at the end
SAFE_RANGE
};
Expand Down

0 comments on commit 38c65e4

Please sign in to comment.