2019-03-08 19:25:23 +01:00
/* See LICENSE file for copyright and license details. */
/*
* appearance
*
* font : see http : //freedesktop.org/software/fontconfig/fontconfig-user.html
*/
2021-04-15 18:13:10 +02:00
static char * font = " Hack Nerd Font Mono:size=16:antialias=true:hintstyle=1:rgba=rgb:autohint=false:lcdfilter=lcddefault:dpi=96 " ;
2019-03-08 19:25:23 +01:00
static int borderpx = 2 ;
/*
* What program is execed by st depends of these precedence rules :
* 1 : program passed with - e
* 2 : utmp option
* 3 : SHELL environment variable
* 4 : value of shell in / etc / passwd
* 5 : value of shell in config . h
*/
static char * shell = " /bin/zsh " ;
char * utmp = NULL ;
char * stty_args = " stty raw pass8 nl -echo -iexten -cstopb 38400 " ;
/* identification sequence returned in DA and DECID */
char * vtiden = " \033 [?6c " ;
/* Kerning / character bounding-box multipliers */
2021-04-15 18:13:10 +02:00
static float cwscale = 1.0 ;
static float chscale = 1.0 ;
2019-03-08 19:25:23 +01:00
/*
* word delimiter string
*
2021-04-15 18:13:10 +02:00
* More advanced example : L " `' \" ()[]{} "
2019-03-08 19:25:23 +01:00
*/
2021-04-15 18:13:10 +02:00
wchar_t * worddelimiters = L " " ;
2019-03-08 19:25:23 +01:00
/* selection timeouts (in milliseconds) */
static unsigned int doubleclicktimeout = 300 ;
static unsigned int tripleclicktimeout = 600 ;
/* alt screens */
int allowaltscreen = 1 ;
/* frames per second st should at maximum draw to the screen */
static unsigned int xfps = 144 ;
static unsigned int actionfps = 60 ;
/*
* blinking timeout ( set to 0 to disable blinking ) for the terminal blinking
* attribute .
*/
static unsigned int blinktimeout = 800 ;
/*
* thickness of underline and bar cursors
*/
static unsigned int cursorthickness = 2 ;
/*
* bell volume . It must be a value between - 100 and 100. Use 0 for disabling
* it
*/
static int bellvolume = 0 ;
/* default TERM value */
char * termname = " st-256color " ;
/*
* spaces per tab
*
* When you are changing this value , don ' t forget to adapt the » it « value in
* the st . info and appropriately install the st . info in the environment where
* you use this st version .
*
* it # $ tabspaces ,
*
* Secondly make sure your kernel is not expanding tabs . When running ` stty
* - a ` » tab0 « should appear . You can tell the terminal to not expand tabs by
* running following command :
*
* stty tabs
*/
unsigned int tabspaces = 8 ;
/* Terminal colors (16 first used in escape sequence) */
static const char * colorname [ ] = {
2021-04-15 18:13:10 +02:00
/* 8 normal colors */
[ 0 ] = " #403e41 " , /* black */
[ 1 ] = " #ff6188 " , /* red */
[ 2 ] = " #a9dc76 " , /* green */
[ 3 ] = " #ffd866 " , /* yellow */
[ 4 ] = " #fc9867 " , /* blue */
[ 5 ] = " #ab9df2 " , /* magenta */
[ 6 ] = " #78dce8 " , /* cyan */
[ 7 ] = " #fcfcfa " , /* white */
/* 8 bright colors */
[ 8 ] = " #727072 " , /* black */
[ 9 ] = " #ff6188 " , /* red */
[ 10 ] = " #a9dc76 " , /* green */
[ 11 ] = " #ffd866 " , /* yellow */
[ 12 ] = " #fc9867 " , /* blue */
[ 13 ] = " #ab9df2 " , /* magenta */
[ 14 ] = " #78dce8 " , /* cyan */
[ 15 ] = " #fcfcfa " , /* white */
/* special colors */
[ 256 ] = " #303031 " , /* background */
[ 257 ] = " #fcfcfa " , /* foreground */
2019-03-08 19:25:23 +01:00
} ;
/*
* Default colors ( colorname index )
* foreground , background , cursor , reverse cursor
*/
2021-04-15 18:13:10 +02:00
unsigned int defaultfg = 257 ;
unsigned int defaultbg = 256 ;
unsigned int defaultcs = 257 ;
unsigned int defaultrcs = 257 ;
/*
* Colors used , when the specific fg = = defaultfg . So in reverse mode this
* will reverse too . Another logic would only make the simple feature too
* complex .
*/
static unsigned int defaultitalic = 7 ;
static unsigned int defaultunderline = 7 ;
// opacity
float alpha = 1 ;
2019-03-08 19:25:23 +01:00
/*
* Default shape of cursor
* 2 : Block ( " █ " )
* 4 : Underline ( " _ " )
* 6 : Bar ( " | " )
* 7 : Snowman ( " ☃ " )
*/
static unsigned int cursorshape = 6 ;
/*
* Default columns and rows numbers
*/
static unsigned int cols = 80 ;
static unsigned int rows = 24 ;
/*
* Default colour and shape of the mouse cursor
*/
static unsigned int mouseshape = XC_left_ptr ;
static unsigned int mousefg = 7 ;
static unsigned int mousebg = 0 ;
/*
* Color used to display font attributes when fontconfig selected a font which
* doesn ' t match the ones requested .
*/
static unsigned int defaultattr = 11 ;
/*
* Internal mouse shortcuts .
* Beware that overloading Button1 will disable the selection .
*/
static MouseShortcut mshortcuts [ ] = {
/* button mask string */
2021-04-15 18:13:10 +02:00
{ Button4 , XK_NO_MOD , " \031 " } ,
{ Button5 , XK_NO_MOD , " \005 " } ,
2019-03-08 19:25:23 +01:00
} ;
/* Internal keyboard shortcuts. */
# define MODKEY Mod1Mask
2021-04-15 18:13:10 +02:00
# define TERMMOD (Mod1Mask|ShiftMask)
MouseKey mkeys [ ] = {
/* button mask function argument */
{ Button4 , ShiftMask , kscrollup , { . i = 1 } } ,
{ Button5 , ShiftMask , kscrolldown , { . i = 1 } } ,
{ Button4 , MODKEY , kscrollup , { . i = 1 } } ,
{ Button5 , MODKEY , kscrolldown , { . i = 1 } } ,
{ Button4 , TERMMOD , zoom , { . f = + 1 } } ,
{ Button5 , TERMMOD , zoom , { . f = - 1 } } ,
} ;
static char * openurlcmd [ ] = { " /bin/sh " , " -c " ,
" sed 's/.*│//g' | tr -d ' \n ' | grep -aEo '(((http|https)://|www \\ .)[a-zA-Z0-9.]*[:]?[a-zA-Z0-9./&%?=_-]*)|((magnet: \\ ?xt=urn:btih:)[a-zA-Z0-9]*)'| uniq | sed 's/^www./http: \\ / \\ /www \\ ./g' | dmenu -p 'Follow which url?' -l 10 | xargs -r xdg-open " ,
" externalpipe " , NULL } ;
static char * copyurlcmd [ ] = { " /bin/sh " , " -c " ,
" sed 's/.*│//g' | tr -d ' \n ' | grep -aEo '(((http|https)://|www \\ .)[a-zA-Z0-9.]*[:]?[a-zA-Z0-9./&%?=_-]*)|((magnet: \\ ?xt=urn:btih:)[a-zA-Z0-9]*)' | uniq | sed 's/^www./http: \\ / \\ /www \\ ./g' | dmenu -p 'Copy which url?' -l 10 | tr -d ' \n ' | xclip -selection clipboard " ,
" externalpipe " , NULL } ;
static char * copyoutput [ ] = { " /bin/sh " , " -c " , " st-copyout " , " externalpipe " , NULL } ;
2019-03-08 19:25:23 +01:00
static Shortcut shortcuts [ ] = {
/* mask keysym function argument */
{ XK_ANY_MOD , XK_Break , sendbreak , { . i = 0 } } ,
{ ControlMask , XK_Print , toggleprinter , { . i = 0 } } ,
{ ShiftMask , XK_Print , printscreen , { . i = 0 } } ,
{ XK_ANY_MOD , XK_Print , printsel , { . i = 0 } } ,
{ TERMMOD , XK_Prior , zoom , { . f = + 1 } } ,
{ TERMMOD , XK_Next , zoom , { . f = - 1 } } ,
2021-04-15 18:13:10 +02:00
{ MODKEY , XK_Home , zoomreset , { . f = 0 } } ,
{ ShiftMask , XK_Insert , clippaste , { . i = 0 } } ,
{ MODKEY , XK_c , clipcopy , { . i = 0 } } ,
{ MODKEY , XK_v , clippaste , { . i = 0 } } ,
{ MODKEY , XK_p , selpaste , { . i = 0 } } ,
{ MODKEY , XK_Num_Lock , numlock , { . i = 0 } } ,
{ MODKEY , XK_Control_L , iso14755 , { . i = 0 } } ,
{ ShiftMask , XK_Page_Up , kscrollup , { . i = - 1 } } ,
{ ShiftMask , XK_Page_Down , kscrolldown , { . i = - 1 } } ,
{ MODKEY , XK_Page_Up , kscrollup , { . i = - 1 } } ,
{ MODKEY , XK_Page_Down , kscrolldown , { . i = - 1 } } ,
{ MODKEY , XK_k , kscrollup , { . i = 1 } } ,
{ MODKEY , XK_j , kscrolldown , { . i = 1 } } ,
{ MODKEY , XK_Up , kscrollup , { . i = 1 } } ,
{ MODKEY , XK_Down , kscrolldown , { . i = 1 } } ,
{ MODKEY , XK_u , kscrollup , { . i = - 1 } } ,
{ MODKEY , XK_d , kscrolldown , { . i = - 1 } } ,
{ TERMMOD , XK_Up , zoom , { . f = + 1 } } ,
{ TERMMOD , XK_Down , zoom , { . f = - 1 } } ,
{ TERMMOD , XK_K , zoom , { . f = + 1 } } ,
{ TERMMOD , XK_J , zoom , { . f = - 1 } } ,
{ TERMMOD , XK_U , zoom , { . f = + 2 } } ,
{ TERMMOD , XK_D , zoom , { . f = - 2 } } ,
{ MODKEY , XK_l , externalpipe , { . v = openurlcmd } } ,
{ MODKEY , XK_y , externalpipe , { . v = copyurlcmd } } ,
{ MODKEY , XK_o , externalpipe , { . v = copyoutput } } ,
2019-03-08 19:25:23 +01:00
} ;
/*
* Special keys ( change & recompile st . info accordingly )
*
* Mask value :
* * Use XK_ANY_MOD to match the key no matter modifiers state
* * Use XK_NO_MOD to match the key alone ( no modifiers )
* appkey value :
* * 0 : no value
* * > 0 : keypad application mode enabled
* * = 2 : term . numlock = 1
* * < 0 : keypad application mode disabled
* appcursor value :
* * 0 : no value
* * > 0 : cursor application mode enabled
* * < 0 : cursor application mode disabled
* crlf value
* * 0 : no value
* * > 0 : crlf mode is enabled
* * < 0 : crlf mode is disabled
*
* Be careful with the order of the definitions because st searches in
* this table sequentially , so any XK_ANY_MOD must be in the last
* position for a key .
*/
/*
* If you want keys other than the X11 function keys ( 0xFD00 - 0xFFFF )
* to be mapped below , add them to this array .
*/
static KeySym mappedkeys [ ] = { - 1 } ;
/*
* State bits to ignore when matching key or button events . By default ,
* numlock ( Mod2Mask ) and keyboard layout ( XK_SWITCH_MOD ) are ignored .
*/
static uint ignoremod = Mod2Mask | XK_SWITCH_MOD ;
/*
* Override mouse - select while mask is active ( when MODE_MOUSE is set ) .
* Note that if you want to use ShiftMask with selmasks , set this to an other
* modifier , set to 0 to not use it .
*/
static uint forceselmod = ShiftMask ;
/*
* This is the huge key array which defines all compatibility to the Linux
* world . Please decide about changes wisely .
*/
static Key key [ ] = {
/* keysym mask string appkey appcursor */
{ XK_KP_Home , ShiftMask , " \033 [2J " , 0 , - 1 } ,
{ XK_KP_Home , ShiftMask , " \033 [1;2H " , 0 , + 1 } ,
{ XK_KP_Home , XK_ANY_MOD , " \033 [H " , 0 , - 1 } ,
{ XK_KP_Home , XK_ANY_MOD , " \033 [1~ " , 0 , + 1 } ,
{ XK_KP_Up , XK_ANY_MOD , " \033 Ox " , + 1 , 0 } ,
{ XK_KP_Up , XK_ANY_MOD , " \033 [A " , 0 , - 1 } ,
{ XK_KP_Up , XK_ANY_MOD , " \033 OA " , 0 , + 1 } ,
{ XK_KP_Down , XK_ANY_MOD , " \033 Or " , + 1 , 0 } ,
{ XK_KP_Down , XK_ANY_MOD , " \033 [B " , 0 , - 1 } ,
{ XK_KP_Down , XK_ANY_MOD , " \033 OB " , 0 , + 1 } ,
{ XK_KP_Left , XK_ANY_MOD , " \033 Ot " , + 1 , 0 } ,
{ XK_KP_Left , XK_ANY_MOD , " \033 [D " , 0 , - 1 } ,
{ XK_KP_Left , XK_ANY_MOD , " \033 OD " , 0 , + 1 } ,
{ XK_KP_Right , XK_ANY_MOD , " \033 Ov " , + 1 , 0 } ,
{ XK_KP_Right , XK_ANY_MOD , " \033 [C " , 0 , - 1 } ,
{ XK_KP_Right , XK_ANY_MOD , " \033 OC " , 0 , + 1 } ,
{ XK_KP_Prior , ShiftMask , " \033 [5;2~ " , 0 , 0 } ,
{ XK_KP_Prior , XK_ANY_MOD , " \033 [5~ " , 0 , 0 } ,
{ XK_KP_Begin , XK_ANY_MOD , " \033 [E " , 0 , 0 } ,
{ XK_KP_End , ControlMask , " \033 [J " , - 1 , 0 } ,
{ XK_KP_End , ControlMask , " \033 [1;5F " , + 1 , 0 } ,
{ XK_KP_End , ShiftMask , " \033 [K " , - 1 , 0 } ,
{ XK_KP_End , ShiftMask , " \033 [1;2F " , + 1 , 0 } ,
{ XK_KP_End , XK_ANY_MOD , " \033 [4~ " , 0 , 0 } ,
{ XK_KP_Next , ShiftMask , " \033 [6;2~ " , 0 , 0 } ,
{ XK_KP_Next , XK_ANY_MOD , " \033 [6~ " , 0 , 0 } ,
{ XK_KP_Insert , ShiftMask , " \033 [2;2~ " , + 1 , 0 } ,
{ XK_KP_Insert , ShiftMask , " \033 [4l " , - 1 , 0 } ,
{ XK_KP_Insert , ControlMask , " \033 [L " , - 1 , 0 } ,
{ XK_KP_Insert , ControlMask , " \033 [2;5~ " , + 1 , 0 } ,
{ XK_KP_Insert , XK_ANY_MOD , " \033 [4h " , - 1 , 0 } ,
{ XK_KP_Insert , XK_ANY_MOD , " \033 [2~ " , + 1 , 0 } ,
{ XK_KP_Delete , ControlMask , " \033 [M " , - 1 , 0 } ,
{ XK_KP_Delete , ControlMask , " \033 [3;5~ " , + 1 , 0 } ,
{ XK_KP_Delete , ShiftMask , " \033 [2K " , - 1 , 0 } ,
{ XK_KP_Delete , ShiftMask , " \033 [3;2~ " , + 1 , 0 } ,
{ XK_KP_Delete , XK_ANY_MOD , " \033 [P " , - 1 , 0 } ,
{ XK_KP_Delete , XK_ANY_MOD , " \033 [3~ " , + 1 , 0 } ,
{ XK_KP_Multiply , XK_ANY_MOD , " \033 Oj " , + 2 , 0 } ,
{ XK_KP_Add , XK_ANY_MOD , " \033 Ok " , + 2 , 0 } ,
{ XK_KP_Enter , XK_ANY_MOD , " \033 OM " , + 2 , 0 } ,
{ XK_KP_Enter , XK_ANY_MOD , " \r " , - 1 , 0 } ,
{ XK_KP_Subtract , XK_ANY_MOD , " \033 Om " , + 2 , 0 } ,
{ XK_KP_Decimal , XK_ANY_MOD , " \033 On " , + 2 , 0 } ,
{ XK_KP_Divide , XK_ANY_MOD , " \033 Oo " , + 2 , 0 } ,
{ XK_KP_0 , XK_ANY_MOD , " \033 Op " , + 2 , 0 } ,
{ XK_KP_1 , XK_ANY_MOD , " \033 Oq " , + 2 , 0 } ,
{ XK_KP_2 , XK_ANY_MOD , " \033 Or " , + 2 , 0 } ,
{ XK_KP_3 , XK_ANY_MOD , " \033 Os " , + 2 , 0 } ,
{ XK_KP_4 , XK_ANY_MOD , " \033 Ot " , + 2 , 0 } ,
{ XK_KP_5 , XK_ANY_MOD , " \033 Ou " , + 2 , 0 } ,
{ XK_KP_6 , XK_ANY_MOD , " \033 Ov " , + 2 , 0 } ,
{ XK_KP_7 , XK_ANY_MOD , " \033 Ow " , + 2 , 0 } ,
{ XK_KP_8 , XK_ANY_MOD , " \033 Ox " , + 2 , 0 } ,
{ XK_KP_9 , XK_ANY_MOD , " \033 Oy " , + 2 , 0 } ,
{ XK_Up , ShiftMask , " \033 [1;2A " , 0 , 0 } ,
{ XK_Up , Mod1Mask , " \033 [1;3A " , 0 , 0 } ,
{ XK_Up , ShiftMask | Mod1Mask , " \033 [1;4A " , 0 , 0 } ,
{ XK_Up , ControlMask , " \033 [1;5A " , 0 , 0 } ,
{ XK_Up , ShiftMask | ControlMask , " \033 [1;6A " , 0 , 0 } ,
{ XK_Up , ControlMask | Mod1Mask , " \033 [1;7A " , 0 , 0 } ,
{ XK_Up , ShiftMask | ControlMask | Mod1Mask , " \033 [1;8A " , 0 , 0 } ,
{ XK_Up , XK_ANY_MOD , " \033 [A " , 0 , - 1 } ,
{ XK_Up , XK_ANY_MOD , " \033 OA " , 0 , + 1 } ,
{ XK_Down , ShiftMask , " \033 [1;2B " , 0 , 0 } ,
{ XK_Down , Mod1Mask , " \033 [1;3B " , 0 , 0 } ,
{ XK_Down , ShiftMask | Mod1Mask , " \033 [1;4B " , 0 , 0 } ,
{ XK_Down , ControlMask , " \033 [1;5B " , 0 , 0 } ,
{ XK_Down , ShiftMask | ControlMask , " \033 [1;6B " , 0 , 0 } ,
{ XK_Down , ControlMask | Mod1Mask , " \033 [1;7B " , 0 , 0 } ,
{ XK_Down , ShiftMask | ControlMask | Mod1Mask , " \033 [1;8B " , 0 , 0 } ,
{ XK_Down , XK_ANY_MOD , " \033 [B " , 0 , - 1 } ,
{ XK_Down , XK_ANY_MOD , " \033 OB " , 0 , + 1 } ,
{ XK_Left , ShiftMask , " \033 [1;2D " , 0 , 0 } ,
{ XK_Left , Mod1Mask , " \033 [1;3D " , 0 , 0 } ,
{ XK_Left , ShiftMask | Mod1Mask , " \033 [1;4D " , 0 , 0 } ,
{ XK_Left , ControlMask , " \033 [1;5D " , 0 , 0 } ,
{ XK_Left , ShiftMask | ControlMask , " \033 [1;6D " , 0 , 0 } ,
{ XK_Left , ControlMask | Mod1Mask , " \033 [1;7D " , 0 , 0 } ,
{ XK_Left , ShiftMask | ControlMask | Mod1Mask , " \033 [1;8D " , 0 , 0 } ,
{ XK_Left , XK_ANY_MOD , " \033 [D " , 0 , - 1 } ,
{ XK_Left , XK_ANY_MOD , " \033 OD " , 0 , + 1 } ,
{ XK_Right , ShiftMask , " \033 [1;2C " , 0 , 0 } ,
{ XK_Right , Mod1Mask , " \033 [1;3C " , 0 , 0 } ,
{ XK_Right , ShiftMask | Mod1Mask , " \033 [1;4C " , 0 , 0 } ,
{ XK_Right , ControlMask , " \033 [1;5C " , 0 , 0 } ,
{ XK_Right , ShiftMask | ControlMask , " \033 [1;6C " , 0 , 0 } ,
{ XK_Right , ControlMask | Mod1Mask , " \033 [1;7C " , 0 , 0 } ,
{ XK_Right , ShiftMask | ControlMask | Mod1Mask , " \033 [1;8C " , 0 , 0 } ,
{ XK_Right , XK_ANY_MOD , " \033 [C " , 0 , - 1 } ,
{ XK_Right , XK_ANY_MOD , " \033 OC " , 0 , + 1 } ,
{ XK_ISO_Left_Tab , ShiftMask , " \033 [Z " , 0 , 0 } ,
{ XK_Return , Mod1Mask , " \033 \r " , 0 , 0 } ,
{ XK_Return , XK_ANY_MOD , " \r " , 0 , 0 } ,
{ XK_Insert , ShiftMask , " \033 [4l " , - 1 , 0 } ,
{ XK_Insert , ShiftMask , " \033 [2;2~ " , + 1 , 0 } ,
{ XK_Insert , ControlMask , " \033 [L " , - 1 , 0 } ,
{ XK_Insert , ControlMask , " \033 [2;5~ " , + 1 , 0 } ,
{ XK_Insert , XK_ANY_MOD , " \033 [4h " , - 1 , 0 } ,
{ XK_Insert , XK_ANY_MOD , " \033 [2~ " , + 1 , 0 } ,
{ XK_Delete , ControlMask , " \033 [M " , - 1 , 0 } ,
{ XK_Delete , ControlMask , " \033 [3;5~ " , + 1 , 0 } ,
{ XK_Delete , ShiftMask , " \033 [2K " , - 1 , 0 } ,
{ XK_Delete , ShiftMask , " \033 [3;2~ " , + 1 , 0 } ,
{ XK_Delete , XK_ANY_MOD , " \033 [P " , - 1 , 0 } ,
{ XK_Delete , XK_ANY_MOD , " \033 [3~ " , + 1 , 0 } ,
{ XK_BackSpace , XK_NO_MOD , " \177 " , 0 , 0 } ,
{ XK_BackSpace , Mod1Mask , " \033 \177 " , 0 , 0 } ,
{ XK_Home , ShiftMask , " \033 [2J " , 0 , - 1 } ,
{ XK_Home , ShiftMask , " \033 [1;2H " , 0 , + 1 } ,
{ XK_Home , XK_ANY_MOD , " \033 [H " , 0 , - 1 } ,
{ XK_Home , XK_ANY_MOD , " \033 [1~ " , 0 , + 1 } ,
{ XK_End , ControlMask , " \033 [J " , - 1 , 0 } ,
{ XK_End , ControlMask , " \033 [1;5F " , + 1 , 0 } ,
{ XK_End , ShiftMask , " \033 [K " , - 1 , 0 } ,
{ XK_End , ShiftMask , " \033 [1;2F " , + 1 , 0 } ,
{ XK_End , XK_ANY_MOD , " \033 [4~ " , 0 , 0 } ,
{ XK_Prior , ControlMask , " \033 [5;5~ " , 0 , 0 } ,
{ XK_Prior , ShiftMask , " \033 [5;2~ " , 0 , 0 } ,
{ XK_Prior , XK_ANY_MOD , " \033 [5~ " , 0 , 0 } ,
{ XK_Next , ControlMask , " \033 [6;5~ " , 0 , 0 } ,
{ XK_Next , ShiftMask , " \033 [6;2~ " , 0 , 0 } ,
{ XK_Next , XK_ANY_MOD , " \033 [6~ " , 0 , 0 } ,
{ XK_F1 , XK_NO_MOD , " \033 OP " , 0 , 0 } ,
{ XK_F1 , /* F13 */ ShiftMask , " \033 [1;2P " , 0 , 0 } ,
{ XK_F1 , /* F25 */ ControlMask , " \033 [1;5P " , 0 , 0 } ,
{ XK_F1 , /* F37 */ Mod4Mask , " \033 [1;6P " , 0 , 0 } ,
{ XK_F1 , /* F49 */ Mod1Mask , " \033 [1;3P " , 0 , 0 } ,
{ XK_F1 , /* F61 */ Mod3Mask , " \033 [1;4P " , 0 , 0 } ,
{ XK_F2 , XK_NO_MOD , " \033 OQ " , 0 , 0 } ,
{ XK_F2 , /* F14 */ ShiftMask , " \033 [1;2Q " , 0 , 0 } ,
{ XK_F2 , /* F26 */ ControlMask , " \033 [1;5Q " , 0 , 0 } ,
{ XK_F2 , /* F38 */ Mod4Mask , " \033 [1;6Q " , 0 , 0 } ,
{ XK_F2 , /* F50 */ Mod1Mask , " \033 [1;3Q " , 0 , 0 } ,
{ XK_F2 , /* F62 */ Mod3Mask , " \033 [1;4Q " , 0 , 0 } ,
{ XK_F3 , XK_NO_MOD , " \033 OR " , 0 , 0 } ,
{ XK_F3 , /* F15 */ ShiftMask , " \033 [1;2R " , 0 , 0 } ,
{ XK_F3 , /* F27 */ ControlMask , " \033 [1;5R " , 0 , 0 } ,
{ XK_F3 , /* F39 */ Mod4Mask , " \033 [1;6R " , 0 , 0 } ,
{ XK_F3 , /* F51 */ Mod1Mask , " \033 [1;3R " , 0 , 0 } ,
{ XK_F3 , /* F63 */ Mod3Mask , " \033 [1;4R " , 0 , 0 } ,
{ XK_F4 , XK_NO_MOD , " \033 OS " , 0 , 0 } ,
{ XK_F4 , /* F16 */ ShiftMask , " \033 [1;2S " , 0 , 0 } ,
{ XK_F4 , /* F28 */ ControlMask , " \033 [1;5S " , 0 , 0 } ,
{ XK_F4 , /* F40 */ Mod4Mask , " \033 [1;6S " , 0 , 0 } ,
{ XK_F4 , /* F52 */ Mod1Mask , " \033 [1;3S " , 0 , 0 } ,
{ XK_F5 , XK_NO_MOD , " \033 [15~ " , 0 , 0 } ,
{ XK_F5 , /* F17 */ ShiftMask , " \033 [15;2~ " , 0 , 0 } ,
{ XK_F5 , /* F29 */ ControlMask , " \033 [15;5~ " , 0 , 0 } ,
{ XK_F5 , /* F41 */ Mod4Mask , " \033 [15;6~ " , 0 , 0 } ,
{ XK_F5 , /* F53 */ Mod1Mask , " \033 [15;3~ " , 0 , 0 } ,
{ XK_F6 , XK_NO_MOD , " \033 [17~ " , 0 , 0 } ,
{ XK_F6 , /* F18 */ ShiftMask , " \033 [17;2~ " , 0 , 0 } ,
{ XK_F6 , /* F30 */ ControlMask , " \033 [17;5~ " , 0 , 0 } ,
{ XK_F6 , /* F42 */ Mod4Mask , " \033 [17;6~ " , 0 , 0 } ,
{ XK_F6 , /* F54 */ Mod1Mask , " \033 [17;3~ " , 0 , 0 } ,
{ XK_F7 , XK_NO_MOD , " \033 [18~ " , 0 , 0 } ,
{ XK_F7 , /* F19 */ ShiftMask , " \033 [18;2~ " , 0 , 0 } ,
{ XK_F7 , /* F31 */ ControlMask , " \033 [18;5~ " , 0 , 0 } ,
{ XK_F7 , /* F43 */ Mod4Mask , " \033 [18;6~ " , 0 , 0 } ,
{ XK_F7 , /* F55 */ Mod1Mask , " \033 [18;3~ " , 0 , 0 } ,
{ XK_F8 , XK_NO_MOD , " \033 [19~ " , 0 , 0 } ,
{ XK_F8 , /* F20 */ ShiftMask , " \033 [19;2~ " , 0 , 0 } ,
{ XK_F8 , /* F32 */ ControlMask , " \033 [19;5~ " , 0 , 0 } ,
{ XK_F8 , /* F44 */ Mod4Mask , " \033 [19;6~ " , 0 , 0 } ,
{ XK_F8 , /* F56 */ Mod1Mask , " \033 [19;3~ " , 0 , 0 } ,
{ XK_F9 , XK_NO_MOD , " \033 [20~ " , 0 , 0 } ,
{ XK_F9 , /* F21 */ ShiftMask , " \033 [20;2~ " , 0 , 0 } ,
{ XK_F9 , /* F33 */ ControlMask , " \033 [20;5~ " , 0 , 0 } ,
{ XK_F9 , /* F45 */ Mod4Mask , " \033 [20;6~ " , 0 , 0 } ,
{ XK_F9 , /* F57 */ Mod1Mask , " \033 [20;3~ " , 0 , 0 } ,
{ XK_F10 , XK_NO_MOD , " \033 [21~ " , 0 , 0 } ,
{ XK_F10 , /* F22 */ ShiftMask , " \033 [21;2~ " , 0 , 0 } ,
{ XK_F10 , /* F34 */ ControlMask , " \033 [21;5~ " , 0 , 0 } ,
{ XK_F10 , /* F46 */ Mod4Mask , " \033 [21;6~ " , 0 , 0 } ,
{ XK_F10 , /* F58 */ Mod1Mask , " \033 [21;3~ " , 0 , 0 } ,
{ XK_F11 , XK_NO_MOD , " \033 [23~ " , 0 , 0 } ,
{ XK_F11 , /* F23 */ ShiftMask , " \033 [23;2~ " , 0 , 0 } ,
{ XK_F11 , /* F35 */ ControlMask , " \033 [23;5~ " , 0 , 0 } ,
{ XK_F11 , /* F47 */ Mod4Mask , " \033 [23;6~ " , 0 , 0 } ,
{ XK_F11 , /* F59 */ Mod1Mask , " \033 [23;3~ " , 0 , 0 } ,
{ XK_F12 , XK_NO_MOD , " \033 [24~ " , 0 , 0 } ,
{ XK_F12 , /* F24 */ ShiftMask , " \033 [24;2~ " , 0 , 0 } ,
{ XK_F12 , /* F36 */ ControlMask , " \033 [24;5~ " , 0 , 0 } ,
{ XK_F12 , /* F48 */ Mod4Mask , " \033 [24;6~ " , 0 , 0 } ,
{ XK_F12 , /* F60 */ Mod1Mask , " \033 [24;3~ " , 0 , 0 } ,
{ XK_F13 , XK_NO_MOD , " \033 [1;2P " , 0 , 0 } ,
{ XK_F14 , XK_NO_MOD , " \033 [1;2Q " , 0 , 0 } ,
{ XK_F15 , XK_NO_MOD , " \033 [1;2R " , 0 , 0 } ,
{ XK_F16 , XK_NO_MOD , " \033 [1;2S " , 0 , 0 } ,
{ XK_F17 , XK_NO_MOD , " \033 [15;2~ " , 0 , 0 } ,
{ XK_F18 , XK_NO_MOD , " \033 [17;2~ " , 0 , 0 } ,
{ XK_F19 , XK_NO_MOD , " \033 [18;2~ " , 0 , 0 } ,
{ XK_F20 , XK_NO_MOD , " \033 [19;2~ " , 0 , 0 } ,
{ XK_F21 , XK_NO_MOD , " \033 [20;2~ " , 0 , 0 } ,
{ XK_F22 , XK_NO_MOD , " \033 [21;2~ " , 0 , 0 } ,
{ XK_F23 , XK_NO_MOD , " \033 [23;2~ " , 0 , 0 } ,
{ XK_F24 , XK_NO_MOD , " \033 [24;2~ " , 0 , 0 } ,
{ XK_F25 , XK_NO_MOD , " \033 [1;5P " , 0 , 0 } ,
{ XK_F26 , XK_NO_MOD , " \033 [1;5Q " , 0 , 0 } ,
{ XK_F27 , XK_NO_MOD , " \033 [1;5R " , 0 , 0 } ,
{ XK_F28 , XK_NO_MOD , " \033 [1;5S " , 0 , 0 } ,
{ XK_F29 , XK_NO_MOD , " \033 [15;5~ " , 0 , 0 } ,
{ XK_F30 , XK_NO_MOD , " \033 [17;5~ " , 0 , 0 } ,
{ XK_F31 , XK_NO_MOD , " \033 [18;5~ " , 0 , 0 } ,
{ XK_F32 , XK_NO_MOD , " \033 [19;5~ " , 0 , 0 } ,
{ XK_F33 , XK_NO_MOD , " \033 [20;5~ " , 0 , 0 } ,
{ XK_F34 , XK_NO_MOD , " \033 [21;5~ " , 0 , 0 } ,
{ XK_F35 , XK_NO_MOD , " \033 [23;5~ " , 0 , 0 } ,
} ;
/*
* Selection types ' masks .
* Use the same masks as usual .
* Button1Mask is always unset , to make masks match between ButtonPress .
* ButtonRelease and MotionNotify .
* If no match is found , regular selection is used .
*/
static uint selmasks [ ] = {
[ SEL_RECTANGULAR ] = Mod1Mask ,
} ;
/*
* Printable characters in ASCII , used to estimate the advance width
* of single wide characters .
*/
static char ascii_printable [ ] =
" ! \" #$%&'()*+,-./0123456789:;<=>? "
" @ABCDEFGHIJKLMNOPQRSTUVWXYZ[ \\ ]^_ "
" `abcdefghijklmnopqrstuvwxyz{|}~ " ;