384 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			384 lines
		
	
	
		
			12 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 bable_mode is done by another macro, or TBD interaction with the host.
 | 
						|
 | 
						|
Huge thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts
 | 
						|
and jeebak & algernon's keymap
 | 
						|
*/
 | 
						|
 | 
						|
#pragma once
 | 
						|
#include "quantum.h"
 | 
						|
 | 
						|
#ifdef USE_BABBLEPASTE
 | 
						|
 | 
						|
void set_babble_mode(uint8_t id);
 | 
						|
void babble_mode_increment(void);
 | 
						|
void babble_mode_decrement(void);
 | 
						|
void babble_modeswitch_user(uint8_t mode);
 | 
						|
void babble_modeswitch_kb(uint8_t mode);
 | 
						|
 | 
						|
// manually re-order these if you want to set the order or default.
 | 
						|
enum babble_modes {
 | 
						|
#    ifdef BABL_MAC
 | 
						|
    BABL_MAC_MODE,
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_READMUX
 | 
						|
    BABL_READMUX_MODE,
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_WINDOWS
 | 
						|
    BABL_WINDOWS_MODE,
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_VI
 | 
						|
    BABL_VI_MODE,
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_EMACS
 | 
						|
    BABL_EMACS_MODE,
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_NANO
 | 
						|
    BABL_NANO_MODE,
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_KITTY
 | 
						|
    BABL_KITTY_MODE,
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_CHROMEOS
 | 
						|
    BABL_CHROMEOS_MODE,
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_LINUX
 | 
						|
    BABL_LINUX_MODE,
 | 
						|
#    endif
 | 
						|
    BABL_MODEMAX
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/// Hacks to make it easier to create sendstring macros
 | 
						|
 | 
						|
//"outer" versions wrap text
 | 
						|
#    define OMCTL(arg) SS_DOWN(X_LCTRL) arg SS_UP(X_LCTRL)
 | 
						|
#    define OMGUI(arg) SS_DOWN(X_LGUI) arg SS_UP(X_LGUI)
 | 
						|
#    define OMALT(arg) SS_DOWN(X_LALT) arg SS_UP(X_LALT)
 | 
						|
#    define OMSFT(...) SS_DOWN(X_LSHIFT) __VA_ARGS__ SS_UP(X_LSHIFT)
 | 
						|
//"inner" versions wrap a key tap
 | 
						|
#    define IMCTL(arg) SS_DOWN(X_LCTRL) SS_TAP(arg) SS_UP(X_LCTRL)
 | 
						|
#    define IMGUI(arg) SS_DOWN(X_LGUI) SS_TAP(arg) SS_UP(X_LGUI)
 | 
						|
#    define IMALT(arg) SS_DOWN(X_LALT) SS_TAP(arg) SS_UP(X_LALT)
 | 
						|
#    define IMSFT(arg) SS_DOWN(X_LSHIFT) SS_TAP(arg) SS_UP(X_LSHIFT)
 | 
						|
 | 
						|
#    define BABLM(ent, ...)           \
 | 
						|
        if (ent == keycode) {         \
 | 
						|
            SEND_STRING(__VA_ARGS__); \
 | 
						|
            return true;              \
 | 
						|
        }
 | 
						|
 | 
						|
// BabblePaste should be loaded first (header in userspace .h file, before all else)
 | 
						|
// if not,we'll do our best.
 | 
						|
#    if defined(NEW_SAFE_RANGE)
 | 
						|
#        define BABBLE_START NEW_SAFE_RANGE
 | 
						|
#    else
 | 
						|
#        if defined(KEYMAP_SAFE_RANGE)
 | 
						|
#            define BABBLE_START KEYMAP_SAFE_RANGE
 | 
						|
#        else
 | 
						|
#            define BABBLE_START SAFE_RANGE
 | 
						|
#        endif
 | 
						|
#    endif
 | 
						|
 | 
						|
enum babble_keycodes {
 | 
						|
    FIRST = BABBLE_START,
 | 
						|
    BABL_MODE_INCREMENT, 
 | 
						|
    BABL_MODE_DECREMENT,
 | 
						|
#   ifdef BABL_MODSWAP
 | 
						|
    BABL_PRIMARY_OS_MOD,
 | 
						|
    BABL_SECONDARY_OS_MOD,
 | 
						|
    BABL_TERTIARY_OS_MOD,
 | 
						|
#   endif 
 | 
						|
#    ifdef BABL_MOVE
 | 
						|
    // Movement macros
 | 
						|
    // left & right
 | 
						|
    BABL_GO_LEFT_1C,
 | 
						|
    BABL_GO_RIGHT_1C,
 | 
						|
    BABL_GO_LEFT_WORD,
 | 
						|
    BABL_GO_RIGHT_WORD,
 | 
						|
    BABL_GO_START_LINE,
 | 
						|
    BABL_GO_END_LINE,
 | 
						|
    // now up & down
 | 
						|
    BABL_GO_START_DOC,
 | 
						|
    BABL_GO_END_DOC,
 | 
						|
    BABL_GO_NEXT_LINE,
 | 
						|
    BABL_GO_PREV_LINE,
 | 
						|
    BABL_GO_PARA_START,
 | 
						|
    BABL_GO_PARA_END,
 | 
						|
    BABL_PGDN,
 | 
						|
    BABL_PGUP,
 | 
						|
    // And the delete options
 | 
						|
    BABL_DEL_LEFT_1C,   // == backspace, so why bother?
 | 
						|
    BABL_DEL_RIGHT_1C,  // usually = Del
 | 
						|
    BABL_DEL_LEFT_WORD,
 | 
						|
    BABL_DEL_RIGHT_WORD,
 | 
						|
    BABL_DEL_TO_LINE_END,    // delete from cursor to end of line
 | 
						|
    BABL_DEL_TO_LINE_START,  // delete from cursor to begining line
 | 
						|
    BABL_MODE,               // print out string saying what mode we're in.
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_OSKEYS
 | 
						|
    BABL_UNDO,
 | 
						|
    BABL_REDO,
 | 
						|
    BABL_CUT,
 | 
						|
    BABL_COPY,
 | 
						|
    BABL_PASTE,
 | 
						|
    BABL_SELECT_ALL,
 | 
						|
    /* not yet implemented
 | 
						|
    BABL_SWAP_LAST2C, // swap last characters before the cursor
 | 
						|
    BABL_SWAP_LAST2W, // Swap the last two words before the cursor
 | 
						|
    */
 | 
						|
    // find & replace
 | 
						|
    BABL_FIND,
 | 
						|
    BABL_FIND_NEXT,
 | 
						|
    BABL_FIND_PREV,
 | 
						|
    BABL_FIND_REPLACE,
 | 
						|
    // GUI or app
 | 
						|
    BABL_RUNAPP,
 | 
						|
    BABL_SWITCH_APP_NEXT,
 | 
						|
    BABL_SWITCH_APP_LAST,  // previous
 | 
						|
    BABL_WINDOW_NEXT,
 | 
						|
    BABL_WINDOW_PREV,
 | 
						|
    BABL_WINDOW_NEW,
 | 
						|
    BABL_CLOSE_APP,
 | 
						|
    BABL_HELP,
 | 
						|
    BABL_LOCK,
 | 
						|
    BABL_SCREENCAPTURE,
 | 
						|
    BABL_SWITCH_KEYBOARD_LAYOUT,
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_BROWSER
 | 
						|
    BABL_BROWSER_NEW_TAB,
 | 
						|
    BABL_BROWSER_CLOSE_TAB,
 | 
						|
    BABL_BROWSER_REOPEN_LAST_TAB,
 | 
						|
    BABL_BROWSER_NEXT_TAB,
 | 
						|
    BABL_BROWSER_PREV_TAB,
 | 
						|
    BABL_BROWSER_URL_BAR,
 | 
						|
    BABL_BROWSER_FORWARD,
 | 
						|
    BABL_BROWSER_BACK,
 | 
						|
    BABL_BROWSER_FIND,
 | 
						|
    BABL_BROWSER_BOOKMARK,
 | 
						|
    BABL_BROWSER_DEV_TOOLS,  // hard one to remember
 | 
						|
    BABL_BROWSER_RELOAD,
 | 
						|
    BABL_BROWSER_FULLSCREEN,
 | 
						|
    BABL_BROWSER_ZOOM_IN,
 | 
						|
    BABL_BROWSER_ZOOM_OUT,
 | 
						|
    BABL_BROWSER_VIEWSRC,
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_APP
 | 
						|
    BABL_APP_SAVE,                // save file blurs app & os. Move?
 | 
						|
    BABL_APP_PASTE_VALUES,        // paste only values, or with some special formatting. ctrl shift v chrome, // Ctrl+Alt+V, excel
 | 
						|
                                  // App hotkeys will be flawed, since you may use different spreadsheets across OSes.
 | 
						|
#        ifdef BABL_APP_CELLS     // spreadsheets and tables
 | 
						|
    BABL_APP_CENTER_ALIGN,        // Center align contents of a cell in table or spreadsheet.
 | 
						|
    BABL_APP_CLEAR_FORMATTING,    //
 | 
						|
    BABL_APP_SCROLL_ACTIVE_CELL,  // scroll to active cell.
 | 
						|
    BABL_NEWLINE_IN_CELL,         // newline inside cell of table,
 | 
						|
    BABL_INSERT_COMMENT,          // insert comment
 | 
						|
    BABL_INSERT_COL_LEFT,         // insert columns to the left
 | 
						|
    BABL_INSERT_ROW,              // insert row
 | 
						|
    BABL_DELETE_ROW,              // delete row // excel ctrl minus // chrome ctrl alt minus
 | 
						|
    BABL_SELECT_COL,              // select column - ctrl space //same in both
 | 
						|
    BABL_SELECT_ROW,              // select row shift spaced // same in both.
 | 
						|
#        endif                    // BABL_APP_CELLS
 | 
						|
#        ifdef BABL_APP_EDITOR
 | 
						|
    BABL_APP_MULTI_SELECT, /* www.sublimetext.com/docs/2/multiple_selection_with_the_keyboard.html */
 | 
						|
    BABL_APP_SET_MARK, // set editor mark
 | 
						|
#        endif             // BABL_APP_EDITOR
 | 
						|
#        ifdef BABL_APP_WINDOWSPLITTING
 | 
						|
    // These aren't useful on most oses.
 | 
						|
    BABL_SPLIT_FRAME_VERT,
 | 
						|
    BABL_UNSPLIT_FRAME_VERT,
 | 
						|
    BABL_SPLIT_FRAME_HORIZONTAL,
 | 
						|
    BABL_UNSPLIT_FRAME_HORIZONTAL,
 | 
						|
    BABL_NEXT_FRAME,
 | 
						|
    BABL_PREV_FRAME,
 | 
						|
#        endif
 | 
						|
 | 
						|
#    endif
 | 
						|
 | 
						|
// Macros for mode switching
 | 
						|
#    ifdef BABL_WINDOWS
 | 
						|
    BABL_DO_WINDOWS,
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_MAC
 | 
						|
    BABL_DO_MAC,
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_LINUX
 | 
						|
    BABL_DO_LINUX,
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_EMACS
 | 
						|
    BABL_DO_EMACS,
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_NANO
 | 
						|
    BABL_DO_NANO,
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_KITTY
 | 
						|
    BABL_DO_KITTY,
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_VI
 | 
						|
    BABL_DO_VI,
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_READMUX
 | 
						|
    BABL_DO_READMUX,
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_CHROMEOS
 | 
						|
    BABL_DO_CHROMEOS,
 | 
						|
#    endif
 | 
						|
    BABBLE_END_RANGE
 | 
						|
};
 | 
						|
 | 
						|
// primary function.
 | 
						|
bool babblePaste(uint16_t keycode, bool is_pressed);
 | 
						|
 | 
						|
/****************************************************/
 | 
						|
/* All per-os includes and short mode switch macros*/
 | 
						|
#    ifdef BABL_WINDOWS
 | 
						|
#        define B_WIN BABL_DO_WINDOWS
 | 
						|
bool babblePaste_win(uint16_t keycode);
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_MAC
 | 
						|
#        define B_MAC BABL_DO_MAC
 | 
						|
bool babblePaste_mac(uint16_t keycode);
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_LINUX
 | 
						|
#        define B_LINUX BABL_DO_LINUX
 | 
						|
bool babblePaste_linux(uint16_t keycode);
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_EMACS
 | 
						|
#        define B_EMACS BABL_DO_EMACS
 | 
						|
bool babblePaste_emacs(uint16_t keycode);
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_NANO
 | 
						|
#        define B_NANO BABL_DO_NANO
 | 
						|
bool babblePaste_nano(uint16_t keycode);
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_KITTY
 | 
						|
#        define B_KITTY BABL_DO_KITTY
 | 
						|
bool babblePaste_kitty(uint16_t keycode);
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_VI
 | 
						|
#        define B_VI BABL_DO_VI
 | 
						|
bool babblePaste_vi(uint16_t keycode);
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_READMUX
 | 
						|
#        define B_READ BABL_DO_READMUX
 | 
						|
bool babblePaste_readmux(uint16_t keycode);
 | 
						|
#    endif
 | 
						|
#    ifdef BABL_CHROMEOS
 | 
						|
#        define B_CROM BABL_DO_CHROMEOS
 | 
						|
bool babblePaste_chromeos(uint16_t keycode);
 | 
						|
#    endif
 | 
						|
 | 
						|
 | 
						|
/****************************************************
 | 
						|
**    All keyboard macros for Babble Actions
 | 
						|
*****************************************************/
 | 
						|
#       define B_INC BABL_MODE_INCREMENT
 | 
						|
#       define B_DEC BABL_MODE_DECREMENT
 | 
						|
#   ifdef BABL_MODSWAP
 | 
						|
#       define B_1ME BABL_PRIMARY_OS_MOD 
 | 
						|
#       define B_2ME BABL_SECONDARY_OS_MOD
 | 
						|
#       define B_3ME BABL_TERTIARY_OS_MOD
 | 
						|
#   endif
 | 
						|
 | 
						|
#    ifdef BABL_MOVE
 | 
						|
#        define B_L1C BABL_GO_LEFT_1C
 | 
						|
#        define B_R1C BABL_GO_RIGHT_1C
 | 
						|
#        define B_L1W BABL_GO_LEFT_WORD
 | 
						|
#        define B_R1W BABL_GO_RIGHT_WORD
 | 
						|
#        define B_GSOL BABL_GO_START_LINE
 | 
						|
#        define B_GEOL BABL_GO_END_LINE
 | 
						|
#        define B_GTOP BABL_GO_START_DOC
 | 
						|
#        define B_GEND BABL_GO_END_DOC
 | 
						|
#        define B_DOWN BABL_GO_NEXT_LINE
 | 
						|
#        define B_UP BABL_GO_PREV_LINE
 | 
						|
#        define B_PTOP BABL_GO_PARA_START
 | 
						|
#        define B_PEND BABL_GO_PARA_END
 | 
						|
#        define B_PGDN BABL_PGDN
 | 
						|
#        define B_PGUP BABL_PGUP
 | 
						|
//#define B_BKSP  BABL_DEL_LEFT_1C == backspace so why bother.
 | 
						|
#        define B_DEL BABL_DEL_RIGHT_1C  // usually = Del
 | 
						|
#        define B_DLW BABL_DEL_LEFT_WORD
 | 
						|
#        define B_DRW BABL_DEL_RIGHT_WORD
 | 
						|
#        define B_DEOL BABL_DEL_TO_LINE_END    // delete from cursor to end of line
 | 
						|
#        define B_DSOL BABL_DEL_TO_LINE_START  // delete from cursor to begining line
 | 
						|
#        define B_MODE BABL_MODE               // type out name of current mode.
 | 
						|
#    endif
 | 
						|
 | 
						|
#    ifdef BABL_OSKEYS
 | 
						|
#        define B_UNDO BABL_UNDO
 | 
						|
#        define B_REDO BABL_REDO
 | 
						|
#        define B_CUT BABL_CUT
 | 
						|
#        define B_COPY BABL_COPY
 | 
						|
#        define B_PASTE BABL_PASTE
 | 
						|
#        define B_SELALL BABL_SELECT_ALL
 | 
						|
#        define B_SELA BABL_SELECT_ALL
 | 
						|
#        define B_FIND BABL_FIND
 | 
						|
#        define B_FINDN BABL_FIND_NEXT
 | 
						|
#        define B_FINDP BABL_FIND_PREV
 | 
						|
#        define B_RPLACE BABL_FIND_REPLACE
 | 
						|
#        define B_RUNAPP BABL_RUNAPP
 | 
						|
#        define B_NAPP BABL_SWITCH_APP_NEXT
 | 
						|
#        define B_PAPP BABL_SWITCH_APP_LAST  // previous
 | 
						|
#        define B_NWIN BABL_WINDOW_NEXT
 | 
						|
#        define B_PWIN BABL_WINDOW_PREV
 | 
						|
#        define B_WINN BABL_WINDOW_NEW
 | 
						|
#        define B_CAPP BABL_CLOSE_APP
 | 
						|
#        define B_HELP BABL_HELP
 | 
						|
#        define B_LOCK BABL_LOCK
 | 
						|
#        define B_SCAP BABL_SCREENCAPTURE
 | 
						|
#        define B_KEYB BABL_SWITCH_KEYBOARD_LAYOUT
 | 
						|
#    endif
 | 
						|
 | 
						|
#    ifdef BABL_BROWSER
 | 
						|
#        define B_NTAB BABL_BROWSER_NEW_TAB
 | 
						|
#        define B_CTAB BABL_BROWSER_CLOSE_TAB
 | 
						|
#        define B_ROTB BABL_BROWSER_REOPEN_LAST_TAB
 | 
						|
#        define B_NXTB BABL_BROWSER_NEXT_TAB
 | 
						|
#        define B_PTAB BABL_BROWSER_PREV_TAB
 | 
						|
#        define B_NURL BABL_BROWSER_URL_BAR
 | 
						|
#        define B_BFWD BABL_BROWSER_FORWARD
 | 
						|
#        define B_BBAK BABL_BROWSER_BACK
 | 
						|
#        define B_BFND BABL_BROWSER_FIND
 | 
						|
#        define B_BOOK BABL_BROWSER_BOOKMARK
 | 
						|
#        define B_BDEV BABL_BROWSER_DEV_TOOLS  // hard one to remember
 | 
						|
#        define B_BRLD BABL_BROWSER_RELOAD
 | 
						|
#        define B_BFULL BABL_BROWSER_FULLSCREEN
 | 
						|
#        define B_ZIN BABL_BROWSER_ZOOM_IN
 | 
						|
#        define B_ZOUT BABL_BROWSER_ZOOM_OUT
 | 
						|
#    endif
 | 
						|
 | 
						|
#    ifdef BABL_APP
 | 
						|
#        define B_SAVE BABL_APP_SAVE
 | 
						|
#        ifdef BABL_APP_CELLS  // spreadsheets and tables
 | 
						|
#            define B_PASTV BABL_APP_PASTE_VALUES
 | 
						|
#            define B_CALN BABL_APP_CENTER_ALIGN
 | 
						|
#            define B_CFMT BABL_APP_CLEAR_FORMATTING
 | 
						|
#            define B_SCLA BABL_APP_SCROLL_ACTIVE_CELL
 | 
						|
#            define B_NCEL BABL_NEWLINE_IN_CELL
 | 
						|
#            define B_IPRW BABL_INSERT_ROW_ABOVE
 | 
						|
#            define B_ICOL BABL_INSERT_COL_LEFT
 | 
						|
#            define B_IROW BABL_INSERT_ROW
 | 
						|
#            define B_DROW BABL_DELETE_ROW
 | 
						|
#            define B_SELC BABL_SELECT_COL
 | 
						|
#            define B_SELR BABL_SELECT_ROW
 | 
						|
#        endif  // BABL_APP_CELLS
 | 
						|
#        ifdef BABL_APP_EDITOR
 | 
						|
#            define B_MSEL BABL_APP_MULTI_SELECT
 | 
						|
#            define B_MARK BABL_APP_SET_MARK
 | 
						|
/* www.sublimetext.com/docs/2/multiple_selection_with_the_keyboard.html */
 | 
						|
#        endif  // BABL_APP_EDITOR
 | 
						|
#        ifdef BABL_APP_WINDOWSPLITTING
 | 
						|
#            define B_VSPLIT BABL_SPLIT_FRAME_VERT
 | 
						|
#            define B_VUNSPT BABL_UNSPLIT_FRAME_VERT
 | 
						|
#            define B_HSPLIT BABL_SPLIT_FRAME_HORIZONTAL
 | 
						|
#            define B_HUNSPT BABL_UNSPLIT_FRAME_HORIZONTAL
 | 
						|
#            define B_NXTFM BABL_NEXT_FRAME
 | 
						|
#            define B_PRVFM BABL_PREV_FRAME
 | 
						|
#        endif  // BABL_APP_WINDOWSPLITTING
 | 
						|
#    endif      // BABL_APP
 | 
						|
 | 
						|
#endif
 |