mirror of
https://github.com/Keychron/qmk_firmware.git
synced 2024-12-25 10:44:59 +06:00
7b7689d307
Co-authored-by: Drashna Jaelre <drashna@live.com>
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
|