mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-11-03 23:02:34 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			224 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*  A library to output the right key shortcut in any common app.
 | 
						|
Given a global variable babble_mode to show the environment and a
 | 
						|
key that calls the paste macro, do the right type of paste.
 | 
						|
Setting the context is done by another macro, or TBD interaction with the host.
 | 
						|
 | 
						|
Huge thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts
 | 
						|
and https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jeebak/keymap.c
 | 
						|
*/
 | 
						|
 | 
						|
#include QMK_KEYBOARD_H
 | 
						|
 | 
						|
#ifdef USE_BABBLEPASTE
 | 
						|
#    include "babblePaste.h"
 | 
						|
 | 
						|
// GLOBAL variable to determine mode.  Sets startup default if no eeppom
 | 
						|
uint8_t babble_mode = 0;
 | 
						|
 | 
						|
// functions to tell the user that the mode has changed
 | 
						|
__attribute__((weak)) void babble_modeswitch_user(uint8_t mode) {}
 | 
						|
__attribute__((weak)) void babble_modeswitch_kb(uint8_t mode) { babble_modeswitch_user( mode); }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
void set_babble_mode(uint8_t id) { babble_mode = id; }
 | 
						|
 | 
						|
void babble_mode_increment() {
 | 
						|
    babble_mode += 1;
 | 
						|
    if (babble_mode >= BABL_MODEMAX) {
 | 
						|
        babble_mode = 0;
 | 
						|
    }
 | 
						|
    babble_modeswitch_kb(babble_mode);
 | 
						|
}
 | 
						|
 | 
						|
void babble_mode_decrement() {
 | 
						|
    if (babble_mode >= 1) {
 | 
						|
        babble_mode -= 1;
 | 
						|
    } else {
 | 
						|
        babble_mode = BABL_MODEMAX - 1;
 | 
						|
    }
 | 
						|
    babble_modeswitch_kb(babble_mode);
 | 
						|
}
 | 
						|
 | 
						|
/* this function runs the appropriate babblepaste macro, given
 | 
						|
the global babble_mode and a keycode defined in the babble_keycodes enum.
 | 
						|
 | 
						|
This could be made faster by splitting into functions sorted by keycode range
 | 
						|
But that makes for a *lot* of ifdefs.
 | 
						|
*/
 | 
						|
