st

git clone git://mattcarlson.org/repos/st.git
Log | Files | Refs

config.h (21815B)


      1 // st
      2 
      3 // fonts
      4 static char *font    = "monospace:pixelsize=16:antialias=true:autohint=true";
      5 static char *font2[] = { "Noto Color Emoji:style=Regular:size=16" };
      6 
      7 // padding basically
      8 static int borderpx = 2;
      9 
     10 // shell used
     11 static char *shell = "/bin/sh";
     12 
     13 // find info about user
     14 char *utmp = NULL;
     15 
     16 // scroll program
     17 char *scroll = NULL;
     18 
     19 // stty args
     20 char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400";
     21 
     22 // identification sequence returned in da and decid
     23 char *vtiden = "\033[?6c";
     24 
     25 // kerning / character bounding-box multipliers
     26 static float cwscale = 1.0;
     27 static float chscale = 1.0;
     28 
     29 // word delimiter string
     30 wchar_t *worddelimiters = L" ";
     31 
     32 // selection timeouts (in ms)
     33 static unsigned int doubleclicktimeout = 300;
     34 static unsigned int tripleclicktimeout = 600;
     35 
     36 // alt screens
     37 int allowaltscreen = 1;
     38 
     39 //  allow certain non-interactive (insecure) window operations such as setting clipboard text
     40 int allowwindowops = 0;
     41 
     42 // draw latency range in ms
     43 static double minlatency = 8;
     44 static double maxlatency = 33;
     45 
     46 // blinking timeout for terminal blinking
     47 static unsigned int blinktimeout = 800;
     48 
     49 // thickness of underline and bar cursors
     50 static unsigned int cursorthickness = 2;
     51 
     52 // boxdraw
     53 int boxdraw      = 1;
     54 int boxdraw_bold = 1;
     55 
     56 // braille
     57 int boxdraw_braille = 1;
     58 
     59 // bell volume
     60 static int bellvolume = 0;
     61 
     62 // default term value
     63 char *termname = "st-256color";
     64 
     65 // spaces per tab
     66 unsigned int tabspaces = 8;
     67 
     68 // bg opacity
     69 float alpha = 0.8, alphaUnfocused = 0.6;
     70 
     71 // terminal colors
     72 static const char *colorname[] = {
     73 	// 8 normal colors
     74 	"black",
     75 	"red3",
     76 	"green3",
     77 	"yellow3",
     78 	"blue2",
     79 	"magenta3",
     80 	"cyan3",
     81 	"gray90",
     82 
     83 	// 8 bright colors
     84 	"gray50",
     85 	"red",
     86 	"green",
     87 	"yellow",
     88 	"#5c5cff",
     89 	"magenta",
     90 	"cyan",
     91 	"white",
     92 
     93 	[255] = 0,
     94 
     95 	// more colors can be added after 255 to use with defaultxx
     96 	"#cccccc",
     97 	"#555555",
     98 	"black",
     99 };
    100 
    101 
    102 // default colors
    103 unsigned int defaultfg             = 15;
    104 unsigned int defaultbg             = 258;
    105 static unsigned int defaultcs      = 256;
    106 static unsigned int defaultrcs     = 257;
    107 unsigned int bg = 258, bgUnfocused = 258;
    108 
    109 /* default style of cursor
    110  * 0: blinking block
    111  * 1: blinking block (default)
    112  * 2: steady block
    113  * 3: blinking underline
    114  * 4: steady underline
    115  * 5: blinking bar
    116  * 6: steady bar ("|")
    117  * 7: blinking st cursor
    118  * 8: steady st cursor
    119  */
    120 static unsigned int cursorstyle = 1;
    121 static Rune stcursor            = 0x2603;
    122 
    123 // Default columns and rows numbers
    124 static unsigned int cols = 80;
    125 static unsigned int rows = 24;
    126 
    127 // Default colour and shape of mouse cursor
    128 static unsigned int mouseshape = XC_xterm;
    129 static unsigned int mousefg    = 7;
    130 static unsigned int mousebg    = 0;
    131 
    132 // color used to display font attributes when fontconfig selected font which doesn't match ones requested
    133 static unsigned int defaultattr = 11;
    134 
    135 // force mouse select/shortcuts while mask is active (when mode_mouse is set)
    136 static uint forcemousemod = ShiftMask;
    137 
    138 // internal mouse shortcuts
    139 const unsigned int mousescrollincrement = 1;
    140 static MouseShortcut mshortcuts[] = {
    141 	// mask       button   function     argument                      release
    142 	{ XK_ANY_MOD, Button4, kscrollup,   { .i = mousescrollincrement }, 0, /* !alt */ -1 },
    143 	{ XK_ANY_MOD, Button5, kscrolldown, { .i = mousescrollincrement }, 0, /* !alt */ -1 },
    144 	{ XK_ANY_MOD, Button2, selpaste,    { .i = 0 }, 1               },
    145 	{ ShiftMask,  Button4, ttysend,     { .s = "\033[5;2~" }        },
    146 	{ XK_ANY_MOD, Button4, ttysend,     { .s = "\031" }             },
    147 	{ ShiftMask,  Button5, ttysend,     { .s = "\033[6;2~" }        },
    148 	{ XK_ANY_MOD, Button5, ttysend,     { .s = "\005" }             },
    149 };
    150 
    151 // mod key
    152 #define MODKEY Mod1Mask
    153 
    154 // termmod
    155 #define TERMMOD (ControlMask|ShiftMask)
    156 
    157 // shortcuts
    158 static Shortcut shortcuts[] = {
    159    // mask         keysym        function       argument
    160 	{ XK_ANY_MOD,  XK_Break,     sendbreak,     { .i =  0 } },
    161 	{ ControlMask, XK_Print,     toggleprinter, { .i =  0 } },
    162 	{ ShiftMask,   XK_Print,     printscreen,   { .i =  0 } },
    163 	{ XK_ANY_MOD,  XK_Print,     printsel,      { .i =  0 } },
    164 	{ TERMMOD,     XK_Prior,     zoom,          { .f = +1 } },
    165 	{ TERMMOD,     XK_Next,      zoom,          { .f = -1 } },
    166 	{ TERMMOD,     XK_Home,      zoomreset,     { .f =  0 } },
    167 	{ TERMMOD,     XK_C,         clipcopy,      { .i =  0 } },
    168 	{ TERMMOD,     XK_V,         clippaste,     { .i =  0 } },
    169 	{ TERMMOD,     XK_Y,         selpaste,      { .i =  0 } },
    170 	{ ShiftMask,   XK_Insert,    selpaste,      { .i =  0 } },
    171 	{ TERMMOD,     XK_Num_Lock,  numlock,       { .i =  0 } },
    172 	{ ShiftMask,   XK_Page_Up,   kscrollup,     { .i = -1 } },
    173 	{ ShiftMask,   XK_Page_Down, kscrolldown,   { .i = -1 } },
    174 };
    175 
    176 // special keys
    177 static KeySym mappedkeys[] = { -1 };
    178 
    179 // state bits to ignore when matching key or button events
    180 static uint ignoremod = Mod2Mask|XK_SWITCH_MOD;
    181 
    182 // this is the huge key array which defines all compatibility to the linux world
    183 static Key key[] = {
    184    // keysym            mask                            string        appkey appcursor
    185 	{ XK_KP_Home,       ShiftMask,                      "\033[2J",     0,    -1},
    186 	{ XK_KP_Home,       ShiftMask,                      "\033[1;2H",   0,    +1},
    187 	{ XK_KP_Home,       XK_ANY_MOD,                     "\033[H",      0,    -1},
    188 	{ XK_KP_Home,       XK_ANY_MOD,                     "\033[1~",     0,    +1},
    189 	{ XK_KP_Up,         XK_ANY_MOD,                     "\033Ox",     +1,     0},
    190 	{ XK_KP_Up,         XK_ANY_MOD,                     "\033[A",      0,    -1},
    191 	{ XK_KP_Up,         XK_ANY_MOD,                     "\033OA",      0,    +1},
    192 	{ XK_KP_Down,       XK_ANY_MOD,                     "\033Or",     +1,     0},
    193 	{ XK_KP_Down,       XK_ANY_MOD,                     "\033[B",      0,    -1},
    194 	{ XK_KP_Down,       XK_ANY_MOD,                     "\033OB",      0,    +1},
    195 	{ XK_KP_Left,       XK_ANY_MOD,                     "\033Ot",     +1,     0},
    196 	{ XK_KP_Left,       XK_ANY_MOD,                     "\033[D",      0,    -1},
    197 	{ XK_KP_Left,       XK_ANY_MOD,                     "\033OD",      0,    +1},
    198 	{ XK_KP_Right,      XK_ANY_MOD,                     "\033Ov",     +1,     0},
    199 	{ XK_KP_Right,      XK_ANY_MOD,                     "\033[C",      0,    -1},
    200 	{ XK_KP_Right,      XK_ANY_MOD,                     "\033OC",      0,    +1},
    201 	{ XK_KP_Prior,      ShiftMask,                      "\033[5;2~",   0,     0},
    202 	{ XK_KP_Prior,      XK_ANY_MOD,                     "\033[5~",     0,     0},
    203 	{ XK_KP_Begin,      XK_ANY_MOD,                     "\033[E",      0,     0},
    204 	{ XK_KP_End,        ControlMask,                    "\033[J",     -1,     0},
    205 	{ XK_KP_End,        ControlMask,                    "\033[1;5F",  +1,     0},
    206 	{ XK_KP_End,        ShiftMask,                      "\033[K",     -1,     0},
    207 	{ XK_KP_End,        ShiftMask,                      "\033[1;2F",  +1,     0},
    208 	{ XK_KP_End,        XK_ANY_MOD,                     "\033[4~",     0,     0},
    209 	{ XK_KP_Next,       ShiftMask,                      "\033[6;2~",   0,     0},
    210 	{ XK_KP_Next,       XK_ANY_MOD,                     "\033[6~",     0,     0},
    211 	{ XK_KP_Insert,     ShiftMask,                      "\033[2;2~",  +1,     0},
    212 	{ XK_KP_Insert,     ShiftMask,                      "\033[4l",    -1,     0},
    213 	{ XK_KP_Insert,     ControlMask,                    "\033[L",     -1,     0},
    214 	{ XK_KP_Insert,     ControlMask,                    "\033[2;5~",  +1,     0},
    215 	{ XK_KP_Insert,     XK_ANY_MOD,                     "\033[4h",    -1,     0},
    216 	{ XK_KP_Insert,     XK_ANY_MOD,                     "\033[2~",    +1,     0},
    217 	{ XK_KP_Delete,     ControlMask,                    "\033[M",     -1,     0},
    218 	{ XK_KP_Delete,     ControlMask,                    "\033[3;5~",  +1,     0},
    219 	{ XK_KP_Delete,     ShiftMask,                      "\033[2K",    -1,     0},
    220 	{ XK_KP_Delete,     ShiftMask,                      "\033[3;2~",  +1,     0},
    221 	{ XK_KP_Delete,     XK_ANY_MOD,                     "\033[P",     -1,     0},
    222 	{ XK_KP_Delete,     XK_ANY_MOD,                     "\033[3~",    +1,     0},
    223 	{ XK_KP_Multiply,   XK_ANY_MOD,                     "\033Oj",     +2,     0},
    224 	{ XK_KP_Add,        XK_ANY_MOD,                     "\033Ok",     +2,     0},
    225 	{ XK_KP_Enter,      XK_ANY_MOD,                     "\033OM",     +2,     0},
    226 	{ XK_KP_Enter,      XK_ANY_MOD,                     "\r",         -1,     0},
    227 	{ XK_KP_Subtract,   XK_ANY_MOD,                     "\033Om",     +2,     0},
    228 	{ XK_KP_Decimal,    XK_ANY_MOD,                     "\033On",     +2,     0},
    229 	{ XK_KP_Divide,     XK_ANY_MOD,                     "\033Oo",     +2,     0},
    230 	{ XK_KP_0,          XK_ANY_MOD,                     "\033Op",     +2,     0},
    231 	{ XK_KP_1,          XK_ANY_MOD,                     "\033Oq",     +2,     0},
    232 	{ XK_KP_2,          XK_ANY_MOD,                     "\033Or",     +2,     0},
    233 	{ XK_KP_3,          XK_ANY_MOD,                     "\033Os",     +2,     0},
    234 	{ XK_KP_4,          XK_ANY_MOD,                     "\033Ot",     +2,     0},
    235 	{ XK_KP_5,          XK_ANY_MOD,                     "\033Ou",     +2,     0},
    236 	{ XK_KP_6,          XK_ANY_MOD,                     "\033Ov",     +2,     0},
    237 	{ XK_KP_7,          XK_ANY_MOD,                     "\033Ow",     +2,     0},
    238 	{ XK_KP_8,          XK_ANY_MOD,                     "\033Ox",     +2,     0},
    239 	{ XK_KP_9,          XK_ANY_MOD,                     "\033Oy",     +2,     0},
    240 	{ XK_Up,            ShiftMask,                      "\033[1;2A",   0,     0},
    241 	{ XK_Up,            Mod1Mask,                       "\033[1;3A",   0,     0},
    242 	{ XK_Up,            ShiftMask|Mod1Mask,             "\033[1;4A",   0,     0},
    243 	{ XK_Up,            ControlMask,                    "\033[1;5A",   0,     0},
    244 	{ XK_Up,            ShiftMask|ControlMask,          "\033[1;6A",   0,     0},
    245 	{ XK_Up,            ControlMask|Mod1Mask,           "\033[1;7A",   0,     0},
    246 	{ XK_Up,            ShiftMask|ControlMask|Mod1Mask, "\033[1;8A",   0,     0},
    247 	{ XK_Up,            XK_ANY_MOD,                     "\033[A",      0,    -1},
    248 	{ XK_Up,            XK_ANY_MOD,                     "\033OA",      0,    +1},
    249 	{ XK_Down,          ShiftMask,                      "\033[1;2B",   0,     0},
    250 	{ XK_Down,          Mod1Mask,                       "\033[1;3B",   0,     0},
    251 	{ XK_Down,          ShiftMask|Mod1Mask,             "\033[1;4B",   0,     0},
    252 	{ XK_Down,          ControlMask,                    "\033[1;5B",   0,     0},
    253 	{ XK_Down,          ShiftMask|ControlMask,          "\033[1;6B",   0,     0},
    254 	{ XK_Down,          ControlMask|Mod1Mask,           "\033[1;7B",   0,     0},
    255 	{ XK_Down,          ShiftMask|ControlMask|Mod1Mask, "\033[1;8B",   0,     0},
    256 	{ XK_Down,          XK_ANY_MOD,                     "\033[B",      0,    -1},
    257 	{ XK_Down,          XK_ANY_MOD,                     "\033OB",      0,    +1},
    258 	{ XK_Left,          ShiftMask,                      "\033[1;2D",   0,     0},
    259 	{ XK_Left,          Mod1Mask,                       "\033[1;3D",   0,     0},
    260 	{ XK_Left,          ShiftMask|Mod1Mask,             "\033[1;4D",   0,     0},
    261 	{ XK_Left,          ControlMask,                    "\033[1;5D",   0,     0},
    262 	{ XK_Left,          ShiftMask|ControlMask,          "\033[1;6D",   0,     0},
    263 	{ XK_Left,          ControlMask|Mod1Mask,           "\033[1;7D",   0,     0},
    264 	{ XK_Left,          ShiftMask|ControlMask|Mod1Mask, "\033[1;8D",   0,     0},
    265 	{ XK_Left,          XK_ANY_MOD,                     "\033[D",      0,    -1},
    266 	{ XK_Left,          XK_ANY_MOD,                     "\033OD",      0,    +1},
    267 	{ XK_Right,         ShiftMask,                      "\033[1;2C",   0,     0},
    268 	{ XK_Right,         Mod1Mask,                       "\033[1;3C",   0,     0},
    269 	{ XK_Right,         ShiftMask|Mod1Mask,             "\033[1;4C",   0,     0},
    270 	{ XK_Right,         ControlMask,                    "\033[1;5C",   0,     0},
    271 	{ XK_Right,         ShiftMask|ControlMask,          "\033[1;6C",   0,     0},
    272 	{ XK_Right,         ControlMask|Mod1Mask,           "\033[1;7C",   0,     0},
    273 	{ XK_Right,         ShiftMask|ControlMask|Mod1Mask, "\033[1;8C",   0,    0},
    274 	{ XK_Right,         XK_ANY_MOD,                     "\033[C",      0,    -1},
    275 	{ XK_Right,         XK_ANY_MOD,                     "\033OC",      0,    +1},
    276 	{ XK_ISO_Left_Tab,  ShiftMask,                      "\033[Z",      0,     0},
    277 	{ XK_Return,        Mod1Mask,                       "\033\r",      0,     0},
    278 	{ XK_Return,        XK_ANY_MOD,                     "\r",          0,     0},
    279 	{ XK_Insert,        ShiftMask,                      "\033[4l",    -1,     0},
    280 	{ XK_Insert,        ShiftMask,                      "\033[2;2~",  +1,     0},
    281 	{ XK_Insert,        ControlMask,                    "\033[L",     -1,     0},
    282 	{ XK_Insert,        ControlMask,                    "\033[2;5~",  +1,     0},
    283 	{ XK_Insert,        XK_ANY_MOD,                     "\033[4h",    -1,     0},
    284 	{ XK_Insert,        XK_ANY_MOD,                     "\033[2~",    +1,     0},
    285 	{ XK_Delete,        ControlMask,                    "\033[M",     -1,     0},
    286 	{ XK_Delete,        ControlMask,                    "\033[3;5~",  +1,     0},
    287 	{ XK_Delete,        ShiftMask,                      "\033[2K",    -1,     0},
    288 	{ XK_Delete,        ShiftMask,                      "\033[3;2~",  +1,     0},
    289 	{ XK_Delete,        XK_ANY_MOD,                     "\033[P",     -1,     0},
    290 	{ XK_Delete,        XK_ANY_MOD,                     "\033[3~",    +1,     0},
    291 	{ XK_BackSpace,     XK_NO_MOD,                      "\177",        0,     0},
    292 	{ XK_BackSpace,     Mod1Mask,                       "\033\177",    0,     0},
    293 	{ XK_Home,          ShiftMask,                      "\033[2J",     0,    -1},
    294 	{ XK_Home,          ShiftMask,                      "\033[1;2H",   0,    +1},
    295 	{ XK_Home,          XK_ANY_MOD,                     "\033[H",      0,    -1},
    296 	{ XK_Home,          XK_ANY_MOD,                     "\033[1~",     0,    +1},
    297 	{ XK_End,           ControlMask,                    "\033[J",     -1,     0},
    298 	{ XK_End,           ControlMask,                    "\033[1;5F",  +1,     0},
    299 	{ XK_End,           ShiftMask,                      "\033[K",     -1,     0},
    300 	{ XK_End,           ShiftMask,                      "\033[1;2F",  +1,     0},
    301 	{ XK_End,           XK_ANY_MOD,                     "\033[4~",     0,     0},
    302 	{ XK_Prior,         ControlMask,                    "\033[5;5~",   0,     0},
    303 	{ XK_Prior,         ShiftMask,                      "\033[5;2~",   0,     0},
    304 	{ XK_Prior,         XK_ANY_MOD,                     "\033[5~",     0,     0},
    305 	{ XK_Next,          ControlMask,                    "\033[6;5~",   0,     0},
    306 	{ XK_Next,          ShiftMask,                      "\033[6;2~",   0,     0},
    307 	{ XK_Next,          XK_ANY_MOD,                     "\033[6~",     0,     0},
    308 	{ XK_F1,            XK_NO_MOD,                      "\033OP" ,     0,     0},
    309 	{ XK_F1, /* F13 */  ShiftMask,                      "\033[1;2P",   0,     0},
    310 	{ XK_F1, /* F25 */  ControlMask,                    "\033[1;5P",   0,     0},
    311 	{ XK_F1, /* F37 */  Mod4Mask,                       "\033[1;6P",   0,     0},
    312 	{ XK_F1, /* F49 */  Mod1Mask,                       "\033[1;3P",   0,     0},
    313 	{ XK_F1, /* F61 */  Mod3Mask,                       "\033[1;4P",   0,     0},
    314 	{ XK_F2,            XK_NO_MOD,                      "\033OQ" ,     0,     0},
    315 	{ XK_F2, /* F14 */  ShiftMask,                      "\033[1;2Q",   0,     0},
    316 	{ XK_F2, /* F26 */  ControlMask,                    "\033[1;5Q",   0,     0},
    317 	{ XK_F2, /* F38 */  Mod4Mask,                       "\033[1;6Q",   0,     0},
    318 	{ XK_F2, /* F50 */  Mod1Mask,                       "\033[1;3Q",   0,     0},
    319 	{ XK_F2, /* F62 */  Mod3Mask,                       "\033[1;4Q",   0,     0},
    320 	{ XK_F3,            XK_NO_MOD,                      "\033OR" ,     0,     0},
    321 	{ XK_F3, /* F15 */  ShiftMask,                      "\033[1;2R",   0,     0},
    322 	{ XK_F3, /* F27 */  ControlMask,                    "\033[1;5R",   0,     0},
    323 	{ XK_F3, /* F39 */  Mod4Mask,                       "\033[1;6R",   0,     0},
    324 	{ XK_F3, /* F51 */  Mod1Mask,                       "\033[1;3R",   0,     0},
    325 	{ XK_F3, /* F63 */  Mod3Mask,                       "\033[1;4R",   0,     0},
    326 	{ XK_F4,            XK_NO_MOD,                      "\033OS" ,     0,     0},
    327 	{ XK_F4, /* F16 */  ShiftMask,                      "\033[1;2S",   0,     0},
    328 	{ XK_F4, /* F28 */  ControlMask,                    "\033[1;5S",   0,     0},
    329 	{ XK_F4, /* F40 */  Mod4Mask,                       "\033[1;6S",   0,     0},
    330 	{ XK_F4, /* F52 */  Mod1Mask,                       "\033[1;3S",   0,     0},
    331 	{ XK_F5,            XK_NO_MOD,                      "\033[15~",    0,     0},
    332 	{ XK_F5, /* F17 */  ShiftMask,                      "\033[15;2~",  0,     0},
    333 	{ XK_F5, /* F29 */  ControlMask,                    "\033[15;5~",  0,     0},
    334 	{ XK_F5, /* F41 */  Mod4Mask,                       "\033[15;6~",  0,     0},
    335 	{ XK_F5, /* F53 */  Mod1Mask,                       "\033[15;3~",  0,     0},
    336 	{ XK_F6,            XK_NO_MOD,                      "\033[17~",    0,     0},
    337 	{ XK_F6, /* F18 */  ShiftMask,                      "\033[17;2~",  0,     0},
    338 	{ XK_F6, /* F30 */  ControlMask,                    "\033[17;5~",  0,     0},
    339 	{ XK_F6, /* F42 */  Mod4Mask,                       "\033[17;6~",  0,     0},
    340 	{ XK_F6, /* F54 */  Mod1Mask,                       "\033[17;3~",  0,     0},
    341 	{ XK_F7,            XK_NO_MOD,                      "\033[18~",    0,     0},
    342 	{ XK_F7, /* F19 */  ShiftMask,                      "\033[18;2~",  0,     0},
    343 	{ XK_F7, /* F31 */  ControlMask,                    "\033[18;5~",  0,     0},
    344 	{ XK_F7, /* F43 */  Mod4Mask,                       "\033[18;6~",  0,     0},
    345 	{ XK_F7, /* F55 */  Mod1Mask,                       "\033[18;3~",  0,     0},
    346 	{ XK_F8,            XK_NO_MOD,                      "\033[19~",    0,     0},
    347 	{ XK_F8, /* F20 */  ShiftMask,                      "\033[19;2~",  0,     0},
    348 	{ XK_F8, /* F32 */  ControlMask,                    "\033[19;5~",  0,     0},
    349 	{ XK_F8, /* F44 */  Mod4Mask,                       "\033[19;6~",  0,     0},
    350 	{ XK_F8, /* F56 */  Mod1Mask,                       "\033[19;3~",  0,     0},
    351 	{ XK_F9,            XK_NO_MOD,                      "\033[20~",    0,     0},
    352 	{ XK_F9, /* F21 */  ShiftMask,                      "\033[20;2~",  0,     0},
    353 	{ XK_F9, /* F33 */  ControlMask,                    "\033[20;5~",  0,     0},
    354 	{ XK_F9, /* F45 */  Mod4Mask,                       "\033[20;6~",  0,     0},
    355 	{ XK_F9, /* F57 */  Mod1Mask,                       "\033[20;3~",  0,     0},
    356 	{ XK_F10,           XK_NO_MOD,                      "\033[21~",    0,     0},
    357 	{ XK_F10, /* F22 */ ShiftMask,                      "\033[21;2~",  0,     0},
    358 	{ XK_F10, /* F34 */ ControlMask,                    "\033[21;5~",  0,     0},
    359 	{ XK_F10, /* F46 */ Mod4Mask,                       "\033[21;6~",  0,     0},
    360 	{ XK_F10, /* F58 */ Mod1Mask,                       "\033[21;3~",  0,     0},
    361 	{ XK_F11,           XK_NO_MOD,                      "\033[23~",    0,     0},
    362 	{ XK_F11, /* F23 */ ShiftMask,                      "\033[23;2~",  0,     0},
    363 	{ XK_F11, /* F35 */ ControlMask,                    "\033[23;5~",  0,     0},
    364 	{ XK_F11, /* F47 */ Mod4Mask,                       "\033[23;6~",  0,     0},
    365 	{ XK_F11, /* F59 */ Mod1Mask,                       "\033[23;3~",  0,     0},
    366 	{ XK_F12,           XK_NO_MOD,                      "\033[24~",    0,     0},
    367 	{ XK_F12, /* F24 */ ShiftMask,                      "\033[24;2~",  0,     0},
    368 	{ XK_F12, /* F36 */ ControlMask,                    "\033[24;5~",  0,     0},
    369 	{ XK_F12, /* F48 */ Mod4Mask,                       "\033[24;6~",  0,     0},
    370 	{ XK_F12, /* F60 */ Mod1Mask,                       "\033[24;3~",  0,     0},
    371 	{ XK_F13,           XK_NO_MOD,                      "\033[1;2P",   0,     0},
    372 	{ XK_F14,           XK_NO_MOD,                      "\033[1;2Q",   0,     0},
    373 	{ XK_F15,           XK_NO_MOD,                      "\033[1;2R",   0,     0},
    374 	{ XK_F16,           XK_NO_MOD,                      "\033[1;2S",   0,     0},
    375 	{ XK_F17,           XK_NO_MOD,                      "\033[15;2~",  0,     0},
    376 	{ XK_F18,           XK_NO_MOD,                      "\033[17;2~",  0,     0},
    377 	{ XK_F19,           XK_NO_MOD,                      "\033[18;2~",  0,     0},
    378 	{ XK_F20,           XK_NO_MOD,                      "\033[19;2~",  0,     0},
    379 	{ XK_F21,           XK_NO_MOD,                      "\033[20;2~",  0,     0},
    380 	{ XK_F22,           XK_NO_MOD,                      "\033[21;2~",  0,     0},
    381 	{ XK_F23,           XK_NO_MOD,                      "\033[23;2~",  0,     0},
    382 	{ XK_F24,           XK_NO_MOD,                      "\033[24;2~",  0,     0},
    383 	{ XK_F25,           XK_NO_MOD,                      "\033[1;5P",   0,     0},
    384 	{ XK_F26,           XK_NO_MOD,                      "\033[1;5Q",   0,     0},
    385 	{ XK_F27,           XK_NO_MOD,                      "\033[1;5R",   0,     0},
    386 	{ XK_F28,           XK_NO_MOD,                      "\033[1;5S",   0,     0},
    387 	{ XK_F29,           XK_NO_MOD,                      "\033[15;5~",  0,     0},
    388 	{ XK_F30,           XK_NO_MOD,                      "\033[17;5~",  0,     0},
    389 	{ XK_F31,           XK_NO_MOD,                      "\033[18;5~",  0,     0},
    390 	{ XK_F32,           XK_NO_MOD,                      "\033[19;5~",  0,     0},
    391 	{ XK_F33,           XK_NO_MOD,                      "\033[20;5~",  0,     0},
    392 	{ XK_F34,           XK_NO_MOD,                      "\033[21;5~",  0,     0},
    393 	{ XK_F35,           XK_NO_MOD,                      "\033[23;5~",  0,     0},
    394 };
    395 
    396 // selection types' masks
    397 static uint selmasks[] = {
    398 	[SEL_RECTANGULAR] = Mod1Mask,
    399 };
    400 
    401 // printable characters in ascii
    402 static char ascii_printable[] =
    403 	" !\"#$%&'()*+,-./0123456789:;<=>?"
    404 	"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
    405 	"`abcdefghijklmnopqrstuvwxyz{|}~";