/* See LICENSE file for copyright and license details. */ /* * appearance * * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html */ static char font[] = "Px437_ATI_SmallW_6x8 NF:style=Book:pixelsize=16:antialias=true:autohint=true"; //"CMU Typewriter Text:pixelsize=18:antialias=true:autohint=true"; 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"; static char *utmp = NULL; static char stty_args[] = "stty raw pass8 nl -echo -iexten -cstopb 38400"; /* identification sequence returned in DA and DECID */ static char vtiden[] = "\033[?6c"; /* Kerning / character bounding-box multipliers */ static float cwscale = 1.0; static float chscale = 1.0; /* * word delimiter string * * More advanced example: " `'\"()[]{}" */ static char worddelimiters[] = " `'\"()[]{}"; /* selection timeouts (in milliseconds) */ static unsigned int doubleclicktimeout = 300; static unsigned int tripleclicktimeout = 600; /* alt screens */ static int allowaltscreen = 1; /* frames per second st should at maximum draw to the screen */ static unsigned int xfps = 120; static unsigned int actionfps = 30; /* * 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 */ static 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 */ static unsigned int tabspaces = 8; /* bg opacity */ static const int alpha = 0xdd; static int whichcolortable = 0; static const char *schemenames[] = { "Cobalt Neon", "Highway", "Grape", // "MonokaiVivid", "Pandora", "Shaman", "Symfonic", "Lavandula", "ENCOM", "Alien Blood", "Borland", "IC Orange", "IC Green", "Red Alert" }; static char *colorchart[13][260] = { // cobalt neon { "#142631", // 0 "#ff2320", // 1 "#3ba5ff", // 2 "#e9e75c", // 3 "#8ff586", // 4 "#781aa0", // 5 "#8ff586", // 6 "#ba46b2", // 7 "#fff688", // 8 "#d4312e", // 9 "#8ff586", // 10 "#e9f06d", // 11 "#3c7dd2", // 12 "#8230a7", // 13 "#6cbc67", // 14 "#8ff586", // 15 [255] = 0, /* more colors can be added after 255 to use with DefaultXX */ "#142838", /* bg color */ "#8ff586", // 6 "#c4206f" /* cs color */ }, // Highway { "#000000", // 0 "#d00e18", // 1 "#138034", // 2 "#ffcb3e", // 3 "#006bb3", // 4 "#6b2775", // 5 "#384564", // 6 "#ededed", // 7 "#5d504a", // 8 "#f07e18", // 9 "#b1d130", // 10 "#fff120", // 11 "#4fc2fd", // 12 "#de0071", // 13 "#5d504a", // 14 "#ffffff", // 15 [255] = 0, "#222225", /* bg color */ "#ededed", // 7 "#e0d9b9" /* cs color */ }, // Grape { "#2d283f", // 0 "#ed2261", // 1 "#1fa91b", // 2 "#8ddc20", // 3 "#487df4", // 4 "#8d35c9", // 5 "#3bdeed", // 6 "#9e9ea0", // 7 "#59516a", // 8 "#f0729a", // 9 "#53aa5e", // 10 "#b2dc87", // 11 "#a9bcec", // 12 "#ad81c2", // 13 "#9de3eb", // 14 "#a288f7", // 15 [255] = 0, "#171423", /* bg color */ "#9f9fa1", /* fg color */ "#a288f7", // 15 }, // {// monokai vivid // "#121212", // 0 // "#fa2934", // 1 // "#98e123", // 2 // "#fff30a", // 3 // "#0443ff", // 4 // "#f800f8", // 5 // "#01b6ed", // 6 // "#ffffff", // 7 // "#838383", // 8 // "#f6669d", // 9 // "#b1e05f", // 10 // "#fff26d", // 11 // "#0443ff", // 12 // "#f200f6", // 13 // "#51ceff", // 14 // "#ffffff", // 15 // [255] = 0, // //static unsigned int defaultbg = 0; // "#121212", // 0 // "#f9f9f9", /* fg color */ // //static unsigned int defaultfg = 256; // "#fb0007" /* cs color */ // //static unsigned int defaultcs = 257; // }, { "#000000", // 0 "#ff4242", // 1 "#74af68", // 2 "#ffad29", // 3 "#338f86", // 4 "#9414e6", // 5 "#23d7d7", // 6 "#e2e2e2", // 7 "#3f5648", // 8 "#ff3242", // 9 "#74cd68", // 10 "#ffb929", // 11 "#23d7d7", // 12 "#ff37ff", // 13 "#00ede1", // 14 "#ffffff", // 15 [255] = 0, "#141e43", /* bg color */ //static unsigned int defaultbg = 256; "#e1e1e1", /* fg color */ //static unsigned int defaultfg = 257; "#43d58e" /* cs color */ //static unsigned int defaultcs = 258; }, { "#012026", // 0 "#b2302d", // 1 "#00a941", // 2 "#5e8baa", // 3 "#449a86", // 4 "#00599d", // 5 "#5d7e19", // 6 "#405555", // 7 "#384451", // 8 "#ff4242", // 9 "#2aea5e", // 10 "#8ed4fd", // 11 "#61d5ba", // 12 "#1298ff", // 13 "#98d028", // 14 "#58fbd6", // 15 [255] = 0, "#001015", /* bg color */ //static unsigned int defaultbg = 256; //static unsigned int defaultfg = 7; "#405555", // 7 "#4afcd6" /* cs color */ //static unsigned int defaultcs = 257; }, { "#000000", // 0 "#dc322f", // 1 "#56db3a", // 2 "#ff8400", // 3 "#0084d4", // 4 "#b729d9", // 5 "#ccccff", // 6 "#ffffff", // 7 "#1b1d21", // 8 "#dc322f", // 9 "#56db3a", // 10 "#ff8400", // 11 "#0084d4", // 12 "#b729d9", // 13 "#ccccff", // 14 "#ffffff", // 15 [255] = 0, //static unsigned int defaultbg = 0; "#000000", // 0 //static unsigned int defaultfg = 7; "#ffffff", // 7 //static unsigned int defaultcs = 9; "#dc322f", // 9 }, { "#230046", // 0 "#7d1625", // 1 "#337e6f", // 2 "#7f6f49", // 3 "#4f4a7f", // 4 "#5a3f7f", // 5 "#58777f", // 6 "#736e7d", // 7 "#372d46", // 8 "#e05167", // 9 "#52e0c4", // 10 "#e0c386", // 11 "#8e87e0", // 12 "#a776e0", // 13 "#9ad4e0", // 14 "#8c91fa", // 15 [255] = 0, "#050014", /* bg color */ //static unsigned int defaultbg = 256; //static unsigned int defaultfg = 7; "#736e7d", // 7 //static unsigned int defaultcs = 15; "#8c91fa", // 15 }, { "#000000", // 0 "#9f0000", // 1 "#008b00", // 2 "#ffd000", // 3 "#0081ff", // 4 "#bc00ca", // 5 "#008b8b", // 6 "#bbbbbb", // 7 "#555555", // 8 "#ff0000", // 9 "#00ee00", // 10 "#ffff00", // 11 "#0000ff", // 12 "#ff00ff", // 13 "#00cdcd", // 14 "#ffffff", // 15 [255] = 0, //static unsigned int defaultbg = 0; "#000000", // 0 "#00a595", /* fg color */ //static unsigned int defaultfg = 256; "#bbbbbb", // 7 //static unsigned int defaultcs = 7; }, { "#112616", // 0 "#7f2b27", // 1 "#2f7e25", // 2 "#717f24", // 3 "#2f6a7f", // 4 "#47587f", // 5 "#327f77", // 6 "#647d75", // 7 "#3c4812", // 8 "#e08009", // 9 "#18e000", // 10 "#bde000", // 11 "#00aae0", // 12 "#0058e0", // 13 "#00e0c4", // 14 "#73fa91", // 15 [255] = 0, "#0f1610", /* bg color */ //static unsigned int defaultbg = 256; "#637d75", /* fg color */ //static unsigned int defaultfg = 257; "#73fa91", // 15 //static unsigned int defaultcs = 15; }, { "#4f4f4f", // 0 "#ff6c60", // 1 "#a8ff60", // 2 "#ffffb6", // 3 "#96cbfe", // 4 "#ff73fd", // 5 "#c6c5fe", // 6 "#eeeeee", // 7 "#7c7c7c", // 8 "#ffb6b0", // 9 "#ceffac", // 10 "#ffffcc", // 11 "#b5dcff", // 12 "#ff9cfe", // 13 "#dfdffe", // 14 "#ffffff", // 15 [255] = 0, "#0000a4", /* bg color */ //static unsigned int defaultbg = 256; "#ffff4e", /* fg color */ //static unsigned int defaultfg = 257; "#ffa560" /* cs color */ //static unsigned int defaultcs = 258; }, { "#000000", // 0 "#c13900", // 1 "#a4a900", // 2 "#caaf00", // 3 "#bd6d00", // 4 "#fc5e00", // 5 "#f79500", // 6 "#ffc88a", // 7 "#6a4f2a", // 8 "#ff8c68", // 9 "#f6ff40", // 10 "#ffe36e", // 11 "#ffbe55", // 12 "#fc874f", // 13 "#c69752", // 14 "#fafaff", // 15 [255] = 0, "#262626", /* bg color */ //static unsigned int defaultbg = 256; "#ffcb83", /* fg color */ //static unsigned int defaultfg = 257; "#fc531d" /* cs color */ //static unsigned int defaultcs = 258; }, { "#1f1f1f", // 0 "#fb002a", // 1 "#339c24", // 2 "#659b25", // 3 "#149b45", // 4 "#53b82c", // 5 "#2cb868", // 6 "#e0ffef", // 7 "#032710", // 8 "#a7ff3f", // 9 "#9fff6d", // 10 "#d2ff6d", // 11 "#72ffb5", // 12 "#50ff3e", // 13 "#22ff71", // 14 "#daefd0", // 15 [255] = 0, "#3a3d3f", /* bg color */ //static unsigned int defaultbg = 256; "#d9efd3", /* fg color */ //static unsigned int defaultfg = 257; "#42ff58" /* cs color */ //static unsigned int defaultcs = 258; }, { "#000000", // 0 "#d62e4e", // 1 "#71be6b", // 2 "#beb86b", // 3 "#489bee", // 4 "#e979d7", // 5 "#6bbeb8", // 6 "#d6d6d6", // 7 "#262626", // 8 "#e02553", // 9 "#aff08c", // 10 "#dfddb7", // 11 "#65aaf1", // 12 "#ddb7df", // 13 "#b7dfdd", // 14 "#ffffff", // 15 [255] = 0, "#762423", /* bg color */ //static unsigned int defaultbg = 256; //static unsigned int defaultfg = 15; "#ffffff", // 15 //static unsigned int defaultcs = 15; "#ffffff", // 15 }, }; /* Terminal colors (16 first used in escape sequence) */ static const char *colorname[] = { // cobalt neon "#142631", // 0 "#ff2320", // 1 "#3ba5ff", // 2 "#e9e75c", // 3 "#8ff586", // 4 "#781aa0", // 5 "#8ff586", // 6 "#ba46b2", // 7 "#fff688", // 8 "#d4312e", // 9 "#8ff586", // 10 "#e9f06d", // 11 "#3c7dd2", // 12 "#8230a7", // 13 "#6cbc67", // 14 "#8ff586", // 15 [255] = 0, /* more colors can be added after 255 to use with DefaultXX */ "#142838", /* bg color */ "#8ff586", // 6 "#c4206f" /* cs color */ }; /* Terminal colors for alternate (light) palette */ static const char *altcolorname[] = { // IC_Green "#1f1f1f", // 0 "#fb002a", // 1 "#339c24", // 2 "#659b25", // 3 "#149b45", // 4 "#53b82c", // 5 "#2cb868", // 6 "#e0ffef", // 7 "#032710", // 8 "#a7ff3f", // 9 "#9fff6d", // 10 "#d2ff6d", // 11 "#72ffb5", // 12 "#50ff3e", // 13 "#22ff71", // 14 "#daefd0", // 15 [255] = 0, /* more colors can be added after 255 to use with DefaultXX */ "#3a3d3f", /* bg color */ "#d9efd3", /* fg color */ "#42ff58" /* cs color */ }; /* * Default colors (colorname index) * foreground, background, cursor, reverse cursor */ static unsigned int defaultbg = 256; static unsigned int defaultfg = 257; static unsigned int defaultcs = 258; static unsigned int defaultrcs = 15; /* * Default shape of cursor (1/3/5 are supposed to blink?) * 2: Block ("█") * 4: Underline ("_") * 6: Bar ("|") * 7: Snowman ("☃") my hexagrams: * 8: Creative Heaven ("䷀") * 9: Gathering (Order) ("䷬") *10: Work on the Decayed ("䷑") *11: Inner Truth ("䷼") ansi blocks: *12: Light Shade ("░") *13: Medium Shade ("▒") *14: Dark Shade ("▓") other: *15: This thing: ("▣") */ static unsigned int cursorshape = 1; /* * Default colour and shape of the mouse cursor */ static unsigned int mouseshape = XC_xterm; static unsigned int mousefg = 7; static unsigned int mousebg = 0; /* * 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 = 11; static unsigned int defaultunderline = 7; /* * Internal mouse shortcuts. * Beware that overloading Button1 will disable the selection. */ static MouseShortcut mshortcuts[] = { /* button mask string */ { Button4, XK_ANY_MOD, "\031" }, { Button5, XK_ANY_MOD, "\005" }, }; /* Internal keyboard shortcuts. */ #define MODKEY Mod1Mask /* I don't use the printer, but I _do_ use f6. So I'm going to remove the print bits and replace with toggle. */ 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} }, { MODKEY|ShiftMask, XK_Prior, xzoom, {.f = +1} }, { MODKEY|ShiftMask, XK_Next, xzoom, {.f = -1} }, { MODKEY|ShiftMask, XK_Home, xzoomreset, {.f = 0} }, { ShiftMask, XK_Insert, selpaste, {.i = 0} }, { MODKEY|ShiftMask, XK_Insert, clippaste, {.i = 0} }, { MODKEY|ShiftMask, XK_C, clipcopy, {.i = 0} }, { MODKEY|ShiftMask, XK_V, clippaste, {.i = 0} }, { MODKEY, XK_Num_Lock, numlock, {.i = 0} }, { XK_ANY_MOD, XK_Print, swapcolors, {.i = 0} }, // eject { XK_ANY_MOD, 0x1008ff2c, swapcolors, {.i = 0} }, }; /* * 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 crlf */ { XK_KP_Home, ShiftMask, "\033[2J", 0, -1, 0}, { XK_KP_Home, ShiftMask, "\033[1;2H", 0, +1, 0}, { XK_KP_Home, XK_ANY_MOD, "\033[H", 0, -1, 0}, { XK_KP_Home, XK_ANY_MOD, "\033[1~", 0, +1, 0}, { XK_KP_Up, XK_ANY_MOD, "\033Ox", +1, 0, 0}, { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1, 0}, { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1, 0}, { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0, 0}, { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1, 0}, { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1, 0}, { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0, 0}, { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1, 0}, { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1, 0}, { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0, 0}, { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1, 0}, { XK_KP_Right, XK_ANY_MOD, "\033OC", 0, +1, 0}, { XK_KP_Prior, ShiftMask, "\033[5;2~", 0, 0, 0}, { XK_KP_Prior, XK_ANY_MOD, "\033[5~", 0, 0, 0}, { XK_KP_Begin, XK_ANY_MOD, "\033[E", 0, 0, 0}, { XK_KP_End, ControlMask, "\033[J", -1, 0, 0}, { XK_KP_End, ControlMask, "\033[1;5F", +1, 0, 0}, { XK_KP_End, ShiftMask, "\033[K", -1, 0, 0}, { XK_KP_End, ShiftMask, "\033[1;2F", +1, 0, 0}, { XK_KP_End, XK_ANY_MOD, "\033[4~", 0, 0, 0}, { XK_KP_Next, ShiftMask, "\033[6;2~", 0, 0, 0}, { XK_KP_Next, XK_ANY_MOD, "\033[6~", 0, 0, 0}, { XK_KP_Insert, ShiftMask, "\033[2;2~", +1, 0, 0}, { XK_KP_Insert, ShiftMask, "\033[4l", -1, 0, 0}, { XK_KP_Insert, ControlMask, "\033[L", -1, 0, 0}, { XK_KP_Insert, ControlMask, "\033[2;5~", +1, 0, 0}, { XK_KP_Insert, XK_ANY_MOD, "\033[4h", -1, 0, 0}, { XK_KP_Insert, XK_ANY_MOD, "\033[2~", +1, 0, 0}, { XK_KP_Delete, ControlMask, "\033[M", -1, 0, 0}, { XK_KP_Delete, ControlMask, "\033[3;5~", +1, 0, 0}, { XK_KP_Delete, ShiftMask, "\033[2K", -1, 0, 0}, { XK_KP_Delete, ShiftMask, "\033[3;2~", +1, 0, 0}, { XK_KP_Delete, XK_ANY_MOD, "\033[P", -1, 0, 0}, { XK_KP_Delete, XK_ANY_MOD, "\033[3~", +1, 0, 0}, { XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +2, 0, 0}, { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0, 0}, { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0, 0}, { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0, -1}, { XK_KP_Enter, XK_ANY_MOD, "\r\n", -1, 0, +1}, { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0, 0}, { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0, 0}, { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0, 0}, { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0, 0}, { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0, 0}, { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0, 0}, { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0, 0}, { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0, 0}, { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0, 0}, { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0, 0}, { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0, 0}, { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0, 0}, { XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0, 0}, { XK_Up, ShiftMask, "\033[1;2A", 0, 0, 0}, { XK_Up, ControlMask, "\033[1;5A", 0, 0, 0}, { XK_Up, Mod1Mask, "\033[1;3A", 0, 0, 0}, { XK_Up, XK_ANY_MOD, "\033[A", 0, -1, 0}, { XK_Up, XK_ANY_MOD, "\033OA", 0, +1, 0}, { XK_Down, ShiftMask, "\033[1;2B", 0, 0, 0}, { XK_Down, ControlMask, "\033[1;5B", 0, 0, 0}, { XK_Down, Mod1Mask, "\033[1;3B", 0, 0, 0}, { XK_Down, XK_ANY_MOD, "\033[B", 0, -1, 0}, { XK_Down, XK_ANY_MOD, "\033OB", 0, +1, 0}, { XK_Left, ShiftMask, "\033[1;2D", 0, 0, 0}, { XK_Left, ControlMask, "\033[1;5D", 0, 0, 0}, { XK_Left, Mod1Mask, "\033[1;3D", 0, 0, 0}, { XK_Left, XK_ANY_MOD, "\033[D", 0, -1, 0}, { XK_Left, XK_ANY_MOD, "\033OD", 0, +1, 0}, { XK_Right, ShiftMask, "\033[1;2C", 0, 0, 0}, { XK_Right, ControlMask, "\033[1;5C", 0, 0, 0}, { XK_Right, Mod1Mask, "\033[1;3C", 0, 0, 0}, { XK_Right, XK_ANY_MOD, "\033[C", 0, -1, 0}, { XK_Right, XK_ANY_MOD, "\033OC", 0, +1, 0}, { XK_ISO_Left_Tab, ShiftMask, "\033[Z", 0, 0, 0}, { XK_Return, Mod1Mask, "\033\r", 0, 0, -1}, { XK_Return, Mod1Mask, "\033\r\n", 0, 0, +1}, { XK_Return, XK_ANY_MOD, "\r", 0, 0, -1}, { XK_Return, XK_ANY_MOD, "\r\n", 0, 0, +1}, { XK_Insert, ShiftMask, "\033[4l", -1, 0, 0}, { XK_Insert, ShiftMask, "\033[2;2~", +1, 0, 0}, { XK_Insert, ControlMask, "\033[L", -1, 0, 0}, { XK_Insert, ControlMask, "\033[2;5~", +1, 0, 0}, { XK_Insert, XK_ANY_MOD, "\033[4h", -1, 0, 0}, { XK_Insert, XK_ANY_MOD, "\033[2~", +1, 0, 0}, { XK_Delete, ControlMask, "\033[M", -1, 0, 0}, { XK_Delete, ControlMask, "\033[3;5~", +1, 0, 0}, { XK_Delete, ShiftMask, "\033[2K", -1, 0, 0}, { XK_Delete, ShiftMask, "\033[3;2~", +1, 0, 0}, { XK_Delete, XK_ANY_MOD, "\033[P", -1, 0, 0}, { XK_Delete, XK_ANY_MOD, "\033[3~", +1, 0, 0}, { XK_BackSpace, XK_NO_MOD, "\177", 0, 0, 0}, { XK_BackSpace, Mod1Mask, "\033\177", 0, 0, 0}, { XK_Home, ShiftMask, "\033[2J", 0, -1, 0}, { XK_Home, ShiftMask, "\033[1;2H", 0, +1, 0}, { XK_Home, XK_ANY_MOD, "\033[H", 0, -1, 0}, { XK_Home, XK_ANY_MOD, "\033[1~", 0, +1, 0}, { XK_End, ControlMask, "\033[J", -1, 0, 0}, { XK_End, ControlMask, "\033[1;5F", +1, 0, 0}, { XK_End, ShiftMask, "\033[K", -1, 0, 0}, { XK_End, ShiftMask, "\033[1;2F", +1, 0, 0}, { XK_End, XK_ANY_MOD, "\033[4~", 0, 0, 0}, { XK_Prior, ControlMask, "\033[5;5~", 0, 0, 0}, { XK_Prior, ShiftMask, "\033[5;2~", 0, 0, 0}, { XK_Prior, XK_ANY_MOD, "\033[5~", 0, 0, 0}, { XK_Next, ControlMask, "\033[6;5~", 0, 0, 0}, { XK_Next, ShiftMask, "\033[6;2~", 0, 0, 0}, { XK_Next, XK_ANY_MOD, "\033[6~", 0, 0, 0}, { XK_F1, XK_NO_MOD, "\033OP" , 0, 0, 0}, { XK_F1, /* F13 */ ShiftMask, "\033[1;2P", 0, 0, 0}, { XK_F1, /* F25 */ ControlMask, "\033[1;5P", 0, 0, 0}, { XK_F1, /* F37 */ Mod4Mask, "\033[1;6P", 0, 0, 0}, { XK_F1, /* F49 */ Mod1Mask, "\033[1;3P", 0, 0, 0}, { XK_F1, /* F61 */ Mod3Mask, "\033[1;4P", 0, 0, 0}, { XK_F2, XK_NO_MOD, "\033OQ" , 0, 0, 0}, { XK_F2, /* F14 */ ShiftMask, "\033[1;2Q", 0, 0, 0}, { XK_F2, /* F26 */ ControlMask, "\033[1;5Q", 0, 0, 0}, { XK_F2, /* F38 */ Mod4Mask, "\033[1;6Q", 0, 0, 0}, { XK_F2, /* F50 */ Mod1Mask, "\033[1;3Q", 0, 0, 0}, { XK_F2, /* F62 */ Mod3Mask, "\033[1;4Q", 0, 0, 0}, { XK_F3, XK_NO_MOD, "\033OR" , 0, 0, 0}, { XK_F3, /* F15 */ ShiftMask, "\033[1;2R", 0, 0, 0}, { XK_F3, /* F27 */ ControlMask, "\033[1;5R", 0, 0, 0}, { XK_F3, /* F39 */ Mod4Mask, "\033[1;6R", 0, 0, 0}, { XK_F3, /* F51 */ Mod1Mask, "\033[1;3R", 0, 0, 0}, { XK_F3, /* F63 */ Mod3Mask, "\033[1;4R", 0, 0, 0}, { XK_F4, XK_NO_MOD, "\033OS" , 0, 0, 0}, { XK_F4, /* F16 */ ShiftMask, "\033[1;2S", 0, 0, 0}, { XK_F4, /* F28 */ ControlMask, "\033[1;5S", 0, 0, 0}, { XK_F4, /* F40 */ Mod4Mask, "\033[1;6S", 0, 0, 0}, { XK_F4, /* F52 */ Mod1Mask, "\033[1;3S", 0, 0, 0}, { XK_F5, XK_NO_MOD, "\033[15~", 0, 0, 0}, { XK_F5, /* F17 */ ShiftMask, "\033[15;2~", 0, 0, 0}, { XK_F5, /* F29 */ ControlMask, "\033[15;5~", 0, 0, 0}, { XK_F5, /* F41 */ Mod4Mask, "\033[15;6~", 0, 0, 0}, { XK_F5, /* F53 */ Mod1Mask, "\033[15;3~", 0, 0, 0}, { XK_F6, XK_NO_MOD, "\033[17~", 0, 0, 0}, { XK_F6, /* F18 */ ShiftMask, "\033[17;2~", 0, 0, 0}, { XK_F6, /* F30 */ ControlMask, "\033[17;5~", 0, 0, 0}, { XK_F6, /* F42 */ Mod4Mask, "\033[17;6~", 0, 0, 0}, { XK_F6, /* F54 */ Mod1Mask, "\033[17;3~", 0, 0, 0}, { XK_F7, XK_NO_MOD, "\033[18~", 0, 0, 0}, { XK_F7, /* F19 */ ShiftMask, "\033[18;2~", 0, 0, 0}, { XK_F7, /* F31 */ ControlMask, "\033[18;5~", 0, 0, 0}, { XK_F7, /* F43 */ Mod4Mask, "\033[18;6~", 0, 0, 0}, { XK_F7, /* F55 */ Mod1Mask, "\033[18;3~", 0, 0, 0}, { XK_F8, XK_NO_MOD, "\033[19~", 0, 0, 0}, { XK_F8, /* F20 */ ShiftMask, "\033[19;2~", 0, 0, 0}, { XK_F8, /* F32 */ ControlMask, "\033[19;5~", 0, 0, 0}, { XK_F8, /* F44 */ Mod4Mask, "\033[19;6~", 0, 0, 0}, { XK_F8, /* F56 */ Mod1Mask, "\033[19;3~", 0, 0, 0}, { XK_F9, XK_NO_MOD, "\033[20~", 0, 0, 0}, { XK_F9, /* F21 */ ShiftMask, "\033[20;2~", 0, 0, 0}, { XK_F9, /* F33 */ ControlMask, "\033[20;5~", 0, 0, 0}, { XK_F9, /* F45 */ Mod4Mask, "\033[20;6~", 0, 0, 0}, { XK_F9, /* F57 */ Mod1Mask, "\033[20;3~", 0, 0, 0}, { XK_F10, XK_NO_MOD, "\033[21~", 0, 0, 0}, { XK_F10, /* F22 */ ShiftMask, "\033[21;2~", 0, 0, 0}, { XK_F10, /* F34 */ ControlMask, "\033[21;5~", 0, 0, 0}, { XK_F10, /* F46 */ Mod4Mask, "\033[21;6~", 0, 0, 0}, { XK_F10, /* F58 */ Mod1Mask, "\033[21;3~", 0, 0, 0}, { XK_F11, XK_NO_MOD, "\033[23~", 0, 0, 0}, { XK_F11, /* F23 */ ShiftMask, "\033[23;2~", 0, 0, 0}, { XK_F11, /* F35 */ ControlMask, "\033[23;5~", 0, 0, 0}, { XK_F11, /* F47 */ Mod4Mask, "\033[23;6~", 0, 0, 0}, { XK_F11, /* F59 */ Mod1Mask, "\033[23;3~", 0, 0, 0}, { XK_F12, XK_NO_MOD, "\033[24~", 0, 0, 0}, { XK_F12, /* F24 */ ShiftMask, "\033[24;2~", 0, 0, 0}, { XK_F12, /* F36 */ ControlMask, "\033[24;5~", 0, 0, 0}, { XK_F12, /* F48 */ Mod4Mask, "\033[24;6~", 0, 0, 0}, { XK_F12, /* F60 */ Mod1Mask, "\033[24;3~", 0, 0, 0}, { XK_F13, XK_NO_MOD, "\033[1;2P", 0, 0, 0}, { XK_F14, XK_NO_MOD, "\033[1;2Q", 0, 0, 0}, { XK_F15, XK_NO_MOD, "\033[1;2R", 0, 0, 0}, { XK_F16, XK_NO_MOD, "\033[1;2S", 0, 0, 0}, { XK_F17, XK_NO_MOD, "\033[15;2~", 0, 0, 0}, { XK_F18, XK_NO_MOD, "\033[17;2~", 0, 0, 0}, { XK_F19, XK_NO_MOD, "\033[18;2~", 0, 0, 0}, { XK_F20, XK_NO_MOD, "\033[19;2~", 0, 0, 0}, { XK_F21, XK_NO_MOD, "\033[20;2~", 0, 0, 0}, { XK_F22, XK_NO_MOD, "\033[21;2~", 0, 0, 0}, { XK_F23, XK_NO_MOD, "\033[23;2~", 0, 0, 0}, { XK_F24, XK_NO_MOD, "\033[24;2~", 0, 0, 0}, { XK_F25, XK_NO_MOD, "\033[1;5P", 0, 0, 0}, { XK_F26, XK_NO_MOD, "\033[1;5Q", 0, 0, 0}, { XK_F27, XK_NO_MOD, "\033[1;5R", 0, 0, 0}, { XK_F28, XK_NO_MOD, "\033[1;5S", 0, 0, 0}, { XK_F29, XK_NO_MOD, "\033[15;5~", 0, 0, 0}, { XK_F30, XK_NO_MOD, "\033[17;5~", 0, 0, 0}, { XK_F31, XK_NO_MOD, "\033[18;5~", 0, 0, 0}, { XK_F32, XK_NO_MOD, "\033[19;5~", 0, 0, 0}, { XK_F33, XK_NO_MOD, "\033[20;5~", 0, 0, 0}, { XK_F34, XK_NO_MOD, "\033[21;5~", 0, 0, 0}, { XK_F35, XK_NO_MOD, "\033[23;5~", 0, 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{|}~";