bool babblePaste(uint16_t keycode, bool is_pressed )  {
 | 
						|
    // handle keys that have up & down behavior first, then OS/mode switching, then macros
 | 
						|
 | 
						|
// This is the key used for cut & paste (Propeller on Mac, Control elsewhere)
 | 
						|
#   ifdef BABL_MODSWAP
 | 
						|
    // WARNING, this assumes you have BABL_MAC_MODE defined. 
 | 
						|
    if (keycode == BABL_PRIMARY_OS_MOD ) {
 | 
						|
        if (babble_mode == BABL_MAC_MODE) {
 | 
						|
            if (is_pressed) {
 | 
						|
                register_code(KC_LGUI);
 | 
						|
            } else {
 | 
						|
                unregister_code(KC_LGUI);
 | 
						|
            }
 | 
						|
        } else { // everybody else 
 | 
						|
 | 
						|
            if (is_pressed) {
 | 
						|
                register_code(KC_LCTL);
 | 
						|
            } else {
 | 
						|
                unregister_code(KC_LCTL);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
// This is the os key not used in cut & paste. (CTRL on mac, GUI elsewhere)
 | 
						|
    if (keycode == BABL_SECONDARY_OS_MOD ) {
 | 
						|
        if (babble_mode == BABL_MAC_MODE) {
 | 
						|
                if (is_pressed) {
 | 
						|
                register_code(KC_LCTL);
 | 
						|
            } else {
 | 
						|
                unregister_code(KC_LCTL);
 | 
						|
            }
 | 
						|
 | 
						|
        } else { // everybody else 
 | 
						|
            if (is_pressed) {
 | 
						|
                register_code(KC_LGUI);
 | 
						|
            } else {
 | 
						|
                unregister_code(KC_LGUI);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
// This is the alt key in most OSes. Mostly useful if you want to do hyper on one OS, Meh on another.  
 | 
						|
    if (keycode == BABL_TERTIARY_OS_MOD ) {
 | 
						|
        if (babble_mode == BABL_MAC_MODE) {
 | 
						|
            if (is_pressed) {
 | 
						|
                register_code(KC_LALT);
 | 
						|
            } else {
 | 
						|
                unregister_code(KC_LALT);
 | 
						|
            }
 | 
						|
        } else { // everybody else 
 | 
						|
 | 
						|
            if (is_pressed) {
 | 
						|
                register_code(KC_LALT);
 | 
						|
            } else {
 | 
						|
                unregister_code(KC_LALT);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
#   endif 
 | 
						|
 | 
						|
// below here we are only running macros - don't serve any key up events. 
 | 
						|
    if (is_pressed == 0 ) {
 | 
						|
           return true;
 | 
						|
    }
 | 
						|
 | 
						|
// handle increment functions. 
 | 
						|
 | 
						|
if (keycode == BABL_MODE_INCREMENT) {
 | 
						|
        babble_mode_increment();
 | 
						|
        return true;
 | 
						|
}
 | 
						|
 | 
						|
if (keycode == BABL_MODE_DECREMENT) {
 | 
						|
        babble_mode_decrement();
 | 
						|
        return true;
 | 
						|
}
 | 
						|
 | 
						|
#    ifdef BABL_MAC
 | 
						|
    if (keycode == BABL_DO_MAC) {
 | 
						|
        set_babble_mode(BABL_MAC_MODE);
 | 
						|
        babble_modeswitch_kb(babble_mode);
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    if (babble_mode == BABL_MAC_MODE) {
 | 
						|
        babblePaste_mac(keycode);
 | 
						|
    }
 | 
						|
#    endif
 | 
						|
 | 
						|
#    ifdef BABL_VI
 | 
						|
    if (keycode == BABL_DO_VI) {
 | 
						|
        set_babble_mode(BABL_VI_MODE);
 | 
						|
        babble_modeswitch_kb(babble_mode);
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
    if (babble_mode == BABL_VI_MODE) {
 | 
						|
        babblePaste_vi(keycode);
 | 
						|
    }
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_WINDOWS
 | 
						|
    if (keycode == BABL_DO_WINDOWS) {
 | 
						|
        set_babble_mode(BABL_WINDOWS_MODE);
 | 
						|
        babble_modeswitch_kb(babble_mode);
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
    if (babble_mode == BABL_WINDOWS_MODE) {
 | 
						|
        babblePaste_win(keycode);
 | 
						|
    }
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_LINUX
 | 
						|
    if (keycode == BABL_DO_LINUX) {
 | 
						|
        set_babble_mode(BABL_LINUX_MODE);
 | 
						|
        babble_modeswitch_kb(babble_mode);
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
    if (babble_mode == BABL_LINUX_MODE) {
 | 
						|
        babblePaste_linux(keycode);
 | 
						|
    }
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_EMACS
 | 
						|
    if (keycode == BABL_DO_EMACS) {
 | 
						|
        set_babble_mode(BABL_EMACS_MODE);
 | 
						|
        babble_modeswitch_kb(babble_mode);
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
    if (babble_mode == BABL_EMACS_MODE) {
 | 
						|
        babblePaste_emacs(keycode);
 | 
						|
    }
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_NANO
 | 
						|
    if (keycode == BABL_DO_NANO) {
 | 
						|
        set_babble_mode(BABL_NANO_MODE);
 | 
						|
        babble_modeswitch_kb(babble_mode);
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
    if (babble_mode == BABL_NANO_MODE) {
 | 
						|
        babblePaste_nano(keycode);
 | 
						|
    }
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_KITTY
 | 
						|
    if (keycode == BABL_DO_KITTY) {
 | 
						|
        set_babble_mode(BABL_KITTY_MODE);
 | 
						|
        babble_modeswitch_kb(babble_mode);
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
    if (babble_mode == BABL_KITTY_MODE) {
 | 
						|
        babblePaste_kitty(keycode);
 | 
						|
    }
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_CHROMEOS
 | 
						|
    if (keycode == BABL_DO_CHROMEOS) {
 | 
						|
        set_babble_mode(BABL_CHROMEOS_MODE);
 | 
						|
        babble_modeswitch_kb(babble_mode);
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
    if (babble_mode == BABL_CHROMEOS_MODE) {
 | 
						|
        babblePaste_chromeos(keycode);
 | 
						|
    }
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_READMUX
 | 
						|
    if (keycode == BABL_DO_READMUX) {
 | 
						|
        set_babble_mode(BABL_READMUX_MODE);
 | 
						|
        babble_modeswitch_kb(babble_mode);
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
    if (babble_mode == BABL_READMUX_MODE) {
 | 
						|
        babblePaste_readmux(keycode);
 | 
						|
    }
 | 
						|
#    endif
 | 
						|
 | 
						|
    return false;
 | 
						|
}
 | 
						|
 | 
						|
#endif  // USE_BABBLEPASTE
 |