From fa3ca0c2fb6795a2a2a93358769969f2e25aba19 Mon Sep 17 00:00:00 2001 From: mrsu Date: Mon, 26 Jun 2023 10:13:18 +0100 Subject: [PATCH 1/8] keyboard_select --- config.def.h | 1 + config.h | 475 ++++++++++++++++++ patches/st-keyboard_select-0.8.2.diff | 336 +++++++++++++ .../st-keyboard_select-20200617-9ba7ecf.diff | 319 ++++++++++++ st | Bin 0 -> 110368 bytes st.c | 222 ++++++++ st.h | 1 + st.o | Bin 0 -> 88152 bytes win.h | 3 + x.c | 15 + x.o | Bin 0 -> 75288 bytes 11 files changed, 1372 insertions(+) create mode 100644 config.h create mode 100644 patches/st-keyboard_select-0.8.2.diff create mode 100644 patches/st-keyboard_select-20200617-9ba7ecf.diff create mode 100755 st create mode 100644 st.o create mode 100644 x.o diff --git a/config.def.h b/config.def.h index 91ab8ca..addb201 100644 --- a/config.def.h +++ b/config.def.h @@ -201,6 +201,7 @@ static Shortcut shortcuts[] = { { TERMMOD, XK_Y, selpaste, {.i = 0} }, { ShiftMask, XK_Insert, selpaste, {.i = 0} }, { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, + { TERMMOD, XK_Escape, keyboard_select,{ 0 } }, }; /* diff --git a/config.h b/config.h new file mode 100644 index 0000000..addb201 --- /dev/null +++ b/config.h @@ -0,0 +1,475 @@ +/* See LICENSE file for copyright and license details. */ + +/* + * appearance + * + * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html + */ +static char *font = "Liberation Mono:pixelsize=12: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: scroll and/or utmp + * 3: SHELL environment variable + * 4: value of shell in /etc/passwd + * 5: value of shell in config.h + */ +static char *shell = "/bin/sh"; +char *utmp = NULL; +/* scroll program: to enable use a string like "scroll" */ +char *scroll = 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 */ +static float cwscale = 1.0; +static float chscale = 1.0; + +/* + * word delimiter string + * + * More advanced example: L" `'\"()[]{}" + */ +wchar_t *worddelimiters = L" "; + +/* selection timeouts (in milliseconds) */ +static unsigned int doubleclicktimeout = 300; +static unsigned int tripleclicktimeout = 600; + +/* alt screens */ +int allowaltscreen = 1; + +/* allow certain non-interactive (insecure) window operations such as: + setting the clipboard text */ +int allowwindowops = 0; + +/* + * draw latency range in ms - from new content/keypress/etc until drawing. + * within this range, st draws when content stops arriving (idle). mostly it's + * near minlatency, but it waits longer for slow updates to avoid partial draw. + * low minlatency will tear/flicker more, as it can "detect" idle too early. + */ +static double minlatency = 8; +static double maxlatency = 33; + +/* + * 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[] = { + /* 8 normal colors */ + "black", + "red3", + "green3", + "yellow3", + "blue2", + "magenta3", + "cyan3", + "gray90", + + /* 8 bright colors */ + "gray50", + "red", + "green", + "yellow", + "#5c5cff", + "magenta", + "cyan", + "white", + + [255] = 0, + + /* more colors can be added after 255 to use with DefaultXX */ + "#cccccc", + "#555555", + "gray90", /* default foreground colour */ + "black", /* default background colour */ +}; + + +/* + * Default colors (colorname index) + * foreground, background, cursor, reverse cursor + */ +unsigned int defaultfg = 258; +unsigned int defaultbg = 259; +unsigned int defaultcs = 256; +static unsigned int defaultrcs = 257; + +/* + * Default shape of cursor + * 2: Block ("█") + * 4: Underline ("_") + * 6: Bar ("|") + * 7: Snowman ("☃") + */ +static unsigned int cursorshape = 2; + +/* + * 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_xterm; +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; + +/* + * Force mouse select/shortcuts 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 forcemousemod = ShiftMask; + +/* + * Internal mouse shortcuts. + * Beware that overloading Button1 will disable the selection. + */ +static MouseShortcut mshortcuts[] = { + /* mask button function argument release */ + { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, + { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} }, + { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, + { ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} }, + { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} }, +}; + +/* Internal keyboard shortcuts. */ +#define MODKEY Mod1Mask +#define TERMMOD (ControlMask|ShiftMask) + +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} }, + { TERMMOD, XK_Home, zoomreset, {.f = 0} }, + { TERMMOD, XK_C, clipcopy, {.i = 0} }, + { TERMMOD, XK_V, clippaste, {.i = 0} }, + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, + { TERMMOD, XK_Escape, keyboard_select,{ 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 + * + * 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; + +/* + * 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, "\033Ox", +1, 0}, + { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1}, + { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1}, + { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0}, + { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1}, + { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1}, + { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0}, + { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1}, + { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1}, + { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0}, + { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1}, + { XK_KP_Right, XK_ANY_MOD, "\033OC", 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, "\033Oj", +2, 0}, + { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0}, + { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0}, + { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0}, + { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0}, + { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0}, + { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0}, + { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0}, + { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0}, + { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0}, + { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0}, + { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0}, + { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0}, + { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0}, + { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0}, + { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0}, + { XK_KP_9, XK_ANY_MOD, "\033Oy", +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, "\033OA", 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, "\033OB", 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, "\033OD", 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, "\033OC", 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, "\033OP" , 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, "\033OQ" , 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, "\033OR" , 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, "\033OS" , 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{|}~"; diff --git a/patches/st-keyboard_select-0.8.2.diff b/patches/st-keyboard_select-0.8.2.diff new file mode 100644 index 0000000..8059b4b --- /dev/null +++ b/patches/st-keyboard_select-0.8.2.diff @@ -0,0 +1,336 @@ +From 45cadc1ce5d8d9dd3493c2e9979e8958d87e8bc5 Mon Sep 17 00:00:00 2001 +From: Bartosz Sosna +Date: Sat, 4 May 2019 00:28:24 +0200 +Subject: [PATCH] Adjust patch to version st-0.8.2 + +--- + config.def.h | 1 + + st.c | 222 +++++++++++++++++++++++++++++++++++++++++++++++++++ + st.h | 1 + + win.h | 3 + + x.c | 15 ++++ + 5 files changed, 242 insertions(+) + +diff --git a/config.def.h b/config.def.h +index 482901e..c1e9cce 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -178,6 +178,7 @@ static Shortcut shortcuts[] = { + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, ++ { TERMMOD, XK_Escape, keyboard_select,{ 0 } }, + }; + + /* +diff --git a/st.c b/st.c +index ede7ae6..c2116b2 100644 +--- a/st.c ++++ b/st.c +@@ -16,6 +16,8 @@ + #include + #include + #include ++#include ++#include + + #include "st.h" + #include "win.h" +@@ -2464,6 +2466,9 @@ tresize(int col, int row) + int *bp; + TCursor c; + ++ if ( row < term.row || col < term.col ) ++ toggle_winmode(trt_kbdselect(XK_Escape, NULL, 0)); ++ + if (col < 1 || row < 1) { + fprintf(stderr, + "tresize: error resizing to %dx%d\n", col, row); +@@ -2586,3 +2591,220 @@ redraw(void) + tfulldirt(); + draw(); + } ++ ++void set_notifmode(int type, KeySym ksym) { ++ static char *lib[] = { " MOVE ", " SEL "}; ++ static Glyph *g, *deb, *fin; ++ static int col, bot; ++ ++ if ( ksym == -1 ) { ++ free(g); ++ col = term.col, bot = term.bot; ++ g = xmalloc(col * sizeof(Glyph)); ++ memcpy(g, term.line[bot], col * sizeof(Glyph)); ++ ++ } ++ else if ( ksym == -2 ) ++ memcpy(term.line[bot], g, col * sizeof(Glyph)); ++ ++ if ( type < 2 ) { ++ char *z = lib[type]; ++ for (deb = &term.line[bot][col - 6], fin = &term.line[bot][col]; deb < fin; z++, deb++) ++ deb->mode = ATTR_REVERSE, ++ deb->u = *z, ++ deb->fg = defaultfg, deb->bg = defaultbg; ++ } ++ else if ( type < 5 ) ++ memcpy(term.line[bot], g, col * sizeof(Glyph)); ++ else { ++ for (deb = &term.line[bot][0], fin = &term.line[bot][col]; deb < fin; deb++) ++ deb->mode = ATTR_REVERSE, ++ deb->u = ' ', ++ deb->fg = defaultfg, deb->bg = defaultbg; ++ term.line[bot][0].u = ksym; ++ } ++ ++ term.dirty[bot] = 1; ++ drawregion(0, bot, col, bot + 1); ++} ++ ++void select_or_drawcursor(int selectsearch_mode, int type) { ++ int done = 0; ++ ++ if ( selectsearch_mode & 1 ) { ++ selextend(term.c.x, term.c.y, type, done); ++ xsetsel(getsel()); ++ } ++ else ++ xdrawcursor(term.c.x, term.c.y, term.line[term.c.y][term.c.x], ++ term.ocx, term.ocy, term.line[term.ocy][term.ocx]); ++} ++ ++void search(int selectsearch_mode, Rune *target, int ptarget, int incr, int type, TCursor *cu) { ++ Rune *r; ++ int i, bound = (term.col * cu->y + cu->x) * (incr > 0) + incr; ++ ++ for (i = term.col * term.c.y + term.c.x + incr; i != bound; i += incr) { ++ for (r = target; r - target < ptarget; r++) { ++ if ( *r == term.line[(i + r - target) / term.col][(i + r - target) % term.col].u ) { ++ if ( r - target == ptarget - 1 ) break; ++ } else { ++ r = NULL; ++ break; ++ } ++ } ++ if ( r != NULL ) break; ++ } ++ ++ if ( i != bound ) { ++ term.c.y = i / term.col, term.c.x = i % term.col; ++ select_or_drawcursor(selectsearch_mode, type); ++ } ++} ++ ++int trt_kbdselect(KeySym ksym, char *buf, int len) { ++ static TCursor cu; ++ static Rune target[64]; ++ static int type = 1, ptarget, in_use; ++ static int sens, quant; ++ static char selectsearch_mode; ++ int i, bound, *xy; ++ ++ ++ if ( selectsearch_mode & 2 ) { ++ if ( ksym == XK_Return ) { ++ selectsearch_mode ^= 2; ++ set_notifmode(selectsearch_mode, -2); ++ if ( ksym == XK_Escape ) ptarget = 0; ++ return 0; ++ } ++ else if ( ksym == XK_BackSpace ) { ++ if ( !ptarget ) return 0; ++ term.line[term.bot][ptarget--].u = ' '; ++ } ++ else if ( len < 1 ) { ++ return 0; ++ } ++ else if ( ptarget == term.col || ksym == XK_Escape ) { ++ return 0; ++ } ++ else { ++ utf8decode(buf, &target[ptarget++], len); ++ term.line[term.bot][ptarget].u = target[ptarget - 1]; ++ } ++ ++ if ( ksym != XK_BackSpace ) ++ search(selectsearch_mode, &target[0], ptarget, sens, type, &cu); ++ ++ term.dirty[term.bot] = 1; ++ drawregion(0, term.bot, term.col, term.bot + 1); ++ return 0; ++ } ++ ++ switch ( ksym ) { ++ case -1 : ++ in_use = 1; ++ cu.x = term.c.x, cu.y = term.c.y; ++ set_notifmode(0, ksym); ++ return MODE_KBDSELECT; ++ case XK_s : ++ if ( selectsearch_mode & 1 ) ++ selclear(); ++ else ++ selstart(term.c.x, term.c.y, 0); ++ set_notifmode(selectsearch_mode ^= 1, ksym); ++ break; ++ case XK_t : ++ selextend(term.c.x, term.c.y, type ^= 3, i = 0); /* 2 fois */ ++ selextend(term.c.x, term.c.y, type, i = 0); ++ break; ++ case XK_slash : ++ case XK_KP_Divide : ++ case XK_question : ++ ksym &= XK_question; /* Divide to slash */ ++ sens = (ksym == XK_slash) ? -1 : 1; ++ ptarget = 0; ++ set_notifmode(15, ksym); ++ selectsearch_mode ^= 2; ++ break; ++ case XK_Escape : ++ if ( !in_use ) break; ++ selclear(); ++ case XK_Return : ++ set_notifmode(4, ksym); ++ term.c.x = cu.x, term.c.y = cu.y; ++ select_or_drawcursor(selectsearch_mode = 0, type); ++ in_use = quant = 0; ++ return MODE_KBDSELECT; ++ case XK_n : ++ case XK_N : ++ if ( ptarget ) ++ search(selectsearch_mode, &target[0], ptarget, (ksym == XK_n) ? -1 : 1, type, &cu); ++ break; ++ case XK_BackSpace : ++ term.c.x = 0; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_dollar : ++ term.c.x = term.col - 1; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_Home : ++ term.c.x = 0, term.c.y = 0; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_End : ++ term.c.x = cu.x, term.c.y = cu.y; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_Page_Up : ++ case XK_Page_Down : ++ term.c.y = (ksym == XK_Prior ) ? 0 : cu.y; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_exclam : ++ term.c.x = term.col >> 1; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_asterisk : ++ case XK_KP_Multiply : ++ term.c.x = term.col >> 1; ++ case XK_underscore : ++ term.c.y = cu.y >> 1; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ default : ++ if ( ksym >= XK_0 && ksym <= XK_9 ) { /* 0-9 keyboard */ ++ quant = (quant * 10) + (ksym ^ XK_0); ++ return 0; ++ } ++ else if ( ksym >= XK_KP_0 && ksym <= XK_KP_9 ) { /* 0-9 numpad */ ++ quant = (quant * 10) + (ksym ^ XK_KP_0); ++ return 0; ++ } ++ else if ( ksym == XK_k || ksym == XK_h ) ++ i = ksym & 1; ++ else if ( ksym == XK_l || ksym == XK_j ) ++ i = ((ksym & 6) | 4) >> 1; ++ else if ( (XK_Home & ksym) != XK_Home || (i = (ksym ^ XK_Home) - 1) > 3 ) ++ break; ++ ++ xy = (i & 1) ? &term.c.y : &term.c.x; ++ sens = (i & 2) ? 1 : -1; ++ bound = (i >> 1 ^ 1) ? 0 : (i ^ 3) ? term.col - 1 : term.bot; ++ ++ if ( quant == 0 ) ++ quant++; ++ ++ if ( *xy == bound && ((sens < 0 && bound == 0) || (sens > 0 && bound > 0)) ) ++ break; ++ ++ *xy += quant * sens; ++ if ( *xy < 0 || ( bound > 0 && *xy > bound) ) ++ *xy = bound; ++ ++ select_or_drawcursor(selectsearch_mode, type); ++ } ++ quant = 0; ++ return 0; ++} +diff --git a/st.h b/st.h +index 4da3051..22125e4 100644 +--- a/st.h ++++ b/st.h +@@ -109,6 +109,7 @@ size_t utf8encode(Rune, char *); + void *xmalloc(size_t); + void *xrealloc(void *, size_t); + char *xstrdup(char *); ++int trt_kbdselect(KeySym, char *, int); + + /* config.h globals */ + extern char *utmp; +diff --git a/win.h b/win.h +index a6ef1b9..a240783 100644 +--- a/win.h ++++ b/win.h +@@ -21,6 +21,7 @@ enum win_mode { + MODE_NUMLOCK = 1 << 17, + MODE_MOUSE = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\ + |MODE_MOUSEMANY, ++ MODE_KBDSELECT = 1 << 18, + }; + + void xbell(void); +@@ -36,4 +37,6 @@ void xsetmode(int, unsigned int); + void xsetpointermotion(int); + void xsetsel(char *); + int xstartdraw(void); ++void toggle_winmode(int); ++void keyboard_select(const Arg *); + void xximspot(int, int); +diff --git a/x.c b/x.c +index 5828a3b..5221641 100644 +--- a/x.c ++++ b/x.c +@@ -1731,6 +1731,13 @@ kpress(XEvent *ev) + return; + + len = XmbLookupString(xw.xic, e, buf, sizeof buf, &ksym, &status); ++ if ( IS_SET(MODE_KBDSELECT) ) { ++ if ( match(XK_NO_MOD, e->state) || ++ (XK_Shift_L | XK_Shift_R) & e->state ) ++ win.mode ^= trt_kbdselect(ksym, buf, len); ++ return; ++ } ++ + /* 1. shortcuts */ + for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { + if (ksym == bp->keysym && match(bp->mod, e->state)) { +@@ -1914,6 +1921,14 @@ usage(void) + " [stty_args ...]\n", argv0, argv0); + } + ++void toggle_winmode(int flag) { ++ win.mode ^= flag; ++} ++ ++void keyboard_select(const Arg *dummy) { ++ win.mode ^= trt_kbdselect(-1, NULL, 0); ++} ++ + int + main(int argc, char *argv[]) + { +-- +2.17.1 + diff --git a/patches/st-keyboard_select-20200617-9ba7ecf.diff b/patches/st-keyboard_select-20200617-9ba7ecf.diff new file mode 100644 index 0000000..fac41ea --- /dev/null +++ b/patches/st-keyboard_select-20200617-9ba7ecf.diff @@ -0,0 +1,319 @@ +diff --git a/config.def.h b/config.def.h +index 6f05dce..54612d1 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -199,6 +199,7 @@ static Shortcut shortcuts[] = { + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, ++ { TERMMOD, XK_Escape, keyboard_select,{.i = 0} }, + }; + + /* +diff --git a/st.c b/st.c +index ef8abd5..0c6c6ca 100644 +--- a/st.c ++++ b/st.c +@@ -16,6 +16,8 @@ + #include + #include + #include ++#include ++#include + + #include "st.h" + #include "win.h" +@@ -2487,6 +2489,9 @@ tresize(int col, int row) + int *bp; + TCursor c; + ++ if ( row < term.row || col < term.col ) ++ toggle_winmode(trt_kbdselect(XK_Escape, NULL, 0)); ++ + if (col < 1 || row < 1) { + fprintf(stderr, + "tresize: error resizing to %dx%d\n", col, row); +@@ -2612,3 +2617,220 @@ redraw(void) + tfulldirt(); + draw(); + } ++ ++void set_notifmode(int type, KeySym ksym) { ++ static char *lib[] = { " MOVE ", " SEL "}; ++ static Glyph *g, *deb, *fin; ++ static int col, bot; ++ ++ if ( ksym == -1 ) { ++ free(g); ++ col = term.col, bot = term.bot; ++ g = xmalloc(col * sizeof(Glyph)); ++ memcpy(g, term.line[bot], col * sizeof(Glyph)); ++ ++ } ++ else if ( ksym == -2 ) ++ memcpy(term.line[bot], g, col * sizeof(Glyph)); ++ ++ if ( type < 2 ) { ++ char *z = lib[type]; ++ for (deb = &term.line[bot][col - 6], fin = &term.line[bot][col]; deb < fin; z++, deb++) ++ deb->mode = ATTR_REVERSE, ++ deb->u = *z, ++ deb->fg = defaultfg, deb->bg = defaultbg; ++ } ++ else if ( type < 5 ) ++ memcpy(term.line[bot], g, col * sizeof(Glyph)); ++ else { ++ for (deb = &term.line[bot][0], fin = &term.line[bot][col]; deb < fin; deb++) ++ deb->mode = ATTR_REVERSE, ++ deb->u = ' ', ++ deb->fg = defaultfg, deb->bg = defaultbg; ++ term.line[bot][0].u = ksym; ++ } ++ ++ term.dirty[bot] = 1; ++ drawregion(0, bot, col, bot + 1); ++} ++ ++void select_or_drawcursor(int selectsearch_mode, int type) { ++ int done = 0; ++ ++ if ( selectsearch_mode & 1 ) { ++ selextend(term.c.x, term.c.y, type, done); ++ xsetsel(getsel()); ++ } ++ else ++ xdrawcursor(term.c.x, term.c.y, term.line[term.c.y][term.c.x], ++ term.ocx, term.ocy, term.line[term.ocy][term.ocx]); ++} ++ ++void search(int selectsearch_mode, Rune *target, int ptarget, int incr, int type, TCursor *cu) { ++ Rune *r; ++ int i, bound = (term.col * cu->y + cu->x) * (incr > 0) + incr; ++ ++ for (i = term.col * term.c.y + term.c.x + incr; i != bound; i += incr) { ++ for (r = target; r - target < ptarget; r++) { ++ if ( *r == term.line[(i + r - target) / term.col][(i + r - target) % term.col].u ) { ++ if ( r - target == ptarget - 1 ) break; ++ } else { ++ r = NULL; ++ break; ++ } ++ } ++ if ( r != NULL ) break; ++ } ++ ++ if ( i != bound ) { ++ term.c.y = i / term.col, term.c.x = i % term.col; ++ select_or_drawcursor(selectsearch_mode, type); ++ } ++} ++ ++int trt_kbdselect(KeySym ksym, char *buf, int len) { ++ static TCursor cu; ++ static Rune target[64]; ++ static int type = 1, ptarget, in_use; ++ static int sens, quant; ++ static char selectsearch_mode; ++ int i, bound, *xy; ++ ++ ++ if ( selectsearch_mode & 2 ) { ++ if ( ksym == XK_Return ) { ++ selectsearch_mode ^= 2; ++ set_notifmode(selectsearch_mode, -2); ++ if ( ksym == XK_Escape ) ptarget = 0; ++ return 0; ++ } ++ else if ( ksym == XK_BackSpace ) { ++ if ( !ptarget ) return 0; ++ term.line[term.bot][ptarget--].u = ' '; ++ } ++ else if ( len < 1 ) { ++ return 0; ++ } ++ else if ( ptarget == term.col || ksym == XK_Escape ) { ++ return 0; ++ } ++ else { ++ utf8decode(buf, &target[ptarget++], len); ++ term.line[term.bot][ptarget].u = target[ptarget - 1]; ++ } ++ ++ if ( ksym != XK_BackSpace ) ++ search(selectsearch_mode, &target[0], ptarget, sens, type, &cu); ++ ++ term.dirty[term.bot] = 1; ++ drawregion(0, term.bot, term.col, term.bot + 1); ++ return 0; ++ } ++ ++ switch ( ksym ) { ++ case -1 : ++ in_use = 1; ++ cu.x = term.c.x, cu.y = term.c.y; ++ set_notifmode(0, ksym); ++ return MODE_KBDSELECT; ++ case XK_s : ++ if ( selectsearch_mode & 1 ) ++ selclear(); ++ else ++ selstart(term.c.x, term.c.y, 0); ++ set_notifmode(selectsearch_mode ^= 1, ksym); ++ break; ++ case XK_t : ++ selextend(term.c.x, term.c.y, type ^= 3, i = 0); /* 2 fois */ ++ selextend(term.c.x, term.c.y, type, i = 0); ++ break; ++ case XK_slash : ++ case XK_KP_Divide : ++ case XK_question : ++ ksym &= XK_question; /* Divide to slash */ ++ sens = (ksym == XK_slash) ? -1 : 1; ++ ptarget = 0; ++ set_notifmode(15, ksym); ++ selectsearch_mode ^= 2; ++ break; ++ case XK_Escape : ++ if ( !in_use ) break; ++ selclear(); ++ case XK_Return : ++ set_notifmode(4, ksym); ++ term.c.x = cu.x, term.c.y = cu.y; ++ select_or_drawcursor(selectsearch_mode = 0, type); ++ in_use = quant = 0; ++ return MODE_KBDSELECT; ++ case XK_n : ++ case XK_N : ++ if ( ptarget ) ++ search(selectsearch_mode, &target[0], ptarget, (ksym == XK_n) ? -1 : 1, type, &cu); ++ break; ++ case XK_BackSpace : ++ term.c.x = 0; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_dollar : ++ term.c.x = term.col - 1; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_Home : ++ term.c.x = 0, term.c.y = 0; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_End : ++ term.c.x = cu.x, term.c.y = cu.y; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_Page_Up : ++ case XK_Page_Down : ++ term.c.y = (ksym == XK_Prior ) ? 0 : cu.y; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_exclam : ++ term.c.x = term.col >> 1; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_asterisk : ++ case XK_KP_Multiply : ++ term.c.x = term.col >> 1; ++ case XK_underscore : ++ term.c.y = cu.y >> 1; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ default : ++ if ( ksym >= XK_0 && ksym <= XK_9 ) { /* 0-9 keyboard */ ++ quant = (quant * 10) + (ksym ^ XK_0); ++ return 0; ++ } ++ else if ( ksym >= XK_KP_0 && ksym <= XK_KP_9 ) { /* 0-9 numpad */ ++ quant = (quant * 10) + (ksym ^ XK_KP_0); ++ return 0; ++ } ++ else if ( ksym == XK_k || ksym == XK_h ) ++ i = ksym & 1; ++ else if ( ksym == XK_l || ksym == XK_j ) ++ i = ((ksym & 6) | 4) >> 1; ++ else if ( (XK_Home & ksym) != XK_Home || (i = (ksym ^ XK_Home) - 1) > 3 ) ++ break; ++ ++ xy = (i & 1) ? &term.c.y : &term.c.x; ++ sens = (i & 2) ? 1 : -1; ++ bound = (i >> 1 ^ 1) ? 0 : (i ^ 3) ? term.col - 1 : term.bot; ++ ++ if ( quant == 0 ) ++ quant++; ++ ++ if ( *xy == bound && ((sens < 0 && bound == 0) || (sens > 0 && bound > 0)) ) ++ break; ++ ++ *xy += quant * sens; ++ if ( *xy < 0 || ( bound > 0 && *xy > bound) ) ++ *xy = bound; ++ ++ select_or_drawcursor(selectsearch_mode, type); ++ } ++ quant = 0; ++ return 0; ++} +diff --git a/st.h b/st.h +index 3d351b6..2d1a11b 100644 +--- a/st.h ++++ b/st.h +@@ -110,6 +110,7 @@ size_t utf8encode(Rune, char *); + void *xmalloc(size_t); + void *xrealloc(void *, size_t); + char *xstrdup(char *); ++int trt_kbdselect(KeySym, char *, int); + + /* config.h globals */ + extern char *utmp; +diff --git a/win.h b/win.h +index a6ef1b9..9a47fbb 100644 +--- a/win.h ++++ b/win.h +@@ -21,6 +21,7 @@ enum win_mode { + MODE_NUMLOCK = 1 << 17, + MODE_MOUSE = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\ + |MODE_MOUSEMANY, ++ MODE_KBDSELECT = 1 << 18, + }; + + void xbell(void); +@@ -36,4 +37,6 @@ void xsetmode(int, unsigned int); + void xsetpointermotion(int); + void xsetsel(char *); + int xstartdraw(void); ++void toggle_winmode(int); ++void keyboard_select(const Arg *); + void xximspot(int, int); +diff --git a/x.c b/x.c +index 210f184..b77ce54 100644 +--- a/x.c ++++ b/x.c +@@ -1800,6 +1800,12 @@ kpress(XEvent *ev) + len = XmbLookupString(xw.ime.xic, e, buf, sizeof buf, &ksym, &status); + else + len = XLookupString(e, buf, sizeof buf, &ksym, NULL); ++ if ( IS_SET(MODE_KBDSELECT) ) { ++ if ( match(XK_NO_MOD, e->state) || ++ (XK_Shift_L | XK_Shift_R) & e->state ) ++ win.mode ^= trt_kbdselect(ksym, buf, len); ++ return; ++ } + /* 1. shortcuts */ + for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { + if (ksym == bp->keysym && match(bp->mod, e->state)) { +@@ -1977,6 +1983,14 @@ usage(void) + " [stty_args ...]\n", argv0, argv0); + } + ++void toggle_winmode(int flag) { ++ win.mode ^= flag; ++} ++ ++void keyboard_select(const Arg *dummy) { ++ win.mode ^= trt_kbdselect(-1, NULL, 0); ++} ++ + int + main(int argc, char *argv[]) + { diff --git a/st b/st new file mode 100755 index 0000000000000000000000000000000000000000..7d1fc907aee8d3872957071a317661611847deb6 GIT binary patch literal 110368 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 z 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 Dq|WL| diff --git a/x.c b/x.c index 12e3d89..217988a 100644 --- a/x.c +++ b/x.c @@ -14,6 +14,7 @@ #include #include #include +#include char *argv0; #include "arg.h" @@ -45,6 +46,19 @@ typedef struct { signed char appcursor; /* application cursor */ } Key; +/* Xresources preferences */ +enum resource_type { + STRING = 0, + INTEGER = 1, + FLOAT = 2 +}; + +typedef struct { + char *name; + enum resource_type type; + void *dst; +} ResourcePref; + /* X modifiers */ #define XK_ANY_MOD UINT_MAX #define XK_NO_MOD 0 @@ -157,6 +171,8 @@ static void xhints(void); static int xloadcolor(int, const char *, Color *); static int xloadfont(Font *, FcPattern *); static void xloadfonts(const char *, double); +static int xloadsparefont(FcPattern *, int); +static void xloadsparefonts(void); static void xunloadfont(Font *); static void xunloadfonts(void); static void xsetenv(void); @@ -306,6 +322,7 @@ zoomabs(const Arg *arg) { xunloadfonts(); xloadfonts(usedfont, arg->f); + xloadsparefonts(); cresize(0, 0); redraw(); xhints(); @@ -859,8 +876,8 @@ xclear(int x1, int y1, int x2, int y2) void xhints(void) { - XClassHint class = {opt_name ? opt_name : termname, - opt_class ? opt_class : termname}; + XClassHint class = {opt_name ? opt_name : "st", + opt_class ? opt_class : "St"}; XWMHints wm = {.flags = InputHint, .input = 1}; XSizeHints *sizeh; @@ -1050,6 +1067,101 @@ xloadfonts(const char *fontstr, double fontsize) FcPatternDestroy(pattern); } +int +xloadsparefont(FcPattern *pattern, int flags) +{ + FcPattern *match; + FcResult result; + + match = FcFontMatch(NULL, pattern, &result); + if (!match) { + return 1; + } + + if (!(frc[frclen].font = XftFontOpenPattern(xw.dpy, match))) { + FcPatternDestroy(match); + return 1; + } + + frc[frclen].flags = flags; + /* Believe U+0000 glyph will present in each default font */ + frc[frclen].unicodep = 0; + frclen++; + + return 0; +} + +void +xloadsparefonts(void) +{ + FcPattern *pattern; + double sizeshift, fontval; + int fc; + char **fp; + + if (frclen != 0) + die("can't embed spare fonts. cache isn't empty"); + + /* Calculate count of spare fonts */ + fc = sizeof(font2) / sizeof(*font2); + if (fc == 0) + return; + + /* Allocate memory for cache entries. */ + if (frccap < 4 * fc) { + frccap += 4 * fc - frccap; + frc = xrealloc(frc, frccap * sizeof(Fontcache)); + } + + for (fp = font2; fp - font2 < fc; ++fp) { + + if (**fp == '-') + pattern = XftXlfdParse(*fp, False, False); + else + pattern = FcNameParse((FcChar8 *)*fp); + + if (!pattern) + die("can't open spare font %s\n", *fp); + + if (defaultfontsize > 0) { + sizeshift = usedfontsize - defaultfontsize; + if (sizeshift != 0 && + FcPatternGetDouble(pattern, FC_PIXEL_SIZE, 0, &fontval) == + FcResultMatch) { + fontval += sizeshift; + FcPatternDel(pattern, FC_PIXEL_SIZE); + FcPatternDel(pattern, FC_SIZE); + FcPatternAddDouble(pattern, FC_PIXEL_SIZE, fontval); + } + } + + FcPatternAddBool(pattern, FC_SCALABLE, 1); + + FcConfigSubstitute(NULL, pattern, FcMatchPattern); + XftDefaultSubstitute(xw.dpy, xw.scr, pattern); + + if (xloadsparefont(pattern, FRC_NORMAL)) + die("can't open spare font %s\n", *fp); + + FcPatternDel(pattern, FC_SLANT); + FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); + if (xloadsparefont(pattern, FRC_ITALIC)) + die("can't open spare font %s\n", *fp); + + FcPatternDel(pattern, FC_WEIGHT); + FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); + if (xloadsparefont(pattern, FRC_ITALICBOLD)) + die("can't open spare font %s\n", *fp); + + FcPatternDel(pattern, FC_SLANT); + FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN); + if (xloadsparefont(pattern, FRC_BOLD)) + die("can't open spare font %s\n", *fp); + + FcPatternDestroy(pattern); + } +} + void xunloadfont(Font *f) { @@ -1135,8 +1247,6 @@ xinit(int cols, int rows) pid_t thispid = getpid(); XColor xmousefg, xmousebg; - if (!(xw.dpy = XOpenDisplay(NULL))) - die("can't open display\n"); xw.scr = XDefaultScreen(xw.dpy); xw.vis = XDefaultVisual(xw.dpy, xw.scr); @@ -1147,6 +1257,9 @@ xinit(int cols, int rows) usedfont = (opt_font == NULL)? font : opt_font; xloadfonts(usedfont, 0); + /* spare fonts */ + xloadsparefonts(); + /* colors */ xw.cmap = XDefaultColormap(xw.dpy, xw.scr); xloadcols(); @@ -2021,6 +2134,59 @@ run(void) } } +int +resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst) +{ + char **sdst = dst; + int *idst = dst; + float *fdst = dst; + + char fullname[256]; + char fullclass[256]; + char *type; + XrmValue ret; + + snprintf(fullname, sizeof(fullname), "%s.%s", + opt_name ? opt_name : "st", name); + snprintf(fullclass, sizeof(fullclass), "%s.%s", + opt_class ? opt_class : "St", name); + fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0'; + + XrmGetResource(db, fullname, fullclass, &type, &ret); + if (ret.addr == NULL || strncmp("String", type, 64)) + return 1; + + switch (rtype) { + case STRING: + *sdst = ret.addr; + break; + case INTEGER: + *idst = strtoul(ret.addr, NULL, 10); + break; + case FLOAT: + *fdst = strtof(ret.addr, NULL); + break; + } + return 0; +} + +void +config_init(void) +{ + char *resm; + XrmDatabase db; + ResourcePref *p; + + XrmInitialize(); + resm = XResourceManagerString(xw.dpy); + if (!resm) + return; + + db = XrmGetStringDatabase(resm); + for (p = resources; p < resources + LEN(resources); p++) + resource_load(db, p->name, p->type, p->dst); +} + void usage(void) { @@ -2102,6 +2268,11 @@ run: setlocale(LC_CTYPE, ""); XSetLocaleModifiers(""); + + if(!(xw.dpy = XOpenDisplay(NULL))) + die("Can't open display\n"); + + config_init(); cols = MAX(cols, 1); rows = MAX(rows, 1); tnew(cols, rows); diff --git a/x.c.orig b/x.c.orig new file mode 100644 index 0000000..fad97dc --- /dev/null +++ b/x.c.orig @@ -0,0 +1,2215 @@ +/* See LICENSE for license details. */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +char *argv0; +#include "arg.h" +#include "st.h" +#include "win.h" + +/* types used in config.h */ +typedef struct { + uint mod; + KeySym keysym; + void (*func)(const Arg *); + const Arg arg; +} Shortcut; + +typedef struct { + uint mod; + uint button; + void (*func)(const Arg *); + const Arg arg; + uint release; +} MouseShortcut; + +typedef struct { + KeySym k; + uint mask; + char *s; + /* three-valued logic variables: 0 indifferent, 1 on, -1 off */ + signed char appkey; /* application keypad */ + signed char appcursor; /* application cursor */ +} Key; + +/* X modifiers */ +#define XK_ANY_MOD UINT_MAX +#define XK_NO_MOD 0 +#define XK_SWITCH_MOD (1<<13|1<<14) + +/* function definitions used in config.h */ +static void clipcopy(const Arg *); +static void clippaste(const Arg *); +static void numlock(const Arg *); +static void selpaste(const Arg *); +static void zoom(const Arg *); +static void zoomabs(const Arg *); +static void zoomreset(const Arg *); +static void ttysend(const Arg *); + +/* config.h for applying patches and the configuration. */ +#include "config.h" + +/* XEMBED messages */ +#define XEMBED_FOCUS_IN 4 +#define XEMBED_FOCUS_OUT 5 + +/* macros */ +#define IS_SET(flag) ((win.mode & (flag)) != 0) +#define TRUERED(x) (((x) & 0xff0000) >> 8) +#define TRUEGREEN(x) (((x) & 0xff00)) +#define TRUEBLUE(x) (((x) & 0xff) << 8) + +typedef XftDraw *Draw; +typedef XftColor Color; +typedef XftGlyphFontSpec GlyphFontSpec; + +/* Purely graphic info */ +typedef struct { + int tw, th; /* tty width and height */ + int w, h; /* window width and height */ + int ch; /* char height */ + int cw; /* char width */ + int mode; /* window state/mode flags */ + int cursor; /* cursor style */ +} TermWindow; + +typedef struct { + Display *dpy; + Colormap cmap; + Window win; + Drawable buf; + GlyphFontSpec *specbuf; /* font spec buffer used for rendering */ + Atom xembed, wmdeletewin, netwmname, netwmiconname, netwmpid; + struct { + XIM xim; + XIC xic; + XPoint spot; + XVaNestedList spotlist; + } ime; + Draw draw; + Visual *vis; + XSetWindowAttributes attrs; + int scr; + int isfixed; /* is fixed geometry? */ + int l, t; /* left and top offset */ + int gm; /* geometry mask */ +} XWindow; + +typedef struct { + Atom xtarget; + char *primary, *clipboard; + struct timespec tclick1; + struct timespec tclick2; +} XSelection; + +/* Font structure */ +#define Font Font_ +typedef struct { + int height; + int width; + int ascent; + int descent; + int badslant; + int badweight; + short lbearing; + short rbearing; + XftFont *match; + FcFontSet *set; + FcPattern *pattern; +} Font; + +/* Drawing Context */ +typedef struct { + Color *col; + size_t collen; + Font font, bfont, ifont, ibfont; + GC gc; +} DC; + +static inline ushort sixd_to_16bit(int); +static int xmakeglyphfontspecs(XftGlyphFontSpec *, const Glyph *, int, int, int); +static void xdrawglyphfontspecs(const XftGlyphFontSpec *, Glyph, int, int, int, int); +static void xdrawglyph(Glyph, int, int); +static void xclear(int, int, int, int); +static int xgeommasktogravity(int); +static int ximopen(Display *); +static void ximinstantiate(Display *, XPointer, XPointer); +static void ximdestroy(XIM, XPointer, XPointer); +static int xicdestroy(XIC, XPointer, XPointer); +static void xinit(int, int); +static void cresize(int, int); +static void xresize(int, int); +static void xhints(void); +static int xloadcolor(int, const char *, Color *); +static int xloadfont(Font *, FcPattern *); +static void xloadfonts(const char *, double); +static int xloadsparefont(FcPattern *, int); +static void xloadsparefonts(void); +static void xunloadfont(Font *); +static void xunloadfonts(void); +static void xsetenv(void); +static void xseturgency(int); +static int evcol(XEvent *); +static int evrow(XEvent *); + +static void expose(XEvent *); +static void visibility(XEvent *); +static void unmap(XEvent *); +static void kpress(XEvent *); +static void cmessage(XEvent *); +static void resize(XEvent *); +static void focus(XEvent *); +static uint buttonmask(uint); +static int mouseaction(XEvent *, uint); +static void brelease(XEvent *); +static void bpress(XEvent *); +static void bmotion(XEvent *); +static void propnotify(XEvent *); +static void selnotify(XEvent *); +static void selclear_(XEvent *); +static void selrequest(XEvent *); +static void setsel(char *, Time); +static void mousesel(XEvent *, int); +static void mousereport(XEvent *); +static char *kmap(KeySym, uint); +static int match(uint, uint); + +static void run(void); +static void usage(void); + +static void (*handler[LASTEvent])(XEvent *) = { + [KeyPress] = kpress, + [ClientMessage] = cmessage, + [ConfigureNotify] = resize, + [VisibilityNotify] = visibility, + [UnmapNotify] = unmap, + [Expose] = expose, + [FocusIn] = focus, + [FocusOut] = focus, + [MotionNotify] = bmotion, + [ButtonPress] = bpress, + [ButtonRelease] = brelease, +/* + * Uncomment if you want the selection to disappear when you select something + * different in another window. + */ +/* [SelectionClear] = selclear_, */ + [SelectionNotify] = selnotify, +/* + * PropertyNotify is only turned on when there is some INCR transfer happening + * for the selection retrieval. + */ + [PropertyNotify] = propnotify, + [SelectionRequest] = selrequest, +}; + +/* Globals */ +static DC dc; +static XWindow xw; +static XSelection xsel; +static TermWindow win; + +/* Font Ring Cache */ +enum { + FRC_NORMAL, + FRC_ITALIC, + FRC_BOLD, + FRC_ITALICBOLD +}; + +typedef struct { + XftFont *font; + int flags; + Rune unicodep; +} Fontcache; + +/* Fontcache is an array now. A new font will be appended to the array. */ +static Fontcache *frc = NULL; +static int frclen = 0; +static int frccap = 0; +static char *usedfont = NULL; +static double usedfontsize = 0; +static double defaultfontsize = 0; + +static char *opt_class = NULL; +static char **opt_cmd = NULL; +static char *opt_embed = NULL; +static char *opt_font = NULL; +static char *opt_io = NULL; +static char *opt_line = NULL; +static char *opt_name = NULL; +static char *opt_title = NULL; + +static uint buttons; /* bit field of pressed buttons */ + +void +clipcopy(const Arg *dummy) +{ + Atom clipboard; + + free(xsel.clipboard); + xsel.clipboard = NULL; + + if (xsel.primary != NULL) { + xsel.clipboard = xstrdup(xsel.primary); + clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); + XSetSelectionOwner(xw.dpy, clipboard, xw.win, CurrentTime); + } +} + +void +clippaste(const Arg *dummy) +{ + Atom clipboard; + + clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); + XConvertSelection(xw.dpy, clipboard, xsel.xtarget, clipboard, + xw.win, CurrentTime); +} + +void +selpaste(const Arg *dummy) +{ + XConvertSelection(xw.dpy, XA_PRIMARY, xsel.xtarget, XA_PRIMARY, + xw.win, CurrentTime); +} + +void +numlock(const Arg *dummy) +{ + win.mode ^= MODE_NUMLOCK; +} + +void +zoom(const Arg *arg) +{ + Arg larg; + + larg.f = usedfontsize + arg->f; + zoomabs(&larg); +} + +void +zoomabs(const Arg *arg) +{ + xunloadfonts(); + xloadfonts(usedfont, arg->f); + xloadsparefonts(); + cresize(0, 0); + redraw(); + xhints(); +} + +void +zoomreset(const Arg *arg) +{ + Arg larg; + + if (defaultfontsize > 0) { + larg.f = defaultfontsize; + zoomabs(&larg); + } +} + +void +ttysend(const Arg *arg) +{ + ttywrite(arg->s, strlen(arg->s), 1); +} + +int +evcol(XEvent *e) +{ + int x = e->xbutton.x - borderpx; + LIMIT(x, 0, win.tw - 1); + return x / win.cw; +} + +int +evrow(XEvent *e) +{ + int y = e->xbutton.y - borderpx; + LIMIT(y, 0, win.th - 1); + return y / win.ch; +} + +void +mousesel(XEvent *e, int done) +{ + int type, seltype = SEL_REGULAR; + uint state = e->xbutton.state & ~(Button1Mask | forcemousemod); + + for (type = 1; type < LEN(selmasks); ++type) { + if (match(selmasks[type], state)) { + seltype = type; + break; + } + } + selextend(evcol(e), evrow(e), seltype, done); + if (done) + setsel(getsel(), e->xbutton.time); +} + +void +mousereport(XEvent *e) +{ + int len, btn, code; + int x = evcol(e), y = evrow(e); + int state = e->xbutton.state; + char buf[40]; + static int ox, oy; + + if (e->type == MotionNotify) { + if (x == ox && y == oy) + return; + if (!IS_SET(MODE_MOUSEMOTION) && !IS_SET(MODE_MOUSEMANY)) + return; + /* MODE_MOUSEMOTION: no reporting if no button is pressed */ + if (IS_SET(MODE_MOUSEMOTION) && buttons == 0) + return; + /* Set btn to lowest-numbered pressed button, or 12 if no + * buttons are pressed. */ + for (btn = 1; btn <= 11 && !(buttons & (1<<(btn-1))); btn++) + ; + code = 32; + } else { + btn = e->xbutton.button; + /* Only buttons 1 through 11 can be encoded */ + if (btn < 1 || btn > 11) + return; + if (e->type == ButtonRelease) { + /* MODE_MOUSEX10: no button release reporting */ + if (IS_SET(MODE_MOUSEX10)) + return; + /* Don't send release events for the scroll wheel */ + if (btn == 4 || btn == 5) + return; + } + code = 0; + } + + ox = x; + oy = y; + + /* Encode btn into code. If no button is pressed for a motion event in + * MODE_MOUSEMANY, then encode it as a release. */ + if ((!IS_SET(MODE_MOUSESGR) && e->type == ButtonRelease) || btn == 12) + code += 3; + else if (btn >= 8) + code += 128 + btn - 8; + else if (btn >= 4) + code += 64 + btn - 4; + else + code += btn - 1; + + if (!IS_SET(MODE_MOUSEX10)) { + code += ((state & ShiftMask ) ? 4 : 0) + + ((state & Mod1Mask ) ? 8 : 0) /* meta key: alt */ + + ((state & ControlMask) ? 16 : 0); + } + + if (IS_SET(MODE_MOUSESGR)) { + len = snprintf(buf, sizeof(buf), "\033[<%d;%d;%d%c", + code, x+1, y+1, + e->type == ButtonRelease ? 'm' : 'M'); + } else if (x < 223 && y < 223) { + len = snprintf(buf, sizeof(buf), "\033[M%c%c%c", + 32+code, 32+x+1, 32+y+1); + } else { + return; + } + + ttywrite(buf, len, 0); +} + +uint +buttonmask(uint button) +{ + return button == Button1 ? Button1Mask + : button == Button2 ? Button2Mask + : button == Button3 ? Button3Mask + : button == Button4 ? Button4Mask + : button == Button5 ? Button5Mask + : 0; +} + +int +mouseaction(XEvent *e, uint release) +{ + MouseShortcut *ms; + + /* ignore Buttonmask for Button - it's set on release */ + uint state = e->xbutton.state & ~buttonmask(e->xbutton.button); + + for (ms = mshortcuts; ms < mshortcuts + LEN(mshortcuts); ms++) { + if (ms->release == release && + ms->button == e->xbutton.button && + (match(ms->mod, state) || /* exact or forced */ + match(ms->mod, state & ~forcemousemod))) { + ms->func(&(ms->arg)); + return 1; + } + } + + return 0; +} + +void +bpress(XEvent *e) +{ + int btn = e->xbutton.button; + struct timespec now; + int snap; + + if (1 <= btn && btn <= 11) + buttons |= 1 << (btn-1); + + if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { + mousereport(e); + return; + } + + if (mouseaction(e, 0)) + return; + + if (btn == Button1) { + /* + * If the user clicks below predefined timeouts specific + * snapping behaviour is exposed. + */ + clock_gettime(CLOCK_MONOTONIC, &now); + if (TIMEDIFF(now, xsel.tclick2) <= tripleclicktimeout) { + snap = SNAP_LINE; + } else if (TIMEDIFF(now, xsel.tclick1) <= doubleclicktimeout) { + snap = SNAP_WORD; + } else { + snap = 0; + } + xsel.tclick2 = xsel.tclick1; + xsel.tclick1 = now; + + selstart(evcol(e), evrow(e), snap); + } +} + +void +propnotify(XEvent *e) +{ + XPropertyEvent *xpev; + Atom clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); + + xpev = &e->xproperty; + if (xpev->state == PropertyNewValue && + (xpev->atom == XA_PRIMARY || + xpev->atom == clipboard)) { + selnotify(e); + } +} + +void +selnotify(XEvent *e) +{ + ulong nitems, ofs, rem; + int format; + uchar *data, *last, *repl; + Atom type, incratom, property = None; + + incratom = XInternAtom(xw.dpy, "INCR", 0); + + ofs = 0; + if (e->type == SelectionNotify) + property = e->xselection.property; + else if (e->type == PropertyNotify) + property = e->xproperty.atom; + + if (property == None) + return; + + do { + if (XGetWindowProperty(xw.dpy, xw.win, property, ofs, + BUFSIZ/4, False, AnyPropertyType, + &type, &format, &nitems, &rem, + &data)) { + fprintf(stderr, "Clipboard allocation failed\n"); + return; + } + + if (e->type == PropertyNotify && nitems == 0 && rem == 0) { + /* + * If there is some PropertyNotify with no data, then + * this is the signal of the selection owner that all + * data has been transferred. We won't need to receive + * PropertyNotify events anymore. + */ + MODBIT(xw.attrs.event_mask, 0, PropertyChangeMask); + XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, + &xw.attrs); + } + + if (type == incratom) { + /* + * Activate the PropertyNotify events so we receive + * when the selection owner does send us the next + * chunk of data. + */ + MODBIT(xw.attrs.event_mask, 1, PropertyChangeMask); + XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, + &xw.attrs); + + /* + * Deleting the property is the transfer start signal. + */ + XDeleteProperty(xw.dpy, xw.win, (int)property); + continue; + } + + /* + * As seen in getsel: + * Line endings are inconsistent in the terminal and GUI world + * copy and pasting. When receiving some selection data, + * replace all '\n' with '\r'. + * FIXME: Fix the computer world. + */ + repl = data; + last = data + nitems * format / 8; + while ((repl = memchr(repl, '\n', last - repl))) { + *repl++ = '\r'; + } + + if (IS_SET(MODE_BRCKTPASTE) && ofs == 0) + ttywrite("\033[200~", 6, 0); + ttywrite((char *)data, nitems * format / 8, 1); + if (IS_SET(MODE_BRCKTPASTE) && rem == 0) + ttywrite("\033[201~", 6, 0); + XFree(data); + /* number of 32-bit chunks returned */ + ofs += nitems * format / 32; + } while (rem > 0); + + /* + * Deleting the property again tells the selection owner to send the + * next data chunk in the property. + */ + XDeleteProperty(xw.dpy, xw.win, (int)property); +} + +void +xclipcopy(void) +{ + clipcopy(NULL); +} + +void +selclear_(XEvent *e) +{ + selclear(); +} + +void +selrequest(XEvent *e) +{ + XSelectionRequestEvent *xsre; + XSelectionEvent xev; + Atom xa_targets, string, clipboard; + char *seltext; + + xsre = (XSelectionRequestEvent *) e; + xev.type = SelectionNotify; + xev.requestor = xsre->requestor; + xev.selection = xsre->selection; + xev.target = xsre->target; + xev.time = xsre->time; + if (xsre->property == None) + xsre->property = xsre->target; + + /* reject */ + xev.property = None; + + xa_targets = XInternAtom(xw.dpy, "TARGETS", 0); + if (xsre->target == xa_targets) { + /* respond with the supported type */ + string = xsel.xtarget; + XChangeProperty(xsre->display, xsre->requestor, xsre->property, + XA_ATOM, 32, PropModeReplace, + (uchar *) &string, 1); + xev.property = xsre->property; + } else if (xsre->target == xsel.xtarget || xsre->target == XA_STRING) { + /* + * xith XA_STRING non ascii characters may be incorrect in the + * requestor. It is not our problem, use utf8. + */ + clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); + if (xsre->selection == XA_PRIMARY) { + seltext = xsel.primary; + } else if (xsre->selection == clipboard) { + seltext = xsel.clipboard; + } else { + fprintf(stderr, + "Unhandled clipboard selection 0x%lx\n", + xsre->selection); + return; + } + if (seltext != NULL) { + XChangeProperty(xsre->display, xsre->requestor, + xsre->property, xsre->target, + 8, PropModeReplace, + (uchar *)seltext, strlen(seltext)); + xev.property = xsre->property; + } + } + + /* all done, send a notification to the listener */ + if (!XSendEvent(xsre->display, xsre->requestor, 1, 0, (XEvent *) &xev)) + fprintf(stderr, "Error sending SelectionNotify event\n"); +} + +void +setsel(char *str, Time t) +{ + if (!str) + return; + + free(xsel.primary); + xsel.primary = str; + + XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, t); + if (XGetSelectionOwner(xw.dpy, XA_PRIMARY) != xw.win) + selclear(); +} + +void +xsetsel(char *str) +{ + setsel(str, CurrentTime); +} + +void +brelease(XEvent *e) +{ + int btn = e->xbutton.button; + + if (1 <= btn && btn <= 11) + buttons &= ~(1 << (btn-1)); + + if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { + mousereport(e); + return; + } + + if (mouseaction(e, 1)) + return; + if (btn == Button1) + mousesel(e, 1); +} + +void +bmotion(XEvent *e) +{ + if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { + mousereport(e); + return; + } + + mousesel(e, 0); +} + +void +cresize(int width, int height) +{ + int col, row; + + if (width != 0) + win.w = width; + if (height != 0) + win.h = height; + + col = (win.w - 2 * borderpx) / win.cw; + row = (win.h - 2 * borderpx) / win.ch; + col = MAX(1, col); + row = MAX(1, row); + + tresize(col, row); + xresize(col, row); + ttyresize(win.tw, win.th); +} + +void +xresize(int col, int row) +{ + win.tw = col * win.cw; + win.th = row * win.ch; + + XFreePixmap(xw.dpy, xw.buf); + xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, + DefaultDepth(xw.dpy, xw.scr)); + XftDrawChange(xw.draw, xw.buf); + xclear(0, 0, win.w, win.h); + + /* resize to new width */ + xw.specbuf = xrealloc(xw.specbuf, col * sizeof(GlyphFontSpec)); +} + +ushort +sixd_to_16bit(int x) +{ + return x == 0 ? 0 : 0x3737 + 0x2828 * x; +} + +int +xloadcolor(int i, const char *name, Color *ncolor) +{ + XRenderColor color = { .alpha = 0xffff }; + + if (!name) { + if (BETWEEN(i, 16, 255)) { /* 256 color */ + if (i < 6*6*6+16) { /* same colors as xterm */ + color.red = sixd_to_16bit( ((i-16)/36)%6 ); + color.green = sixd_to_16bit( ((i-16)/6) %6 ); + color.blue = sixd_to_16bit( ((i-16)/1) %6 ); + } else { /* greyscale */ + color.red = 0x0808 + 0x0a0a * (i - (6*6*6+16)); + color.green = color.blue = color.red; + } + return XftColorAllocValue(xw.dpy, xw.vis, + xw.cmap, &color, ncolor); + } else + name = colorname[i]; + } + + return XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, ncolor); +} + +void +xloadcols(void) +{ + int i; + static int loaded; + Color *cp; + + if (loaded) { + for (cp = dc.col; cp < &dc.col[dc.collen]; ++cp) + XftColorFree(xw.dpy, xw.vis, xw.cmap, cp); + } else { + dc.collen = MAX(LEN(colorname), 256); + dc.col = xmalloc(dc.collen * sizeof(Color)); + } + + for (i = 0; i < dc.collen; i++) + if (!xloadcolor(i, NULL, &dc.col[i])) { + if (colorname[i]) + die("could not allocate color '%s'\n", colorname[i]); + else + die("could not allocate color %d\n", i); + } + loaded = 1; +} + +int +xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b) +{ + if (!BETWEEN(x, 0, dc.collen)) + return 1; + + *r = dc.col[x].color.red >> 8; + *g = dc.col[x].color.green >> 8; + *b = dc.col[x].color.blue >> 8; + + return 0; +} + +int +xsetcolorname(int x, const char *name) +{ + Color ncolor; + + if (!BETWEEN(x, 0, dc.collen)) + return 1; + + if (!xloadcolor(x, name, &ncolor)) + return 1; + + XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.col[x]); + dc.col[x] = ncolor; + + return 0; +} + +/* + * Absolute coordinates. + */ +void +xclear(int x1, int y1, int x2, int y2) +{ + XftDrawRect(xw.draw, + &dc.col[IS_SET(MODE_REVERSE)? defaultfg : defaultbg], + x1, y1, x2-x1, y2-y1); +} + +void +xhints(void) +{ + XClassHint class = {opt_name ? opt_name : termname, + opt_class ? opt_class : termname}; + XWMHints wm = {.flags = InputHint, .input = 1}; + XSizeHints *sizeh; + + sizeh = XAllocSizeHints(); + + sizeh->flags = PSize | PResizeInc | PBaseSize | PMinSize; + sizeh->height = win.h; + sizeh->width = win.w; + sizeh->height_inc = win.ch; + sizeh->width_inc = win.cw; + sizeh->base_height = 2 * borderpx; + sizeh->base_width = 2 * borderpx; + sizeh->min_height = win.ch + 2 * borderpx; + sizeh->min_width = win.cw + 2 * borderpx; + if (xw.isfixed) { + sizeh->flags |= PMaxSize; + sizeh->min_width = sizeh->max_width = win.w; + sizeh->min_height = sizeh->max_height = win.h; + } + if (xw.gm & (XValue|YValue)) { + sizeh->flags |= USPosition | PWinGravity; + sizeh->x = xw.l; + sizeh->y = xw.t; + sizeh->win_gravity = xgeommasktogravity(xw.gm); + } + + XSetWMProperties(xw.dpy, xw.win, NULL, NULL, NULL, 0, sizeh, &wm, + &class); + XFree(sizeh); +} + +int +xgeommasktogravity(int mask) +{ + switch (mask & (XNegative|YNegative)) { + case 0: + return NorthWestGravity; + case XNegative: + return NorthEastGravity; + case YNegative: + return SouthWestGravity; + } + + return SouthEastGravity; +} + +int +xloadfont(Font *f, FcPattern *pattern) +{ + FcPattern *configured; + FcPattern *match; + FcResult result; + XGlyphInfo extents; + int wantattr, haveattr; + + /* + * Manually configure instead of calling XftMatchFont + * so that we can use the configured pattern for + * "missing glyph" lookups. + */ + configured = FcPatternDuplicate(pattern); + if (!configured) + return 1; + + FcConfigSubstitute(NULL, configured, FcMatchPattern); + XftDefaultSubstitute(xw.dpy, xw.scr, configured); + + match = FcFontMatch(NULL, configured, &result); + if (!match) { + FcPatternDestroy(configured); + return 1; + } + + if (!(f->match = XftFontOpenPattern(xw.dpy, match))) { + FcPatternDestroy(configured); + FcPatternDestroy(match); + return 1; + } + + if ((XftPatternGetInteger(pattern, "slant", 0, &wantattr) == + XftResultMatch)) { + /* + * Check if xft was unable to find a font with the appropriate + * slant but gave us one anyway. Try to mitigate. + */ + if ((XftPatternGetInteger(f->match->pattern, "slant", 0, + &haveattr) != XftResultMatch) || haveattr < wantattr) { + f->badslant = 1; + fputs("font slant does not match\n", stderr); + } + } + + if ((XftPatternGetInteger(pattern, "weight", 0, &wantattr) == + XftResultMatch)) { + if ((XftPatternGetInteger(f->match->pattern, "weight", 0, + &haveattr) != XftResultMatch) || haveattr != wantattr) { + f->badweight = 1; + fputs("font weight does not match\n", stderr); + } + } + + XftTextExtentsUtf8(xw.dpy, f->match, + (const FcChar8 *) ascii_printable, + strlen(ascii_printable), &extents); + + f->set = NULL; + f->pattern = configured; + + f->ascent = f->match->ascent; + f->descent = f->match->descent; + f->lbearing = 0; + f->rbearing = f->match->max_advance_width; + + f->height = f->ascent + f->descent; + f->width = DIVCEIL(extents.xOff, strlen(ascii_printable)); + + return 0; +} + +void +xloadfonts(const char *fontstr, double fontsize) +{ + FcPattern *pattern; + double fontval; + + if (fontstr[0] == '-') + pattern = XftXlfdParse(fontstr, False, False); + else + pattern = FcNameParse((const FcChar8 *)fontstr); + + if (!pattern) + die("can't open font %s\n", fontstr); + + if (fontsize > 1) { + FcPatternDel(pattern, FC_PIXEL_SIZE); + FcPatternDel(pattern, FC_SIZE); + FcPatternAddDouble(pattern, FC_PIXEL_SIZE, (double)fontsize); + usedfontsize = fontsize; + } else { + if (FcPatternGetDouble(pattern, FC_PIXEL_SIZE, 0, &fontval) == + FcResultMatch) { + usedfontsize = fontval; + } else if (FcPatternGetDouble(pattern, FC_SIZE, 0, &fontval) == + FcResultMatch) { + usedfontsize = -1; + } else { + /* + * Default font size is 12, if none given. This is to + * have a known usedfontsize value. + */ + FcPatternAddDouble(pattern, FC_PIXEL_SIZE, 12); + usedfontsize = 12; + } + defaultfontsize = usedfontsize; + } + + if (xloadfont(&dc.font, pattern)) + die("can't open font %s\n", fontstr); + + if (usedfontsize < 0) { + FcPatternGetDouble(dc.font.match->pattern, + FC_PIXEL_SIZE, 0, &fontval); + usedfontsize = fontval; + if (fontsize == 0) + defaultfontsize = fontval; + } + + /* Setting character width and height. */ + win.cw = ceilf(dc.font.width * cwscale); + win.ch = ceilf(dc.font.height * chscale); + + FcPatternDel(pattern, FC_SLANT); + FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); + if (xloadfont(&dc.ifont, pattern)) + die("can't open font %s\n", fontstr); + + FcPatternDel(pattern, FC_WEIGHT); + FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); + if (xloadfont(&dc.ibfont, pattern)) + die("can't open font %s\n", fontstr); + + FcPatternDel(pattern, FC_SLANT); + FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN); + if (xloadfont(&dc.bfont, pattern)) + die("can't open font %s\n", fontstr); + + FcPatternDestroy(pattern); +} + +int +xloadsparefont(FcPattern *pattern, int flags) +{ + FcPattern *match; + FcResult result; + + match = FcFontMatch(NULL, pattern, &result); + if (!match) { + return 1; + } + + if (!(frc[frclen].font = XftFontOpenPattern(xw.dpy, match))) { + FcPatternDestroy(match); + return 1; + } + + frc[frclen].flags = flags; + /* Believe U+0000 glyph will present in each default font */ + frc[frclen].unicodep = 0; + frclen++; + + return 0; +} + +void +xloadsparefonts(void) +{ + FcPattern *pattern; + double sizeshift, fontval; + int fc; + char **fp; + + if (frclen != 0) + die("can't embed spare fonts. cache isn't empty"); + + /* Calculate count of spare fonts */ + fc = sizeof(font2) / sizeof(*font2); + if (fc == 0) + return; + + /* Allocate memory for cache entries. */ + if (frccap < 4 * fc) { + frccap += 4 * fc - frccap; + frc = xrealloc(frc, frccap * sizeof(Fontcache)); + } + + for (fp = font2; fp - font2 < fc; ++fp) { + + if (**fp == '-') + pattern = XftXlfdParse(*fp, False, False); + else + pattern = FcNameParse((FcChar8 *)*fp); + + if (!pattern) + die("can't open spare font %s\n", *fp); + + if (defaultfontsize > 0) { + sizeshift = usedfontsize - defaultfontsize; + if (sizeshift != 0 && + FcPatternGetDouble(pattern, FC_PIXEL_SIZE, 0, &fontval) == + FcResultMatch) { + fontval += sizeshift; + FcPatternDel(pattern, FC_PIXEL_SIZE); + FcPatternDel(pattern, FC_SIZE); + FcPatternAddDouble(pattern, FC_PIXEL_SIZE, fontval); + } + } + + FcPatternAddBool(pattern, FC_SCALABLE, 1); + + FcConfigSubstitute(NULL, pattern, FcMatchPattern); + XftDefaultSubstitute(xw.dpy, xw.scr, pattern); + + if (xloadsparefont(pattern, FRC_NORMAL)) + die("can't open spare font %s\n", *fp); + + FcPatternDel(pattern, FC_SLANT); + FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); + if (xloadsparefont(pattern, FRC_ITALIC)) + die("can't open spare font %s\n", *fp); + + FcPatternDel(pattern, FC_WEIGHT); + FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); + if (xloadsparefont(pattern, FRC_ITALICBOLD)) + die("can't open spare font %s\n", *fp); + + FcPatternDel(pattern, FC_SLANT); + FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN); + if (xloadsparefont(pattern, FRC_BOLD)) + die("can't open spare font %s\n", *fp); + + FcPatternDestroy(pattern); + } +} + +void +xunloadfont(Font *f) +{ + XftFontClose(xw.dpy, f->match); + FcPatternDestroy(f->pattern); + if (f->set) + FcFontSetDestroy(f->set); +} + +void +xunloadfonts(void) +{ + /* Free the loaded fonts in the font cache. */ + while (frclen > 0) + XftFontClose(xw.dpy, frc[--frclen].font); + + xunloadfont(&dc.font); + xunloadfont(&dc.bfont); + xunloadfont(&dc.ifont); + xunloadfont(&dc.ibfont); +} + +int +ximopen(Display *dpy) +{ + XIMCallback imdestroy = { .client_data = NULL, .callback = ximdestroy }; + XICCallback icdestroy = { .client_data = NULL, .callback = xicdestroy }; + + xw.ime.xim = XOpenIM(xw.dpy, NULL, NULL, NULL); + if (xw.ime.xim == NULL) + return 0; + + if (XSetIMValues(xw.ime.xim, XNDestroyCallback, &imdestroy, NULL)) + fprintf(stderr, "XSetIMValues: " + "Could not set XNDestroyCallback.\n"); + + xw.ime.spotlist = XVaCreateNestedList(0, XNSpotLocation, &xw.ime.spot, + NULL); + + if (xw.ime.xic == NULL) { + xw.ime.xic = XCreateIC(xw.ime.xim, XNInputStyle, + XIMPreeditNothing | XIMStatusNothing, + XNClientWindow, xw.win, + XNDestroyCallback, &icdestroy, + NULL); + } + if (xw.ime.xic == NULL) + fprintf(stderr, "XCreateIC: Could not create input context.\n"); + + return 1; +} + +void +ximinstantiate(Display *dpy, XPointer client, XPointer call) +{ + if (ximopen(dpy)) + XUnregisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, + ximinstantiate, NULL); +} + +void +ximdestroy(XIM xim, XPointer client, XPointer call) +{ + xw.ime.xim = NULL; + XRegisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, + ximinstantiate, NULL); + XFree(xw.ime.spotlist); +} + +int +xicdestroy(XIC xim, XPointer client, XPointer call) +{ + xw.ime.xic = NULL; + return 1; +} + +void +xinit(int cols, int rows) +{ + XGCValues gcvalues; + Cursor cursor; + Window parent; + pid_t thispid = getpid(); + XColor xmousefg, xmousebg; + + if (!(xw.dpy = XOpenDisplay(NULL))) + die("can't open display\n"); + xw.scr = XDefaultScreen(xw.dpy); + xw.vis = XDefaultVisual(xw.dpy, xw.scr); + + /* font */ + if (!FcInit()) + die("could not init fontconfig.\n"); + + usedfont = (opt_font == NULL)? font : opt_font; + xloadfonts(usedfont, 0); + + /* spare fonts */ + xloadsparefonts(); + + /* colors */ + xw.cmap = XDefaultColormap(xw.dpy, xw.scr); + xloadcols(); + + /* adjust fixed window geometry */ + win.w = 2 * borderpx + cols * win.cw; + win.h = 2 * borderpx + rows * win.ch; + if (xw.gm & XNegative) + xw.l += DisplayWidth(xw.dpy, xw.scr) - win.w - 2; + if (xw.gm & YNegative) + xw.t += DisplayHeight(xw.dpy, xw.scr) - win.h - 2; + + /* Events */ + xw.attrs.background_pixel = dc.col[defaultbg].pixel; + xw.attrs.border_pixel = dc.col[defaultbg].pixel; + xw.attrs.bit_gravity = NorthWestGravity; + xw.attrs.event_mask = FocusChangeMask | KeyPressMask | KeyReleaseMask + | ExposureMask | VisibilityChangeMask | StructureNotifyMask + | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; + xw.attrs.colormap = xw.cmap; + + if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) + parent = XRootWindow(xw.dpy, xw.scr); + xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t, + win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput, + xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity + | CWEventMask | CWColormap, &xw.attrs); + + memset(&gcvalues, 0, sizeof(gcvalues)); + gcvalues.graphics_exposures = False; + dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures, + &gcvalues); + xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, + DefaultDepth(xw.dpy, xw.scr)); + XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel); + XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h); + + /* font spec buffer */ + xw.specbuf = xmalloc(cols * sizeof(GlyphFontSpec)); + + /* Xft rendering context */ + xw.draw = XftDrawCreate(xw.dpy, xw.buf, xw.vis, xw.cmap); + + /* input methods */ + if (!ximopen(xw.dpy)) { + XRegisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, + ximinstantiate, NULL); + } + + /* white cursor, black outline */ + cursor = XCreateFontCursor(xw.dpy, mouseshape); + XDefineCursor(xw.dpy, xw.win, cursor); + + if (XParseColor(xw.dpy, xw.cmap, colorname[mousefg], &xmousefg) == 0) { + xmousefg.red = 0xffff; + xmousefg.green = 0xffff; + xmousefg.blue = 0xffff; + } + + if (XParseColor(xw.dpy, xw.cmap, colorname[mousebg], &xmousebg) == 0) { + xmousebg.red = 0x0000; + xmousebg.green = 0x0000; + xmousebg.blue = 0x0000; + } + + XRecolorCursor(xw.dpy, cursor, &xmousefg, &xmousebg); + + xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False); + xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False); + xw.netwmname = XInternAtom(xw.dpy, "_NET_WM_NAME", False); + xw.netwmiconname = XInternAtom(xw.dpy, "_NET_WM_ICON_NAME", False); + XSetWMProtocols(xw.dpy, xw.win, &xw.wmdeletewin, 1); + + xw.netwmpid = XInternAtom(xw.dpy, "_NET_WM_PID", False); + XChangeProperty(xw.dpy, xw.win, xw.netwmpid, XA_CARDINAL, 32, + PropModeReplace, (uchar *)&thispid, 1); + + win.mode = MODE_NUMLOCK; + resettitle(); + xhints(); + XMapWindow(xw.dpy, xw.win); + XSync(xw.dpy, False); + + clock_gettime(CLOCK_MONOTONIC, &xsel.tclick1); + clock_gettime(CLOCK_MONOTONIC, &xsel.tclick2); + xsel.primary = NULL; + xsel.clipboard = NULL; + xsel.xtarget = XInternAtom(xw.dpy, "UTF8_STRING", 0); + if (xsel.xtarget == None) + xsel.xtarget = XA_STRING; +} + +int +xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x, int y) +{ + float winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, xp, yp; + ushort mode, prevmode = USHRT_MAX; + Font *font = &dc.font; + int frcflags = FRC_NORMAL; + float runewidth = win.cw; + Rune rune; + FT_UInt glyphidx; + FcResult fcres; + FcPattern *fcpattern, *fontpattern; + FcFontSet *fcsets[] = { NULL }; + FcCharSet *fccharset; + int i, f, numspecs = 0; + + for (i = 0, xp = winx, yp = winy + font->ascent; i < len; ++i) { + /* Fetch rune and mode for current glyph. */ + rune = glyphs[i].u; + mode = glyphs[i].mode; + + /* Skip dummy wide-character spacing. */ + if (mode == ATTR_WDUMMY) + continue; + + /* Determine font for glyph if different from previous glyph. */ + if (prevmode != mode) { + prevmode = mode; + font = &dc.font; + frcflags = FRC_NORMAL; + runewidth = win.cw * ((mode & ATTR_WIDE) ? 2.0f : 1.0f); + if ((mode & ATTR_ITALIC) && (mode & ATTR_BOLD)) { + font = &dc.ibfont; + frcflags = FRC_ITALICBOLD; + } else if (mode & ATTR_ITALIC) { + font = &dc.ifont; + frcflags = FRC_ITALIC; + } else if (mode & ATTR_BOLD) { + font = &dc.bfont; + frcflags = FRC_BOLD; + } + yp = winy + font->ascent; + } + + /* Lookup character index with default font. */ + glyphidx = XftCharIndex(xw.dpy, font->match, rune); + if (glyphidx) { + specs[numspecs].font = font->match; + specs[numspecs].glyph = glyphidx; + specs[numspecs].x = (short)xp; + specs[numspecs].y = (short)yp; + xp += runewidth; + numspecs++; + continue; + } + + /* Fallback on font cache, search the font cache for match. */ + for (f = 0; f < frclen; f++) { + glyphidx = XftCharIndex(xw.dpy, frc[f].font, rune); + /* Everything correct. */ + if (glyphidx && frc[f].flags == frcflags) + break; + /* We got a default font for a not found glyph. */ + if (!glyphidx && frc[f].flags == frcflags + && frc[f].unicodep == rune) { + break; + } + } + + /* Nothing was found. Use fontconfig to find matching font. */ + if (f >= frclen) { + if (!font->set) + font->set = FcFontSort(0, font->pattern, + 1, 0, &fcres); + fcsets[0] = font->set; + + /* + * Nothing was found in the cache. Now use + * some dozen of Fontconfig calls to get the + * font for one single character. + * + * Xft and fontconfig are design failures. + */ + fcpattern = FcPatternDuplicate(font->pattern); + fccharset = FcCharSetCreate(); + + FcCharSetAddChar(fccharset, rune); + FcPatternAddCharSet(fcpattern, FC_CHARSET, + fccharset); + FcPatternAddBool(fcpattern, FC_SCALABLE, 1); + + FcConfigSubstitute(0, fcpattern, + FcMatchPattern); + FcDefaultSubstitute(fcpattern); + + fontpattern = FcFontSetMatch(0, fcsets, 1, + fcpattern, &fcres); + + /* Allocate memory for the new cache entry. */ + if (frclen >= frccap) { + frccap += 16; + frc = xrealloc(frc, frccap * sizeof(Fontcache)); + } + + frc[frclen].font = XftFontOpenPattern(xw.dpy, + fontpattern); + if (!frc[frclen].font) + die("XftFontOpenPattern failed seeking fallback font: %s\n", + strerror(errno)); + frc[frclen].flags = frcflags; + frc[frclen].unicodep = rune; + + glyphidx = XftCharIndex(xw.dpy, frc[frclen].font, rune); + + f = frclen; + frclen++; + + FcPatternDestroy(fcpattern); + FcCharSetDestroy(fccharset); + } + + specs[numspecs].font = frc[f].font; + specs[numspecs].glyph = glyphidx; + specs[numspecs].x = (short)xp; + specs[numspecs].y = (short)yp; + xp += runewidth; + numspecs++; + } + + return numspecs; +} + +void +xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y, int dmode) +{ + int charlen = len * ((base.mode & ATTR_WIDE) ? 2 : 1); + int winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, + width = charlen * win.cw; + Color *fg, *bg, *temp, revfg, revbg, truefg, truebg; + XRenderColor colfg, colbg; + XRectangle r; + + /* Fallback on color display for attributes not supported by the font */ + if (base.mode & ATTR_ITALIC && base.mode & ATTR_BOLD) { + if (dc.ibfont.badslant || dc.ibfont.badweight) + base.fg = defaultattr; + } else if ((base.mode & ATTR_ITALIC && dc.ifont.badslant) || + (base.mode & ATTR_BOLD && dc.bfont.badweight)) { + base.fg = defaultattr; + } + + if (IS_TRUECOL(base.fg)) { + colfg.alpha = 0xffff; + colfg.red = TRUERED(base.fg); + colfg.green = TRUEGREEN(base.fg); + colfg.blue = TRUEBLUE(base.fg); + XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, &truefg); + fg = &truefg; + } else { + fg = &dc.col[base.fg]; + } + + if (IS_TRUECOL(base.bg)) { + colbg.alpha = 0xffff; + colbg.green = TRUEGREEN(base.bg); + colbg.red = TRUERED(base.bg); + colbg.blue = TRUEBLUE(base.bg); + XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colbg, &truebg); + bg = &truebg; + } else { + bg = &dc.col[base.bg]; + } + + /* Change basic system colors [0-7] to bright system colors [8-15] */ + if ((base.mode & ATTR_BOLD_FAINT) == ATTR_BOLD && BETWEEN(base.fg, 0, 7)) + fg = &dc.col[base.fg + 8]; + + if (IS_SET(MODE_REVERSE)) { + if (fg == &dc.col[defaultfg]) { + fg = &dc.col[defaultbg]; + } else { + colfg.red = ~fg->color.red; + colfg.green = ~fg->color.green; + colfg.blue = ~fg->color.blue; + colfg.alpha = fg->color.alpha; + XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, + &revfg); + fg = &revfg; + } + + if (bg == &dc.col[defaultbg]) { + bg = &dc.col[defaultfg]; + } else { + colbg.red = ~bg->color.red; + colbg.green = ~bg->color.green; + colbg.blue = ~bg->color.blue; + colbg.alpha = bg->color.alpha; + XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colbg, + &revbg); + bg = &revbg; + } + } + + if ((base.mode & ATTR_BOLD_FAINT) == ATTR_FAINT) { + colfg.red = fg->color.red / 2; + colfg.green = fg->color.green / 2; + colfg.blue = fg->color.blue / 2; + colfg.alpha = fg->color.alpha; + XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, &revfg); + fg = &revfg; + } + + if (base.mode & ATTR_REVERSE) { + temp = fg; + fg = bg; + bg = temp; + } + + if (base.mode & ATTR_BLINK && win.mode & MODE_BLINK) + fg = bg; + + if (base.mode & ATTR_INVISIBLE) + fg = bg; + + if (dmode & DRAW_BG) { + /* Intelligent cleaning up of the borders. */ + if (x == 0) { + xclear(0, (y == 0)? 0 : winy, borderpx, + winy + win.ch + + ((winy + win.ch >= borderpx + win.th)? win.h : 0)); + } + if (winx + width >= borderpx + win.tw) { + xclear(winx + width, (y == 0)? 0 : winy, win.w, + ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch))); + } + if (y == 0) + xclear(winx, 0, winx + width, borderpx); + if (winy + win.ch >= borderpx + win.th) + xclear(winx, winy + win.ch, winx + width, win.h); + /* Fill the background */ + XftDrawRect(xw.draw, bg, winx, winy, width, win.ch); + } + + if (dmode & DRAW_FG) { + /* Render the glyphs. */ + XftDrawGlyphFontSpec(xw.draw, fg, specs, len); + + /* Render underline and strikethrough. */ + if (base.mode & ATTR_UNDERLINE) { + XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent + 1, + width, 1); + } + + if (base.mode & ATTR_STRUCK) { + XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent / 3, + width, 1); + } + } +} + +void +xdrawglyph(Glyph g, int x, int y) +{ + int numspecs; + XftGlyphFontSpec spec; + + numspecs = xmakeglyphfontspecs(&spec, &g, 1, x, y); + xdrawglyphfontspecs(&spec, g, numspecs, x, y, DRAW_BG | DRAW_FG); +} + +void +xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og) +{ + Color drawcol; + + /* remove the old cursor */ + if (selected(ox, oy)) + og.mode ^= ATTR_REVERSE; + xdrawglyph(og, ox, oy); + + if (IS_SET(MODE_HIDE)) + return; + + /* + * Select the right color for the right mode. + */ + g.mode &= ATTR_BOLD|ATTR_ITALIC|ATTR_UNDERLINE|ATTR_STRUCK|ATTR_WIDE; + + if (IS_SET(MODE_REVERSE)) { + g.mode |= ATTR_REVERSE; + g.bg = defaultfg; + if (selected(cx, cy)) { + drawcol = dc.col[defaultcs]; + g.fg = defaultrcs; + } else { + drawcol = dc.col[defaultrcs]; + g.fg = defaultcs; + } + } else { + if (selected(cx, cy)) { + g.fg = defaultfg; + g.bg = defaultrcs; + } else { + g.fg = defaultbg; + g.bg = defaultcs; + } + drawcol = dc.col[g.bg]; + } + + /* draw the new one */ + if (IS_SET(MODE_FOCUSED)) { + switch (win.cursor) { + case 7: /* st extension */ + g.u = 0x2603; /* snowman (U+2603) */ + /* FALLTHROUGH */ + case 0: /* Blinking Block */ + case 1: /* Blinking Block (Default) */ + case 2: /* Steady Block */ + xdrawglyph(g, cx, cy); + break; + case 3: /* Blinking Underline */ + case 4: /* Steady Underline */ + XftDrawRect(xw.draw, &drawcol, + borderpx + cx * win.cw, + borderpx + (cy + 1) * win.ch - \ + cursorthickness, + win.cw, cursorthickness); + break; + case 5: /* Blinking bar */ + case 6: /* Steady bar */ + XftDrawRect(xw.draw, &drawcol, + borderpx + cx * win.cw, + borderpx + cy * win.ch, + cursorthickness, win.ch); + break; + } + } else { + XftDrawRect(xw.draw, &drawcol, + borderpx + cx * win.cw, + borderpx + cy * win.ch, + win.cw - 1, 1); + XftDrawRect(xw.draw, &drawcol, + borderpx + cx * win.cw, + borderpx + cy * win.ch, + 1, win.ch - 1); + XftDrawRect(xw.draw, &drawcol, + borderpx + (cx + 1) * win.cw - 1, + borderpx + cy * win.ch, + 1, win.ch - 1); + XftDrawRect(xw.draw, &drawcol, + borderpx + cx * win.cw, + borderpx + (cy + 1) * win.ch - 1, + win.cw, 1); + } +} + +void +xsetenv(void) +{ + char buf[sizeof(long) * 8 + 1]; + + snprintf(buf, sizeof(buf), "%lu", xw.win); + setenv("WINDOWID", buf, 1); +} + +void +xseticontitle(char *p) +{ + XTextProperty prop; + DEFAULT(p, opt_title); + + if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, + &prop) != Success) + return; + XSetWMIconName(xw.dpy, xw.win, &prop); + XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmiconname); + XFree(prop.value); +} + +void +xsettitle(char *p) +{ + XTextProperty prop; + DEFAULT(p, opt_title); + + if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, + &prop) != Success) + return; + XSetWMName(xw.dpy, xw.win, &prop); + XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmname); + XFree(prop.value); +} + +int +xstartdraw(void) +{ + return IS_SET(MODE_VISIBLE); +} + +void +xdrawline(Line line, int x1, int y1, int x2) +{ + int i, x, ox, numspecs, numspecs_cached; + Glyph base, new; + XftGlyphFontSpec *specs; + + numspecs_cached = xmakeglyphfontspecs(xw.specbuf, &line[x1], x2 - x1, x1, y1); + + /* Draw line in 2 passes: background and foreground. This way wide glyphs + won't get truncated (#223) */ + for (int dmode = DRAW_BG; dmode <= DRAW_FG; dmode <<= 1) { + specs = xw.specbuf; + numspecs = numspecs_cached; + i = ox = 0; + for (x = x1; x < x2 && i < numspecs; x++) { + new = line[x]; + if (new.mode == ATTR_WDUMMY) + continue; + if (selected(x, y1)) + new.mode ^= ATTR_REVERSE; + if (i > 0 && ATTRCMP(base, new)) { + xdrawglyphfontspecs(specs, base, i, ox, y1, dmode); + specs += i; + numspecs -= i; + i = 0; + } + if (i == 0) { + ox = x; + base = new; + } + i++; + } + if (i > 0) + xdrawglyphfontspecs(specs, base, i, ox, y1, dmode); + } +} + +void +xfinishdraw(void) +{ + XCopyArea(xw.dpy, xw.buf, xw.win, dc.gc, 0, 0, win.w, + win.h, 0, 0); + XSetForeground(xw.dpy, dc.gc, + dc.col[IS_SET(MODE_REVERSE)? + defaultfg : defaultbg].pixel); +} + +void +xximspot(int x, int y) +{ + if (xw.ime.xic == NULL) + return; + + xw.ime.spot.x = borderpx + x * win.cw; + xw.ime.spot.y = borderpx + (y + 1) * win.ch; + + XSetICValues(xw.ime.xic, XNPreeditAttributes, xw.ime.spotlist, NULL); +} + +void +expose(XEvent *ev) +{ + redraw(); +} + +void +visibility(XEvent *ev) +{ + XVisibilityEvent *e = &ev->xvisibility; + + MODBIT(win.mode, e->state != VisibilityFullyObscured, MODE_VISIBLE); +} + +void +unmap(XEvent *ev) +{ + win.mode &= ~MODE_VISIBLE; +} + +void +xsetpointermotion(int set) +{ + MODBIT(xw.attrs.event_mask, set, PointerMotionMask); + XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs); +} + +void +xsetmode(int set, unsigned int flags) +{ + int mode = win.mode; + MODBIT(win.mode, set, flags); + if ((win.mode & MODE_REVERSE) != (mode & MODE_REVERSE)) + redraw(); +} + +int +xsetcursor(int cursor) +{ + if (!BETWEEN(cursor, 0, 7)) /* 7: st extension */ + return 1; + win.cursor = cursor; + return 0; +} + +void +xseturgency(int add) +{ + XWMHints *h = XGetWMHints(xw.dpy, xw.win); + + MODBIT(h->flags, add, XUrgencyHint); + XSetWMHints(xw.dpy, xw.win, h); + XFree(h); +} + +void +xbell(void) +{ + if (!(IS_SET(MODE_FOCUSED))) + xseturgency(1); + if (bellvolume) + XkbBell(xw.dpy, xw.win, bellvolume, (Atom)NULL); +} + +void +focus(XEvent *ev) +{ + XFocusChangeEvent *e = &ev->xfocus; + + if (e->mode == NotifyGrab) + return; + + if (ev->type == FocusIn) { + if (xw.ime.xic) + XSetICFocus(xw.ime.xic); + win.mode |= MODE_FOCUSED; + xseturgency(0); + if (IS_SET(MODE_FOCUS)) + ttywrite("\033[I", 3, 0); + } else { + if (xw.ime.xic) + XUnsetICFocus(xw.ime.xic); + win.mode &= ~MODE_FOCUSED; + if (IS_SET(MODE_FOCUS)) + ttywrite("\033[O", 3, 0); + } +} + +int +match(uint mask, uint state) +{ + return mask == XK_ANY_MOD || mask == (state & ~ignoremod); +} + +char* +kmap(KeySym k, uint state) +{ + Key *kp; + int i; + + /* Check for mapped keys out of X11 function keys. */ + for (i = 0; i < LEN(mappedkeys); i++) { + if (mappedkeys[i] == k) + break; + } + if (i == LEN(mappedkeys)) { + if ((k & 0xFFFF) < 0xFD00) + return NULL; + } + + for (kp = key; kp < key + LEN(key); kp++) { + if (kp->k != k) + continue; + + if (!match(kp->mask, state)) + continue; + + if (IS_SET(MODE_APPKEYPAD) ? kp->appkey < 0 : kp->appkey > 0) + continue; + if (IS_SET(MODE_NUMLOCK) && kp->appkey == 2) + continue; + + if (IS_SET(MODE_APPCURSOR) ? kp->appcursor < 0 : kp->appcursor > 0) + continue; + + return kp->s; + } + + return NULL; +} + +void +kpress(XEvent *ev) +{ + XKeyEvent *e = &ev->xkey; + KeySym ksym = NoSymbol; + char buf[64], *customkey; + int len; + Rune c; + Status status; + Shortcut *bp; + + if (IS_SET(MODE_KBDLOCK)) + return; + + if (xw.ime.xic) { + len = XmbLookupString(xw.ime.xic, e, buf, sizeof buf, &ksym, &status); + if (status == XBufferOverflow) + return; + } else { + len = XLookupString(e, buf, sizeof buf, &ksym, NULL); + } + if ( IS_SET(MODE_KBDSELECT) ) { + if ( match(XK_NO_MOD, e->state) || + (XK_Shift_L | XK_Shift_R) & e->state ) + win.mode ^= trt_kbdselect(ksym, buf, len); + return; + } + + /* 1. shortcuts */ + for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { + if (ksym == bp->keysym && match(bp->mod, e->state)) { + bp->func(&(bp->arg)); + return; + } + } + + /* 2. custom keys from config.h */ + if ((customkey = kmap(ksym, e->state))) { + ttywrite(customkey, strlen(customkey), 1); + return; + } + + /* 3. composed string from input method */ + if (len == 0) + return; + if (len == 1 && e->state & Mod1Mask) { + if (IS_SET(MODE_8BIT)) { + if (*buf < 0177) { + c = *buf | 0x80; + len = utf8encode(c, buf); + } + } else { + buf[1] = buf[0]; + buf[0] = '\033'; + len = 2; + } + } + ttywrite(buf, len, 1); +} + +void +cmessage(XEvent *e) +{ + /* + * See xembed specs + * http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html + */ + if (e->xclient.message_type == xw.xembed && e->xclient.format == 32) { + if (e->xclient.data.l[1] == XEMBED_FOCUS_IN) { + win.mode |= MODE_FOCUSED; + xseturgency(0); + } else if (e->xclient.data.l[1] == XEMBED_FOCUS_OUT) { + win.mode &= ~MODE_FOCUSED; + } + } else if (e->xclient.data.l[0] == xw.wmdeletewin) { + ttyhangup(); + exit(0); + } +} + +void +resize(XEvent *e) +{ + if (e->xconfigure.width == win.w && e->xconfigure.height == win.h) + return; + + cresize(e->xconfigure.width, e->xconfigure.height); +} + +void +run(void) +{ + XEvent ev; + int w = win.w, h = win.h; + fd_set rfd; + int xfd = XConnectionNumber(xw.dpy), ttyfd, xev, drawing; + struct timespec seltv, *tv, now, lastblink, trigger; + double timeout; + + /* Waiting for window mapping */ + do { + XNextEvent(xw.dpy, &ev); + /* + * This XFilterEvent call is required because of XOpenIM. It + * does filter out the key event and some client message for + * the input method too. + */ + if (XFilterEvent(&ev, None)) + continue; + if (ev.type == ConfigureNotify) { + w = ev.xconfigure.width; + h = ev.xconfigure.height; + } + } while (ev.type != MapNotify); + + ttyfd = ttynew(opt_line, shell, opt_io, opt_cmd); + cresize(w, h); + + for (timeout = -1, drawing = 0, lastblink = (struct timespec){0};;) { + FD_ZERO(&rfd); + FD_SET(ttyfd, &rfd); + FD_SET(xfd, &rfd); + + if (XPending(xw.dpy)) + timeout = 0; /* existing events might not set xfd */ + + seltv.tv_sec = timeout / 1E3; + seltv.tv_nsec = 1E6 * (timeout - 1E3 * seltv.tv_sec); + tv = timeout >= 0 ? &seltv : NULL; + + if (pselect(MAX(xfd, ttyfd)+1, &rfd, NULL, NULL, tv, NULL) < 0) { + if (errno == EINTR) + continue; + die("select failed: %s\n", strerror(errno)); + } + clock_gettime(CLOCK_MONOTONIC, &now); + + if (FD_ISSET(ttyfd, &rfd)) + ttyread(); + + xev = 0; + while (XPending(xw.dpy)) { + xev = 1; + XNextEvent(xw.dpy, &ev); + if (XFilterEvent(&ev, None)) + continue; + if (handler[ev.type]) + (handler[ev.type])(&ev); + } + + /* + * To reduce flicker and tearing, when new content or event + * triggers drawing, we first wait a bit to ensure we got + * everything, and if nothing new arrives - we draw. + * We start with trying to wait minlatency ms. If more content + * arrives sooner, we retry with shorter and shorter periods, + * and eventually draw even without idle after maxlatency ms. + * Typically this results in low latency while interacting, + * maximum latency intervals during `cat huge.txt`, and perfect + * sync with periodic updates from animations/key-repeats/etc. + */ + if (FD_ISSET(ttyfd, &rfd) || xev) { + if (!drawing) { + trigger = now; + drawing = 1; + } + timeout = (maxlatency - TIMEDIFF(now, trigger)) \ + / maxlatency * minlatency; + if (timeout > 0) + continue; /* we have time, try to find idle */ + } + + /* idle detected or maxlatency exhausted -> draw */ + timeout = -1; + if (blinktimeout && tattrset(ATTR_BLINK)) { + timeout = blinktimeout - TIMEDIFF(now, lastblink); + if (timeout <= 0) { + if (-timeout > blinktimeout) /* start visible */ + win.mode |= MODE_BLINK; + win.mode ^= MODE_BLINK; + tsetdirtattr(ATTR_BLINK); + lastblink = now; + timeout = blinktimeout; + } + } + + draw(); + XFlush(xw.dpy); + drawing = 0; + } +} + +void +usage(void) +{ + die("usage: %s [-aiv] [-c class] [-f font] [-g geometry]" + " [-n name] [-o file]\n" + " [-T title] [-t title] [-w windowid]" + " [[-e] command [args ...]]\n" + " %s [-aiv] [-c class] [-f font] [-g geometry]" + " [-n name] [-o file]\n" + " [-T title] [-t title] [-w windowid] -l line" + " [stty_args ...]\n", argv0, argv0); +} + +void toggle_winmode(int flag) { + win.mode ^= flag; +} + +void keyboard_select(const Arg *dummy) { + win.mode ^= trt_kbdselect(-1, NULL, 0); +} + +int +main(int argc, char *argv[]) +{ + xw.l = xw.t = 0; + xw.isfixed = False; + xsetcursor(cursorshape); + + ARGBEGIN { + case 'a': + allowaltscreen = 0; + break; + case 'c': + opt_class = EARGF(usage()); + break; + case 'e': + if (argc > 0) + --argc, ++argv; + goto run; + case 'f': + opt_font = EARGF(usage()); + break; + case 'g': + xw.gm = XParseGeometry(EARGF(usage()), + &xw.l, &xw.t, &cols, &rows); + break; + case 'i': + xw.isfixed = 1; + break; + case 'o': + opt_io = EARGF(usage()); + break; + case 'l': + opt_line = EARGF(usage()); + break; + case 'n': + opt_name = EARGF(usage()); + break; + case 't': + case 'T': + opt_title = EARGF(usage()); + break; + case 'w': + opt_embed = EARGF(usage()); + break; + case 'v': + die("%s " VERSION "\n", argv0); + break; + default: + usage(); + } ARGEND; + +run: + if (argc > 0) /* eat all remaining arguments */ + opt_cmd = argv; + + if (!opt_title) + opt_title = (opt_line || !opt_cmd) ? "st" : opt_cmd[0]; + + setlocale(LC_CTYPE, ""); + XSetLocaleModifiers(""); + cols = MAX(cols, 1); + rows = MAX(rows, 1); + tnew(cols, rows); + xinit(cols, rows); + xsetenv(); + selinit(); + run(); + + return 0; +} diff --git a/x.o b/x.o index 9e7c08e52b7eae95605a0ab61c95fc4fb8f1cf3d..704f1cda785fc976591968fffca3f0e4700c7a19 100644 GIT binary patch literal 80776 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 N`hSI1A*_7;e*s33QV9S6 literal 75008 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 Date: Mon, 26 Jun 2023 10:24:23 +0100 Subject: [PATCH 4/8] alpha --- config.def.h | 517 ------ config.def.h.orig | 481 ------ config.mk | 2 +- patches/st-alpha-20220206-0.8.5.diff | 146 ++ patches/st-scrollback-0.8.5.diff | 350 ++++ st | Bin 109776 -> 0 bytes st.h | 1 + x.c | 40 +- x.c.orig | 2215 -------------------------- x.o | Bin 80776 -> 82064 bytes 10 files changed, 528 insertions(+), 3224 deletions(-) delete mode 100644 config.def.h delete mode 100644 config.def.h.orig create mode 100644 patches/st-alpha-20220206-0.8.5.diff create mode 100644 patches/st-scrollback-0.8.5.diff delete mode 100755 st delete mode 100644 x.c.orig diff --git a/config.def.h b/config.def.h deleted file mode 100644 index aa63b99..0000000 --- a/config.def.h +++ /dev/null @@ -1,517 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -/* - * appearance - * - * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html - */ -static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; -/* Spare fonts */ -static char *font2[] = { -/* "Inconsolata for Powerline:pixelsize=12:antialias=true:autohint=true", */ -/* "Hack Nerd Font Mono:pixelsize=11: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: scroll and/or utmp - * 3: SHELL environment variable - * 4: value of shell in /etc/passwd - * 5: value of shell in config.h - */ -static char *shell = "/bin/sh"; -char *utmp = NULL; -/* scroll program: to enable use a string like "scroll" */ -char *scroll = 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 */ -static float cwscale = 1.0; -static float chscale = 1.0; - -/* - * word delimiter string - * - * More advanced example: L" `'\"()[]{}" - */ -wchar_t *worddelimiters = L" "; - -/* selection timeouts (in milliseconds) */ -static unsigned int doubleclicktimeout = 300; -static unsigned int tripleclicktimeout = 600; - -/* alt screens */ -int allowaltscreen = 1; - -/* allow certain non-interactive (insecure) window operations such as: - setting the clipboard text */ -int allowwindowops = 0; - -/* - * draw latency range in ms - from new content/keypress/etc until drawing. - * within this range, st draws when content stops arriving (idle). mostly it's - * near minlatency, but it waits longer for slow updates to avoid partial draw. - * low minlatency will tear/flicker more, as it can "detect" idle too early. - */ -static double minlatency = 8; -static double maxlatency = 33; - -/* - * 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[] = { - /* 8 normal colors */ - "black", - "red3", - "green3", - "yellow3", - "blue2", - "magenta3", - "cyan3", - "gray90", - - /* 8 bright colors */ - "gray50", - "red", - "green", - "yellow", - "#5c5cff", - "magenta", - "cyan", - "white", - - [255] = 0, - - /* more colors can be added after 255 to use with DefaultXX */ - "#cccccc", - "#555555", - "gray90", /* default foreground colour */ - "black", /* default background colour */ -}; - - -/* - * Default colors (colorname index) - * foreground, background, cursor, reverse cursor - */ -unsigned int defaultfg = 258; -unsigned int defaultbg = 259; -unsigned int defaultcs = 256; -static unsigned int defaultrcs = 257; - -/* - * Default shape of cursor - * 2: Block ("█") - * 4: Underline ("_") - * 6: Bar ("|") - * 7: Snowman ("☃") - */ -static unsigned int cursorshape = 2; - -/* - * 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_xterm; -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; - -/* - * Force mouse select/shortcuts 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 forcemousemod = ShiftMask; - -/* - * Xresources preferences to load at startup - */ -ResourcePref resources[] = { - { "font", STRING, &font }, - { "color0", STRING, &colorname[0] }, - { "color1", STRING, &colorname[1] }, - { "color2", STRING, &colorname[2] }, - { "color3", STRING, &colorname[3] }, - { "color4", STRING, &colorname[4] }, - { "color5", STRING, &colorname[5] }, - { "color6", STRING, &colorname[6] }, - { "color7", STRING, &colorname[7] }, - { "color8", STRING, &colorname[8] }, - { "color9", STRING, &colorname[9] }, - { "color10", STRING, &colorname[10] }, - { "color11", STRING, &colorname[11] }, - { "color12", STRING, &colorname[12] }, - { "color13", STRING, &colorname[13] }, - { "color14", STRING, &colorname[14] }, - { "color15", STRING, &colorname[15] }, - { "background", STRING, &colorname[256] }, - { "foreground", STRING, &colorname[257] }, - { "cursorColor", STRING, &colorname[258] }, - { "termname", STRING, &termname }, - { "shell", STRING, &shell }, - { "minlatency", INTEGER, &minlatency }, - { "maxlatency", INTEGER, &maxlatency }, - { "blinktimeout", INTEGER, &blinktimeout }, - { "bellvolume", INTEGER, &bellvolume }, - { "tabspaces", INTEGER, &tabspaces }, - { "borderpx", INTEGER, &borderpx }, - { "cwscale", FLOAT, &cwscale }, - { "chscale", FLOAT, &chscale }, -}; - -/* - * Internal mouse shortcuts. - * Beware that overloading Button1 will disable the selection. - */ -static MouseShortcut mshortcuts[] = { - /* mask button function argument release */ - { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, - { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} }, - { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, - { ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} }, - { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} }, -}; - -/* Internal keyboard shortcuts. */ -#define MODKEY Mod1Mask -#define TERMMOD (ControlMask|ShiftMask) - -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} }, - { TERMMOD, XK_Home, zoomreset, {.f = 0} }, - { TERMMOD, XK_C, clipcopy, {.i = 0} }, - { TERMMOD, XK_V, clippaste, {.i = 0} }, - { TERMMOD, XK_Y, selpaste, {.i = 0} }, - { ShiftMask, XK_Insert, selpaste, {.i = 0} }, - { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, - { TERMMOD, XK_Escape, keyboard_select,{ 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 - * - * 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; - -/* - * 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, "\033Ox", +1, 0}, - { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1}, - { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1}, - { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0}, - { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1}, - { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1}, - { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0}, - { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1}, - { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1}, - { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0}, - { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1}, - { XK_KP_Right, XK_ANY_MOD, "\033OC", 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, "\033Oj", +2, 0}, - { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0}, - { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0}, - { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0}, - { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0}, - { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0}, - { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0}, - { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0}, - { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0}, - { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0}, - { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0}, - { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0}, - { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0}, - { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0}, - { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0}, - { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0}, - { XK_KP_9, XK_ANY_MOD, "\033Oy", +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, "\033OA", 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, "\033OB", 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, "\033OD", 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, "\033OC", 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, "\033OP" , 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, "\033OQ" , 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, "\033OR" , 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, "\033OS" , 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{|}~"; diff --git a/config.def.h.orig b/config.def.h.orig deleted file mode 100644 index 27582bd..0000000 --- a/config.def.h.orig +++ /dev/null @@ -1,481 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -/* - * appearance - * - * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html - */ -static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; -/* Spare fonts */ -static char *font2[] = { -/* "Inconsolata for Powerline:pixelsize=12:antialias=true:autohint=true", */ -/* "Hack Nerd Font Mono:pixelsize=11: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: scroll and/or utmp - * 3: SHELL environment variable - * 4: value of shell in /etc/passwd - * 5: value of shell in config.h - */ -static char *shell = "/bin/sh"; -char *utmp = NULL; -/* scroll program: to enable use a string like "scroll" */ -char *scroll = 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 */ -static float cwscale = 1.0; -static float chscale = 1.0; - -/* - * word delimiter string - * - * More advanced example: L" `'\"()[]{}" - */ -wchar_t *worddelimiters = L" "; - -/* selection timeouts (in milliseconds) */ -static unsigned int doubleclicktimeout = 300; -static unsigned int tripleclicktimeout = 600; - -/* alt screens */ -int allowaltscreen = 1; - -/* allow certain non-interactive (insecure) window operations such as: - setting the clipboard text */ -int allowwindowops = 0; - -/* - * draw latency range in ms - from new content/keypress/etc until drawing. - * within this range, st draws when content stops arriving (idle). mostly it's - * near minlatency, but it waits longer for slow updates to avoid partial draw. - * low minlatency will tear/flicker more, as it can "detect" idle too early. - */ -static double minlatency = 8; -static double maxlatency = 33; - -/* - * 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[] = { - /* 8 normal colors */ - "black", - "red3", - "green3", - "yellow3", - "blue2", - "magenta3", - "cyan3", - "gray90", - - /* 8 bright colors */ - "gray50", - "red", - "green", - "yellow", - "#5c5cff", - "magenta", - "cyan", - "white", - - [255] = 0, - - /* more colors can be added after 255 to use with DefaultXX */ - "#cccccc", - "#555555", - "gray90", /* default foreground colour */ - "black", /* default background colour */ -}; - - -/* - * Default colors (colorname index) - * foreground, background, cursor, reverse cursor - */ -unsigned int defaultfg = 258; -unsigned int defaultbg = 259; -unsigned int defaultcs = 256; -static unsigned int defaultrcs = 257; - -/* - * Default shape of cursor - * 2: Block ("█") - * 4: Underline ("_") - * 6: Bar ("|") - * 7: Snowman ("☃") - */ -static unsigned int cursorshape = 2; - -/* - * 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_xterm; -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; - -/* - * Force mouse select/shortcuts 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 forcemousemod = ShiftMask; - -/* - * Internal mouse shortcuts. - * Beware that overloading Button1 will disable the selection. - */ -static MouseShortcut mshortcuts[] = { - /* mask button function argument release */ - { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, - { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} }, - { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, - { ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} }, - { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} }, -}; - -/* Internal keyboard shortcuts. */ -#define MODKEY Mod1Mask -#define TERMMOD (ControlMask|ShiftMask) - -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} }, - { TERMMOD, XK_Home, zoomreset, {.f = 0} }, - { TERMMOD, XK_C, clipcopy, {.i = 0} }, - { TERMMOD, XK_V, clippaste, {.i = 0} }, - { TERMMOD, XK_Y, selpaste, {.i = 0} }, - { ShiftMask, XK_Insert, selpaste, {.i = 0} }, - { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, - { TERMMOD, XK_Escape, keyboard_select,{ 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 - * - * 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; - -/* - * 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, "\033Ox", +1, 0}, - { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1}, - { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1}, - { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0}, - { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1}, - { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1}, - { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0}, - { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1}, - { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1}, - { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0}, - { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1}, - { XK_KP_Right, XK_ANY_MOD, "\033OC", 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, "\033Oj", +2, 0}, - { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0}, - { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0}, - { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0}, - { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0}, - { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0}, - { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0}, - { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0}, - { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0}, - { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0}, - { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0}, - { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0}, - { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0}, - { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0}, - { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0}, - { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0}, - { XK_KP_9, XK_ANY_MOD, "\033Oy", +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, "\033OA", 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, "\033OB", 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, "\033OD", 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, "\033OC", 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, "\033OP" , 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, "\033OQ" , 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, "\033OR" , 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, "\033OS" , 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{|}~"; diff --git a/config.mk b/config.mk index 1e306f8..47c615e 100644 --- a/config.mk +++ b/config.mk @@ -16,7 +16,7 @@ PKG_CONFIG = pkg-config INCS = -I$(X11INC) \ `$(PKG_CONFIG) --cflags fontconfig` \ `$(PKG_CONFIG) --cflags freetype2` -LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft \ +LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft -lXrender\ `$(PKG_CONFIG) --libs fontconfig` \ `$(PKG_CONFIG) --libs freetype2` diff --git a/patches/st-alpha-20220206-0.8.5.diff b/patches/st-alpha-20220206-0.8.5.diff new file mode 100644 index 0000000..ab029f6 --- /dev/null +++ b/patches/st-alpha-20220206-0.8.5.diff @@ -0,0 +1,146 @@ +diff --git a/config.def.h b/config.def.h +index 91ab8ca..6af616e 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -93,6 +93,9 @@ char *termname = "st-256color"; + */ + unsigned int tabspaces = 8; + ++/* bg opacity */ ++float alpha = 0.8; ++ + /* Terminal colors (16 first used in escape sequence) */ + static const char *colorname[] = { + /* 8 normal colors */ +diff --git a/config.mk b/config.mk +index 4c4c5d5..0114bad 100644 +--- a/config.mk ++++ b/config.mk +@@ -16,7 +16,7 @@ PKG_CONFIG = pkg-config + INCS = -I$(X11INC) \ + `$(PKG_CONFIG) --cflags fontconfig` \ + `$(PKG_CONFIG) --cflags freetype2` +-LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft \ ++LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft -lXrender\ + `$(PKG_CONFIG) --libs fontconfig` \ + `$(PKG_CONFIG) --libs freetype2` + +diff --git a/st.h b/st.h +index 519b9bd..8bb533d 100644 +--- a/st.h ++++ b/st.h +@@ -126,3 +126,4 @@ extern unsigned int tabspaces; + extern unsigned int defaultfg; + extern unsigned int defaultbg; + extern unsigned int defaultcs; ++extern float alpha; +diff --git a/x.c b/x.c +index 8a16faa..ddf4178 100644 +--- a/x.c ++++ b/x.c +@@ -105,6 +105,7 @@ typedef struct { + XSetWindowAttributes attrs; + int scr; + int isfixed; /* is fixed geometry? */ ++ int depth; /* bit depth */ + int l, t; /* left and top offset */ + int gm; /* geometry mask */ + } XWindow; +@@ -243,6 +244,7 @@ static char *usedfont = NULL; + static double usedfontsize = 0; + static double defaultfontsize = 0; + ++static char *opt_alpha = NULL; + static char *opt_class = NULL; + static char **opt_cmd = NULL; + static char *opt_embed = NULL; +@@ -736,7 +738,7 @@ xresize(int col, int row) + + XFreePixmap(xw.dpy, xw.buf); + xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, +- DefaultDepth(xw.dpy, xw.scr)); ++ xw.depth); + XftDrawChange(xw.draw, xw.buf); + xclear(0, 0, win.w, win.h); + +@@ -796,6 +798,13 @@ xloadcols(void) + else + die("could not allocate color %d\n", i); + } ++ ++ /* set alpha value of bg color */ ++ if (opt_alpha) ++ alpha = strtof(opt_alpha, NULL); ++ dc.col[defaultbg].color.alpha = (unsigned short)(0xffff * alpha); ++ dc.col[defaultbg].pixel &= 0x00FFFFFF; ++ dc.col[defaultbg].pixel |= (unsigned char)(0xff * alpha) << 24; + loaded = 1; + } + +@@ -1118,11 +1127,23 @@ xinit(int cols, int rows) + Window parent; + pid_t thispid = getpid(); + XColor xmousefg, xmousebg; ++ XWindowAttributes attr; ++ XVisualInfo vis; + + if (!(xw.dpy = XOpenDisplay(NULL))) + die("can't open display\n"); + xw.scr = XDefaultScreen(xw.dpy); +- xw.vis = XDefaultVisual(xw.dpy, xw.scr); ++ ++ if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) { ++ parent = XRootWindow(xw.dpy, xw.scr); ++ xw.depth = 32; ++ } else { ++ XGetWindowAttributes(xw.dpy, parent, &attr); ++ xw.depth = attr.depth; ++ } ++ ++ XMatchVisualInfo(xw.dpy, xw.scr, xw.depth, TrueColor, &vis); ++ xw.vis = vis.visual; + + /* font */ + if (!FcInit()) +@@ -1132,7 +1153,7 @@ xinit(int cols, int rows) + xloadfonts(usedfont, 0); + + /* colors */ +- xw.cmap = XDefaultColormap(xw.dpy, xw.scr); ++ xw.cmap = XCreateColormap(xw.dpy, parent, xw.vis, None); + xloadcols(); + + /* adjust fixed window geometry */ +@@ -1152,19 +1173,15 @@ xinit(int cols, int rows) + | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; + xw.attrs.colormap = xw.cmap; + +- if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) +- parent = XRootWindow(xw.dpy, xw.scr); + xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t, +- win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput, ++ win.w, win.h, 0, xw.depth, InputOutput, + xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity + | CWEventMask | CWColormap, &xw.attrs); + + memset(&gcvalues, 0, sizeof(gcvalues)); + gcvalues.graphics_exposures = False; +- dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures, +- &gcvalues); +- xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, +- DefaultDepth(xw.dpy, xw.scr)); ++ xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, xw.depth); ++ dc.gc = XCreateGC(xw.dpy, xw.buf, GCGraphicsExposures, &gcvalues); + XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel); + XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h); + +@@ -2019,6 +2036,9 @@ main(int argc, char *argv[]) + case 'a': + allowaltscreen = 0; + break; ++ case 'A': ++ opt_alpha = EARGF(usage()); ++ break; + case 'c': + opt_class = EARGF(usage()); + break; diff --git a/patches/st-scrollback-0.8.5.diff b/patches/st-scrollback-0.8.5.diff new file mode 100644 index 0000000..750111d --- /dev/null +++ b/patches/st-scrollback-0.8.5.diff @@ -0,0 +1,350 @@ +diff --git a/config.def.h b/config.def.h +index 91ab8ca..e3b469b 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -201,6 +201,8 @@ static Shortcut shortcuts[] = { + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, ++ { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, ++ { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, + }; + + /* +diff --git a/st.c b/st.c +index 51049ba..cd750f2 100644 +--- a/st.c ++++ b/st.c +@@ -35,6 +35,7 @@ + #define ESC_ARG_SIZ 16 + #define STR_BUF_SIZ ESC_BUF_SIZ + #define STR_ARG_SIZ ESC_ARG_SIZ ++#define HISTSIZE 2000 + + /* macros */ + #define IS_SET(flag) ((term.mode & (flag)) != 0) +@@ -42,6 +43,9 @@ + #define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f)) + #define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c)) + #define ISDELIM(u) (u && wcschr(worddelimiters, u)) ++#define TLINE(y) ((y) < term.scr ? term.hist[((y) + term.histi - \ ++ term.scr + HISTSIZE + 1) % HISTSIZE] : \ ++ term.line[(y) - term.scr]) + + enum term_mode { + MODE_WRAP = 1 << 0, +@@ -115,6 +119,9 @@ typedef struct { + int col; /* nb col */ + Line *line; /* screen */ + Line *alt; /* alternate screen */ ++ Line hist[HISTSIZE]; /* history buffer */ ++ int histi; /* history index */ ++ int scr; /* scroll back */ + int *dirty; /* dirtyness of lines */ + TCursor c; /* cursor */ + int ocx; /* old cursor col */ +@@ -184,8 +191,8 @@ static void tnewline(int); + static void tputtab(int); + static void tputc(Rune); + static void treset(void); +-static void tscrollup(int, int); +-static void tscrolldown(int, int); ++static void tscrollup(int, int, int); ++static void tscrolldown(int, int, int); + static void tsetattr(const int *, int); + static void tsetchar(Rune, const Glyph *, int, int); + static void tsetdirt(int, int); +@@ -416,10 +423,10 @@ tlinelen(int y) + { + int i = term.col; + +- if (term.line[y][i - 1].mode & ATTR_WRAP) ++ if (TLINE(y)[i - 1].mode & ATTR_WRAP) + return i; + +- while (i > 0 && term.line[y][i - 1].u == ' ') ++ while (i > 0 && TLINE(y)[i - 1].u == ' ') + --i; + + return i; +@@ -528,7 +535,7 @@ selsnap(int *x, int *y, int direction) + * Snap around if the word wraps around at the end or + * beginning of a line. + */ +- prevgp = &term.line[*y][*x]; ++ prevgp = &TLINE(*y)[*x]; + prevdelim = ISDELIM(prevgp->u); + for (;;) { + newx = *x + direction; +@@ -543,14 +550,14 @@ selsnap(int *x, int *y, int direction) + yt = *y, xt = *x; + else + yt = newy, xt = newx; +- if (!(term.line[yt][xt].mode & ATTR_WRAP)) ++ if (!(TLINE(yt)[xt].mode & ATTR_WRAP)) + break; + } + + if (newx >= tlinelen(newy)) + break; + +- gp = &term.line[newy][newx]; ++ gp = &TLINE(newy)[newx]; + delim = ISDELIM(gp->u); + if (!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim + || (delim && gp->u != prevgp->u))) +@@ -571,14 +578,14 @@ selsnap(int *x, int *y, int direction) + *x = (direction < 0) ? 0 : term.col - 1; + if (direction < 0) { + for (; *y > 0; *y += direction) { +- if (!(term.line[*y-1][term.col-1].mode ++ if (!(TLINE(*y-1)[term.col-1].mode + & ATTR_WRAP)) { + break; + } + } + } else if (direction > 0) { + for (; *y < term.row-1; *y += direction) { +- if (!(term.line[*y][term.col-1].mode ++ if (!(TLINE(*y)[term.col-1].mode + & ATTR_WRAP)) { + break; + } +@@ -609,13 +616,13 @@ getsel(void) + } + + if (sel.type == SEL_RECTANGULAR) { +- gp = &term.line[y][sel.nb.x]; ++ gp = &TLINE(y)[sel.nb.x]; + lastx = sel.ne.x; + } else { +- gp = &term.line[y][sel.nb.y == y ? sel.nb.x : 0]; ++ gp = &TLINE(y)[sel.nb.y == y ? sel.nb.x : 0]; + lastx = (sel.ne.y == y) ? sel.ne.x : term.col-1; + } +- last = &term.line[y][MIN(lastx, linelen-1)]; ++ last = &TLINE(y)[MIN(lastx, linelen-1)]; + while (last >= gp && last->u == ' ') + --last; + +@@ -851,6 +858,9 @@ void + ttywrite(const char *s, size_t n, int may_echo) + { + const char *next; ++ Arg arg = (Arg) { .i = term.scr }; ++ ++ kscrolldown(&arg); + + if (may_echo && IS_SET(MODE_ECHO)) + twrite(s, n, 1); +@@ -1062,12 +1072,52 @@ tswapscreen(void) + } + + void +-tscrolldown(int orig, int n) ++kscrolldown(const Arg* a) ++{ ++ int n = a->i; ++ ++ if (n < 0) ++ n = term.row + n; ++ ++ if (n > term.scr) ++ n = term.scr; ++ ++ if (term.scr > 0) { ++ term.scr -= n; ++ selscroll(0, -n); ++ tfulldirt(); ++ } ++} ++ ++void ++kscrollup(const Arg* a) ++{ ++ int n = a->i; ++ ++ if (n < 0) ++ n = term.row + n; ++ ++ if (term.scr <= HISTSIZE-n) { ++ term.scr += n; ++ selscroll(0, n); ++ tfulldirt(); ++ } ++} ++ ++void ++tscrolldown(int orig, int n, int copyhist) + { + int i; + Line temp; + + LIMIT(n, 0, term.bot-orig+1); ++ if (copyhist) { ++ term.histi = (term.histi - 1 + HISTSIZE) % HISTSIZE; ++ temp = term.hist[term.histi]; ++ term.hist[term.histi] = term.line[term.bot]; ++ term.line[term.bot] = temp; ++ } ++ + + tsetdirt(orig, term.bot-n); + tclearregion(0, term.bot-n+1, term.col-1, term.bot); +@@ -1078,17 +1128,28 @@ tscrolldown(int orig, int n) + term.line[i-n] = temp; + } + +- selscroll(orig, n); ++ if (term.scr == 0) ++ selscroll(orig, n); + } + + void +-tscrollup(int orig, int n) ++tscrollup(int orig, int n, int copyhist) + { + int i; + Line temp; + + LIMIT(n, 0, term.bot-orig+1); + ++ if (copyhist) { ++ term.histi = (term.histi + 1) % HISTSIZE; ++ temp = term.hist[term.histi]; ++ term.hist[term.histi] = term.line[orig]; ++ term.line[orig] = temp; ++ } ++ ++ if (term.scr > 0 && term.scr < HISTSIZE) ++ term.scr = MIN(term.scr + n, HISTSIZE-1); ++ + tclearregion(0, orig, term.col-1, orig+n-1); + tsetdirt(orig+n, term.bot); + +@@ -1098,7 +1159,8 @@ tscrollup(int orig, int n) + term.line[i+n] = temp; + } + +- selscroll(orig, -n); ++ if (term.scr == 0) ++ selscroll(orig, -n); + } + + void +@@ -1127,7 +1189,7 @@ tnewline(int first_col) + int y = term.c.y; + + if (y == term.bot) { +- tscrollup(term.top, 1); ++ tscrollup(term.top, 1, 1); + } else { + y++; + } +@@ -1292,14 +1354,14 @@ void + tinsertblankline(int n) + { + if (BETWEEN(term.c.y, term.top, term.bot)) +- tscrolldown(term.c.y, n); ++ tscrolldown(term.c.y, n, 0); + } + + void + tdeleteline(int n) + { + if (BETWEEN(term.c.y, term.top, term.bot)) +- tscrollup(term.c.y, n); ++ tscrollup(term.c.y, n, 0); + } + + int32_t +@@ -1736,11 +1798,11 @@ csihandle(void) + break; + case 'S': /* SU -- Scroll line up */ + DEFAULT(csiescseq.arg[0], 1); +- tscrollup(term.top, csiescseq.arg[0]); ++ tscrollup(term.top, csiescseq.arg[0], 0); + break; + case 'T': /* SD -- Scroll line down */ + DEFAULT(csiescseq.arg[0], 1); +- tscrolldown(term.top, csiescseq.arg[0]); ++ tscrolldown(term.top, csiescseq.arg[0], 0); + break; + case 'L': /* IL -- Insert blank lines */ + DEFAULT(csiescseq.arg[0], 1); +@@ -2330,7 +2392,7 @@ eschandle(uchar ascii) + return 0; + case 'D': /* IND -- Linefeed */ + if (term.c.y == term.bot) { +- tscrollup(term.top, 1); ++ tscrollup(term.top, 1, 1); + } else { + tmoveto(term.c.x, term.c.y+1); + } +@@ -2343,7 +2405,7 @@ eschandle(uchar ascii) + break; + case 'M': /* RI -- Reverse index */ + if (term.c.y == term.top) { +- tscrolldown(term.top, 1); ++ tscrolldown(term.top, 1, 1); + } else { + tmoveto(term.c.x, term.c.y-1); + } +@@ -2557,7 +2619,7 @@ twrite(const char *buf, int buflen, int show_ctrl) + void + tresize(int col, int row) + { +- int i; ++ int i, j; + int minrow = MIN(row, term.row); + int mincol = MIN(col, term.col); + int *bp; +@@ -2594,6 +2656,14 @@ tresize(int col, int row) + term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty)); + term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs)); + ++ for (i = 0; i < HISTSIZE; i++) { ++ term.hist[i] = xrealloc(term.hist[i], col * sizeof(Glyph)); ++ for (j = mincol; j < col; j++) { ++ term.hist[i][j] = term.c.attr; ++ term.hist[i][j].u = ' '; ++ } ++ } ++ + /* resize each row to new width, zero-pad if needed */ + for (i = 0; i < minrow; i++) { + term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph)); +@@ -2652,7 +2722,7 @@ drawregion(int x1, int y1, int x2, int y2) + continue; + + term.dirty[y] = 0; +- xdrawline(term.line[y], x1, y, x2); ++ xdrawline(TLINE(y), x1, y, x2); + } + } + +@@ -2673,8 +2743,9 @@ draw(void) + cx--; + + drawregion(0, 0, term.col, term.row); +- xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], +- term.ocx, term.ocy, term.line[term.ocy][term.ocx]); ++ if (term.scr == 0) ++ xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], ++ term.ocx, term.ocy, term.line[term.ocy][term.ocx]); + term.ocx = cx; + term.ocy = term.c.y; + xfinishdraw(); +diff --git a/st.h b/st.h +index 519b9bd..da36b34 100644 +--- a/st.h ++++ b/st.h +@@ -81,6 +81,8 @@ void die(const char *, ...); + void redraw(void); + void draw(void); + ++void kscrolldown(const Arg *); ++void kscrollup(const Arg *); + void printscreen(const Arg *); + void printsel(const Arg *); + void sendbreak(const Arg *); diff --git a/st b/st deleted file mode 100755 index 01e4acaae87a6930839c17220ff1d36539f62e8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109776 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 ezjZx5YCRm&{ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -char *argv0; -#include "arg.h" -#include "st.h" -#include "win.h" - -/* types used in config.h */ -typedef struct { - uint mod; - KeySym keysym; - void (*func)(const Arg *); - const Arg arg; -} Shortcut; - -typedef struct { - uint mod; - uint button; - void (*func)(const Arg *); - const Arg arg; - uint release; -} MouseShortcut; - -typedef struct { - KeySym k; - uint mask; - char *s; - /* three-valued logic variables: 0 indifferent, 1 on, -1 off */ - signed char appkey; /* application keypad */ - signed char appcursor; /* application cursor */ -} Key; - -/* X modifiers */ -#define XK_ANY_MOD UINT_MAX -#define XK_NO_MOD 0 -#define XK_SWITCH_MOD (1<<13|1<<14) - -/* function definitions used in config.h */ -static void clipcopy(const Arg *); -static void clippaste(const Arg *); -static void numlock(const Arg *); -static void selpaste(const Arg *); -static void zoom(const Arg *); -static void zoomabs(const Arg *); -static void zoomreset(const Arg *); -static void ttysend(const Arg *); - -/* config.h for applying patches and the configuration. */ -#include "config.h" - -/* XEMBED messages */ -#define XEMBED_FOCUS_IN 4 -#define XEMBED_FOCUS_OUT 5 - -/* macros */ -#define IS_SET(flag) ((win.mode & (flag)) != 0) -#define TRUERED(x) (((x) & 0xff0000) >> 8) -#define TRUEGREEN(x) (((x) & 0xff00)) -#define TRUEBLUE(x) (((x) & 0xff) << 8) - -typedef XftDraw *Draw; -typedef XftColor Color; -typedef XftGlyphFontSpec GlyphFontSpec; - -/* Purely graphic info */ -typedef struct { - int tw, th; /* tty width and height */ - int w, h; /* window width and height */ - int ch; /* char height */ - int cw; /* char width */ - int mode; /* window state/mode flags */ - int cursor; /* cursor style */ -} TermWindow; - -typedef struct { - Display *dpy; - Colormap cmap; - Window win; - Drawable buf; - GlyphFontSpec *specbuf; /* font spec buffer used for rendering */ - Atom xembed, wmdeletewin, netwmname, netwmiconname, netwmpid; - struct { - XIM xim; - XIC xic; - XPoint spot; - XVaNestedList spotlist; - } ime; - Draw draw; - Visual *vis; - XSetWindowAttributes attrs; - int scr; - int isfixed; /* is fixed geometry? */ - int l, t; /* left and top offset */ - int gm; /* geometry mask */ -} XWindow; - -typedef struct { - Atom xtarget; - char *primary, *clipboard; - struct timespec tclick1; - struct timespec tclick2; -} XSelection; - -/* Font structure */ -#define Font Font_ -typedef struct { - int height; - int width; - int ascent; - int descent; - int badslant; - int badweight; - short lbearing; - short rbearing; - XftFont *match; - FcFontSet *set; - FcPattern *pattern; -} Font; - -/* Drawing Context */ -typedef struct { - Color *col; - size_t collen; - Font font, bfont, ifont, ibfont; - GC gc; -} DC; - -static inline ushort sixd_to_16bit(int); -static int xmakeglyphfontspecs(XftGlyphFontSpec *, const Glyph *, int, int, int); -static void xdrawglyphfontspecs(const XftGlyphFontSpec *, Glyph, int, int, int, int); -static void xdrawglyph(Glyph, int, int); -static void xclear(int, int, int, int); -static int xgeommasktogravity(int); -static int ximopen(Display *); -static void ximinstantiate(Display *, XPointer, XPointer); -static void ximdestroy(XIM, XPointer, XPointer); -static int xicdestroy(XIC, XPointer, XPointer); -static void xinit(int, int); -static void cresize(int, int); -static void xresize(int, int); -static void xhints(void); -static int xloadcolor(int, const char *, Color *); -static int xloadfont(Font *, FcPattern *); -static void xloadfonts(const char *, double); -static int xloadsparefont(FcPattern *, int); -static void xloadsparefonts(void); -static void xunloadfont(Font *); -static void xunloadfonts(void); -static void xsetenv(void); -static void xseturgency(int); -static int evcol(XEvent *); -static int evrow(XEvent *); - -static void expose(XEvent *); -static void visibility(XEvent *); -static void unmap(XEvent *); -static void kpress(XEvent *); -static void cmessage(XEvent *); -static void resize(XEvent *); -static void focus(XEvent *); -static uint buttonmask(uint); -static int mouseaction(XEvent *, uint); -static void brelease(XEvent *); -static void bpress(XEvent *); -static void bmotion(XEvent *); -static void propnotify(XEvent *); -static void selnotify(XEvent *); -static void selclear_(XEvent *); -static void selrequest(XEvent *); -static void setsel(char *, Time); -static void mousesel(XEvent *, int); -static void mousereport(XEvent *); -static char *kmap(KeySym, uint); -static int match(uint, uint); - -static void run(void); -static void usage(void); - -static void (*handler[LASTEvent])(XEvent *) = { - [KeyPress] = kpress, - [ClientMessage] = cmessage, - [ConfigureNotify] = resize, - [VisibilityNotify] = visibility, - [UnmapNotify] = unmap, - [Expose] = expose, - [FocusIn] = focus, - [FocusOut] = focus, - [MotionNotify] = bmotion, - [ButtonPress] = bpress, - [ButtonRelease] = brelease, -/* - * Uncomment if you want the selection to disappear when you select something - * different in another window. - */ -/* [SelectionClear] = selclear_, */ - [SelectionNotify] = selnotify, -/* - * PropertyNotify is only turned on when there is some INCR transfer happening - * for the selection retrieval. - */ - [PropertyNotify] = propnotify, - [SelectionRequest] = selrequest, -}; - -/* Globals */ -static DC dc; -static XWindow xw; -static XSelection xsel; -static TermWindow win; - -/* Font Ring Cache */ -enum { - FRC_NORMAL, - FRC_ITALIC, - FRC_BOLD, - FRC_ITALICBOLD -}; - -typedef struct { - XftFont *font; - int flags; - Rune unicodep; -} Fontcache; - -/* Fontcache is an array now. A new font will be appended to the array. */ -static Fontcache *frc = NULL; -static int frclen = 0; -static int frccap = 0; -static char *usedfont = NULL; -static double usedfontsize = 0; -static double defaultfontsize = 0; - -static char *opt_class = NULL; -static char **opt_cmd = NULL; -static char *opt_embed = NULL; -static char *opt_font = NULL; -static char *opt_io = NULL; -static char *opt_line = NULL; -static char *opt_name = NULL; -static char *opt_title = NULL; - -static uint buttons; /* bit field of pressed buttons */ - -void -clipcopy(const Arg *dummy) -{ - Atom clipboard; - - free(xsel.clipboard); - xsel.clipboard = NULL; - - if (xsel.primary != NULL) { - xsel.clipboard = xstrdup(xsel.primary); - clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); - XSetSelectionOwner(xw.dpy, clipboard, xw.win, CurrentTime); - } -} - -void -clippaste(const Arg *dummy) -{ - Atom clipboard; - - clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); - XConvertSelection(xw.dpy, clipboard, xsel.xtarget, clipboard, - xw.win, CurrentTime); -} - -void -selpaste(const Arg *dummy) -{ - XConvertSelection(xw.dpy, XA_PRIMARY, xsel.xtarget, XA_PRIMARY, - xw.win, CurrentTime); -} - -void -numlock(const Arg *dummy) -{ - win.mode ^= MODE_NUMLOCK; -} - -void -zoom(const Arg *arg) -{ - Arg larg; - - larg.f = usedfontsize + arg->f; - zoomabs(&larg); -} - -void -zoomabs(const Arg *arg) -{ - xunloadfonts(); - xloadfonts(usedfont, arg->f); - xloadsparefonts(); - cresize(0, 0); - redraw(); - xhints(); -} - -void -zoomreset(const Arg *arg) -{ - Arg larg; - - if (defaultfontsize > 0) { - larg.f = defaultfontsize; - zoomabs(&larg); - } -} - -void -ttysend(const Arg *arg) -{ - ttywrite(arg->s, strlen(arg->s), 1); -} - -int -evcol(XEvent *e) -{ - int x = e->xbutton.x - borderpx; - LIMIT(x, 0, win.tw - 1); - return x / win.cw; -} - -int -evrow(XEvent *e) -{ - int y = e->xbutton.y - borderpx; - LIMIT(y, 0, win.th - 1); - return y / win.ch; -} - -void -mousesel(XEvent *e, int done) -{ - int type, seltype = SEL_REGULAR; - uint state = e->xbutton.state & ~(Button1Mask | forcemousemod); - - for (type = 1; type < LEN(selmasks); ++type) { - if (match(selmasks[type], state)) { - seltype = type; - break; - } - } - selextend(evcol(e), evrow(e), seltype, done); - if (done) - setsel(getsel(), e->xbutton.time); -} - -void -mousereport(XEvent *e) -{ - int len, btn, code; - int x = evcol(e), y = evrow(e); - int state = e->xbutton.state; - char buf[40]; - static int ox, oy; - - if (e->type == MotionNotify) { - if (x == ox && y == oy) - return; - if (!IS_SET(MODE_MOUSEMOTION) && !IS_SET(MODE_MOUSEMANY)) - return; - /* MODE_MOUSEMOTION: no reporting if no button is pressed */ - if (IS_SET(MODE_MOUSEMOTION) && buttons == 0) - return; - /* Set btn to lowest-numbered pressed button, or 12 if no - * buttons are pressed. */ - for (btn = 1; btn <= 11 && !(buttons & (1<<(btn-1))); btn++) - ; - code = 32; - } else { - btn = e->xbutton.button; - /* Only buttons 1 through 11 can be encoded */ - if (btn < 1 || btn > 11) - return; - if (e->type == ButtonRelease) { - /* MODE_MOUSEX10: no button release reporting */ - if (IS_SET(MODE_MOUSEX10)) - return; - /* Don't send release events for the scroll wheel */ - if (btn == 4 || btn == 5) - return; - } - code = 0; - } - - ox = x; - oy = y; - - /* Encode btn into code. If no button is pressed for a motion event in - * MODE_MOUSEMANY, then encode it as a release. */ - if ((!IS_SET(MODE_MOUSESGR) && e->type == ButtonRelease) || btn == 12) - code += 3; - else if (btn >= 8) - code += 128 + btn - 8; - else if (btn >= 4) - code += 64 + btn - 4; - else - code += btn - 1; - - if (!IS_SET(MODE_MOUSEX10)) { - code += ((state & ShiftMask ) ? 4 : 0) - + ((state & Mod1Mask ) ? 8 : 0) /* meta key: alt */ - + ((state & ControlMask) ? 16 : 0); - } - - if (IS_SET(MODE_MOUSESGR)) { - len = snprintf(buf, sizeof(buf), "\033[<%d;%d;%d%c", - code, x+1, y+1, - e->type == ButtonRelease ? 'm' : 'M'); - } else if (x < 223 && y < 223) { - len = snprintf(buf, sizeof(buf), "\033[M%c%c%c", - 32+code, 32+x+1, 32+y+1); - } else { - return; - } - - ttywrite(buf, len, 0); -} - -uint -buttonmask(uint button) -{ - return button == Button1 ? Button1Mask - : button == Button2 ? Button2Mask - : button == Button3 ? Button3Mask - : button == Button4 ? Button4Mask - : button == Button5 ? Button5Mask - : 0; -} - -int -mouseaction(XEvent *e, uint release) -{ - MouseShortcut *ms; - - /* ignore Buttonmask for Button - it's set on release */ - uint state = e->xbutton.state & ~buttonmask(e->xbutton.button); - - for (ms = mshortcuts; ms < mshortcuts + LEN(mshortcuts); ms++) { - if (ms->release == release && - ms->button == e->xbutton.button && - (match(ms->mod, state) || /* exact or forced */ - match(ms->mod, state & ~forcemousemod))) { - ms->func(&(ms->arg)); - return 1; - } - } - - return 0; -} - -void -bpress(XEvent *e) -{ - int btn = e->xbutton.button; - struct timespec now; - int snap; - - if (1 <= btn && btn <= 11) - buttons |= 1 << (btn-1); - - if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { - mousereport(e); - return; - } - - if (mouseaction(e, 0)) - return; - - if (btn == Button1) { - /* - * If the user clicks below predefined timeouts specific - * snapping behaviour is exposed. - */ - clock_gettime(CLOCK_MONOTONIC, &now); - if (TIMEDIFF(now, xsel.tclick2) <= tripleclicktimeout) { - snap = SNAP_LINE; - } else if (TIMEDIFF(now, xsel.tclick1) <= doubleclicktimeout) { - snap = SNAP_WORD; - } else { - snap = 0; - } - xsel.tclick2 = xsel.tclick1; - xsel.tclick1 = now; - - selstart(evcol(e), evrow(e), snap); - } -} - -void -propnotify(XEvent *e) -{ - XPropertyEvent *xpev; - Atom clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); - - xpev = &e->xproperty; - if (xpev->state == PropertyNewValue && - (xpev->atom == XA_PRIMARY || - xpev->atom == clipboard)) { - selnotify(e); - } -} - -void -selnotify(XEvent *e) -{ - ulong nitems, ofs, rem; - int format; - uchar *data, *last, *repl; - Atom type, incratom, property = None; - - incratom = XInternAtom(xw.dpy, "INCR", 0); - - ofs = 0; - if (e->type == SelectionNotify) - property = e->xselection.property; - else if (e->type == PropertyNotify) - property = e->xproperty.atom; - - if (property == None) - return; - - do { - if (XGetWindowProperty(xw.dpy, xw.win, property, ofs, - BUFSIZ/4, False, AnyPropertyType, - &type, &format, &nitems, &rem, - &data)) { - fprintf(stderr, "Clipboard allocation failed\n"); - return; - } - - if (e->type == PropertyNotify && nitems == 0 && rem == 0) { - /* - * If there is some PropertyNotify with no data, then - * this is the signal of the selection owner that all - * data has been transferred. We won't need to receive - * PropertyNotify events anymore. - */ - MODBIT(xw.attrs.event_mask, 0, PropertyChangeMask); - XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, - &xw.attrs); - } - - if (type == incratom) { - /* - * Activate the PropertyNotify events so we receive - * when the selection owner does send us the next - * chunk of data. - */ - MODBIT(xw.attrs.event_mask, 1, PropertyChangeMask); - XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, - &xw.attrs); - - /* - * Deleting the property is the transfer start signal. - */ - XDeleteProperty(xw.dpy, xw.win, (int)property); - continue; - } - - /* - * As seen in getsel: - * Line endings are inconsistent in the terminal and GUI world - * copy and pasting. When receiving some selection data, - * replace all '\n' with '\r'. - * FIXME: Fix the computer world. - */ - repl = data; - last = data + nitems * format / 8; - while ((repl = memchr(repl, '\n', last - repl))) { - *repl++ = '\r'; - } - - if (IS_SET(MODE_BRCKTPASTE) && ofs == 0) - ttywrite("\033[200~", 6, 0); - ttywrite((char *)data, nitems * format / 8, 1); - if (IS_SET(MODE_BRCKTPASTE) && rem == 0) - ttywrite("\033[201~", 6, 0); - XFree(data); - /* number of 32-bit chunks returned */ - ofs += nitems * format / 32; - } while (rem > 0); - - /* - * Deleting the property again tells the selection owner to send the - * next data chunk in the property. - */ - XDeleteProperty(xw.dpy, xw.win, (int)property); -} - -void -xclipcopy(void) -{ - clipcopy(NULL); -} - -void -selclear_(XEvent *e) -{ - selclear(); -} - -void -selrequest(XEvent *e) -{ - XSelectionRequestEvent *xsre; - XSelectionEvent xev; - Atom xa_targets, string, clipboard; - char *seltext; - - xsre = (XSelectionRequestEvent *) e; - xev.type = SelectionNotify; - xev.requestor = xsre->requestor; - xev.selection = xsre->selection; - xev.target = xsre->target; - xev.time = xsre->time; - if (xsre->property == None) - xsre->property = xsre->target; - - /* reject */ - xev.property = None; - - xa_targets = XInternAtom(xw.dpy, "TARGETS", 0); - if (xsre->target == xa_targets) { - /* respond with the supported type */ - string = xsel.xtarget; - XChangeProperty(xsre->display, xsre->requestor, xsre->property, - XA_ATOM, 32, PropModeReplace, - (uchar *) &string, 1); - xev.property = xsre->property; - } else if (xsre->target == xsel.xtarget || xsre->target == XA_STRING) { - /* - * xith XA_STRING non ascii characters may be incorrect in the - * requestor. It is not our problem, use utf8. - */ - clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); - if (xsre->selection == XA_PRIMARY) { - seltext = xsel.primary; - } else if (xsre->selection == clipboard) { - seltext = xsel.clipboard; - } else { - fprintf(stderr, - "Unhandled clipboard selection 0x%lx\n", - xsre->selection); - return; - } - if (seltext != NULL) { - XChangeProperty(xsre->display, xsre->requestor, - xsre->property, xsre->target, - 8, PropModeReplace, - (uchar *)seltext, strlen(seltext)); - xev.property = xsre->property; - } - } - - /* all done, send a notification to the listener */ - if (!XSendEvent(xsre->display, xsre->requestor, 1, 0, (XEvent *) &xev)) - fprintf(stderr, "Error sending SelectionNotify event\n"); -} - -void -setsel(char *str, Time t) -{ - if (!str) - return; - - free(xsel.primary); - xsel.primary = str; - - XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, t); - if (XGetSelectionOwner(xw.dpy, XA_PRIMARY) != xw.win) - selclear(); -} - -void -xsetsel(char *str) -{ - setsel(str, CurrentTime); -} - -void -brelease(XEvent *e) -{ - int btn = e->xbutton.button; - - if (1 <= btn && btn <= 11) - buttons &= ~(1 << (btn-1)); - - if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { - mousereport(e); - return; - } - - if (mouseaction(e, 1)) - return; - if (btn == Button1) - mousesel(e, 1); -} - -void -bmotion(XEvent *e) -{ - if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { - mousereport(e); - return; - } - - mousesel(e, 0); -} - -void -cresize(int width, int height) -{ - int col, row; - - if (width != 0) - win.w = width; - if (height != 0) - win.h = height; - - col = (win.w - 2 * borderpx) / win.cw; - row = (win.h - 2 * borderpx) / win.ch; - col = MAX(1, col); - row = MAX(1, row); - - tresize(col, row); - xresize(col, row); - ttyresize(win.tw, win.th); -} - -void -xresize(int col, int row) -{ - win.tw = col * win.cw; - win.th = row * win.ch; - - XFreePixmap(xw.dpy, xw.buf); - xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, - DefaultDepth(xw.dpy, xw.scr)); - XftDrawChange(xw.draw, xw.buf); - xclear(0, 0, win.w, win.h); - - /* resize to new width */ - xw.specbuf = xrealloc(xw.specbuf, col * sizeof(GlyphFontSpec)); -} - -ushort -sixd_to_16bit(int x) -{ - return x == 0 ? 0 : 0x3737 + 0x2828 * x; -} - -int -xloadcolor(int i, const char *name, Color *ncolor) -{ - XRenderColor color = { .alpha = 0xffff }; - - if (!name) { - if (BETWEEN(i, 16, 255)) { /* 256 color */ - if (i < 6*6*6+16) { /* same colors as xterm */ - color.red = sixd_to_16bit( ((i-16)/36)%6 ); - color.green = sixd_to_16bit( ((i-16)/6) %6 ); - color.blue = sixd_to_16bit( ((i-16)/1) %6 ); - } else { /* greyscale */ - color.red = 0x0808 + 0x0a0a * (i - (6*6*6+16)); - color.green = color.blue = color.red; - } - return XftColorAllocValue(xw.dpy, xw.vis, - xw.cmap, &color, ncolor); - } else - name = colorname[i]; - } - - return XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, ncolor); -} - -void -xloadcols(void) -{ - int i; - static int loaded; - Color *cp; - - if (loaded) { - for (cp = dc.col; cp < &dc.col[dc.collen]; ++cp) - XftColorFree(xw.dpy, xw.vis, xw.cmap, cp); - } else { - dc.collen = MAX(LEN(colorname), 256); - dc.col = xmalloc(dc.collen * sizeof(Color)); - } - - for (i = 0; i < dc.collen; i++) - if (!xloadcolor(i, NULL, &dc.col[i])) { - if (colorname[i]) - die("could not allocate color '%s'\n", colorname[i]); - else - die("could not allocate color %d\n", i); - } - loaded = 1; -} - -int -xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b) -{ - if (!BETWEEN(x, 0, dc.collen)) - return 1; - - *r = dc.col[x].color.red >> 8; - *g = dc.col[x].color.green >> 8; - *b = dc.col[x].color.blue >> 8; - - return 0; -} - -int -xsetcolorname(int x, const char *name) -{ - Color ncolor; - - if (!BETWEEN(x, 0, dc.collen)) - return 1; - - if (!xloadcolor(x, name, &ncolor)) - return 1; - - XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.col[x]); - dc.col[x] = ncolor; - - return 0; -} - -/* - * Absolute coordinates. - */ -void -xclear(int x1, int y1, int x2, int y2) -{ - XftDrawRect(xw.draw, - &dc.col[IS_SET(MODE_REVERSE)? defaultfg : defaultbg], - x1, y1, x2-x1, y2-y1); -} - -void -xhints(void) -{ - XClassHint class = {opt_name ? opt_name : termname, - opt_class ? opt_class : termname}; - XWMHints wm = {.flags = InputHint, .input = 1}; - XSizeHints *sizeh; - - sizeh = XAllocSizeHints(); - - sizeh->flags = PSize | PResizeInc | PBaseSize | PMinSize; - sizeh->height = win.h; - sizeh->width = win.w; - sizeh->height_inc = win.ch; - sizeh->width_inc = win.cw; - sizeh->base_height = 2 * borderpx; - sizeh->base_width = 2 * borderpx; - sizeh->min_height = win.ch + 2 * borderpx; - sizeh->min_width = win.cw + 2 * borderpx; - if (xw.isfixed) { - sizeh->flags |= PMaxSize; - sizeh->min_width = sizeh->max_width = win.w; - sizeh->min_height = sizeh->max_height = win.h; - } - if (xw.gm & (XValue|YValue)) { - sizeh->flags |= USPosition | PWinGravity; - sizeh->x = xw.l; - sizeh->y = xw.t; - sizeh->win_gravity = xgeommasktogravity(xw.gm); - } - - XSetWMProperties(xw.dpy, xw.win, NULL, NULL, NULL, 0, sizeh, &wm, - &class); - XFree(sizeh); -} - -int -xgeommasktogravity(int mask) -{ - switch (mask & (XNegative|YNegative)) { - case 0: - return NorthWestGravity; - case XNegative: - return NorthEastGravity; - case YNegative: - return SouthWestGravity; - } - - return SouthEastGravity; -} - -int -xloadfont(Font *f, FcPattern *pattern) -{ - FcPattern *configured; - FcPattern *match; - FcResult result; - XGlyphInfo extents; - int wantattr, haveattr; - - /* - * Manually configure instead of calling XftMatchFont - * so that we can use the configured pattern for - * "missing glyph" lookups. - */ - configured = FcPatternDuplicate(pattern); - if (!configured) - return 1; - - FcConfigSubstitute(NULL, configured, FcMatchPattern); - XftDefaultSubstitute(xw.dpy, xw.scr, configured); - - match = FcFontMatch(NULL, configured, &result); - if (!match) { - FcPatternDestroy(configured); - return 1; - } - - if (!(f->match = XftFontOpenPattern(xw.dpy, match))) { - FcPatternDestroy(configured); - FcPatternDestroy(match); - return 1; - } - - if ((XftPatternGetInteger(pattern, "slant", 0, &wantattr) == - XftResultMatch)) { - /* - * Check if xft was unable to find a font with the appropriate - * slant but gave us one anyway. Try to mitigate. - */ - if ((XftPatternGetInteger(f->match->pattern, "slant", 0, - &haveattr) != XftResultMatch) || haveattr < wantattr) { - f->badslant = 1; - fputs("font slant does not match\n", stderr); - } - } - - if ((XftPatternGetInteger(pattern, "weight", 0, &wantattr) == - XftResultMatch)) { - if ((XftPatternGetInteger(f->match->pattern, "weight", 0, - &haveattr) != XftResultMatch) || haveattr != wantattr) { - f->badweight = 1; - fputs("font weight does not match\n", stderr); - } - } - - XftTextExtentsUtf8(xw.dpy, f->match, - (const FcChar8 *) ascii_printable, - strlen(ascii_printable), &extents); - - f->set = NULL; - f->pattern = configured; - - f->ascent = f->match->ascent; - f->descent = f->match->descent; - f->lbearing = 0; - f->rbearing = f->match->max_advance_width; - - f->height = f->ascent + f->descent; - f->width = DIVCEIL(extents.xOff, strlen(ascii_printable)); - - return 0; -} - -void -xloadfonts(const char *fontstr, double fontsize) -{ - FcPattern *pattern; - double fontval; - - if (fontstr[0] == '-') - pattern = XftXlfdParse(fontstr, False, False); - else - pattern = FcNameParse((const FcChar8 *)fontstr); - - if (!pattern) - die("can't open font %s\n", fontstr); - - if (fontsize > 1) { - FcPatternDel(pattern, FC_PIXEL_SIZE); - FcPatternDel(pattern, FC_SIZE); - FcPatternAddDouble(pattern, FC_PIXEL_SIZE, (double)fontsize); - usedfontsize = fontsize; - } else { - if (FcPatternGetDouble(pattern, FC_PIXEL_SIZE, 0, &fontval) == - FcResultMatch) { - usedfontsize = fontval; - } else if (FcPatternGetDouble(pattern, FC_SIZE, 0, &fontval) == - FcResultMatch) { - usedfontsize = -1; - } else { - /* - * Default font size is 12, if none given. This is to - * have a known usedfontsize value. - */ - FcPatternAddDouble(pattern, FC_PIXEL_SIZE, 12); - usedfontsize = 12; - } - defaultfontsize = usedfontsize; - } - - if (xloadfont(&dc.font, pattern)) - die("can't open font %s\n", fontstr); - - if (usedfontsize < 0) { - FcPatternGetDouble(dc.font.match->pattern, - FC_PIXEL_SIZE, 0, &fontval); - usedfontsize = fontval; - if (fontsize == 0) - defaultfontsize = fontval; - } - - /* Setting character width and height. */ - win.cw = ceilf(dc.font.width * cwscale); - win.ch = ceilf(dc.font.height * chscale); - - FcPatternDel(pattern, FC_SLANT); - FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); - if (xloadfont(&dc.ifont, pattern)) - die("can't open font %s\n", fontstr); - - FcPatternDel(pattern, FC_WEIGHT); - FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); - if (xloadfont(&dc.ibfont, pattern)) - die("can't open font %s\n", fontstr); - - FcPatternDel(pattern, FC_SLANT); - FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN); - if (xloadfont(&dc.bfont, pattern)) - die("can't open font %s\n", fontstr); - - FcPatternDestroy(pattern); -} - -int -xloadsparefont(FcPattern *pattern, int flags) -{ - FcPattern *match; - FcResult result; - - match = FcFontMatch(NULL, pattern, &result); - if (!match) { - return 1; - } - - if (!(frc[frclen].font = XftFontOpenPattern(xw.dpy, match))) { - FcPatternDestroy(match); - return 1; - } - - frc[frclen].flags = flags; - /* Believe U+0000 glyph will present in each default font */ - frc[frclen].unicodep = 0; - frclen++; - - return 0; -} - -void -xloadsparefonts(void) -{ - FcPattern *pattern; - double sizeshift, fontval; - int fc; - char **fp; - - if (frclen != 0) - die("can't embed spare fonts. cache isn't empty"); - - /* Calculate count of spare fonts */ - fc = sizeof(font2) / sizeof(*font2); - if (fc == 0) - return; - - /* Allocate memory for cache entries. */ - if (frccap < 4 * fc) { - frccap += 4 * fc - frccap; - frc = xrealloc(frc, frccap * sizeof(Fontcache)); - } - - for (fp = font2; fp - font2 < fc; ++fp) { - - if (**fp == '-') - pattern = XftXlfdParse(*fp, False, False); - else - pattern = FcNameParse((FcChar8 *)*fp); - - if (!pattern) - die("can't open spare font %s\n", *fp); - - if (defaultfontsize > 0) { - sizeshift = usedfontsize - defaultfontsize; - if (sizeshift != 0 && - FcPatternGetDouble(pattern, FC_PIXEL_SIZE, 0, &fontval) == - FcResultMatch) { - fontval += sizeshift; - FcPatternDel(pattern, FC_PIXEL_SIZE); - FcPatternDel(pattern, FC_SIZE); - FcPatternAddDouble(pattern, FC_PIXEL_SIZE, fontval); - } - } - - FcPatternAddBool(pattern, FC_SCALABLE, 1); - - FcConfigSubstitute(NULL, pattern, FcMatchPattern); - XftDefaultSubstitute(xw.dpy, xw.scr, pattern); - - if (xloadsparefont(pattern, FRC_NORMAL)) - die("can't open spare font %s\n", *fp); - - FcPatternDel(pattern, FC_SLANT); - FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); - if (xloadsparefont(pattern, FRC_ITALIC)) - die("can't open spare font %s\n", *fp); - - FcPatternDel(pattern, FC_WEIGHT); - FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); - if (xloadsparefont(pattern, FRC_ITALICBOLD)) - die("can't open spare font %s\n", *fp); - - FcPatternDel(pattern, FC_SLANT); - FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN); - if (xloadsparefont(pattern, FRC_BOLD)) - die("can't open spare font %s\n", *fp); - - FcPatternDestroy(pattern); - } -} - -void -xunloadfont(Font *f) -{ - XftFontClose(xw.dpy, f->match); - FcPatternDestroy(f->pattern); - if (f->set) - FcFontSetDestroy(f->set); -} - -void -xunloadfonts(void) -{ - /* Free the loaded fonts in the font cache. */ - while (frclen > 0) - XftFontClose(xw.dpy, frc[--frclen].font); - - xunloadfont(&dc.font); - xunloadfont(&dc.bfont); - xunloadfont(&dc.ifont); - xunloadfont(&dc.ibfont); -} - -int -ximopen(Display *dpy) -{ - XIMCallback imdestroy = { .client_data = NULL, .callback = ximdestroy }; - XICCallback icdestroy = { .client_data = NULL, .callback = xicdestroy }; - - xw.ime.xim = XOpenIM(xw.dpy, NULL, NULL, NULL); - if (xw.ime.xim == NULL) - return 0; - - if (XSetIMValues(xw.ime.xim, XNDestroyCallback, &imdestroy, NULL)) - fprintf(stderr, "XSetIMValues: " - "Could not set XNDestroyCallback.\n"); - - xw.ime.spotlist = XVaCreateNestedList(0, XNSpotLocation, &xw.ime.spot, - NULL); - - if (xw.ime.xic == NULL) { - xw.ime.xic = XCreateIC(xw.ime.xim, XNInputStyle, - XIMPreeditNothing | XIMStatusNothing, - XNClientWindow, xw.win, - XNDestroyCallback, &icdestroy, - NULL); - } - if (xw.ime.xic == NULL) - fprintf(stderr, "XCreateIC: Could not create input context.\n"); - - return 1; -} - -void -ximinstantiate(Display *dpy, XPointer client, XPointer call) -{ - if (ximopen(dpy)) - XUnregisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, - ximinstantiate, NULL); -} - -void -ximdestroy(XIM xim, XPointer client, XPointer call) -{ - xw.ime.xim = NULL; - XRegisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, - ximinstantiate, NULL); - XFree(xw.ime.spotlist); -} - -int -xicdestroy(XIC xim, XPointer client, XPointer call) -{ - xw.ime.xic = NULL; - return 1; -} - -void -xinit(int cols, int rows) -{ - XGCValues gcvalues; - Cursor cursor; - Window parent; - pid_t thispid = getpid(); - XColor xmousefg, xmousebg; - - if (!(xw.dpy = XOpenDisplay(NULL))) - die("can't open display\n"); - xw.scr = XDefaultScreen(xw.dpy); - xw.vis = XDefaultVisual(xw.dpy, xw.scr); - - /* font */ - if (!FcInit()) - die("could not init fontconfig.\n"); - - usedfont = (opt_font == NULL)? font : opt_font; - xloadfonts(usedfont, 0); - - /* spare fonts */ - xloadsparefonts(); - - /* colors */ - xw.cmap = XDefaultColormap(xw.dpy, xw.scr); - xloadcols(); - - /* adjust fixed window geometry */ - win.w = 2 * borderpx + cols * win.cw; - win.h = 2 * borderpx + rows * win.ch; - if (xw.gm & XNegative) - xw.l += DisplayWidth(xw.dpy, xw.scr) - win.w - 2; - if (xw.gm & YNegative) - xw.t += DisplayHeight(xw.dpy, xw.scr) - win.h - 2; - - /* Events */ - xw.attrs.background_pixel = dc.col[defaultbg].pixel; - xw.attrs.border_pixel = dc.col[defaultbg].pixel; - xw.attrs.bit_gravity = NorthWestGravity; - xw.attrs.event_mask = FocusChangeMask | KeyPressMask | KeyReleaseMask - | ExposureMask | VisibilityChangeMask | StructureNotifyMask - | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; - xw.attrs.colormap = xw.cmap; - - if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) - parent = XRootWindow(xw.dpy, xw.scr); - xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t, - win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput, - xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity - | CWEventMask | CWColormap, &xw.attrs); - - memset(&gcvalues, 0, sizeof(gcvalues)); - gcvalues.graphics_exposures = False; - dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures, - &gcvalues); - xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, - DefaultDepth(xw.dpy, xw.scr)); - XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel); - XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h); - - /* font spec buffer */ - xw.specbuf = xmalloc(cols * sizeof(GlyphFontSpec)); - - /* Xft rendering context */ - xw.draw = XftDrawCreate(xw.dpy, xw.buf, xw.vis, xw.cmap); - - /* input methods */ - if (!ximopen(xw.dpy)) { - XRegisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, - ximinstantiate, NULL); - } - - /* white cursor, black outline */ - cursor = XCreateFontCursor(xw.dpy, mouseshape); - XDefineCursor(xw.dpy, xw.win, cursor); - - if (XParseColor(xw.dpy, xw.cmap, colorname[mousefg], &xmousefg) == 0) { - xmousefg.red = 0xffff; - xmousefg.green = 0xffff; - xmousefg.blue = 0xffff; - } - - if (XParseColor(xw.dpy, xw.cmap, colorname[mousebg], &xmousebg) == 0) { - xmousebg.red = 0x0000; - xmousebg.green = 0x0000; - xmousebg.blue = 0x0000; - } - - XRecolorCursor(xw.dpy, cursor, &xmousefg, &xmousebg); - - xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False); - xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False); - xw.netwmname = XInternAtom(xw.dpy, "_NET_WM_NAME", False); - xw.netwmiconname = XInternAtom(xw.dpy, "_NET_WM_ICON_NAME", False); - XSetWMProtocols(xw.dpy, xw.win, &xw.wmdeletewin, 1); - - xw.netwmpid = XInternAtom(xw.dpy, "_NET_WM_PID", False); - XChangeProperty(xw.dpy, xw.win, xw.netwmpid, XA_CARDINAL, 32, - PropModeReplace, (uchar *)&thispid, 1); - - win.mode = MODE_NUMLOCK; - resettitle(); - xhints(); - XMapWindow(xw.dpy, xw.win); - XSync(xw.dpy, False); - - clock_gettime(CLOCK_MONOTONIC, &xsel.tclick1); - clock_gettime(CLOCK_MONOTONIC, &xsel.tclick2); - xsel.primary = NULL; - xsel.clipboard = NULL; - xsel.xtarget = XInternAtom(xw.dpy, "UTF8_STRING", 0); - if (xsel.xtarget == None) - xsel.xtarget = XA_STRING; -} - -int -xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x, int y) -{ - float winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, xp, yp; - ushort mode, prevmode = USHRT_MAX; - Font *font = &dc.font; - int frcflags = FRC_NORMAL; - float runewidth = win.cw; - Rune rune; - FT_UInt glyphidx; - FcResult fcres; - FcPattern *fcpattern, *fontpattern; - FcFontSet *fcsets[] = { NULL }; - FcCharSet *fccharset; - int i, f, numspecs = 0; - - for (i = 0, xp = winx, yp = winy + font->ascent; i < len; ++i) { - /* Fetch rune and mode for current glyph. */ - rune = glyphs[i].u; - mode = glyphs[i].mode; - - /* Skip dummy wide-character spacing. */ - if (mode == ATTR_WDUMMY) - continue; - - /* Determine font for glyph if different from previous glyph. */ - if (prevmode != mode) { - prevmode = mode; - font = &dc.font; - frcflags = FRC_NORMAL; - runewidth = win.cw * ((mode & ATTR_WIDE) ? 2.0f : 1.0f); - if ((mode & ATTR_ITALIC) && (mode & ATTR_BOLD)) { - font = &dc.ibfont; - frcflags = FRC_ITALICBOLD; - } else if (mode & ATTR_ITALIC) { - font = &dc.ifont; - frcflags = FRC_ITALIC; - } else if (mode & ATTR_BOLD) { - font = &dc.bfont; - frcflags = FRC_BOLD; - } - yp = winy + font->ascent; - } - - /* Lookup character index with default font. */ - glyphidx = XftCharIndex(xw.dpy, font->match, rune); - if (glyphidx) { - specs[numspecs].font = font->match; - specs[numspecs].glyph = glyphidx; - specs[numspecs].x = (short)xp; - specs[numspecs].y = (short)yp; - xp += runewidth; - numspecs++; - continue; - } - - /* Fallback on font cache, search the font cache for match. */ - for (f = 0; f < frclen; f++) { - glyphidx = XftCharIndex(xw.dpy, frc[f].font, rune); - /* Everything correct. */ - if (glyphidx && frc[f].flags == frcflags) - break; - /* We got a default font for a not found glyph. */ - if (!glyphidx && frc[f].flags == frcflags - && frc[f].unicodep == rune) { - break; - } - } - - /* Nothing was found. Use fontconfig to find matching font. */ - if (f >= frclen) { - if (!font->set) - font->set = FcFontSort(0, font->pattern, - 1, 0, &fcres); - fcsets[0] = font->set; - - /* - * Nothing was found in the cache. Now use - * some dozen of Fontconfig calls to get the - * font for one single character. - * - * Xft and fontconfig are design failures. - */ - fcpattern = FcPatternDuplicate(font->pattern); - fccharset = FcCharSetCreate(); - - FcCharSetAddChar(fccharset, rune); - FcPatternAddCharSet(fcpattern, FC_CHARSET, - fccharset); - FcPatternAddBool(fcpattern, FC_SCALABLE, 1); - - FcConfigSubstitute(0, fcpattern, - FcMatchPattern); - FcDefaultSubstitute(fcpattern); - - fontpattern = FcFontSetMatch(0, fcsets, 1, - fcpattern, &fcres); - - /* Allocate memory for the new cache entry. */ - if (frclen >= frccap) { - frccap += 16; - frc = xrealloc(frc, frccap * sizeof(Fontcache)); - } - - frc[frclen].font = XftFontOpenPattern(xw.dpy, - fontpattern); - if (!frc[frclen].font) - die("XftFontOpenPattern failed seeking fallback font: %s\n", - strerror(errno)); - frc[frclen].flags = frcflags; - frc[frclen].unicodep = rune; - - glyphidx = XftCharIndex(xw.dpy, frc[frclen].font, rune); - - f = frclen; - frclen++; - - FcPatternDestroy(fcpattern); - FcCharSetDestroy(fccharset); - } - - specs[numspecs].font = frc[f].font; - specs[numspecs].glyph = glyphidx; - specs[numspecs].x = (short)xp; - specs[numspecs].y = (short)yp; - xp += runewidth; - numspecs++; - } - - return numspecs; -} - -void -xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y, int dmode) -{ - int charlen = len * ((base.mode & ATTR_WIDE) ? 2 : 1); - int winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, - width = charlen * win.cw; - Color *fg, *bg, *temp, revfg, revbg, truefg, truebg; - XRenderColor colfg, colbg; - XRectangle r; - - /* Fallback on color display for attributes not supported by the font */ - if (base.mode & ATTR_ITALIC && base.mode & ATTR_BOLD) { - if (dc.ibfont.badslant || dc.ibfont.badweight) - base.fg = defaultattr; - } else if ((base.mode & ATTR_ITALIC && dc.ifont.badslant) || - (base.mode & ATTR_BOLD && dc.bfont.badweight)) { - base.fg = defaultattr; - } - - if (IS_TRUECOL(base.fg)) { - colfg.alpha = 0xffff; - colfg.red = TRUERED(base.fg); - colfg.green = TRUEGREEN(base.fg); - colfg.blue = TRUEBLUE(base.fg); - XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, &truefg); - fg = &truefg; - } else { - fg = &dc.col[base.fg]; - } - - if (IS_TRUECOL(base.bg)) { - colbg.alpha = 0xffff; - colbg.green = TRUEGREEN(base.bg); - colbg.red = TRUERED(base.bg); - colbg.blue = TRUEBLUE(base.bg); - XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colbg, &truebg); - bg = &truebg; - } else { - bg = &dc.col[base.bg]; - } - - /* Change basic system colors [0-7] to bright system colors [8-15] */ - if ((base.mode & ATTR_BOLD_FAINT) == ATTR_BOLD && BETWEEN(base.fg, 0, 7)) - fg = &dc.col[base.fg + 8]; - - if (IS_SET(MODE_REVERSE)) { - if (fg == &dc.col[defaultfg]) { - fg = &dc.col[defaultbg]; - } else { - colfg.red = ~fg->color.red; - colfg.green = ~fg->color.green; - colfg.blue = ~fg->color.blue; - colfg.alpha = fg->color.alpha; - XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, - &revfg); - fg = &revfg; - } - - if (bg == &dc.col[defaultbg]) { - bg = &dc.col[defaultfg]; - } else { - colbg.red = ~bg->color.red; - colbg.green = ~bg->color.green; - colbg.blue = ~bg->color.blue; - colbg.alpha = bg->color.alpha; - XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colbg, - &revbg); - bg = &revbg; - } - } - - if ((base.mode & ATTR_BOLD_FAINT) == ATTR_FAINT) { - colfg.red = fg->color.red / 2; - colfg.green = fg->color.green / 2; - colfg.blue = fg->color.blue / 2; - colfg.alpha = fg->color.alpha; - XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, &revfg); - fg = &revfg; - } - - if (base.mode & ATTR_REVERSE) { - temp = fg; - fg = bg; - bg = temp; - } - - if (base.mode & ATTR_BLINK && win.mode & MODE_BLINK) - fg = bg; - - if (base.mode & ATTR_INVISIBLE) - fg = bg; - - if (dmode & DRAW_BG) { - /* Intelligent cleaning up of the borders. */ - if (x == 0) { - xclear(0, (y == 0)? 0 : winy, borderpx, - winy + win.ch + - ((winy + win.ch >= borderpx + win.th)? win.h : 0)); - } - if (winx + width >= borderpx + win.tw) { - xclear(winx + width, (y == 0)? 0 : winy, win.w, - ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch))); - } - if (y == 0) - xclear(winx, 0, winx + width, borderpx); - if (winy + win.ch >= borderpx + win.th) - xclear(winx, winy + win.ch, winx + width, win.h); - /* Fill the background */ - XftDrawRect(xw.draw, bg, winx, winy, width, win.ch); - } - - if (dmode & DRAW_FG) { - /* Render the glyphs. */ - XftDrawGlyphFontSpec(xw.draw, fg, specs, len); - - /* Render underline and strikethrough. */ - if (base.mode & ATTR_UNDERLINE) { - XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent + 1, - width, 1); - } - - if (base.mode & ATTR_STRUCK) { - XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent / 3, - width, 1); - } - } -} - -void -xdrawglyph(Glyph g, int x, int y) -{ - int numspecs; - XftGlyphFontSpec spec; - - numspecs = xmakeglyphfontspecs(&spec, &g, 1, x, y); - xdrawglyphfontspecs(&spec, g, numspecs, x, y, DRAW_BG | DRAW_FG); -} - -void -xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og) -{ - Color drawcol; - - /* remove the old cursor */ - if (selected(ox, oy)) - og.mode ^= ATTR_REVERSE; - xdrawglyph(og, ox, oy); - - if (IS_SET(MODE_HIDE)) - return; - - /* - * Select the right color for the right mode. - */ - g.mode &= ATTR_BOLD|ATTR_ITALIC|ATTR_UNDERLINE|ATTR_STRUCK|ATTR_WIDE; - - if (IS_SET(MODE_REVERSE)) { - g.mode |= ATTR_REVERSE; - g.bg = defaultfg; - if (selected(cx, cy)) { - drawcol = dc.col[defaultcs]; - g.fg = defaultrcs; - } else { - drawcol = dc.col[defaultrcs]; - g.fg = defaultcs; - } - } else { - if (selected(cx, cy)) { - g.fg = defaultfg; - g.bg = defaultrcs; - } else { - g.fg = defaultbg; - g.bg = defaultcs; - } - drawcol = dc.col[g.bg]; - } - - /* draw the new one */ - if (IS_SET(MODE_FOCUSED)) { - switch (win.cursor) { - case 7: /* st extension */ - g.u = 0x2603; /* snowman (U+2603) */ - /* FALLTHROUGH */ - case 0: /* Blinking Block */ - case 1: /* Blinking Block (Default) */ - case 2: /* Steady Block */ - xdrawglyph(g, cx, cy); - break; - case 3: /* Blinking Underline */ - case 4: /* Steady Underline */ - XftDrawRect(xw.draw, &drawcol, - borderpx + cx * win.cw, - borderpx + (cy + 1) * win.ch - \ - cursorthickness, - win.cw, cursorthickness); - break; - case 5: /* Blinking bar */ - case 6: /* Steady bar */ - XftDrawRect(xw.draw, &drawcol, - borderpx + cx * win.cw, - borderpx + cy * win.ch, - cursorthickness, win.ch); - break; - } - } else { - XftDrawRect(xw.draw, &drawcol, - borderpx + cx * win.cw, - borderpx + cy * win.ch, - win.cw - 1, 1); - XftDrawRect(xw.draw, &drawcol, - borderpx + cx * win.cw, - borderpx + cy * win.ch, - 1, win.ch - 1); - XftDrawRect(xw.draw, &drawcol, - borderpx + (cx + 1) * win.cw - 1, - borderpx + cy * win.ch, - 1, win.ch - 1); - XftDrawRect(xw.draw, &drawcol, - borderpx + cx * win.cw, - borderpx + (cy + 1) * win.ch - 1, - win.cw, 1); - } -} - -void -xsetenv(void) -{ - char buf[sizeof(long) * 8 + 1]; - - snprintf(buf, sizeof(buf), "%lu", xw.win); - setenv("WINDOWID", buf, 1); -} - -void -xseticontitle(char *p) -{ - XTextProperty prop; - DEFAULT(p, opt_title); - - if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, - &prop) != Success) - return; - XSetWMIconName(xw.dpy, xw.win, &prop); - XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmiconname); - XFree(prop.value); -} - -void -xsettitle(char *p) -{ - XTextProperty prop; - DEFAULT(p, opt_title); - - if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, - &prop) != Success) - return; - XSetWMName(xw.dpy, xw.win, &prop); - XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmname); - XFree(prop.value); -} - -int -xstartdraw(void) -{ - return IS_SET(MODE_VISIBLE); -} - -void -xdrawline(Line line, int x1, int y1, int x2) -{ - int i, x, ox, numspecs, numspecs_cached; - Glyph base, new; - XftGlyphFontSpec *specs; - - numspecs_cached = xmakeglyphfontspecs(xw.specbuf, &line[x1], x2 - x1, x1, y1); - - /* Draw line in 2 passes: background and foreground. This way wide glyphs - won't get truncated (#223) */ - for (int dmode = DRAW_BG; dmode <= DRAW_FG; dmode <<= 1) { - specs = xw.specbuf; - numspecs = numspecs_cached; - i = ox = 0; - for (x = x1; x < x2 && i < numspecs; x++) { - new = line[x]; - if (new.mode == ATTR_WDUMMY) - continue; - if (selected(x, y1)) - new.mode ^= ATTR_REVERSE; - if (i > 0 && ATTRCMP(base, new)) { - xdrawglyphfontspecs(specs, base, i, ox, y1, dmode); - specs += i; - numspecs -= i; - i = 0; - } - if (i == 0) { - ox = x; - base = new; - } - i++; - } - if (i > 0) - xdrawglyphfontspecs(specs, base, i, ox, y1, dmode); - } -} - -void -xfinishdraw(void) -{ - XCopyArea(xw.dpy, xw.buf, xw.win, dc.gc, 0, 0, win.w, - win.h, 0, 0); - XSetForeground(xw.dpy, dc.gc, - dc.col[IS_SET(MODE_REVERSE)? - defaultfg : defaultbg].pixel); -} - -void -xximspot(int x, int y) -{ - if (xw.ime.xic == NULL) - return; - - xw.ime.spot.x = borderpx + x * win.cw; - xw.ime.spot.y = borderpx + (y + 1) * win.ch; - - XSetICValues(xw.ime.xic, XNPreeditAttributes, xw.ime.spotlist, NULL); -} - -void -expose(XEvent *ev) -{ - redraw(); -} - -void -visibility(XEvent *ev) -{ - XVisibilityEvent *e = &ev->xvisibility; - - MODBIT(win.mode, e->state != VisibilityFullyObscured, MODE_VISIBLE); -} - -void -unmap(XEvent *ev) -{ - win.mode &= ~MODE_VISIBLE; -} - -void -xsetpointermotion(int set) -{ - MODBIT(xw.attrs.event_mask, set, PointerMotionMask); - XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs); -} - -void -xsetmode(int set, unsigned int flags) -{ - int mode = win.mode; - MODBIT(win.mode, set, flags); - if ((win.mode & MODE_REVERSE) != (mode & MODE_REVERSE)) - redraw(); -} - -int -xsetcursor(int cursor) -{ - if (!BETWEEN(cursor, 0, 7)) /* 7: st extension */ - return 1; - win.cursor = cursor; - return 0; -} - -void -xseturgency(int add) -{ - XWMHints *h = XGetWMHints(xw.dpy, xw.win); - - MODBIT(h->flags, add, XUrgencyHint); - XSetWMHints(xw.dpy, xw.win, h); - XFree(h); -} - -void -xbell(void) -{ - if (!(IS_SET(MODE_FOCUSED))) - xseturgency(1); - if (bellvolume) - XkbBell(xw.dpy, xw.win, bellvolume, (Atom)NULL); -} - -void -focus(XEvent *ev) -{ - XFocusChangeEvent *e = &ev->xfocus; - - if (e->mode == NotifyGrab) - return; - - if (ev->type == FocusIn) { - if (xw.ime.xic) - XSetICFocus(xw.ime.xic); - win.mode |= MODE_FOCUSED; - xseturgency(0); - if (IS_SET(MODE_FOCUS)) - ttywrite("\033[I", 3, 0); - } else { - if (xw.ime.xic) - XUnsetICFocus(xw.ime.xic); - win.mode &= ~MODE_FOCUSED; - if (IS_SET(MODE_FOCUS)) - ttywrite("\033[O", 3, 0); - } -} - -int -match(uint mask, uint state) -{ - return mask == XK_ANY_MOD || mask == (state & ~ignoremod); -} - -char* -kmap(KeySym k, uint state) -{ - Key *kp; - int i; - - /* Check for mapped keys out of X11 function keys. */ - for (i = 0; i < LEN(mappedkeys); i++) { - if (mappedkeys[i] == k) - break; - } - if (i == LEN(mappedkeys)) { - if ((k & 0xFFFF) < 0xFD00) - return NULL; - } - - for (kp = key; kp < key + LEN(key); kp++) { - if (kp->k != k) - continue; - - if (!match(kp->mask, state)) - continue; - - if (IS_SET(MODE_APPKEYPAD) ? kp->appkey < 0 : kp->appkey > 0) - continue; - if (IS_SET(MODE_NUMLOCK) && kp->appkey == 2) - continue; - - if (IS_SET(MODE_APPCURSOR) ? kp->appcursor < 0 : kp->appcursor > 0) - continue; - - return kp->s; - } - - return NULL; -} - -void -kpress(XEvent *ev) -{ - XKeyEvent *e = &ev->xkey; - KeySym ksym = NoSymbol; - char buf[64], *customkey; - int len; - Rune c; - Status status; - Shortcut *bp; - - if (IS_SET(MODE_KBDLOCK)) - return; - - if (xw.ime.xic) { - len = XmbLookupString(xw.ime.xic, e, buf, sizeof buf, &ksym, &status); - if (status == XBufferOverflow) - return; - } else { - len = XLookupString(e, buf, sizeof buf, &ksym, NULL); - } - if ( IS_SET(MODE_KBDSELECT) ) { - if ( match(XK_NO_MOD, e->state) || - (XK_Shift_L | XK_Shift_R) & e->state ) - win.mode ^= trt_kbdselect(ksym, buf, len); - return; - } - - /* 1. shortcuts */ - for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { - if (ksym == bp->keysym && match(bp->mod, e->state)) { - bp->func(&(bp->arg)); - return; - } - } - - /* 2. custom keys from config.h */ - if ((customkey = kmap(ksym, e->state))) { - ttywrite(customkey, strlen(customkey), 1); - return; - } - - /* 3. composed string from input method */ - if (len == 0) - return; - if (len == 1 && e->state & Mod1Mask) { - if (IS_SET(MODE_8BIT)) { - if (*buf < 0177) { - c = *buf | 0x80; - len = utf8encode(c, buf); - } - } else { - buf[1] = buf[0]; - buf[0] = '\033'; - len = 2; - } - } - ttywrite(buf, len, 1); -} - -void -cmessage(XEvent *e) -{ - /* - * See xembed specs - * http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html - */ - if (e->xclient.message_type == xw.xembed && e->xclient.format == 32) { - if (e->xclient.data.l[1] == XEMBED_FOCUS_IN) { - win.mode |= MODE_FOCUSED; - xseturgency(0); - } else if (e->xclient.data.l[1] == XEMBED_FOCUS_OUT) { - win.mode &= ~MODE_FOCUSED; - } - } else if (e->xclient.data.l[0] == xw.wmdeletewin) { - ttyhangup(); - exit(0); - } -} - -void -resize(XEvent *e) -{ - if (e->xconfigure.width == win.w && e->xconfigure.height == win.h) - return; - - cresize(e->xconfigure.width, e->xconfigure.height); -} - -void -run(void) -{ - XEvent ev; - int w = win.w, h = win.h; - fd_set rfd; - int xfd = XConnectionNumber(xw.dpy), ttyfd, xev, drawing; - struct timespec seltv, *tv, now, lastblink, trigger; - double timeout; - - /* Waiting for window mapping */ - do { - XNextEvent(xw.dpy, &ev); - /* - * This XFilterEvent call is required because of XOpenIM. It - * does filter out the key event and some client message for - * the input method too. - */ - if (XFilterEvent(&ev, None)) - continue; - if (ev.type == ConfigureNotify) { - w = ev.xconfigure.width; - h = ev.xconfigure.height; - } - } while (ev.type != MapNotify); - - ttyfd = ttynew(opt_line, shell, opt_io, opt_cmd); - cresize(w, h); - - for (timeout = -1, drawing = 0, lastblink = (struct timespec){0};;) { - FD_ZERO(&rfd); - FD_SET(ttyfd, &rfd); - FD_SET(xfd, &rfd); - - if (XPending(xw.dpy)) - timeout = 0; /* existing events might not set xfd */ - - seltv.tv_sec = timeout / 1E3; - seltv.tv_nsec = 1E6 * (timeout - 1E3 * seltv.tv_sec); - tv = timeout >= 0 ? &seltv : NULL; - - if (pselect(MAX(xfd, ttyfd)+1, &rfd, NULL, NULL, tv, NULL) < 0) { - if (errno == EINTR) - continue; - die("select failed: %s\n", strerror(errno)); - } - clock_gettime(CLOCK_MONOTONIC, &now); - - if (FD_ISSET(ttyfd, &rfd)) - ttyread(); - - xev = 0; - while (XPending(xw.dpy)) { - xev = 1; - XNextEvent(xw.dpy, &ev); - if (XFilterEvent(&ev, None)) - continue; - if (handler[ev.type]) - (handler[ev.type])(&ev); - } - - /* - * To reduce flicker and tearing, when new content or event - * triggers drawing, we first wait a bit to ensure we got - * everything, and if nothing new arrives - we draw. - * We start with trying to wait minlatency ms. If more content - * arrives sooner, we retry with shorter and shorter periods, - * and eventually draw even without idle after maxlatency ms. - * Typically this results in low latency while interacting, - * maximum latency intervals during `cat huge.txt`, and perfect - * sync with periodic updates from animations/key-repeats/etc. - */ - if (FD_ISSET(ttyfd, &rfd) || xev) { - if (!drawing) { - trigger = now; - drawing = 1; - } - timeout = (maxlatency - TIMEDIFF(now, trigger)) \ - / maxlatency * minlatency; - if (timeout > 0) - continue; /* we have time, try to find idle */ - } - - /* idle detected or maxlatency exhausted -> draw */ - timeout = -1; - if (blinktimeout && tattrset(ATTR_BLINK)) { - timeout = blinktimeout - TIMEDIFF(now, lastblink); - if (timeout <= 0) { - if (-timeout > blinktimeout) /* start visible */ - win.mode |= MODE_BLINK; - win.mode ^= MODE_BLINK; - tsetdirtattr(ATTR_BLINK); - lastblink = now; - timeout = blinktimeout; - } - } - - draw(); - XFlush(xw.dpy); - drawing = 0; - } -} - -void -usage(void) -{ - die("usage: %s [-aiv] [-c class] [-f font] [-g geometry]" - " [-n name] [-o file]\n" - " [-T title] [-t title] [-w windowid]" - " [[-e] command [args ...]]\n" - " %s [-aiv] [-c class] [-f font] [-g geometry]" - " [-n name] [-o file]\n" - " [-T title] [-t title] [-w windowid] -l line" - " [stty_args ...]\n", argv0, argv0); -} - -void toggle_winmode(int flag) { - win.mode ^= flag; -} - -void keyboard_select(const Arg *dummy) { - win.mode ^= trt_kbdselect(-1, NULL, 0); -} - -int -main(int argc, char *argv[]) -{ - xw.l = xw.t = 0; - xw.isfixed = False; - xsetcursor(cursorshape); - - ARGBEGIN { - case 'a': - allowaltscreen = 0; - break; - case 'c': - opt_class = EARGF(usage()); - break; - case 'e': - if (argc > 0) - --argc, ++argv; - goto run; - case 'f': - opt_font = EARGF(usage()); - break; - case 'g': - xw.gm = XParseGeometry(EARGF(usage()), - &xw.l, &xw.t, &cols, &rows); - break; - case 'i': - xw.isfixed = 1; - break; - case 'o': - opt_io = EARGF(usage()); - break; - case 'l': - opt_line = EARGF(usage()); - break; - case 'n': - opt_name = EARGF(usage()); - break; - case 't': - case 'T': - opt_title = EARGF(usage()); - break; - case 'w': - opt_embed = EARGF(usage()); - break; - case 'v': - die("%s " VERSION "\n", argv0); - break; - default: - usage(); - } ARGEND; - -run: - if (argc > 0) /* eat all remaining arguments */ - opt_cmd = argv; - - if (!opt_title) - opt_title = (opt_line || !opt_cmd) ? "st" : opt_cmd[0]; - - setlocale(LC_CTYPE, ""); - XSetLocaleModifiers(""); - cols = MAX(cols, 1); - rows = MAX(rows, 1); - tnew(cols, rows); - xinit(cols, rows); - xsetenv(); - selinit(); - run(); - - return 0; -} diff --git a/x.o b/x.o index 704f1cda785fc976591968fffca3f0e4700c7a19..225e8751a4ab0a58d3f4df2437505ded46373eb5 100644 GIT binary patch delta 19658 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%0A$; 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 delta 18546 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 F{{SBzm-PSu From c5f63147179608778b76f1067537b46c4eb25804 Mon Sep 17 00:00:00 2001 From: mrsu Date: Mon, 26 Jun 2023 10:27:44 +0100 Subject: [PATCH 5/8] scrollback --- config.def.h | 519 +++++++++++++++++++++++++++++++++++++++++++++++++++ config.h | 2 + st.c | 125 ++++++++++--- st.h | 2 + st.o | Bin 88152 -> 91200 bytes x.o | Bin 82064 -> 82248 bytes 6 files changed, 621 insertions(+), 27 deletions(-) create mode 100644 config.def.h diff --git a/config.def.h b/config.def.h new file mode 100644 index 0000000..fd2a22d --- /dev/null +++ b/config.def.h @@ -0,0 +1,519 @@ +/* See LICENSE file for copyright and license details. */ + +/* + * appearance + * + * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html + */ +static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; +/* Spare fonts */ +static char *font2[] = { +/* "Inconsolata for Powerline:pixelsize=12:antialias=true:autohint=true", */ +/* "Hack Nerd Font Mono:pixelsize=11: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: scroll and/or utmp + * 3: SHELL environment variable + * 4: value of shell in /etc/passwd + * 5: value of shell in config.h + */ +static char *shell = "/bin/sh"; +char *utmp = NULL; +/* scroll program: to enable use a string like "scroll" */ +char *scroll = 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 */ +static float cwscale = 1.0; +static float chscale = 1.0; + +/* + * word delimiter string + * + * More advanced example: L" `'\"()[]{}" + */ +wchar_t *worddelimiters = L" "; + +/* selection timeouts (in milliseconds) */ +static unsigned int doubleclicktimeout = 300; +static unsigned int tripleclicktimeout = 600; + +/* alt screens */ +int allowaltscreen = 1; + +/* allow certain non-interactive (insecure) window operations such as: + setting the clipboard text */ +int allowwindowops = 0; + +/* + * draw latency range in ms - from new content/keypress/etc until drawing. + * within this range, st draws when content stops arriving (idle). mostly it's + * near minlatency, but it waits longer for slow updates to avoid partial draw. + * low minlatency will tear/flicker more, as it can "detect" idle too early. + */ +static double minlatency = 8; +static double maxlatency = 33; + +/* + * 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[] = { + /* 8 normal colors */ + "black", + "red3", + "green3", + "yellow3", + "blue2", + "magenta3", + "cyan3", + "gray90", + + /* 8 bright colors */ + "gray50", + "red", + "green", + "yellow", + "#5c5cff", + "magenta", + "cyan", + "white", + + [255] = 0, + + /* more colors can be added after 255 to use with DefaultXX */ + "#cccccc", + "#555555", + "gray90", /* default foreground colour */ + "black", /* default background colour */ +}; + + +/* + * Default colors (colorname index) + * foreground, background, cursor, reverse cursor + */ +unsigned int defaultfg = 258; +unsigned int defaultbg = 259; +unsigned int defaultcs = 256; +static unsigned int defaultrcs = 257; + +/* + * Default shape of cursor + * 2: Block ("█") + * 4: Underline ("_") + * 6: Bar ("|") + * 7: Snowman ("☃") + */ +static unsigned int cursorshape = 2; + +/* + * 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_xterm; +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; + +/* + * Force mouse select/shortcuts 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 forcemousemod = ShiftMask; + +/* + * Xresources preferences to load at startup + */ +ResourcePref resources[] = { + { "font", STRING, &font }, + { "color0", STRING, &colorname[0] }, + { "color1", STRING, &colorname[1] }, + { "color2", STRING, &colorname[2] }, + { "color3", STRING, &colorname[3] }, + { "color4", STRING, &colorname[4] }, + { "color5", STRING, &colorname[5] }, + { "color6", STRING, &colorname[6] }, + { "color7", STRING, &colorname[7] }, + { "color8", STRING, &colorname[8] }, + { "color9", STRING, &colorname[9] }, + { "color10", STRING, &colorname[10] }, + { "color11", STRING, &colorname[11] }, + { "color12", STRING, &colorname[12] }, + { "color13", STRING, &colorname[13] }, + { "color14", STRING, &colorname[14] }, + { "color15", STRING, &colorname[15] }, + { "background", STRING, &colorname[256] }, + { "foreground", STRING, &colorname[257] }, + { "cursorColor", STRING, &colorname[258] }, + { "termname", STRING, &termname }, + { "shell", STRING, &shell }, + { "minlatency", INTEGER, &minlatency }, + { "maxlatency", INTEGER, &maxlatency }, + { "blinktimeout", INTEGER, &blinktimeout }, + { "bellvolume", INTEGER, &bellvolume }, + { "tabspaces", INTEGER, &tabspaces }, + { "borderpx", INTEGER, &borderpx }, + { "cwscale", FLOAT, &cwscale }, + { "chscale", FLOAT, &chscale }, +}; + +/* + * Internal mouse shortcuts. + * Beware that overloading Button1 will disable the selection. + */ +static MouseShortcut mshortcuts[] = { + /* mask button function argument release */ + { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, + { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} }, + { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, + { ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} }, + { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} }, +}; + +/* Internal keyboard shortcuts. */ +#define MODKEY Mod1Mask +#define TERMMOD (ControlMask|ShiftMask) + +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} }, + { TERMMOD, XK_Home, zoomreset, {.f = 0} }, + { TERMMOD, XK_C, clipcopy, {.i = 0} }, + { TERMMOD, XK_V, clippaste, {.i = 0} }, + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, + { TERMMOD, XK_Escape, keyboard_select,{ 0 } }, + { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, + { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, +}; + +/* + * 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 + * + * 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; + +/* + * 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, "\033Ox", +1, 0}, + { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1}, + { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1}, + { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0}, + { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1}, + { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1}, + { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0}, + { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1}, + { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1}, + { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0}, + { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1}, + { XK_KP_Right, XK_ANY_MOD, "\033OC", 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, "\033Oj", +2, 0}, + { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0}, + { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0}, + { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0}, + { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0}, + { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0}, + { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0}, + { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0}, + { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0}, + { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0}, + { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0}, + { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0}, + { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0}, + { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0}, + { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0}, + { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0}, + { XK_KP_9, XK_ANY_MOD, "\033Oy", +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, "\033OA", 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, "\033OB", 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, "\033OD", 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, "\033OC", 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, "\033OP" , 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, "\033OQ" , 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, "\033OR" , 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, "\033OS" , 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{|}~"; diff --git a/config.h b/config.h index aa63b99..fd2a22d 100644 --- a/config.h +++ b/config.h @@ -244,6 +244,8 @@ static Shortcut shortcuts[] = { { ShiftMask, XK_Insert, selpaste, {.i = 0} }, { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, { TERMMOD, XK_Escape, keyboard_select,{ 0 } }, + { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, + { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, }; /* diff --git a/st.c b/st.c index 8dd4c6c..e344718 100644 --- a/st.c +++ b/st.c @@ -37,6 +37,7 @@ #define ESC_ARG_SIZ 16 #define STR_BUF_SIZ ESC_BUF_SIZ #define STR_ARG_SIZ ESC_ARG_SIZ +#define HISTSIZE 2000 /* macros */ #define IS_SET(flag) ((term.mode & (flag)) != 0) @@ -44,6 +45,9 @@ #define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f)) #define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c)) #define ISDELIM(u) (u && wcschr(worddelimiters, u)) +#define TLINE(y) ((y) < term.scr ? term.hist[((y) + term.histi - \ + term.scr + HISTSIZE + 1) % HISTSIZE] : \ + term.line[(y) - term.scr]) enum term_mode { MODE_WRAP = 1 << 0, @@ -117,6 +121,9 @@ typedef struct { int col; /* nb col */ Line *line; /* screen */ Line *alt; /* alternate screen */ + Line hist[HISTSIZE]; /* history buffer */ + int histi; /* history index */ + int scr; /* scroll back */ int *dirty; /* dirtyness of lines */ TCursor c; /* cursor */ int ocx; /* old cursor col */ @@ -187,8 +194,8 @@ static void tnewline(int); static void tputtab(int); static void tputc(Rune); static void treset(void); -static void tscrollup(int, int); -static void tscrolldown(int, int); +static void tscrollup(int, int, int); +static void tscrolldown(int, int, int); static void tsetattr(const int *, int); static void tsetchar(Rune, const Glyph *, int, int); static void tsetdirt(int, int); @@ -411,10 +418,10 @@ tlinelen(int y) { int i = term.col; - if (term.line[y][i - 1].mode & ATTR_WRAP) + if (TLINE(y)[i - 1].mode & ATTR_WRAP) return i; - while (i > 0 && term.line[y][i - 1].u == ' ') + while (i > 0 && TLINE(y)[i - 1].u == ' ') --i; return i; @@ -523,7 +530,7 @@ selsnap(int *x, int *y, int direction) * Snap around if the word wraps around at the end or * beginning of a line. */ - prevgp = &term.line[*y][*x]; + prevgp = &TLINE(*y)[*x]; prevdelim = ISDELIM(prevgp->u); for (;;) { newx = *x + direction; @@ -538,14 +545,14 @@ selsnap(int *x, int *y, int direction) yt = *y, xt = *x; else yt = newy, xt = newx; - if (!(term.line[yt][xt].mode & ATTR_WRAP)) + if (!(TLINE(yt)[xt].mode & ATTR_WRAP)) break; } if (newx >= tlinelen(newy)) break; - gp = &term.line[newy][newx]; + gp = &TLINE(newy)[newx]; delim = ISDELIM(gp->u); if (!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim || (delim && gp->u != prevgp->u))) @@ -566,14 +573,14 @@ selsnap(int *x, int *y, int direction) *x = (direction < 0) ? 0 : term.col - 1; if (direction < 0) { for (; *y > 0; *y += direction) { - if (!(term.line[*y-1][term.col-1].mode + if (!(TLINE(*y-1)[term.col-1].mode & ATTR_WRAP)) { break; } } } else if (direction > 0) { for (; *y < term.row-1; *y += direction) { - if (!(term.line[*y][term.col-1].mode + if (!(TLINE(*y)[term.col-1].mode & ATTR_WRAP)) { break; } @@ -604,13 +611,13 @@ getsel(void) } if (sel.type == SEL_RECTANGULAR) { - gp = &term.line[y][sel.nb.x]; + gp = &TLINE(y)[sel.nb.x]; lastx = sel.ne.x; } else { - gp = &term.line[y][sel.nb.y == y ? sel.nb.x : 0]; + gp = &TLINE(y)[sel.nb.y == y ? sel.nb.x : 0]; lastx = (sel.ne.y == y) ? sel.ne.x : term.col-1; } - last = &term.line[y][MIN(lastx, linelen-1)]; + last = &TLINE(y)[MIN(lastx, linelen-1)]; while (last >= gp && last->u == ' ') --last; @@ -846,6 +853,9 @@ void ttywrite(const char *s, size_t n, int may_echo) { const char *next; + Arg arg = (Arg) { .i = term.scr }; + + kscrolldown(&arg); if (may_echo && IS_SET(MODE_ECHO)) twrite(s, n, 1); @@ -1057,12 +1067,52 @@ tswapscreen(void) } void -tscrolldown(int orig, int n) +kscrolldown(const Arg* a) +{ + int n = a->i; + + if (n < 0) + n = term.row + n; + + if (n > term.scr) + n = term.scr; + + if (term.scr > 0) { + term.scr -= n; + selscroll(0, -n); + tfulldirt(); + } +} + +void +kscrollup(const Arg* a) +{ + int n = a->i; + + if (n < 0) + n = term.row + n; + + if (term.scr <= HISTSIZE-n) { + term.scr += n; + selscroll(0, n); + tfulldirt(); + } +} + +void +tscrolldown(int orig, int n, int copyhist) { int i; Line temp; LIMIT(n, 0, term.bot-orig+1); + if (copyhist) { + term.histi = (term.histi - 1 + HISTSIZE) % HISTSIZE; + temp = term.hist[term.histi]; + term.hist[term.histi] = term.line[term.bot]; + term.line[term.bot] = temp; + } + tsetdirt(orig, term.bot-n); tclearregion(0, term.bot-n+1, term.col-1, term.bot); @@ -1073,17 +1123,28 @@ tscrolldown(int orig, int n) term.line[i-n] = temp; } - selscroll(orig, n); + if (term.scr == 0) + selscroll(orig, n); } void -tscrollup(int orig, int n) +tscrollup(int orig, int n, int copyhist) { int i; Line temp; LIMIT(n, 0, term.bot-orig+1); + if (copyhist) { + term.histi = (term.histi + 1) % HISTSIZE; + temp = term.hist[term.histi]; + term.hist[term.histi] = term.line[orig]; + term.line[orig] = temp; + } + + if (term.scr > 0 && term.scr < HISTSIZE) + term.scr = MIN(term.scr + n, HISTSIZE-1); + tclearregion(0, orig, term.col-1, orig+n-1); tsetdirt(orig+n, term.bot); @@ -1093,7 +1154,8 @@ tscrollup(int orig, int n) term.line[i+n] = temp; } - selscroll(orig, -n); + if (term.scr == 0) + selscroll(orig, -n); } void @@ -1122,7 +1184,7 @@ tnewline(int first_col) int y = term.c.y; if (y == term.bot) { - tscrollup(term.top, 1); + tscrollup(term.top, 1, 1); } else { y++; } @@ -1287,14 +1349,14 @@ void tinsertblankline(int n) { if (BETWEEN(term.c.y, term.top, term.bot)) - tscrolldown(term.c.y, n); + tscrolldown(term.c.y, n, 0); } void tdeleteline(int n) { if (BETWEEN(term.c.y, term.top, term.bot)) - tscrollup(term.c.y, n); + tscrollup(term.c.y, n, 0); } int32_t @@ -1731,11 +1793,11 @@ csihandle(void) break; case 'S': /* SU -- Scroll line up */ DEFAULT(csiescseq.arg[0], 1); - tscrollup(term.top, csiescseq.arg[0]); + tscrollup(term.top, csiescseq.arg[0], 0); break; case 'T': /* SD -- Scroll line down */ DEFAULT(csiescseq.arg[0], 1); - tscrolldown(term.top, csiescseq.arg[0]); + tscrolldown(term.top, csiescseq.arg[0], 0); break; case 'L': /* IL -- Insert blank lines */ DEFAULT(csiescseq.arg[0], 1); @@ -2307,7 +2369,7 @@ eschandle(uchar ascii) return 0; case 'D': /* IND -- Linefeed */ if (term.c.y == term.bot) { - tscrollup(term.top, 1); + tscrollup(term.top, 1, 1); } else { tmoveto(term.c.x, term.c.y+1); } @@ -2320,7 +2382,7 @@ eschandle(uchar ascii) break; case 'M': /* RI -- Reverse index */ if (term.c.y == term.top) { - tscrolldown(term.top, 1); + tscrolldown(term.top, 1, 1); } else { tmoveto(term.c.x, term.c.y-1); } @@ -2539,7 +2601,7 @@ twrite(const char *buf, int buflen, int show_ctrl) void tresize(int col, int row) { - int i; + int i, j; int minrow = MIN(row, term.row); int mincol = MIN(col, term.col); int *bp; @@ -2579,6 +2641,14 @@ tresize(int col, int row) term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty)); term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs)); + for (i = 0; i < HISTSIZE; i++) { + term.hist[i] = xrealloc(term.hist[i], col * sizeof(Glyph)); + for (j = mincol; j < col; j++) { + term.hist[i][j] = term.c.attr; + term.hist[i][j].u = ' '; + } + } + /* resize each row to new width, zero-pad if needed */ for (i = 0; i < minrow; i++) { term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph)); @@ -2637,7 +2707,7 @@ drawregion(int x1, int y1, int x2, int y2) continue; term.dirty[y] = 0; - xdrawline(term.line[y], x1, y, x2); + xdrawline(TLINE(y), x1, y, x2); } } @@ -2658,8 +2728,9 @@ draw(void) cx--; drawregion(0, 0, term.col, term.row); - xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], - term.ocx, term.ocy, term.line[term.ocy][term.ocx]); + if (term.scr == 0) + xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], + term.ocx, term.ocy, term.line[term.ocy][term.ocx]); term.ocx = cx; term.ocy = term.c.y; xfinishdraw(); diff --git a/st.h b/st.h index 8714d58..5434356 100644 --- a/st.h +++ b/st.h @@ -87,6 +87,8 @@ void die(const char *, ...); void redraw(void); void draw(void); +void kscrolldown(const Arg *); +void kscrollup(const Arg *); void printscreen(const Arg *); void printsel(const Arg *); void sendbreak(const Arg *); diff --git a/st.o b/st.o index 1162a7ec5dd2a39304840ce6b631e2ab1c624af6..401e2e22c34a9f0c09a478a9fe087fe40750546f 100644 GIT binary patch literal 91200 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 literal 88152 zcmeF4d3+RA_UNmV1_FjuR74aQTTPS*BFG{wC~0Vu7eB;1OfyR9Y9A>R5q7xS{6|jLFjkRz4s(1mz4hA`@GNRy+5oEov!-U zsdLXg_uRFrn#v)8%Tin}gEp6OsnK{u)G!_$)kt#%&NWUpPBMJ2UBD_P$*O?1f99*AkE=-+gQ6yo1{J!hZVs#wNqKB-zR^Cg;?*I+`?$#rS7Y3JA|SjC@jO_y%M?Qfn@(g@jV; zYEF$DuAIDi5gK0S`>XF7-_^d+SC6tHKlZciP*z%={b{~c|<6ml-0ppIxzOrv1HP& z3)B>6b;yejNkT4DCs*V}j=Cll=0$#UO&YrdEeS-YWqFqGXz4ST4(J}RkHr?lWv%P1 z2w)>T+={Gn4fB2nDdm}$t+KqU%0KbF50@DM?=JJM3CUy<4NJ2-1nk|GT_0NmR}Zs) zj1Pk|LVset?|n=s-XBOFoaqJMG1O2a%EStS2H|C^rrlvHxW-z(&3(Y%X1^=kzPfhC zNtSDE9-B7A3Vv=y z-49_}IpCJSg)Y#YqEf4Or=VF-GH%PeCLFI@igJniW%yNnVCoz4_`N!%w=5~n#45r3 zI!oEE47a8Iw#ZPV4{C77R-&M}P{iMXb|egEEW6aiN?=nsj$a9(Mqq2BwZm_9bP3^!^QSz zR?ccG+WSqAZg1v@{KM|e>E?-@g?1rO6MC~9q*F8PZ<(=u5EykT-ZSlKS?QL&-~PmB zud{;63ZZ1?w3N|CxT}3A67xk4T{8JhyH-^^t7gCot2!AnF~HLoyCIp_!rvgKg1
EN`2nd)7RSvC0;C1b#lgN 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 Gi2nz0 z^?kDAQgKfoNhPI66oF@z+dNZaM z0=bM0(^uLu+B0@ce+i-%OxLsnQV*tQf~XJER{|*}p6ba9-NdHZGiopiR8QBkXS8E< vn4W15lrb=#z6!|YVrYXnQ$u0;CwoRSPK{*{zVdWK2S#(I3d`wP4vcC5nG|j0 delta 376 zcmX@n#5$pob%F-d1{M*fd?qn(-gg4&LcXHjMum3#KdD zGS)L45ShNnmeGxI!St85jOLsUhKyj>T1?lpV>D-Un4W0IXwT>|eIbZSnEnt*O@Cm= z$T3~Rp3#DF!}LUZMti0+Rg)LGiA|o6FEIUtJ);EEg{tX~>>2GC8Kx^b0HrI8rYAWt p+HoCdg#^S8`RS`17|l3$EQRoSr@wSyH0L^C0kN8kadK9^8~`T?SCaq$ From c0d403acdb8972f53fe48770fce552ef5977612e Mon Sep 17 00:00:00 2001 From: mrsu Date: Mon, 26 Jun 2023 10:39:15 +0100 Subject: [PATCH 6/8] config --- config.def.h | 25 ++++++++++++++----------- config.h | 25 ++++++++++++++----------- st | Bin 0 -> 110208 bytes x.o | Bin 82248 -> 85080 bytes 4 files changed, 28 insertions(+), 22 deletions(-) create mode 100755 st diff --git a/config.def.h b/config.def.h index fd2a22d..433cd63 100644 --- a/config.def.h +++ b/config.def.h @@ -5,12 +5,9 @@ * * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html */ -static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; +static char *font = "monospace:pixelsize=32:antialias=true:autohint=true"; /* Spare fonts */ -static char *font2[] = { -/* "Inconsolata for Powerline:pixelsize=12:antialias=true:autohint=true", */ -/* "Hack Nerd Font Mono:pixelsize=11:antialias=true:autohint=true", */ -}; +static char *font2[] = { "NotoColorEmoji:pixelsize=24:antialias=true:autohint=true" }; static int borderpx = 2; @@ -99,6 +96,9 @@ char *termname = "st-256color"; */ unsigned int tabspaces = 8; +/* bg opacity */ +float alpha = 0.8; + /* Terminal colors (16 first used in escape sequence) */ static const char *colorname[] = { /* 8 normal colors */ @@ -137,8 +137,8 @@ static const char *colorname[] = { */ unsigned int defaultfg = 258; unsigned int defaultbg = 259; -unsigned int defaultcs = 256; -static unsigned int defaultrcs = 257; +unsigned int defaultcs = 3; +static unsigned int defaultrcs = 50; /* * Default shape of cursor @@ -202,6 +202,7 @@ ResourcePref resources[] = { { "cursorColor", STRING, &colorname[258] }, { "termname", STRING, &termname }, { "shell", STRING, &shell }, + { "alpha", FLOAT, &alpha }, { "minlatency", INTEGER, &minlatency }, { "maxlatency", INTEGER, &maxlatency }, { "blinktimeout", INTEGER, &blinktimeout }, @@ -235,8 +236,8 @@ static Shortcut shortcuts[] = { { 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} }, + { TERMMOD, XK_K, zoom, {.f = +2} }, + { TERMMOD, XK_J, zoom, {.f = -2} }, { TERMMOD, XK_Home, zoomreset, {.f = 0} }, { TERMMOD, XK_C, clipcopy, {.i = 0} }, { TERMMOD, XK_V, clippaste, {.i = 0} }, @@ -244,8 +245,10 @@ static Shortcut shortcuts[] = { { ShiftMask, XK_Insert, selpaste, {.i = 0} }, { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, { TERMMOD, XK_Escape, keyboard_select,{ 0 } }, - { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, - { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, + { ControlMask, XK_Page_Up, kscrollup, {.i = 10} }, + { ControlMask, XK_Page_Down, kscrolldown, {.i = 10} }, + { ControlMask, XK_k, kscrollup, {.i = 1} }, + { ControlMask, XK_j, kscrolldown, {.i = 1} }, }; /* diff --git a/config.h b/config.h index fd2a22d..433cd63 100644 --- a/config.h +++ b/config.h @@ -5,12 +5,9 @@ * * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html */ -static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; +static char *font = "monospace:pixelsize=32:antialias=true:autohint=true"; /* Spare fonts */ -static char *font2[] = { -/* "Inconsolata for Powerline:pixelsize=12:antialias=true:autohint=true", */ -/* "Hack Nerd Font Mono:pixelsize=11:antialias=true:autohint=true", */ -}; +static char *font2[] = { "NotoColorEmoji:pixelsize=24:antialias=true:autohint=true" }; static int borderpx = 2; @@ -99,6 +96,9 @@ char *termname = "st-256color"; */ unsigned int tabspaces = 8; +/* bg opacity */ +float alpha = 0.8; + /* Terminal colors (16 first used in escape sequence) */ static const char *colorname[] = { /* 8 normal colors */ @@ -137,8 +137,8 @@ static const char *colorname[] = { */ unsigned int defaultfg = 258; unsigned int defaultbg = 259; -unsigned int defaultcs = 256; -static unsigned int defaultrcs = 257; +unsigned int defaultcs = 3; +static unsigned int defaultrcs = 50; /* * Default shape of cursor @@ -202,6 +202,7 @@ ResourcePref resources[] = { { "cursorColor", STRING, &colorname[258] }, { "termname", STRING, &termname }, { "shell", STRING, &shell }, + { "alpha", FLOAT, &alpha }, { "minlatency", INTEGER, &minlatency }, { "maxlatency", INTEGER, &maxlatency }, { "blinktimeout", INTEGER, &blinktimeout }, @@ -235,8 +236,8 @@ static Shortcut shortcuts[] = { { 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} }, + { TERMMOD, XK_K, zoom, {.f = +2} }, + { TERMMOD, XK_J, zoom, {.f = -2} }, { TERMMOD, XK_Home, zoomreset, {.f = 0} }, { TERMMOD, XK_C, clipcopy, {.i = 0} }, { TERMMOD, XK_V, clippaste, {.i = 0} }, @@ -244,8 +245,10 @@ static Shortcut shortcuts[] = { { ShiftMask, XK_Insert, selpaste, {.i = 0} }, { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, { TERMMOD, XK_Escape, keyboard_select,{ 0 } }, - { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, - { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, + { ControlMask, XK_Page_Up, kscrollup, {.i = 10} }, + { ControlMask, XK_Page_Down, kscrolldown, {.i = 10} }, + { ControlMask, XK_k, kscrollup, {.i = 1} }, + { ControlMask, XK_j, kscrolldown, {.i = 1} }, }; /* diff --git a/st b/st new file mode 100755 index 0000000000000000000000000000000000000000..871b403d20b3d8fe354bac568baab81d9523223a GIT binary patch literal 110208 zcmeFadt6l28b3S(vlR{6V>-ntNh&Py7M2u~PBJ>$#z4tS(G?LPDFlKUFXaW>knDD& z)ajIUy4c;*sS|a|JZ8p41?`4*GrOT>?Qzu5O7Y73eb!zZHv2T6_q^|4zdwHTarXLt z*R!7WtY_WVzO-y&=Adgvjrrpq%<6ef z=l(RVhCj(h`j^K2X}zW+j{efwugzvnw~(i^UVU8NxKbYUH+`Rf&i|kMvU$4f1if6= z>tddPaW(S00qMvu|LY&GcH17Ss?j4WN=IJ7Odz{b@Q;#TH)W~>Qgy)uUvGXAgWy;87c>*AsPB3j{X^c)Eu6`Kayeo(KBGJgn0K6)#yS% z|NXZg^5^_FZTk!b`!n8$%>Rr(gv|epe=Y*Q2zmaQd;%>0Gk#R>Kj%9l*clfg-?Jmg zx1l2bEZ>O{@*Nj}e=Y+5O9XocMBvYh;O7MRE%8t4>%j>1_(TLf??lLVQw0CNA3@#` zL4Pm;|3C!&uSBr_uMzTXj=-l!;EN*gYJ_%pUWE3rF@m1D2=ePAw701d@;w&8KQBkf zcTz2=js)`FbMQ85N;ixe@eS8NvR85%lbi z&<>YI&@()OA1;Vc@6{3XoC1F_bXosKM)1Sx2=?C-!TviU*i#rmes_fa`$~j-r$n%` zFakd~LVLI*g8qRK-?MexIn z2z)~X`)5S3^T`PL4vnBcC4&7e5&TmdLC=N=c4kJf=O=WOKbxo41l|#W z-x?v`w<7rS;t2LD5&TdQf&V3fpI1jHZ(0OBNfG=!H-i2E^y!4J*|`Q8;l z&utOxzafJB?-BI3MzB96f}YnR)NgYH|BQ}M-qjK6{e}p3&Wxb{;RyE6kC3kvfnOBC zp4TGedw+y{?~hO~uSd|oD1!d8BIxNALC^XK^^zGu&x8o|`$+`-as)jk5&W4SLH@o7 z{Ei6rH%73BHjjTczU_%%Pf`T=NfGjOM`(vXMey6|2=Z;Pzn|@V+nOa1z@KrhV9U*z zk(E2ApuFJDq6&XO`HZXy#ib<$GxBB^7ua%h@0?d!l3U@=EBEK->Y{%tn3G*lGN-8I zPFv1|@`5~n!GzM{((-wEWwxA2Ma9rMaehIG-j0_IGZRGJ@v zbXH!OE^W)nEG@k|P^M>N%gN3wuPC^#pmbh=zZ~A`(wbdfT2@f*2Q{fUP%+nV#B~#F zIlh9zyg;#kdVYC9K?%X)0)Iibyk4#hU9hO6z;HXWEhE3QM7NJ}%94so{IG5kG%@$h zC|Kz4)`S$9rTKZq1zDwYiVBMg%DJdf8|CvdN{Uc-#YOib`Lxnf?h#wg-LuCR6c^ia zyv4<(`O^{2Gn!CZG9RVtsyNngil?C#;bgSLoGCDXS1@w#a^JLqiqb%NenD1VN#30W zd3t2`4*%NBXjLiHvw!DtfD*p)MHGFf^4{JA$4RRr>iGfE0ekzi3tK1(*K z6s@$pG*B{!>*jtbqRMB!1mQ2uFD(Y97N3!2%L(`k)5wR^o@SKx^d@UvMnQ~r)$MFJ zfqIisTY4=TZ3ccT(VO~|z`WVi*5}Rc(T*nNXXp8;*Z2Zu#YOq(PPQ(}J7>=L($eB? z0#)xT4N%YTl0hQ^pq9ZJWOoE)sXM~y-JB17ro40!2-sCvbm#QI>A-;JV^PWphdS^s)l9fI>gj-o%A|jA#`zQLToYUNMAniVNrH-r_2# z9aBViZmi{XQF=Giv(twa6rW{T(B%ydyWPkA$+PA1rRDx^SHp88)WelLm93(r48xhf z&{h`k=i4x%lw$<0DDYPl&9UX9Z{D4IXMx{egaIp;#(&`axp(Il<`os&3TaTlAXHL@ zQOKWPfuVOc`qbSvRQ{YmnQdOdym_Vb3kdp43-wE}tzr?z(|I;%En5&kCWWQtEJZPf zs@&Xs|Dv*j+}XLv*#=#6Yylc23rgnOpz#Wp3TY5SuQdFAnFD8efz05Dw}K%$7Hs>J-JAM~B*1Q7C8BsP1r~ zUq9?7z8qCiP)>Lh$rYl}VpvBZ4w-!Crt)UmvbjNn{M$X-gIi-<;u6lY3>G?<5dUx4vPEG4DJMIRY##+?45Ax{4 zk71?O+twQkG~xyn6~)mVgL623o5c&ZfgJZ|@ebQ%96!$Dqiv%&4xC?vTN_cfvB30a z+~4BRmVJxPr}6t<25;khx`m%6=<7$x!r#pKSr&d4=jU4ZIh-%E@N+r8(83pUzS6>% zalXdF`#E20;TLi~`}&^i;5#^ zvhW)?-)7-AabC0Vjht_{@LM_GVd1xP-j><3J$%CX7z@9X^G*x@CFkQU{BF)CTKMld zKg7cC<$Q{T|C#e?7CyxJbPIow^OA*c=X{xkKk}_U4pdtB<=^OhjfH<|x6apE_%hC~ zwea4rb@{poe7%MLsY#dLW#OfFbiUof7jfRn@53A8Sm-BRKHb7E{aoj>E&QEd>3oib z|AP(&@Hf}OKg{{HGkUfk1DDP0$$vUP$F&yzbI#XU_-{DhYTH7;jiR;wuQfj^JNx(9Or8- z{3OoTS@`QY-)iBfalYNc-^6+6%{}eEmGdbUem3W`E&QFFFSGE)oUgU;Wt^|G@C!KK zYT*}izTLvhoOj;R)BY8lPqFY1aX#C^*K)qh!avISS_@x&uAX0=g$rTYg*WWp zrC9j&hW!?PBj?L3d=uwuE&O)Q*ID=-oNu-8yExx&;eX(~^Y)(h|IGOm3vZ08*%say zSIaE?L9VCP!vD_sItzc2^Q{&>inq6R3*U$H&O3VA@8o=ng+Gt;*%say=gTa-G0xXo z_zSt7ItxFT^Q{(sIOp3f{FR({=JvGz8qTL!crWL(Exg3}G7E3aJGBTJXmMpjd`%u!dG%V?H0a@ z^Ul1U_8a3{iiJ1kk!%ZZ%sXWk-k4u%Exa+m)LD3AerdJv#{AN5;f?vlIlHI*#{80E z;f?tv+rk_3OPPf?=9gLvZ_F=s7QTl2v(>_{F#K=fjrE~3zo-4i`Y^@98|%Yt3va9s z%PhRHZmG5K#=51>!W-+BRts;eTiPwWv2JnB>1qFiyu2wE-dK-iTX?;;oszZnT21^`C1GA0q5&1d=uwe zE&O)Qw_ErfoOjX#L-;fHLAyAgV&Q+_e71%Ene$~9en01HE&O55*ID=u&bM0lPR_Sm z_+IDfc02FvX@4B&Q!IQx&SzWrc+Qtu_(7bnweXj6zRtpr;C!ovzmoIq7JdxpopXEI zKY{Zp7XEt9XIuE`oG-KRH*>z$!sl_m&cYXQzSY9t!})d#zlihBqMr6I<9v#RU%~lo z3%`otA&4^^X(S?9nL%N>S_P`oKLavTR5L>;XmYjnT7w1 z^R*WK8_w5R_#ZjnYT?72Z@2J=Iq$r?r~St{pJL(d@w!~Lh3~`pG7I02^R*WKJkHly z_(7a+weXj5zTLuK&Ut5XPy4Ute2Rtla6a3@Pvm@=h0o%At%aY-`8o@4jOVQu-WXTg zExa+lIp_7X-xz07EW9xeWLtQnpO#s8qaW2;c%z-yS$Lxzwpw_jowQqcqaK|lJ?%IA zoMPdPc`e(*8}mzm!E6l{ak*bg-_w~l@|U! zE?;Zm)42R<3x7YCUu)shxqO|4SGat=g_pQ|i-oV{^1Cd2HkWU+@Q-u(b_<`wEd00Jo(>D2!sTt{J?mZL@=gn%&gJ7R{9!IX#KOvX=>!e7JJdvzAxSO>O7;M*o3v7Q{Kkk5EDC-G4Vr8e42?*Hu32ueyE9;O#CntpKapl9b4ls z$Hb2?NL*)`_{&ZFToa#S;>%3@C=% z3=-EhCjM#@zt+U_PmQqHIun15Nq)VFA7kR{O}xj%x0v{AO?<0~A7|osnfP=Q-)7>y zCSEh~<4t_KiJxHNJ50RK#M`EIxBrPIKE}jPGVx9mf1QbsH}R5*Pc-ovCVq&CpKRh& zO#JmGKF!2un)q}RpJn1D6VE?g!(y{dJbf#`_{%Zz*#?R0EE9i&iJxoYrC%j;@6t^TTFbNiNDpvuQ&0xnfQ7W zf4hlqG4Xep_*N57-xe_bcA5BD28nB%iO)0fnu(un;@eGpzKQQJ@pDYPZF+b6FEH^j zCce9p~nfMeFf47NGGx5bHKHbF6Gx3s%FER1iCcf0f z=a~316FF(4CO%-|YfSun6JKlM7nu0fCVrubUt{7I znfSFP{$3MbXX5WO@#{_eViR9);+L5C78AeJ#J8IGWhQ=?iLW&AZ6U ziGSS0*P8g%CjS2h|IhNkZ{md~B>6y$qzZ3#Vmn%0?~m$imE_GaP0Y~F)a{@<2Y-ZL zaZox!gxSmyYU{+`;6}pKIYX@sZy+2+xSrv+2uBmHWB66V4#H~~ex9&ExR&833HKsg z$?zkDdlN2W_(8%kgl92)KjA)vvl+gZa9_gd43`t8Ep#Y_;kyXO5>8}zHsLtJPKIwG zOk3rUjp1p8MZ)c8Kn$Kt*h#pJ;qip~5pHGp8p7ugu4niP!u<)?F+7y;0K#h+zL>C! za4o~<6F!%4CBx?sK96u2!+it z8%kt&FX05jPKI|AzL2nu;hlsB5pF+C<=;*?k#HNsjf5{E+{*9+XZS6`mk_RF z_*KG5gx4_qJmJBFYZ-o$@TG(+8GeNDWrWKZevt4G!m}8@pKvnaY=-Y8Jd|)c!{vl& zYZ*#m_%6c32`4f?WMe@QKsF zv?UCsGkkxQyWk2}^`$F?>Ja z48qwA-%EHh;dF+}3DXuWl)~^`gfj^zGCZ4b7GWpDw-BB}*v9ZQ!cz&ipJ4S*IGb=A z!{Z6xK)99RYY0yxT+i?ogr^g(V|Xax8HCp`d@7o8p7p->lwa+a0THyhKCaN6JEpc#e@TdYZ*SD z@O;9R44*@I0pT)+`x0JAcoxG^glWqV%4Yb)NnqM4gwh#4Lij$yDGcu?yqItz!+QxY zA?##$H{qp(Z4B=uyo_-BF;@SCD+#wT+(>vi;Z}w>5Wb&qJ;QGimI>D}{3_up!fP0Q zo^UncT85t_`~cxfh94okf^Zqb4-&2+Jd5G`2`hxN8NQeBgM`x=E+?!KPGR^i!VeKn zWOz2=AYmuNw-8=Q*v9ZQ!m9|kA7%AVxR!7m!{Z4*Ot_WdYY0C=xE`3+SECMQC_CT3CXAKq)YM{NokiF4vmu{{Sf1_lK?^rn9Y3 z9E8!=NKf`vdY(pFTj0u>lI&@Oq)k%x`Qs$j^S}u*u@01$kFswS{1CL?-qdYxQ(pCy$Xi|GiLDxA*H^%W+c|5{DufvyZ5sn>U+hwzPI(yq}3zD0A zpYF8THqg)dC}g?(1o86|a0MkkUN5ezM@G?2>Ur{sWedJpk22euyf=Ao^v?9om^mHG z;513`C&gqapU;t0$6#7yNQy6M$f)|}UZhs4-Wj-5Qo+oThUxKQ^?#^zN*k8UX}8|) zz0G^O_YQAvQ-*Rz3i^}c#ZBY1!&pZtO_^$OQhY{mVkb%&y`UmPK5d_0m?59C&!6=^ zS&|uCoRrw`V=u3`Y3#^M<&3rg$@(-&GH6?1iX?BbXSw$wrwnn@7RkM({4?)HB(r6@ z4~qAb$H}l5B|cL*Bq_~W3sPq(2SQnhVfw?Z-i?$`XbhMP#9WE1HXP1TUArgQZK_aQ zZMV5QmgYx$?m#HHd3o~=I8e%OmWt{>%bM*(o4QOn-f( zxp%}%vgVZXw@VFs9Fo1|Xu4nzoKwAX>Dh8xVxSL2%KPnsBT8$No>CPGSV~6+#f7(2 zcP_kH6*9mDvpd}#;*=BBM;E56!quE<7pEL?pIJOn%Ku6VI{rqbM}rS$USUU$QIhKV zSC!q??1-XbqNW{^yCo26+C*~U<`3vneRNTsj^Arig&!s&r?O5Kqb-9wn$T5tf`qEi z=%Tnbvx~3=7diEQsCQ_aNl;uDmj`sTASQwcO3#K%hhV!a-{PG zy`ApkUU5o?;u(w>ce^-stNVyJrB!kL1sI0hNa{8F24?9-W>0vh(tcDpCF8RX%wTb1 zDgpaeZ8_zy3P*t&v?#gFUfmf;kycB=0b3}&l-!6a@m&P-gO1wY#8P1mB*lK{nx%2i zv7i*&BzM~V_9jXd_ZKG06Dwaz$y=r1=rp?v05K9cf_F9-17^ZZ{npf`dEVxLi zN967>Y*xoMO4Xfyk@`&R1_$J{e5^h*@_$E-q$9bc4rrJ1o1}&|hxl%0l;h}@DF1A^ z$v!6GLc}gPzu6b%Or+AQu70}sk;3J3q6T!H1oQa))GXd&%|dk@p1{-{L9r&nFAi!r z-*HaOOo~-vqtKb1)R~)(ZgKcGL3caX{SKES-M@F94nL1-&QyiRK%1KEAb0z+Xf!PM znI#t}sS}aA;+cToCcS3&=`C=N(yp9Qn#12QR_Au0!MCfzBnW0A*R7m?WMXpD^ZHpC4p$+ zFha?#f3B7z z*_T9HYxHw}1)NiOzTKuh@dw7n>U!~SGyyoseQp1 zM@y&?O3;QwAK~g#+IWI>h|W}pH-<#CB}qk*l|d7gOEVP=?WCC*rKWh*vz6cM;e|2o zgi54Xwodgd#5L#`^u)1F>Kg~V_K(DxpV4!C?!h-BN?iFhK=nb45+7lZQ-!u=RLSB> zns%e(J^@N@Sl*!fsKGoQZ*Mp;D7lr7$E*}Vp*J+bl$LlY|ESdPv*V~QMX-xi^C>^& z7cCZJzI&IrvJhBx&4+HEd#||Cg{)B2XkixR_P z>3APzLe)dhCu-vFrkd~`ohUfO>UA)}4cCd)UtznAYN~n>4EZ+RH)fnz^%ziSBSq~L zYtZsB&JIVGXoQlAxmxK3e&th$_o7vK;t)lRyH$MXL)2VIMugIy+(OkI*D;RV65Alj zA&aB>T8r!7*^Hocu5 zzf5Uv=p2-Myl5M1r<7MPu8QTA*?=iAQpq!S=+@M*X4(w@z?^;V!9zQ4S@|%j)g+%wFpbWrKhwHu(jU6#^Ye>D1&?z zq`%e6TC92w#CUZ^?^CFUk|$~S z^3cmsY_+Ww9O>*_&nk&deuG{IhUP0t+A&_u>>V>n_4STbdMT}aT6}%#J)KasAhlty zvtdt6pY6UrjY?}AD0{d;*$(Y>PcZG?F73Sy?cp_u-lj)i+!d`I=9!0=2fb0q`6{K? zc;x6{8Ho?fg<&)YrSADVQ>@_~Ki%wq87V_PlA+A6)U|K!l6kO8hR%DtmijS1b@00f zG04lOIs<3Xfww+EHA%|p4CN0AGsuOK@|&dWmXt#@YR-lpOd|{9B>NUAxhb$OtNP%g zX6(Q6VU^}UEan?1)Sd`+b~Xz)AxI7lzsS}`>gD3P+ig|f_=jgGr?g8CbasmCzL8Yt zQQs~0^uUF*y3bICC+R}i19{-jaDV+0D+MPa)`8fGHnuG3G56x^KJE(_S`00lHtC(p z6Gjbdm$y^H@Z59_NU`b%L~E~wK`C1@gM-JXVc=GN%nYV}2HDJ@rx}+lWncIbtOBZ` zPpgNO64qFfvMV#WEn`eIzV~Gl<;S5%TsMXm;p#-&QC~I+@R8iv*MG6x8Rs7>cV6JX zSvirZ97PNBK#yKk(Xb`_CQKb_HFYAHTJ~YNAa}@H9A5Xg{#zwQlcI%d7Gn5Gv-$V&0o64agnReWca>ey zf(zmQc`D6j87^*&4?koqmYSMqTN;DKm4g~1wulb4BGf{xYC9YYBne#u+baJ+OotBT zu)JrSysfe(wtvGR?5DBaI)E*$gZ9j?P_+$+I=1uT8AQbG2GMtby#~8)IH`$MQ}{Py zCEsHQ95bq(Rk!dC8jYk5Y}Hz*y}OR#jkvqf9 zZqJ1Xaa#7o19bWaHw*1o8Rkb3g+Dd51DxvFk6*13&4F#g^alO8)&PlSVFThQU9<2u z52?bYfU$2>gzaE`%HU^lQAWJZe&3+qgqPUwEBMt8V6v4x_aSKW_iYyLM1W3L)YL@? zsh+z@W&*Nj0~6*oU|PksK&Hnq6|a1ue28s9Af|eoSWSb7PfeW&X`kx3hFt~^VwVw# zxTr!e{9;WVt9S-dDD`~&YPm2*84*sUC2ML7n1JYWdrkredbx{}V*MGaum{NN-r^Or zwkTUwVLOAHv9jK*G;2>_sHpx%e3aa7uUCYp5Q`=jZ*({u-DuUAPs96V&oac>13SX6 zHOZb;2zQEAGUp>o@5OeLmdrDf zV!g`8NY$IR>lpsj8A&ld_x@#leG1l|U%=}zv=K%<)zCUZ6*eFj+TXT_Q+H7EiP)wt zRD~CG+UIWfVbe0P`k+{YgG$IhU_@w$*pCye7~8^ZRVdYI=#DW|#ZY%gZHcRPBV|VZ z77Qd&66QK7A9c@06`11;--n%DEF^4U*{kn~Yr(`YW}_->DTn_i#Ha$jXQNDrEo`2E z*|0e}5dt)|Vn6S7A6ks5O*nEToA)M14@|?LuKcQXVtt4G?*=W1;V1lWFXScJfq_f6 zY?%*aLT^l|{ z0Gp<%SkV_E(icn`<_%^hb*jP#SFoyA4zW`T?N! z-R|v6w#gp$x}#rUW6H5_lNFK@N$z8?t>sIC*Gh>0EM z-oAKBW`5)3po5+IC2!A2Zp~m6TCfLmfXgt)V9`H9crQL#D}vFO*- ztbWzDR3Z7*jDbPK{F|7;#3Z7V5%U}|{lQ?^@ndBy?8F=2a!XW=unhq=MCe|72VM>B zhaSlMi)7kPhj&w=SUK)ZV0-9eM9PC-LikLm0bxX@i;p&^0EBMn60Pnj+Cb3BMc*dTOCd_> zZtE$ynxL&xk5ftTG*WG{CF;x~VsOL?2F{}NcM|h8V;nj&lbB{OvS-X5T*Rsk_%*pf z3t~?rdoI)?pGM?SA%HIgIJyqiVgr|8yo|+29`Gz5^A{)%EHW#|go5y$xW_OOtyjXJ zaVG_`J53ce6}MZ%8?;3lE*r6vJB*ul7(h;7#MQSD^*2_ z$h5b2wrxrWrqU_*(+u6@$aMcG%Ge9qP}3i&{g~j zsGovI3u8&h>nPvXEIfy#^rs4+LX@4PJO-*+pl^A25z#EHL?{}6%|Z z(2sWD=T3efW%e&*L={xAdR|6>9`$@D)^OTiAuosRfsMB|Ny`uHf(p9zhGXOzNhy+& znUt1^X+J#^A*rg~f3=wGOUf3LGm~bC$upA5#N?-vDv?G^eldw|#fr(VC9PrCx0C41 zN=)9ERF7+qO-wv)<2l%p0W-5B1<_KlDyfaGwBnJ1zNAD7Iq6Ou*Q)qHmWJ9Pw@v&G_gD z7zqE3u=ZEhYa0LKf(UE3lJe_s(m!!O_fbSk&BDXDP=cC-`w)`jUMs|8#@9Vi{_Of( zU3vJq_wJxlKKWiYUH-~Su&`(M&!AB^O*^Nn1TU;GN^lWMfF$uf#vwXP!EH_lTa~Jw z?=OMDe?wxNEnevsJ_QVv!sQNStNin_fN*qkXTU4BEyJ)d*1q(53@_Q(l+CG`(yZ#A{I}52&>^w~jYvLdrzadzvw} z=}gA}P;(*lYD3XL!yjwW@N(DTF`g5lL*fkOBa<)iSO^?}t=nZ-3(Ijc=h$I)F!ccH zK~lcbcA|cec}cS{_AC7zW(gbSs-0+8^grDt-|1z@K!!@QB5b>eout$RNdo_D+6Oy3 zJIPIVqSLAg|3ExdocUptC$X?mcA@(CvnWj))}f(q@-qED==wvbRz-O4ODv7*MTM3r z+5@OFG@+@?{S9>H9ZbE7>{dPZp<4BHUZe|2Bz}`Fp2)dGM$r{E&$L*U{bnh^&}HeiMJ zK|f0SuN^QUhD`VzT43?hs8M~+eYdO1Upt2QxApiXUGe|yihl_4s^`5gpzjd$(Oq0^ z9|Bq(ewd?~8Pf>Cc{YZ8gs7Srx(bMuX4Ba-bV_#-*$1bxmm)||?u-&w(U<(RB<8Cv zw8#b`e`BD`{Y-D}bY6Bnq~OLZn5i{0tG8g36sypRZ0H|iRWSwB;Yko0NkWa#f$&fY zuhYXx6n>S$>XrOfktd$GLQ>ex#S%9SoG!%b?{n+{v}>7MMWT^dBQm*5P)&_H$*lZ> z_Ls_kw~*5rolv5jN2zT0}ACK z8AMm>qW-fomHipY7D;Ihf0Usd3^!|=VE&)Y2dXdwow-nPB&os_7V;%U71F7HAy&n` zupr$ufEt?TodjbuGyy(BH^S3_J%;X)`q2FjijD5E6kUl%-(czx6c)Ytb=05UR4dRR zaezKtwR#c z7)bKg0bV>Xvh@566$@!Ep2#>XzU!<$L3g(5u{3K5v}fRuC(GR$_=@GPAGtTNbMhvf zg`Iq#+$ejlhj#n21Ui2B6}MdWV~n7CW2$f^S)$q9+R`6Y*H8i{>`Q-ww=YH*M{^ow z8=MAn_TolFX1@WH|L(wly7CXdt6q(>wzIG|xq}AQWqq2WQ@_I^Fno|^bv%_drJat^ z3K4tkdwp(n;OszOnlN`z`g2s54-)Iyz5aH0<5E)d7^(T0)Yy+Gt|Y|k={IB7t3Arf z0C!TnKE8MkUI0H=e!^x1eHVcS`FthX{(Gp9@Ig8CTqsG@S4Km2S!kNAF~=`}bC)gLVMzOSpf4Y634{}VdVt^w9M z{3GPk7lR`PCcH);3lE}6g+7KSRN=E*(H$4!O!gB5 zv;qwNp|>d_brZ1OJhF*=7G%S((ef{LZ9ScctpYwOybU3zzqi(YE>^b-wc2}dxd+Z1 z472`oJw#Y%#qtHKXH{4MX}RqSxdjhf+=p=JY?OOFjo`^Gif|8@@EA32BCe`y41O{0 zB;oSGI7nz;vpLH3A&OzuEDs(|X=Tq~Tx??XyBJ5Cg%Jes7g`Ibm-`HzBJIHO$9K1o z_k>;$X?E0-TzCWOXzB0pHntlte?%_Z%BEufxff@=`{6n%I39P+g&$ZjZdW`San104^1*cZ^tJP2CC?cu<^!#0InBaI zm_mQeLI=d@4>#xO^Lv#Z`e@%c|4?M|H-xtO`a!e3CBwa0l-nSOrFF&!)b#MTOj14$ zXKWQJpu^7gx#1R8ck16V(UXGZcI6!k;2|WX>Tj_KRl3InZjjG7{h67;JXni++3W^C z)K^?3;iQC2*?^Mclpc%sU$lG3scLLerhAY7MI0xmN%Dy^Qgb6^FNqTx!;fYvd&G72 z8sTbI?tAQLNZ+0Zo1TNu;U%P{mC#AJoEBI8;?O1tsKSFR$}9S|D#B8P)zp?8?9jKWo{hL_H(@Ld z-G$X7p3OB$&OkU?cm@)Plc`i8~_dWr3?Ynqp-Q`K#t}vRAqG>dW@QyfV@>9mvo{g538OSGA0A3QL134xVUkM zlS6o#R}8*L>JqLX;pv^hGJZ#BAcR8-%jwgZET?4&YU*YLq0hA*SG|IMrxu$BId&v_ z07msZlKmXw z$c*ufWZ@Qs^&Iw5asNZfg*TAI=twUhtfn5srx8@okN6GFNJE3sE~IfsWzx%;v{*G2 zH_TyM{-FFMDR472P~g9CSt?7@-P;vnZXf1_op-?{<;)X@Rfzj2M>U1 z8w&W=R=Twj3#1Cqv#^80j-+6YT^X2!C#=Mk|Dv^S{x@EA#?x5uj}li5Mq1oN%=cAe zCe-jUlN`5Y8fLt3GeYkn6cv6Sp*In7g#V4uD+tAe|AElc2sy*gBJ@{;62pH(NI@t) ztQIbhTZ&MnEnHbB5B4K?DpY|!3UDXD$xxvVZUHzJx>*NV0KbMZb&wA5Lui~1t_1iX zbOnLsg9igF>kK6UNy^VYWiN)d&(48&Cu0LfRn-?Uir|1)s1pkvRd`|xIp#Oq84Mkw z4W*IlX-YMKr}`W*im;P}wy{*XEL8&$>p=v^@0B}xFE~pPUM1=!M(yI%--&vJQ7;p9 zw!D9u;#yAZV#Yqj+1nIXDY5jVI2Ln*uspm`7f z@W^^F?pO2~HFh~(=Sf9IH4i!I4VrL*vLAKv9_{(?TzwcyUfGJ_yB9J{^NY>GcT>q; zxTg$@U7vCg%gJXz$)4Ywh*%aE{uUeRF(ZBkTC&5ZVA=g8MJx>|Un~1@?DD}xD(+Ae z7mrnpN!WnM#Xp5V#JzPzsD`3YJoL&fiHfj*P+x}96`_dGsUv8YKWGzi6F1b3upBN{ z5^kcHe6({pJVZ&z0+L%|6d{f14+o)4?qQ#~Q0{+_8Lc z1zj9fjrJpPH-OWd+DI~CJV7d`Hi+PrfNPy%)i7MOY-;WoQ7HTY8W`<(RXln-*Pgz9 zBvN1(+lF^4KVk>B+vc&B(HJs%Y0YM+`w5#3HT54^<2rqzFK8;s~-lXKwBRVoM zR*V_pq0|rU2Ui()0F*uSIJx=99U9x!x@vT#^K_-NyOq9TC>;!0 zW=51Mj7PlcszDS+J@*bVs80m<4S=)GX`X z&rj++8Q!I)cH%&oo@e-LGm820ue4KK9gD(4$fvZc36~**VF_PA%H1SR-KCD$j-Wk^ zn%sf_s;@5@r#f0y*D0h+-c7Hc(Ail2AMC^q?*`|8$X?V8j*Zd&*hH;EMM^9$@x1e| zS_6&hBU!$Q=6v4(7?yB*SH5x6D3RkYQhsVC%h>fWB=DHm5!EGA#*JMWFIY6V$bdYTKG#LS$1nvz@gs_%~%I|T4 z_Fwnys*f%$&Y;Jge#cXj?EK8j+FkfwOzgUg>CT>%e=^gKN0czOD_d~SXHm~XTCw_R zSj2AAn4de9+tYET?D*ggL~2*S(C`43MYtiDeGI3a^98vhF7P$(D>$_Nh_;8ZMq2vf zQ6ZdxiAAhlgw}+YurLnz1RH7cDW~zErvDQhNjc<>LG#zk9n1Xx4rbG_)`Io8rP!Ta z6P}~~;8x1`KL~~Yt_?uNOh=uL?M*A~M7TQn2vY9wTc) zF^B4dnH#J&`h7S$O*{P_8#6I$pSs%^j$*%uTee20?!nU)O6oWG)hGO*=hL5Iz`bXX z(zO|Ma--tfh->xEWdaI@`^RX)c)7~+3gqxiVVZXBMi~2(@iadkB%z566@*t%O-G+q zNim>D)#H6>T&3VsNtGxm-tY*xLI)7iRzQuKCU-i->S&U{+uZt%8hS8Ma_Ia&o6*qF(TmL`(r0^NZ=V61r9O{tu0&2a$PX^Ed)eJE z(~U72c`D#FS`Llk1FA$|lXX!Kk>ryNrsPj!8F@UP0e0iIcv-sSpm-GSN;laIc@; zig0Tc&qAPlSZ4AcS@u6dGs%LXXaZ;nzoC5kow`f96h=Xz_82B6SQ!3LTLa0iTdeWy z7VGcIXQqnuCE?yVJ-h>pF<@+*ga(8sg>g1@5!M^k-}w6+6}|`Q44ijV_yU0#e*Fz}$ zwN?iov*#NmW`0H3(pU z5Lf(*ikOeq4lT@8S~1#B2wz*UDPgFnfuQm=Chor#Kv4DEvB%Jsgf0|XNpgQ!Oh$RD zZ(!DL{GY7dejl?|Mh+%x9o^POb88=%Mgv~Zb?i<`kUCU1>BBa|q=#wj!PwV*93P-Z zTX7WMq@|)Y_898t_NaiIQT14p!cQ0>6EW<)MOh#`L=}#`%UHNgc!jfRs_>o8rh|Qo zvl7k#eK^&|R6HmOYf<5K{L&xJh%ZENtHWvg4>7R)Y~ac?Oj^g$v?ayyiMYurpBUp$ z#?u5tF$mdpjB$u==8d;+jY6s$@Z9uqr@ybH>or{3}aSHGIsH0AN>Ox%gKF*xc*=S9( zX{x?sazwKPc%~8pD-S>bce>%iv1qB8SkmGE*r(8D=NT-QQG{Q=H|q8s)L-Zx%8yb~ z#)#g9ky*PL_el}{h{7+?Y8;D0U2428^%ljb6f??*8KTFmrkKAVeds(E6D6)Zn*yG7 z<55pym7R$tEP|M%+=jcq*yxO#80+w|T@tp^nds5@T*onOH`aJq)JzoD4ew2OyN)rFJ9^jnl6r}oG@}3AlkP2U z+C}tJU36@3Z{_Ju|123lw<=mgheK|Q_TsHJUmwj|<4BTEcKXLDyBa$1)d-9lGm?5? zLD;9&i#+U=$2n)^eFEbx#=1lt1kuQfr|49_Bay8c=pBR&IAsVGQeyoDbak;K5s##3H)l~J z^IzVb4BriK;0eop49LwP=r z5biAYg-!YkjOkDxdPrw~{{}ts2Wx*sl$8L|5`+NAt48&HJz39K791asgsO< zO~N1QIY)it?dgH{<&*S&=E*pJntbvC|4d~!&3mfnX{gnwgM5q(;TKU?4}$7`m6RHo zh6)HPh$`(7g@xFvSulPZqS+^ZAd%HWg66t^Qfvl|)N0)26f2mT!S>lmuaLw`VBg0- zltR!>VNl5xS1kt|d%L(wp(_R%j;mrYaYNgl-Oy&fV~|JM#z336$@L<1pgQtFp_uC+ zsuy!HqVY=XQ;0@?oC~{Ht~ew4IG1|lhz52^t-~es0w%w)cL)9o4SpohPGj7n86~G{ z^%M{>qs%pyP4x2EH*cX$;O!nY!F?@uH6zC17l)%`anTC0^>J?xGFM%LL1CJ&*+odW z3GE(7@Axc7)(*whhtdkYNdjxadXk76MH2VWOITUB-4*uGE-N(&B-WVxn>*35TaS7L z2cBKuZ^yT5NF?9&4!f{Vr%2I`FU5D$9fgB!jzS#a%b#Jb`8Ard>iP=5tc`wv%xv0D zoEgZTn~~J!pQ0ozLO>Pn#xL&k;#Uh{N>@Fz5p@3==!36V(7W#bv((h-6gvZ}6mm)v z>!qRLa5Hm1+kL~ECCCgpfsVl=+A zRoI;FNVGNE5}{Xhwc&(A$;O*ZpRqtJCIou)rTlB!^D3!N=$h$!gp*ZAy)r~iUCC5` ziTr*a({)@GoMKm93lXE&goIrrl}K-7=+d59h|~W1Iy-bvgf_gvnE?t_&FzIhFSD$==BnRx0^5g3Dv=6hiu`PI9`7M@~-V9!BUn41= z#|YaSB=@HxYJsfk&|N5QxCR4I#5Qy*plc(9RP4r5;Y5?{=)OUcJ2c@Gw- zJ`qn~36r2N^p0-%cs=+2-IkALxiia0AgHxsTnw!sX*3r+RbuxK{SPY6rW{dIYp+2Y z^gMuHEe-b!wd?R88O>`G$H8K1Pno!%c9ON)dmw~XTSzHVb6C15_+@RknVM-vv;&hK zZ@XXfwtIcFV>fHN+D+FnmCo=hJyxJY@VHmJ^05z#g@J0EguJ}UrxV3D77dsfy~tU8 za6Ord*C{)^LC56~8lbd@ZwR~Gbc6R3{Q82Uhj`u1Vig8iB>fx)_lA<{oh+dwPT9)V zA({CHGq57a%KrrKh~X6joC_WI1#juh%Krv0TR45n@$f+U=2#47{58-tKIlueW!XbM zyv>aL#MTU@-OC#0#Oj}xetCV+5hEqzV5cKWdO|wZ$xhUw2Q;ctUbijKl;u9@AB+dT z&!cz7Gn5G+h5=fSG563H zUueaQb7MRg>K3*gC)t8tO!fjMn*%_%rV_S60w)of`E8gkHhyliT_5znWYhkQ)-^$$ z@e<-vZ-mjtK&Hl3LK()h!-^AU|EKXKyqk~+Ehy!m$S|%DfTrU^+Cf@Evf3Xc-_@Hv!utaOeJ?qd`$g$~I zO?`n>dY-_q)`BGA57mShp-=uTT1ogj0{W=9TTQ)}36_!I#kl*?#m{DZ4)J}#hwh>} zQO?LekHhSGx&BgM&}YLP%9qCzQ1DSOS{1H? zCK5h&rD2_&guM`M7NQVIe=J+`;y^x$ojI{^*WC+B@HmVdO% zA4W9`p-=g12*K1xkcoUUTC5%ikKucHfa}S3%n#_<_#k{op9L%MJ|fZt9hLHLDM7~s zJaYxeY|!6!lus7pQ#wWt;qg*X&bHBX+tEi{@fh@}LZ+@@`EPab8q;x2myRpZEnpmK zG71J9ZL;IMCYXBU3iP7g^4_SxvSuL_!jRIxRU~^(e*&cee3jxb0%WjyHtx7oJ%kYE z#x^2b7WQ?wE_L7xIZA0%&ebb=9kv_V(POCSI+{_it31~F4>qDyKMP{{ZxqJsiR6=2 zbc>JeZ<>X5JR4=#jt(rJ#VUHMig`+3=+aoJ3J?8;qGjuR=q6CO{TxH&)_|)Ih3z$jzlAcCRZ5O&7Ry0p#plFy(@d7M8V2SO_0NAn;w_f!P*n4D)TUa&< zw|#v+Y~ktqvF{&2lTycO+Q1j!FI9NQz_EmJHprgQz8-0O$!%_J$w%}?{x{;P3waLq zrZEZkAkC7ir2H^G;}Q)WMY@h5TFdiHXP$xA10y|j;sbhPz%IihpSQt|;PCIrIC|kk z^$bOX_9}aBPPmYgGIk)bkLs+G*x=}=SsK;zFvc2fkseizFy1kV&&&_w4f@x0t#sB$ zZ_0Y!Ajzq^L6!Q{XWvE?w9)xo!uDzC)}M?TimcpDKPI>oXnM)}T{e40KCMUu+! zB(L&axCl#=0r<2=JQ}fZ1NqN0@+00~wBKJw1^GOU|r_%k_;J`1))vQ%{lQ(DBKW8Op zYHooVIxu(=JI`+AnVhXMSSZG;-GL8PVKAcL;&^O`A9@&CkyX4Rh{Pg8MX)0joZD%9 zxnkOD=$ol)N7B^y41P8Dt03ZJ1jTnnx2jzNSJ{uia%5TAPYBtiL;15zuNai;~`D@$%4}0$d z7ge?Xjqd?QQDFvC3QcP)FicUrprB5I3_2((dCO~xTm(fR7!>n{f#x()R#tX7<>~4< zU9>VaE5*BZx>%WMS(=#+VdbUcrHk|bK5IP-h8?^5{oeQUd;jm}J)@gv?dP_h^{o5a zYp;!IY`ecv*$=l9Q$;OKto^*iT+vT+;Rwh_|4w-xRDpy0P%usJI&nZp#Wm2oM>cig zWs+fq69=CKhW{J`6$$%`zpgotvLR0IKqDmTzXR{hoqZGY#RQbKMUmdC|Dkpoynztf zIaf3}&w;~#kI=CGv)XF9r=ejD9+qsSJoB!Dg4&(f|7+cd#Di|bkUScmLF(P1{SkYP zJ3IlvZSF&V?Q!_)aL4r!Af_9EWl>!K&|&fGY2r|>`mwwF7x%w0i(R#vibzxyz~)P+ zYa$I;ZHoN?X4F1Tn_6NHbRp$Y9|7Pw)KTvNbnM~p3MVWHH4O0hHrcHqP+^YeEQW{&tOMqvxE7v8uDfM@!=KH3%I49X#RIpEQ$_r zVSkeYSg}98A8~ukz3BefmD(RFqUe?VEAow(3ZKtqS$y)xr*OdG6?qs@!*@4=-T(HC zNOySVj83Y!VxH3qb0Vz9cbkL~p@!6QfxWgPAexcd>i{tlt-TsB7|;S32G|4;h9+G+ zkksKlXH|O-261UsFCvLrEskW~VN1htUG{{T5vAuG{YrvLPdhyQkmponZbezc!s}JI ztvGpwFard}g}q7h!hEBGMbc}{qQuwxU1TavvC*OpL;iTZPas?NnC%GDkJ>>5>Ac?o z-WNr^Hb(&=`YW`Rc1k7Aza-I@S3}gjTMRr=O>QAMkNqYh4TSS3(jBB|ntV?flRsMP z@z~$*42~j-*WG>_!nEp(GiMRnLPmh&8{)X~BzEdB;$uR*^LL2!Gap1)JS+;Phef4W z%dI^p-o?Qp$aZ==-HnIg_SMr=Yo4%G*@BmSo$j-#?)?p(C(&a|xuHHsKE5Q-1TuI$ z-xG%2j`*N@j{tTjSu#pA45(>XYiu1A4Wq3~Fy5xh6S1Re@EQA$K+VQErdV}0k3~a` zt@)Q~UtjDyMXdMH%oa0kw7Gd7C*1o@ymQ;nH*ULhJvBgdjL?h!{O8ShNMUn-w2hAQ zt_n#s?Gx1uM+xn9waCe zad>T2>qOJXa&B>{(|#5EG8uasoqYE-eAJixj=75f_DBG4H)LPUXK3vf|L8?}bMk!6 zo98Uv6C9l5?vFNFygoNSGN5*gH-)^3BI&-=>1>jFUnh)`_M;G7ftCyA`|!HF%@ySd zzy1lhk(RnlpJ5LSUTme4Yj38Q-gt~N*b{!?amiGBxWU*g*GYYW$ak4tbd<%o?jL)? zW1t?-t{`Sz`>yG-10&O`fl4x6!igVWoKLdee2Cs7Oh*bdIs@dq^=9(|M0(yj4!bI> z_jW?H27Vv#`v5-%{8*e*&og!to(iHhhKkmtLaxrBrgw*q&8V>W20=@7llY6i7=LlX z2L4Wp>?KC`9Ak1YqH{#{l3Wf?tkY9sbD)@e>~G?b0q=oF#gMfU+Yaaz*w$1e#G+st z4(&kSgdp&SKdN1c|;S81w!k_5kWZ^V_lWA__7w{`Y?w^_!E&V_C@&nH<7Qx%xzE|=~!?w z!5oa6^VaeEWqOmgLLoZS_PgMC>&E$!SGj+_`0<79I2QF+>MX@39%t3Wy;v0tvM!G1ClCE1<*R7vuY@syj%C;y>6#9<#5ejlA&27rmkHPySC{1+Oo93n41tzNmvl< z8j^}9_Bb-|Dj*gP!S@7kt|kp4G3pHj3Jb5%(zlaw=Pg@BzIAOuA^*0cNgI?f|K{M* zcT(Knx_8yKPDv;YDP1RTn!0zTROLsS90@U-z-YaXhHB1=dC{0Vub`kO8PB&+l$@S< zv0l?dVq=AO?!zd%^cpH2g*$L6C*}ZyRuYPytbRV0MqQ`8y--0mLj{}^_W|Rok>{dO zrcI%gT5kb5U*g^XNc$1e({N}?8XnUMQOVO5RRwRo;`upDOfXx?(5eWsE;A+oH{uY- zz?fgKl^bJ8l&|qXdJj+qqakIc`Abm5Ss8)mgA~N!n$}88V2HM@p0*i5hr2A;;Vues zdSazNLrGWkBed@d1BnO0l7zEU-DWpJWccI<5e*7fy!RO-jt1yzGa8U6$d`tR<xVzfnvjvBE>5 zar5(06Xdwlog7^=1SJWhaJTscj-jBP7qmkTXF}l4`@!49Wd0ao@hLIyF{BGSY5pPd zlU{xvFj;j#n=oUnIRa&>6`%^`_n4{`Zd;@4$n}3z6$>l;+OWl^mywfEGqJS3Kgs-`vbIoaS_ok6Zp>{W*M(c}Fa zYJoE0RD1hNgmSe;3WHm~(ApVzju(Xd)=J00$Y3nxVUy|@>RCG?|F>`ZF8DR{UZXKc z-!20;Y&(XY!4VnhL?ue6Z7N8D7q#vvotWW?bHXk-e;@9=2jJ`4YgAmGd^AN=e*+j8<}T1_vsNA<2YbTr z1~b05_Yg_r;RsHz#{r0y_mB%WrUYNyPe$4hY%YU0AQ&Qp7<{K#h}@CV5bKwQYh@Z} z4Gn29QyRjM2E^7z#5TY`wjI{Wt|GQ%jxE}{F_~k#89|P%3xXoHuC#kUkz$KZ#bSvk z{N)>j$F7#KJ%T&$(@I+%nIc?e>_G!Fw7YS+#J>z)4q z&exGi46xGMb;un@WLez9m>YiWaR3)!wG1?I-(_K-f53NIic0}Tc;%(kw z8IIoe4a)SSNUX+Bik#|~LoEZH^sQZi2JXVn;L@S^TaFC`#Aoh+^qQ(^a-O$u?3giQoZD(_G@{++Fr7^j zJF-Mx%8Vpk(WL8j=n{?*rRYnb(A+o5ei`O@E5Tmt_P&qo=M$AUCZed0u@9gqXWWaZJod*a{FR3jp-!pB zPHg=|i#AK5240cP!h2+>Th6+%S<`hJMj`Xt!y4I|mr_s^m`@P$4kvHXC;NFb;$z!t+0QDn?UQmi>Z0Q`^<0P^@jm5*2-15_l~7u47y%ADB(#U z&SAuR5BO=CkYnw(ZFUqeq2<7wvrgKZyk?RRRg{+(+~&j z{O~>=@X=E=N~3qd{S*5WDbWEMfD7lqF;rUh~^3RADRZQSaAC z_2w*Sq2>_x+n{R;xI|R_SZtvbySHBKpCq=oUhEzc6T^4t2x74;DRyhUSP6+iO2syc z#L&ly*xpB*LPicDF{l~qMzW|C^lOKQ5)G4UD$+R4Xf#qkZ7u3NC2)^9@mjo52yI&u zNu|f$ANSrauakGou?W|U16zIZ_pXO4kwZ1(fkqwr?R7|1*%u5|1Gc85I)#WBJVPa@ zadSZ>>w=LKvUW1a$h(4F=d9y`BF|y*79*FKQG!c&bP*+^DsB+V72y{74le2Na@^NM zNCW0e1AfJ>8Bt!nOJ4zTs3cC2#G`e@JR;I7OE7()ByO)GrV(+GBt}W%b9KaSM0^xP z@5fbW`qU;IOiO;jaIry=$9ar+Fz=nPjGVA*6Wot_haMM2jMswH((T22iRC*_+;#9Y zoPSeWIR9zr7bi9H$;8K@hfdpp=PECeF0qvVYa6i65%S44L8}$c# z1qpwxXE=)|Cd81)3{Z(Bw5Y`%iB3Rv(QKJU`XTOZv_0NqucUa7l8JkgqoEMy%#3w< zM%g?8bWZhY&)ipI} zJnB}3z9H=uYEuMG;QP@#d#P%0uu^~%UvW!I>r?8`Z_!8r3v}>_rz}EwA^-{XPCy%r zRX+==M-W!-gRNDxH3%;*i45|D&OnxLZi_f&UB>qZosimzq}I@;gGLpvB^Hxjaiuut zBe^vzZb^!-^;7&fNzEk1_fmmc4EeeOg;loSa#F1ecQz73%B`c`4!9+molNd7ycl&e-od9X zqsqQN0(snqo0jnugJ@&BnVW*ediPYu(0a~4z>4Jv^S5q99eoJ1$?#%460%0`wT^xl zcTrR6uItycJ7Q{yc3Q0V>^*PYez*xyZz1aFBbaO+wvO3v9s4=BcDT)-TrHaXYKkG5 zV^~xlLs)|tu3&-5IEEuc{e29x5Ce*O4L0_Q7bT8*TP)#Lo$qU@OBU|vPVQ)qXO`4< zy&>z!hI+w|E4f`~!Pn{pV@dF%U!>qeQgBYa;G-mnVxcUUTPJuo{On!Df~63oY`YVS z>-x66m}sJHrw=sBU5TOx^M+96MLT^E*+|W1l|2bD%O*1OA5^9Vp{|YoG)2ae1*1e; zi>eZirrF#ooI2Z<=0L!jBMpU~W1((R$b9z*+J=K=beu(nAhq$;)c!NuUXcR4Ps^m* zr=(>sfG#cDw}vW(j08%iBbWT^aV!|U+o45RNLH1il8M0q%JWYc2As9tlL2w-l8N|B z3~6Af87?%E6Z+Rhbvs4XgDST0&W&}16e5hQBQ&ogbRh!un%)oZh8Vu8*`SWnV3!xe zv2tCD5iSjZF)DOKhEXm9`Q%B7jQIVKunX+;UL?I@L*p#m%0>|n0SeF^2nqP|J_lTI zlqxhF-5$GzUw;LyOE>6O&DIQz9lW7vZCNC|J9I%Z8ymOo-5I}Q2Gn5H1dC&#!BB=X)0RR4@7Y{~yUoEtl*YISgwapD z1d5F4>2gYx`59uRAw3G#O|bhHJe=O#+0X9d=IJ|Z;)S3H3NYIm~3ot$Xe<{sM4wB0=_qQc%pWJ)XNp1?Bba?i85 z=S8?nBHbnJE|`CYje#zQb8!n3+GLOU8{CVpMSLX!II;LJ0u{$&H_D~?^NsBY#?c8UoMayJ<3M_8muAN9MJ`DAD6iF*JRBZKDwcsDGjT-j-( z_Nnb6gweS=>&Bj?_)yQz^ocvXPoaGf5#XG3l1>;L?YfHUx4emW^#Nlro;AkW@F_+- z)5Ol2Abd2FKAZb(MbsX2(ZAvC{?IK51jqrrkM zR8Tb_s7w-tbR+b6Z$QJ3H~o@4c#q`L^*BBMQoB<7FszJ4*P02$(@BY4-htcDV_+Gl zMhvz+p?zOO0d5DZs(8Ji)VmVe$O}|~g81=P4KfZ1^nW%i8ggd~G!51zBZ<5?>IWEu z#Gt1ReG0+N^t2Ph)Eg0oyFR`9eXL#JtSU3@#yNHF&z+rq-qIYZyfq78I;z%*3+CIvXmT|Z!`9D1b7s=p zzt**wDGp0Xb}{q&`uk&ViH+Vi*HE(B90{yC1OhxG8nIY41gO(?uL_Fpgn0onn$EQ zM7j|q>D6U00abkOC2z_chdsQJ5B}vNq@za)x~Io;Eu;&Kz$t)6+K z-Iws?)QT(3t#{LIw~EVVYvmLK+%Z3epjin24u3sy^FtB7xcC&UYl{X`)^nVTV!gK< z+*N78Wi|J}9SJe-K)_lFvmurOv5ULI$}yM{^N7R?yTfQXdo_4~!uByd3S5aBdaQ(l z6o3_tw_HeaZ^Ns86_-L>%^dE3ee%tcUtHh2V{QkxJA5?#WqZJ3T~Z5GZ`$yO4ciuo zMfgN4hPNMB)oTgxn)^(}u^^lr9h}sxy5eM5lIe`Yv~3CAf*>oB$}fv%?N~+iEWAKV ztxme5YKX~!$0caw-?F2=MuSiGO-t{D8+W4w;dwJ2Ae|C<=1t#8Wu{>rJ_8w9hj%2H zpK1ZmEIEnXuKmmt*NKvFcJbH3$~_f724R_e_EvYy0&uy*OXx2r(7NPFvj4L5N{tOA z$uFrjbD$8%hAk{XCiJf{gSz;)uOMK(uYkfo%kVUWE4HD@J%x02K)O00U1$3@NY^WK zu}DCLTAa`0jyczyO!3lRmG?GKIg1dYeD{f?bJ(_86h-eT6zWk<&-GN|I?snwa7qYr zRt!fw@1T>1XT3T8@m zGf;k@FkN+wHmG?MV;;?$NOpOW6G>zo6{Z@vpQpE2#po+iFcdny8{kmXd^jT}km8`a zAA)9}bQmy~VT5RL`$3wfx0_Hp@cAFKO(QO@dx`rSAdD?P{n{|t}e)jFNKXh zm)ScL#(B&!xOZ=_IR2YE{00Q+*$9Rbv>@uSzgow8AL$F#aL>JW`ghc8oWTqGHrIZU z)p8}Q%H9{=@_ty2nzg9`z9Zo`5`MMcD^MtSw6kh@deY((l<>MuT?Jo=QQ}ZS2uDo@ z0y|ri-l6iFRPiMoeAIjLb95OvL;%6p5ybf%*cSF3WV|6*FvUkvT2Wf$(~BKaw04iv zGcn$){f)8+TP45pjyXcj06FQRxh+x@QH?=#lM92>O)l#eM5cMuC_l+5-VQ&5S2pm$ zu-#KQx+(=`HJ@X3Z`%a>eV3YNYEOYvf9X%Hp=Ev0>; z^VoG6x__)=qwOQL$H**MU@%%g1eM}B03LMBM_BTD?CTKrdNAOYIR_Epdepvquu%p% zc^@(SJdcvRyH49ZK+=MaCp?xy9(x{fIg}b+$+qd+2CR-XOg3f6C&!wZ$2Os4AHrY1 zWcL&vqzroFupIXz=`PG4Fx2)NVTme@aj1AUK-`<~)U5U}9zJX(_1^1BVLJwRwB-!IqU7AdlP9Tdfc|8w*#PzR-kFM z6e})!O9neTn^T3RYJW}D&d#BI{nYFuHH%pdDOkb^lB^Hz#Ou)~u#q*~1Oa@RzPXSq zY!`_y)Bj*5A0PGF52=p71%>wDxiYq^p1?v-%~`6jx1hmkF!(KNFm}kLsVO`L>+wXa z3`!HNOV;CtjugT9jFbS(Ge^)P1}yjCSwFR%5pTjsT0`<4g?hAYAsDu`_PG{f4`Up3 zBwgG|FOih?b7GW?&A{!0pQIu3>o$0)<}QfRk{R$AhhYeZ-{wU8q4m18B~oAQ8%dtY z>1s`W^JnPfaPXd{HQRw%D9K?aiaiiC&OHAvJ#X0(L?z7;nd_JLqh!-vCaWoL(xdHv z=kei=gqgvmXOldo>7IVx3DA!^gM;ekMfgUA)ow@up7s;Xp*9Y$mbb{kL&;z9Xd7nA zXWrNy9n%B7ORcqhUWB$VTJ0;m!`ZKM={e6lY|^;k4Ul@jp|64;BEGUi!ZiVC25=kT z+DEsr($(F%A-PSpw`pZ{=^JQ9Fc<#9)sgb|1DB{ z8)X(^d5Chfc9Wpvh4>D;!FMf637w&f1DUs z0?|}#%-#{GUOW~E2BL}EZU#5@05);Q`2y(i^1f0GF?!Ktr00#=Jl`F%RJ{ z<^=(W5_Xb)?+0_x7vL;bpzs}QU_9X^lIwr~_IHRYzD#%>ixayg_8Lm#T}U_HQv?S4 zGVxcmKwIGxO@4|b^E_{6d6aaR9wQy*Dq@doL4WNg!vC-uc+q+IZ-8BVnuc6{b+a;Z z4G?G&V?Hs_v-YU{07yl9(s2mh#+l7@u+K5dljap~i$E(^KU$ge*e`g9l1D1T@u%@0*+IB@A{*&td%zZfZlT+A$GyppZlB}t_a4rxEQ)>q{qvB*B4C%zG zS1kFA+MRd`;M9TKeqxP;=FIYyjHHAw9oDp3v6Tt!P3;gmt=avZ+=50;kQh?o&*(@e z72m0;h=KlpC)$Jv_y>i=y$kxhkHZao*3lEVr?J{pXVpsKum-0d;Z&p4%-w0t=I@+J zGgG_;LVZHBG~9aZ&yf?3p#(th5*l@jg>tms<}WY+L60C8v8ij=d(JvObQiG9GHDwS z<|mkKzc8PA79t-(XK^UaI&hab_0PMNsuAWLRrVtt)cEX!2Z2Kx(`Ap9kI2bP_hsje zFs;-oKf{SN>$~!hi=o~=Z=i?!P7X?7_-Qno-kXHsu3J=zk)`A#BK=AgRz42sfFP#% zJDr*GD`BagAe^IA?Rp(8k#B$POZc{pU&PJCZV?(`qxEm6mBL@N5fAxoqtG}CMWag# zfA7QTl< zM1@!M)YR`gkskZ8D^wofW9%PkS91r)!Y6ew9()IwtolPy<{(*#?V9QZo8~^>my??Q7pfT zRSL|e`k5bwj?xyM@CN`BZtL&Dxb<|fXHI{#^f?%Eig6vjxQ!8~`8KdDsb1JkydpRR zH@w?6(40g!v_aPX6hhv6X3_vZTCn3qr7HWIsR??#wB zaNas05ZVs^3f#5dVwiH|C^uDGk$BDfFYtNWAkVzFV?H20qlH18C#Y`!NO1RRlq~Zy zD4_BJ-))0n(Su|>YNU=6I}$okk#FQ9Rcu;QC54KtWdj|k-h=>gz6Ze=CluV$xBLx$76z|1qeFuaw_oW%{Te#?P z)=kR^#9iq^Af{y;8j8NymGTo5V&J50O++>DUbO;dy3JnzS-Z*o6%In#MB?6I_mTN{ zJ*{8+J)o6zr?o-a3LO}}7WX2J=!wrE;b=WRP4)CTLfib`p#fb>$kt+FZvXUW7>FUj zRnjFVv38GaF+V+vb}fgQ9|OdDg!n6*fPr{m_(&+n^FlmD#5bdft;@a~_YjM7@eRmE zykBna4hDM0*g;bFZ#y1A2j(>k+hcBv=%`&#W4|3@*0K0>Igs?laKF-28A^Wb0ug)#&C|+~KoH#6}|KDMI8JM8dO#$X!Atv7MvSUQhU~B;p9W;x-RP2=Cg?qzJ^; zqp>9DK~l}@NzQG42Vjr+E&QcyMcF-spmp_);4-(AEXN5{ndbqd=eCW;d$V!V5uSl> z=^Q283=H|cLckM#0Dq;EKDY!YC7>;)Ue|5@5VzDvu0|YhQr94A0J=Z=mL8UqF?3u> z8bSwx(Gwm|>>j%tz#D{qSt@yeuLQHBX3LKOP81Q&WG1n1DGl;uS8wWaip+eKAcvlZ zIAkV?ySRUgJNrQZ?;W!QUtg(a2cZUhL$U7+qZ!4$81HXcC1SKcPsF5b;>Vf-DsrHYU z{N#|GBzLm}XvZi%8_i3@IjCF{C#`=FXzvwK zTE)ZL&DRsVcus2W1Dew#Th{viau#;|QUfd(V=x3iLlR=w(jZcH7Ro#;BdJHKd6z~f zRrb7&z`wT)GuWSi;3cLibBp7RJ=Halk}fEuH7RK7yaSO|v5>vQS2loN8%wY^g>Q;` zibIX?Em5#zk{jP_SrarOC-|<#vH;v22@AnK)H3vSu`Qmjgun7au$D66@X4* zUd6v`o|rY+wAc9uI?S#FkzmZ-!(;XU$*uo5BpnN1!SwxO#0R?(8{)eW!?=pQJ)G{K z$l5#MmRQNR!WM{VI$?>*6P`j^8cHOS6 zMTiB{n+xXQ=TPmel^sx0@jVIL;Q0SVi|}mPdf$f-!)HPk=Ay5N1O?}AWYNO%E)zQ3 z7z;21tJ0#c;GCmlNmZ?JP!z3#(WjA-_4c(Od;4ah1aBnO;qxHcXlgt$lR&DO1g|Wq zo*P}W4D9r%Zpk79{3TFMouPrKMKm3Yz$RcD-kEnc`{DPQNi%0>hdm-YvD$sy8}~8n z=mvf0gT|hvl(a*fFuVruTAT5T_}ZvspzBkyiBnMntk;FdQ51k!dlHU2nn{^nV_h5C z4EH9yZix3`4w&#>=_K+1;-T*(pqZuxjOR&3cc}1~zd$SDiTgXG-P<7XzUeHCv#t%_ z1H9>+14qaui7F)pXOZBg3t{4 zF2QG|9QGMMQf|?^fG8WmG-wPHgGRXs=&`q@h_Vq8>J3_(29XUxWQk~P;8Rp-+RXkd zY4g~>1@OjBCF?@lK!GG4mBhV7>?usgb9!&yWDMG$_Xhllo!fu-V>^pU>pO_@FWEU- znnG{+dY#hFJVJ>?^pQjx5j}!Pc5XxQhn*8dF?k!-R2(z;FRE3X9+%|4h!;Z9` za|<;_q5-^->JkQy0LTYauVb__ZF4rm`KTDeK@A3QX_1lieg!Rpp^n9S@7#x6$i&GR z^d=NyNb2+h4Y?o~>0fiv*5Ra5>&62ZC)%8E*2URjFYr!x5EP=uLU9Ocwk^lu&Wh|o zA4~7`4lLHt-cYHf&tB6f%)=IzI1>K7pul0>m>HClwD?!NSbEeG2+2rKaxg%M!!s`g zuUcTO?nm!eShmF`0{1b|^gFC6$CiA*urrLeCE$aBIPC~&ib%qlb`Nb2-fvxU98=>Q zM?b`GU2+iN+Pg~2Yhqxq10wyGe7|VuM_G~a75R~gcyRatj6>61`aR_>R)`!>8Mg2% z2jX_%@b-lVoH(Y$nd1Hp&hJGj5y_#n_OH1GI{&w2!}&eP26`qt1zHgp=T}E5_hx9A zFqp@m#vmNuC?z0=A95&;YV@r(x{{TB7asuu5 zfhosr&j-0;w+V!}R|O$%wjjif0YOa|Mv#uGxVzf}xc7+e(OWW+;}h?wU~1kQku4?0 zioJ;#j?NP@pnfyT@lNudsunxEXHl$a9mRWziVn^ff)Bi1$R8-4I30A4w;PpV zdN9%cjoFB?>KQK-V5dTuXB76{_oTfGQ_(=6Rf?c9ZN3#Vf$nww(yb#GlP>VPMfd^gHCR?R??nH zEQI}d4PGvakFhSna~;e9(oK~(bPbb3t^DU0S9^L1+KMBvD)eiV$Jv~WJt2#YN&{Ml%$-afHDK65Mf-`V%5O>V=pkM{@)JdepTKO<#URC>> zMXSN@NBxE}Ko2IP0Of+`yxRz4t|U>lY~cMA+2FCSACIal=U`UHCAa-q+c^mw$fLZidvq z5H<1x@9=#zj;ss)K!ETHVQcZP-tXWVx48_rHN&BDk9j40!e-Hr*X9>sozE^AN+CxQh)nXsZ$t0`XD zs5ozShAZ1vlI`jS3$tCeS%q2IkYouJzv4IIo0E~}$}5;|%Yk)8d0Doo+$>v8MqYk) zR$p6GNpmeTH!nZShV;$KD?of%wye@@o2$@Pk~h5|Bfmbr5|?Xky)$h2*#*;GxnL}` z{v? z7i4A&&e*c3*dF6-H$`RMqy&^dWZEbNIoYnvT%?h+hCK(q!eUCgZ4OeNO@1yA4gv;# zE-EZ2$tIoGPL3*x%Ib%#?Tff5zOrt=3pCX@-F$y4Z^B#;FugiOQKS^$qsN{jrnKf5fCvVKk;vb4mN;VLZ= z8J|~I9~$O95|vz7nx9p0lgpL~#gK8$)neGv!lLW~N?BA%UrIjR+Vb-XvXNaSH#I1G zL@GkD@-L4lr!yNM@(MFu`L@xiBa%lYj~+d~0d0D=t7uMX9v9^~xrMfj;%wX8!qNfF zwNcKLv@|VwMB12P!$)apsl!u7X`@p{4ogl-*V0A|9-cHTMH@3JWu)dDfe=yZ6Ghc+ zPF_J);T+Th$}~!d%!iWff-FkiG`MtTU7o30m|2o%)2^KuTYx`NdHtgDMrxVLQxHJL z78lO4mE>mU=S!s}+4F=cGnr+yKu_-pqHYz2}X48%@y&uo$5&No z#~)dWFz_qfxR&Fp!gY_feVw-bRfL|!<T!jmgE5WgHC9b!%6z{2|vYix+n8}K7#66hx_fgE;7C= z9*nI5oi5^0VSlJ({c$SX+D~5L{;RODcss+Ea9mH~3T8N#A>kUkW*OiWZzbp{NcT3_ zTm<+yuAO{;5U>*XKe|ZnkLdpun)ffnr`LB4;&Tb^rL z*fA5=L%6o!8i%}Hfa_IU@8hC3mU9;Se0y;zd*kk^4@Uq$z>h{eO_`qV$ERcoQXCX- z7_OtRp$L3r3&l&XSv`dNa@;GK=b(QRaBo-Ex z-qi1&=pXWZ1oB+T_(O_=;-#nLFW`y?AK60jt_6NF?wz<-GP9ts9Jor@u5bh|<9=9$ z#7zRUVHe&YTvKsHtVEvSg(HIc>)ZQ%K6UA7|9`r_6Y03=Z$96IC;!*38~+#N8;gJB z6F%PqxF*21Eqr-#ufqOtt{;!W_ch>E^gn|nuSTX=6#no0Zh_E%UU9wq#3%Ia*WZpi zq0tl&7-VkJG`Lyw79pV)Ygo&xTD1+>B4{0`SSTtDM_*z5DXUi-i2y7|AMXClY{6~mS_KHnK!9lw({&1Fb7ZsG7xfXn>w z%6=99!{D8YD>*GSec*_skq)fth;}3X;>%7%%I7-n2VQSNh=%cK?N=`tu4wc z%g(1+u2zztQQ*?%WamxKbzu$(y1>}73bRXW1%+6F%D{?Bb4ikHzoYrZQx`*4Hs*?j zbCa=BK+{nTi!83RLOFfaGV}AY3tYE}$+nhPfQ5}wuDLL{#HEdLX{p1LM{3FWc}3F- zGm5ipVi7}5d*zI|Ip*0tVq+Hy(49bkEZT_wn3rBVaadF){nJJ#jU1dZdK56JxJJlH zxkwYM%=TL)5;Jx|%qz&l+#H_BEG)>$o8Gm#Hf3DOuz@KK?Y3c494Tojqf@5bmO9)q z;x=u{@RZS0fEDWs>LxXL#PEig^i+p7X7r%=DWgV@OdUR0D=N;;&dPHoVO211TB$3$ zM2jlv8dZX{V_j-GZfvn#6R_M;pM6<*B}MrebDL{X`K6kS96I5KA^6k1Uk@h$UF3}s zWe6kz(p8M`KtQ@&2t#NDU9%BR2E;Wnu3rywVjTTR!6kLZ4MK1zE~uwqFCzDrti37R zLxy|hBb+Agg@#_a6efmYxO(;z$R4DqrxZx1Am}4z;F^gGd?RMz!urXGLR>|-?!Z-o zs}$E9Tyr4=Ly#nZo)X|_4Z4eyptl5lB#4)w2hvRf67-TFPJ-SN^pPN5f*#~m2uRRN zf;b6!OVCGxcnNxt2O%IqFA3r#=q*7X3E~M%(5?;Du3dysob*g@0Y;EhkUk0GB@Nf0MNZwY!z&JK zbzgGzh?QJ`vRuY8muMP#Ac3S4P?p5*%!ND?c>c>=s=W4OuAa;#N`H@D%+-r^^?-lRB#$rX=l3fW@Tf6S(}C>%Grha zrI2)GOhccMiMDB4VR2S=aZ#C;Ifr@{bSt?MPRpl;9jlN%wdrWl3VLdDAzwJBr#3CW zG`k04nT}RI1E$W+0C9S8#@vKh0pbWif(5i2<1*tib8?h~5YVtx@5zMxg^Q7^1A1p_-KOOgbSufF(LiYlqNJ5e+r*fRyxEfhGHsdp86_nY%n_|Rg{Ir4 zXBXlDPw`y3E3lETD1_$+SYMyq+*bFS7&F@D%5wn;va3EghnI@;vOt&^19E2JtXX)# zVVjsyJiWx$wQJYOb$b4X?TN{kOYakDg?>t%Id~{BF2^+p9oq;j!KdSyRCaLzFGAyq zQ}#?+;m+ayTDVHC0mHAdgU`m}u`FBtNTQ@G9t33OX4~>gXq=Hf3(NYH3y5b_wkvhm z*bEedlD;eqb+-n zUVSm#%ELpWj1oK6^RxSAl)4IY@ia=@iNxX0tipmqQTzNvd-nKaQJWIhv_$M>8GzfN zKA&%q=36uv-)u;(C!g6W!_nZQ-x=c7$}79lE(=YozAKS{R$VM%;(ZblPX5YOz;tb3 zzxhF$b}tb7dtm((;jsQ#GY4#D$NU&@4B%lfV}{>55gQ9u*~W6tp;43iggme zRzt8}1(*XEiFw77@JbQjt!dB?xDD_CV97A7t7A^_2w)`O2Ecg0VZ&iB;C#TTfIh(G zfCoqTe8&LqO^1HKn?_>KV>3;gij58~z?T4510EcWbx6Rz<1mj$S?W0+_5vOQOap8+ z0c$jX=O+1l>jB$O_WAY$rURY^JPH`mLes9g9ddyC0n-7$oB}@q-hg*D4gszQ{0Z=V zz>pA4i_3<80G|MK03HFH1lSI*$+!Rq1FirZ0r)K7WWcupX96AoTnKm?uzD^&3m&Rz z?_s@V8K4X68fyR(7hnzp7`qT_Xcpw-BKQT+ywvAA0yrD%gsrXE4+z)=@Hscq2^ez^ z_yFg4U^ieo);L;Yn%DCY_!n?F;3~jJ0AB*!3Rn$z3h)5nB|tA=n^ivFuYer@!&<_> zfRTW~kNSN1fF*#HfL{Qv2lN5H2l)8okOw>s7<84Uty_)tQovTv!w-Nf0gnMb4R{Ig zXTZo-ns)sQ@B`phtaOPQa|aNH5?_d6OmZ~;@v4C9woq#XA3x5JWxgX^W@DyM$mK7F$g!BUT{?zB25BL?}YQUujp&xJs z;32?I55a$JHSPApC4j%{?P;09GUBNw_-2!*_(hk8nk}GJqo*{hYWeas2~0+D)hpw1nLk zFwhclZ{R?Sttx1sC3?9z$r8J?Ns=YLqN&4Dw6M7)9*87MG#J1Lfq|CbB-C5dzaQ7s z1neLKq#xl<;QAD}0z%+NxJ$UY^+mlQ1b&3Wd1C_CNnj+-2Al(YnSQulz&!{YHui}h z$vT010=WAa7YjHExNG`hjgoLMb9q3LC1Pn{lEqdLH%pY-uiC zs-c)_k)ZEKpAk)Thb1h)DXH_4iM}P~{kz-Zf++c*P3^f0o|F!0Szo6%xeLAJr2><-S55sfej+P;PXczUqtf4Uk*z|0DK&lB)mp> zKMp+Kg6B2jfxZ4|qr6|P%X{+ka>!(+piLtg*i{iQ4*GV8GOz};nV?-yH2kPsybauJ z;2seeiQ5m{W#GCoj{JNAxYmPkz764Ywgk+p_j5YPVL^xoyq^(o`k&Or^nkw^6s(b! zVBxM0seWZa=MT`iiFDqI^7EV}nCiV4_YC&=9;I^iXL*_)SZ|OmM?i_RtnxojG2Nk_PLqsM?G)g)vQ@? zQ<~Dj8-Vdq7JU8}(lj*Cpqx^9pfOxqjFm+DA?xKuOR#L4H-UB$w3orB4YnL3(@17N z@XIl->PdLi)!|%`$+pv=Jpa}qZEE0K0S1{%@x)_1*c;=u&IrpokVmEo8%Bec z0-D~2XwZv5n*^F@CmZ-ZV1~crMf$O>i6n?OUiF7jzKyhn9<1@LbIpG$cBY`C5UE_6Ki3H3fhvnm@L(zh2p>EKC3SetAK zn+AP^KL&i6!e?2+CIU~kT>^eJ@FM?EPR4OLAsbpFBiDikAbzAL8aK}XhheF(H_u_;JAB2Yf5$9}a#R2NVH+5AXwt@Mm?t+!VMR70jT!7h{KN=$ntdE7W)YslIe- zq#M^p{a^^jGyP{_Y>qJZgZHspGzU;!K;H@admLBe{l;KRbwFT0m`y_zbbIw32$~*^ z$`s9QoP`+cB5Y8m5(Ae0zD&`WX&q#Lh3q`Cp}s6QEK>tUT5^*tMM;*jBulv|$+FBe z(6Yjm1wy3}A=$siVO$KAVVEyngCl+>pbq`1KUbRq`!_N2s2nFwg}x4Re7-x_XARor z0RMJ5U<{4uVuxC6RNhuWZbDhZ@Up8iI;Dw;y8B2Do zf^4t5u;+@~oj)EE2fiEBSh&a@KpEK0A~U2 z1LFI$b|W$1jmF$T%AL6QiQKL2{`u%s`r zj2mc~I?0kgS~spGUu8k|CCK{s9aMhi1MxKQ<4C7}TV@Lw?B{dQkF5bO9px59yzuu_ z?tiL*{{na?;{%c{!LbM*0=~sc9v}S9-dGyA+WhBUWKW1y(;k9M4Ye))_QVE0!Y!2; z=aE0+!8`I1ESP_7(gQiQlgDgdZ zWZy9hIjP1Lq>sL{@#s?+(;`gzZfAXTp9tF5pt=9bn6fC~euGjL7-F)N4MM*)2>sR| z^jm{0tI&U~Hsx80MBQ0~cmkgG`DmMlwEGTW1+{NGLAwz&I&r5#zNH5aF^n^Z-eZdH8!!2P&!s-AThKaF2Iq1tkUrBV7(?-fdY(Vz!ih}UT+mJm5 zS!%yTo#1?-vU~`%GoXof&c7_%0#g0V7j=u)@VdQFKVC23y44Q&A;1r2{g@_;y44H# zxxhEpr#mc(0kd><%L(~h$ZS}Hb+^A#PS%+M&KVRGDv#@-Ys)`pEXJ+huEkss^4bKbq@3ivpJuLRu0Mv3xk=o5CKsyN~q!ybO_FZ|p0!Iss5fhSCs zHGwIXb%BE{o3K<;9XQys7jSlxfO#m-eNk?hyjfoI4jtR?)F`E|J|@UcJW*C%y} zZx(>r5U=GB53Moxe%qLb(&GfrX7FH$DSlJ&cM@>xfJ^x+WqySzU;)~^6w&6bFa?e` z@!bS8D5;J0^KdgBVB|LP%b<{(XuRIH1DJI(mHxM@BrdRdeU%n7jOd! z13kB~9%@f>L0bdbM5>pDWfKb-L4miR*KBm|MD?52=ijRS^EE@V@d$X2gBMd>@uPO~ z3~-+UH!#~Trb4MC-EdD~?Kk>PQMGPBqp$k4NF$yaB zi5)7`5IWyzc(3mA4DgCxb3%pw8eDjwA>VYd(5`9!{-`1Te%-yIs?z=fH)`tsRo(qN zy8C^)`@_2X)4KcL_&!8MoGt^HR*GNH6$#ZGJytB3U<|=@8e`F~tpr*;(`ighKSlrd z6<;CUS5tqE9}Pd~Hx6Sn`q9z}{pc$Y^i%z-lNG473F?37hc2$ckHs|a28uwLQ&L+ltI->ZB(!}qJ% zQJ49Cp<-ZV|I?s+SmOp@N2T};VmOvz4#U|Dmoj{q;qwePFx<`XAj6XkFEDI!tBmJr zh8-DVtEP;f;aG+_3}-W3%J5-^&okV>a5uw)3{Nt=z_7_kj-O#ihS&ot<7YUQVGhID z43{!|nBnsbH!$4I@F2sJ3@dU_IDUp58TMv4 zh~Zd8h7U7*p5X?DyBQv2c#`1-hE2p`wWeLoup`6X3X4yn!-kJYzjfrO(PPHmHg5cc ziIXPZK4oggw9KsRoawoFGiK(`DkvSM)Hglk6NEZ@Kg4%r#gFlN`T<2}HbqB2BP701 zbe+7SA60age}wrI{RGpQtm)}qCC_qt`e{XH1&`|VpV8^p(|=O(ET^YmQgqh;uulK4 zI{kXOhR-ki`&Um7QgmiprPCkGbS7(hdWe!|IXyj0(OJP`%%}9VR&;5lrsyhvuGP{1 zrnAqcqd&oPn*P!+lIe`r^z>+^D|-}O-FGvPSM;6+^2+|cOqbSRZ=o*z0}SX&evpp- zq)vXQE`B|IB-2&;6F6u}guVoyGN&JlX)o*KSLx(m(b1pK z(bwwet9A5sI{LFZ`l~wn8Xf&L9bL75%0I8`=r8Hy*X!u2eN*yp=;-To@*8w?)qW}Y zjXL^zo%|*pUG)!2{!JZylTLml(^dIrBBiI{o`nzf40D*gKYUB$2H`u_b^oqw*==~r~+pC|*m@=q57y7Es?1G@50Ujw@G zPm%#$`NwHMSLxS}PgMF8T|Yh;p>H6`9qAUCL;}1Pu zKmG`2|Ev61rprG?SNVIlj-IZ|KmGhmPuI`C6kXY`pMUA;`uW#w9KZ6vetfQ{>&NGc zuKcebpX=%R@wuWa`}O1VF*^J1(fLo&Rs8z-i=r$2`uWRPo&NiE`W0R2*Ut|WUFp}) z54Ny=RX$ef^eej3|AYZu<_4ibSL^IQX+T%@e`i2f_MbJNEBh}Q(3Sl@1G=)m$u-InP5id$ z><=}dE2)+SbY*{p0bSXDy#Za>-%&^3uCp)3fUfN8X+T%@^)sL=`;ral%D$mG`VO6a zqYUWEzVQZhWnYE?UD=msKv(wNp`-8A**DjKuIyW6Kv(wNZ9rG{-Df~o_C2Db@6y@# zlmT7Y_nZM;+4r&mUD@}B0bSYmj*h-tXWuRZy0Y(I26ScLCkAw7-xmgSW#2bC`W~Hq zwFY!$-&q5?vhT71UD;<68_~47pNe1E*Gxy>tFy1A0bSX5jR9TRcfA2!*>{rxUD?-7 zN8hKjua5y;*=IMPEBjIm=*qrf26ScL7#;mxoqhWL`(HY`zJGjAN7wg1@9XIL_Wc7L zUEjWbsH5xKxBWW0zJ2*fN7vWyk9Bl?{rW^l*O%`DI=a4meX67D^Y@^Rt{)$Lrlae} zABS{wegA$~N7whCpX=!Q{_6`JUEhBk(b4to_m?`lzWw}4N7uJsM|E_4`*BQ1*VkVf z*V0;BQ{D%o8WvUG2vXfj{Y+By<8PApr%%?^ACjlJyOP(BuSwpYK1C;=p}Q{F`C2U$4WLG5&2GzMSzpb@*kBe@};B!T19@{3^zuqR)c*{cM~sM|AjTh1cnc zWxQ91Ph|XA9eyg~FEU=O5BC})?f8xH$|@)0gWE`q!Y4Aml@8yZ@ira)(g`WqS%;5j z{x}_e660@Sys~o~;|J;RqZ#k#$_ByV%s-mpc!pCM<}xf`IEUc^hLsFI;C%7${rwDA zFlljD>R z`97ZSKjr&ezF)&o8BgPH3eV(uLVks!NT}x38BBjfM_1!2MSn_1SNawGWgT5T*Awpw zA*7zOkfIM^v>(0NpRS&RtpAo787TQ=z8|-taXN34)cWe?K}ue23pAQ1spnvN zx{_bS{yVb1@%XQ0`jDLs>B|4=IY$@vpW3&s=;}Ge>AR%7o-W?o1WC!Od{go>I9esI z=!27S0%Y{y;bS`4y7%nby=!+{kJuhPV|(>TXlSSYj^u;1vz)4WD($}y&@9^c2@;pa zq;NnJ-UK_)QpT+OMrUFX{;&=o1w83_j`d7pJw2Gen)zEZp3EgZt9AH9;7N~ZqGS|j zh9OAhk?=vR*e%H#Z6`M2ErerFOFJ*!A_-JJh`);Y3z&Zz<9}hivL~PM*2$8w6Z4lb zKA!QJj4x;Wp`LB_wq_`XvmLYyat;H@ZVWY22$TdX9D&qaVm3RJm1&it8dIB!SS&N6-j zI{$ zHZh*kNBmzg{!!f1FOKnZ_$`nG#t&fpx+2M^>JgnAM|yr`{LRcyZXtZfV#zPglR|JZ zlk+AFpPH}Z$_NPZ4u{mO4m86V7eWq&B+TkH5+Gd@Dc-$vlWwM1?Q z!Z=zR^9M1%GN%{gHJ$!j6kfe}!~%mEzkh*5v}65g0^dekr>noCnEy2MtMpD_e6{!F#kUouih(E`M#F%cd-68%>M@C?_vB0 zjNb-4wV&mMGQ!o2Pr$}4@{bxfsd2=6f*gqcc{hUTC~tcZv0%X8!(fN`yEMhk~g1 z#P4GJRem*Pe3|k;>uJIGA|3x#z*BnhO?vSY=i?yMk@1;3B!003T6e~)_eLQpe({Vy z$Nb|M?_hl4PKj_begxwWd?*q98Gk$DH!{C!Z)Y*SbeCilXVM_J0C@6qE;l@?{8R{h zTWy@q4-Ybast&)J_20f%>KEtOAox$#U(NM;sw8WhnSU*H^!SOhYXEmKzgjO<`SL#F z)q1JIf696?xFGZLwDu+A!}bgHnmC^ZK{~sV@;yRl|M!e{>hKp?k9vPLOR5tOMJV6Z zd$!`d8qk`>&SRbhwsez5FNfJ@D#6l z&T<{=>Bo5WUa&ZS2DCwpSMM`(_oJmT{>WjeU?uAr!+7<6bQi`?X1scTTD1>3j92ra zp3Gm!cs0)&%=o#CSMOur!R8}8|MH~6VMPvv!W8=3_A zd05Y&qw+pR0__pTmoT0mBWO=C-g8VciZfjhd`9TU_)u3)USxc<4*#0K!yaAz+Qj@e z9sf3g$2dGqI>5$$*vER*^9xl^4=}#&c?YNKDC5<04cv+!odZwhM7?KzGvnzzc*3{( zRwDk+_@9KHwpy;v&fl0{&9~LKx~W;}QStS1C`D(Ath2jb!v&iHhl{_9!K#Z!_` zoFju^6!XXH_`5MaR)_B?@NG2p+)()~p83Oc`~w-Up8F^}gPY5870KmF;fJw)n+{J_ zH#XiF34WYNuBErycbpF|4pyyKq z{3!$cWdnQ&#)pmNZL(!O>%LTthi&-G85$E_K z_@IHF=b8WTvyxw&Gm7AP#^;@s_*N2VZ!`X_iiY?-gb%Q4>YNN_*WMTW>aHHPLH(lg zqn?ke@00scJ${1F5EX#@Oa zfwyRCT{udbr8UF6tT8{gGr)HRp2|ZPT{{^s_$}I4T{#?Rpl7%NezF06h5>#N@HS41 zKX_d5TeMR%B=&kHKEwDGk4eNC#=m5sf13gRQv>`@z_%19k;#r!)t5kSZ|AdrxVh9q z1)h!Y1J?mheooiqnuVmHL4otS69u^?a){(<}n-$H>8sz~AtDv_|LsH&*ZH`#+80 zrx@U83A{zSoyTuoIj-3T{C64Pt5{E;AEW}+zdvrkzlQlMc>Rip5!%ZJ{F{Jp8GwA` z^)%&@od)~|4De?R@TQQ){dScB{w4!_Ujuxq0iM3QMCnrJdZ={e8Su{+c#HPR1<9Gs z0!tV_;Ic%hdC>g^dY)kZzvoGQUZ&SxVElp?B%YUFwO0)EY&F3D%K(3b^|$AGn#=Zo z3w%q=%P#5Kfm#DSzprKxYJhKx1?ooYodJKbz+1HC zT<@-C`xh`iiu2dacsKCW{zU8A^9K#|zhHoW%>e(Q0sf%CTePRy&Vg*t5d;1ofe%AI z>g(w*2K>PoI5pT~m{Rpc6dcc7HdFF4$ z{v68w++@K2z5$-Tqt;k@e>A`cSsUjMH^8?yz;`yl_c6c^HNf9)fWN~4zt8|r--~O^ z4^IG3^+oODRr&Iq0ski8soZMc%5ey1i}sEI|2~1YXt8r7=l@sQ^@T`sl<_i39t2}R z(4Yvb=Yt~Y?A~22rx@Jb+1<(1OrhL z4MXX0ktE!plzH1R|*s1ET>-*}fufBgh-Lu~%hwwWG zf6P5+^zc7)(D{oS|CP5bf!7_Ke>-^K?jt<>T^)Yrkq-Ey9q>cI$=`ZA_40YTWBjxO zzU+X%*a81$2mG}T_|H1vzwChju><}$hCj4^?_}S}`ClF5-@|#J8?@D2=zw1Vob$|9 ze)43;_%}N8|Ic-dztaJKvxEORkAFyH&s*lb9)6*N&PSm3qz`Yk;_p`-onN@`4c_Nu z@%0Wm-*e-CJ+lMd*9YQ<4*sRNg}>qG{K&!m`&e*aeEhV7{;%BlzklD3d(n;mQ^)wX zJK*nx)3~4Ccy|Z<{T=X+cECT$@Q1{=U4FvaLgn*>eR2b9&MpbHoLcdiW7S!gt%)r_6C|8Yt zYiEl>o1#QHT~&%ik7F?kD|O{ERwpOQL?Wt^xXub{RTWk0IT53*Z>c7z3Je;!M9Z)} zp2$rdr7A4_Fw0L}2$QRY9dALgUVsWX&LB%+N`CfM5(*!X}8jt8hOJ_%4|U~W@eT+K_p5X%Jro)Bx+E3sUNc~T{#Bu!9Ny3RA~cov#yisHzi7)FM+ zEUTuvG*N9Tu_PID0dTQQbr@T1Sn|$^I1c%$31HqPntZvx4bK`! zxn0m6TX5gn_Rnjbp{D&>z=8mn2qsEBL9?qEicG}Aw3vq2+B|^_aL%RAxyK9=h^xYj z5h~u#by{cORxc_cCEi|@$4|+VTL*(<`P9)ZA+Md@I6OF&H%?B@j?d-!!Qtt#6!PfK z^@BmbC%}TP%ScILKrG2k=~S1Sn&{#r>cK0XDRU6V)C0g(Z+Df{F>AG|<`S+X57Yf? zr~Sj8yck>z9v5+4TxR8Q#js*(kOf|xeHZ-m&<7hx+l5La23i%$$ zf%JxWHJC(>p{T&5O&ze09QJfRSEV`Q?d0Hw@nlm&(7m1H2vs*>@))urlP(o>k3Jfl zBDO*(4Uj?1%43*zIBUS6e@0~u5Gw+9o&r9*P`23N(>cXaj4u0w{>EGOFxMzVa2WCm zo=K`YO#As*3v3CkSE^;w+(f6!b~RYOvyvW|gRZ!%Ju)T=9>X(b`n_ku6h2GL)M})| zGL}}OXb!~R2Kyw!9JT=AU9Ynd5(?+4M-zdlk`$3HR$_QdYbQ_ikwjrOZ&x?qg^!Y| zNW&FRu&7&8$o~02#>&g%d;k;3)j2zOFvi};hjcL?-^a2F%YT#cTmMzQvVQ~W8{5DP zhvQ;p#R9rLa9V-%NYL&t!j$qa+CviH?Lj|+JVLm;;YpHW6OZQ#v2BbIO(uGf&H;8} z?cXrL5wy{$wcgbRnHZuyLU03@#d2SvKp61&6Qo{JA{`B_9a;ru?Oy0Ijv=`W=~3xc zfNTTWt_v_QHb-z**C+`fTRB4#0H5OY88jnGV&n*}c%$`~2)+!-#yHh%uu3vH(crbz zHG(3^B!w0r1(?7tq3f{Ge(!_>BpEJSuw#S9Iia#Z={oBVM{5iseeUP6T5_T(hS%X^ zt+=IxuE^u-N92OQ0&knqz{VmeDL=>1QyAH~rruiOGq86L|BVsY4po-A=^6nvy6Muf zmz=kpS>2$7qcE#A?Ms(whbk>y_R18RQ!kOHATKon3N=n9lC>SiUpRZFWgx+#Oxh-( z&cR{1KJ2kC8$88n4yDWM=_&G=&``c@1hUlmF6}+Lf&+4CEN`PH*dz({;9WsTpu3U= z4Y1t~6N@mpkE>vpbFC+aW!6W|kl33Ncomh;8x(nyZQNaw*RG}KBWZe16;GgYjWHj+qwu zL#TlA;UXI~k_kAl%zFYd(c>kQ$y86nED#IH*^qja`GG<5iklnKYuuRdt`j%p;AkZ- zRpfh?1h!^V29l}m(axPhn^HBuqoWi@Ya!ad{}h z$F`1pE5nk>s?w$lK#J6Mhf-1O@d<`wn^Y39#U&pSwnwreQWMilBj7!Ix7|uqA zWU8gISv0xXdSfo+#Sq^)*A#K0aFYfj0EDvfsMvU0d{1KY0I5q!q#~EuleRZamK=3M zPA3sLEEh%WZk(`xbUJzysz$jjEyAX8p19pp>#esmVq3J%viLg@`Vxp-GO=oJ%B@LV zQ#w-!77;Kbx`=^bpsmJNg6+jZ&57h;IRLw2`7Sw zPeb^{AYSE|!nR<9uOLgVC_mmlk+_DN*N_lguSksuI79^o#wY?#xr0)(Dg_Go_svu z2t9)L&FS#1|9y;w+OfV*?FIbNGgyyLzayZ-xBGmy`S8yhJmd;G+xSa|@7s_0fv)xM zS$J^2h5sFg@7oy@De&CQ;+ZKO8M5;mGbkq*Z(btf9MFlzHd9e^>wWXpJdj?|1My( zL{DG%@7G;R`n`R$_n&^Aw~fE!@O-NYk#D{3C} zJY*Z+zhCKFJU(w6ZT^4a@V)#kH9{e(c--(|Zq^?=>z?iW91V^1`2M|c-+sO|Ve3@9 z*~0%VJy62o+no>a>H5R(p9lON9WoJTHp16k+x@hq(;n~7eM>)^z$4Q&zOT!6^?$_w zGjM4pKfnLo;l9J)_ZKjRjvfBoeEbt#(mg-SzbF62CoTW`POxM@ba=kK9=rp?w&%a= z>bl+iti}JhMO%M*eBVCU!uNII-g5XqZf%&y^X+?E`2KylSB~ub;uGtsxwF$e<$vc+ zwEX)0bLCg)hq^ePop7`M*je{%=Ywwk-4@*Ax9!()#WEulI`_J}P2#Sb|E7CkmCWEZ s{P}fz|4ZiWdEdr=_#1Ynm++iy`|$I77#=g;7ysqg?8pl(gx0C}4*|%KJOBUy literal 0 HcmV?d00001 diff --git a/x.o b/x.o index 593fee16b6dc7eab1bba6785fc9f0a9e0ac19a83..b9da6ab61a13d051301a10d3767fcf5986745996 100644 GIT binary patch literal 85080 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 EKS$O8rT_o{ literal 82248 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 From ec85db6a2dc5f2fdf6e0b2c7fd2be40b3e520281 Mon Sep 17 00:00:00 2001 From: mrsu Date: Thu, 29 Jun 2023 15:48:57 +0100 Subject: [PATCH 7/8] change alpha patch --- config.def.h | 6 ++ config.h | 6 ++ patches/st-changealpha-20230519-b44f2ad.diff | 80 +++++++++++++++++++ st | Bin 110208 -> 110376 bytes st.h | 1 + x.c | 22 +++++ x.o | Bin 85080 -> 86000 bytes 7 files changed, 115 insertions(+) create mode 100644 patches/st-changealpha-20230519-b44f2ad.diff diff --git a/config.def.h b/config.def.h index 433cd63..558625e 100644 --- a/config.def.h +++ b/config.def.h @@ -99,6 +99,9 @@ unsigned int tabspaces = 8; /* bg opacity */ float alpha = 0.8; +/* Background opacity */ +float alpha_def; + /* Terminal colors (16 first used in escape sequence) */ static const char *colorname[] = { /* 8 normal colors */ @@ -249,6 +252,9 @@ static Shortcut shortcuts[] = { { ControlMask, XK_Page_Down, kscrolldown, {.i = 10} }, { ControlMask, XK_k, kscrollup, {.i = 1} }, { ControlMask, XK_j, kscrolldown, {.i = 1} }, + { TERMMOD, XK_N, chgalpha, {.f = -1} }, /* Decrease opacity */ + { TERMMOD, XK_M, chgalpha, {.f = +1} }, /* Increase opacity */ + { TERMMOD, XK_B, chgalpha, {.f = 0} }, /* Reset opacity */ }; /* diff --git a/config.h b/config.h index 433cd63..558625e 100644 --- a/config.h +++ b/config.h @@ -99,6 +99,9 @@ unsigned int tabspaces = 8; /* bg opacity */ float alpha = 0.8; +/* Background opacity */ +float alpha_def; + /* Terminal colors (16 first used in escape sequence) */ static const char *colorname[] = { /* 8 normal colors */ @@ -249,6 +252,9 @@ static Shortcut shortcuts[] = { { ControlMask, XK_Page_Down, kscrolldown, {.i = 10} }, { ControlMask, XK_k, kscrollup, {.i = 1} }, { ControlMask, XK_j, kscrolldown, {.i = 1} }, + { TERMMOD, XK_N, chgalpha, {.f = -1} }, /* Decrease opacity */ + { TERMMOD, XK_M, chgalpha, {.f = +1} }, /* Increase opacity */ + { TERMMOD, XK_B, chgalpha, {.f = 0} }, /* Reset opacity */ }; /* diff --git a/patches/st-changealpha-20230519-b44f2ad.diff b/patches/st-changealpha-20230519-b44f2ad.diff new file mode 100644 index 0000000..172969f --- /dev/null +++ b/patches/st-changealpha-20230519-b44f2ad.diff @@ -0,0 +1,80 @@ +diff --git a/config.def.h b/config.def.h +index 91ab8ca..8a06176 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -93,6 +93,9 @@ char *termname = "st-256color"; + */ + unsigned int tabspaces = 8; + ++/* Background opacity */ ++float alpha_def; ++ + /* Terminal colors (16 first used in escape sequence) */ + static const char *colorname[] = { + /* 8 normal colors */ +@@ -201,6 +204,9 @@ static Shortcut shortcuts[] = { + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, ++ { MODKEY, XK_bracketleft, chgalpha, {.f = -1} }, /* Decrease opacity */ ++ { MODKEY|ShiftMask, XK_braceright, chgalpha, {.f = +1} }, /* Increase opacity */ ++ { MODKEY, XK_bracketright,chgalpha, {.f = 0} }, /* Reset opacity */ + }; + + /* +diff --git a/st.h b/st.h +index fd3b0d8..3bb587e 100644 +--- a/st.h ++++ b/st.h +@@ -124,3 +124,4 @@ extern unsigned int tabspaces; + extern unsigned int defaultfg; + extern unsigned int defaultbg; + extern unsigned int defaultcs; ++extern float alpha_def; +diff --git a/x.c b/x.c +index aa09997..f8c8c1a 100644 +--- a/x.c ++++ b/x.c +@@ -59,6 +59,7 @@ static void zoom(const Arg *); + static void zoomabs(const Arg *); + static void zoomreset(const Arg *); + static void ttysend(const Arg *); ++static void chgalpha(const Arg *); + + /* config.h for applying patches and the configuration. */ + #include "config.h" +@@ -1147,6 +1148,9 @@ xinit(int cols, int rows) + usedfont = (opt_font == NULL)? font : opt_font; + xloadfonts(usedfont, 0); + ++ /* Backup default alpha value */ ++ alpha_def = alpha; ++ + /* colors */ + xw.cmap = XDefaultColormap(xw.dpy, xw.scr); + xloadcols(); +@@ -1371,6 +1375,24 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x + return numspecs; + } + ++void ++chgalpha(const Arg *arg) ++{ ++ if (arg->f == -1.0f && alpha >= 0.1f) ++ alpha -= 0.1f; ++ else if (arg->f == 1.0f && alpha < 1.0f) ++ alpha += 0.1f; ++ else if (arg->f == 0.0f) ++ alpha = alpha_def; ++ else ++ return; ++ ++ dc.col[defaultbg].color.alpha = (unsigned short)(0xFFFF * alpha); ++ /* Required to remove artifacting from borderpx */ ++ cresize(0, 0); ++ redraw(); ++} ++ + void + xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y) + { diff --git a/st b/st index 871b403d20b3d8fe354bac568baab81d9523223a..c3f34c43bba134b636866afa4bff10f18452afe4 100755 GIT binary patch delta 26063 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 diff --git a/st.h b/st.h index 5434356..4bf20d5 100644 --- a/st.h +++ b/st.h @@ -134,3 +134,4 @@ extern unsigned int defaultfg; extern unsigned int defaultbg; extern unsigned int defaultcs; extern float alpha; +extern float alpha_def; diff --git a/x.c b/x.c index a9b9c27..2a4680f 100644 --- a/x.c +++ b/x.c @@ -73,6 +73,7 @@ static void zoom(const Arg *); static void zoomabs(const Arg *); static void zoomreset(const Arg *); static void ttysend(const Arg *); +static void chgalpha(const Arg *); /* config.h for applying patches and the configuration. */ #include "config.h" @@ -1281,6 +1282,9 @@ xinit(int cols, int rows) /* spare fonts */ xloadsparefonts(); + /* Backup default alpha value */ + alpha_def = alpha; + /* colors */ xw.cmap = XCreateColormap(xw.dpy, parent, xw.vis, None); xloadcols(); @@ -1501,6 +1505,24 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x return numspecs; } +void +chgalpha(const Arg *arg) +{ + if (arg->f == -1.0f && alpha >= 0.1f) + alpha -= 0.1f; + else if (arg->f == 1.0f && alpha < 1.0f) + alpha += 0.1f; + else if (arg->f == 0.0f) + alpha = alpha_def; + else + return; + + dc.col[defaultbg].color.alpha = (unsigned short)(0xFFFF * alpha); + /* Required to remove artifacting from borderpx */ + cresize(0, 0); + redraw(); +} + void xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y, int dmode) { diff --git a/x.o b/x.o index b9da6ab61a13d051301a10d3767fcf5986745996..194d88014d9d7aaa0b83225dce3d341d0e6c4759 100644 GIT binary patch delta 17880 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 ZuDZ~@=H3L&n&J3p38g0E@4Ru}{{e=**th@y delta 16905 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 From 512b4afad7b2e072b9efedaa54dade35a9cc6c97 Mon Sep 17 00:00:00 2001 From: mrsu Date: Thu, 31 Aug 2023 11:25:21 +0100 Subject: [PATCH 8/8] update --- Makefile | 3 +- boxdraw.c | 194 ++++++++++ boxdraw.o | Bin 0 -> 7624 bytes boxdraw_data.h | 214 ++++++++++++ config.def.h | 12 + config.h | 12 + patches/st-boxdraw_v2-0.8.5.diff | 583 +++++++++++++++++++++++++++++++ st | Bin 110376 -> 118984 bytes st.c | 3 + st.h | 10 + st.o | Bin 91200 -> 91320 bytes x.c | 21 +- x.o | Bin 86000 -> 86576 bytes 13 files changed, 1046 insertions(+), 6 deletions(-) create mode 100644 boxdraw.c create mode 100644 boxdraw.o create mode 100644 boxdraw_data.h create mode 100644 patches/st-boxdraw_v2-0.8.5.diff diff --git a/Makefile b/Makefile index 470ac86..6dfa212 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ include config.mk -SRC = st.c x.c +SRC = st.c x.c boxdraw.c OBJ = $(SRC:.c=.o) all: options st @@ -23,6 +23,7 @@ config.h: st.o: config.h st.h win.h x.o: arg.h config.h st.h win.h +boxdraw.o: config.h st.h boxdraw_data.h $(OBJ): config.h config.mk diff --git a/boxdraw.c b/boxdraw.c new file mode 100644 index 0000000..28a92d0 --- /dev/null +++ b/boxdraw.c @@ -0,0 +1,194 @@ +/* + * Copyright 2018 Avi Halachmi (:avih) avihpit@yahoo.com https://github.com/avih + * MIT/X Consortium License + */ + +#include +#include "st.h" +#include "boxdraw_data.h" + +/* Rounded non-negative integers division of n / d */ +#define DIV(n, d) (((n) + (d) / 2) / (d)) + +static Display *xdpy; +static Colormap xcmap; +static XftDraw *xd; +static Visual *xvis; + +static void drawbox(int, int, int, int, XftColor *, XftColor *, ushort); +static void drawboxlines(int, int, int, int, XftColor *, ushort); + +/* public API */ + +void +boxdraw_xinit(Display *dpy, Colormap cmap, XftDraw *draw, Visual *vis) +{ + xdpy = dpy; xcmap = cmap; xd = draw, xvis = vis; +} + +int +isboxdraw(Rune u) +{ + Rune block = u & ~0xff; + return (boxdraw && block == 0x2500 && boxdata[(uint8_t)u]) || + (boxdraw_braille && block == 0x2800); +} + +/* the "index" is actually the entire shape data encoded as ushort */ +ushort +boxdrawindex(const Glyph *g) +{ + if (boxdraw_braille && (g->u & ~0xff) == 0x2800) + return BRL | (uint8_t)g->u; + if (boxdraw_bold && (g->mode & ATTR_BOLD)) + return BDB | boxdata[(uint8_t)g->u]; + return boxdata[(uint8_t)g->u]; +} + +void +drawboxes(int x, int y, int cw, int ch, XftColor *fg, XftColor *bg, + const XftGlyphFontSpec *specs, int len) +{ + for ( ; len-- > 0; x += cw, specs++) + drawbox(x, y, cw, ch, fg, bg, (ushort)specs->glyph); +} + +/* implementation */ + +void +drawbox(int x, int y, int w, int h, XftColor *fg, XftColor *bg, ushort bd) +{ + ushort cat = bd & ~(BDB | 0xff); /* mask out bold and data */ + if (bd & (BDL | BDA)) { + /* lines (light/double/heavy/arcs) */ + drawboxlines(x, y, w, h, fg, bd); + + } else if (cat == BBD) { + /* lower (8-X)/8 block */ + int d = DIV((uint8_t)bd * h, 8); + XftDrawRect(xd, fg, x, y + d, w, h - d); + + } else if (cat == BBU) { + /* upper X/8 block */ + XftDrawRect(xd, fg, x, y, w, DIV((uint8_t)bd * h, 8)); + + } else if (cat == BBL) { + /* left X/8 block */ + XftDrawRect(xd, fg, x, y, DIV((uint8_t)bd * w, 8), h); + + } else if (cat == BBR) { + /* right (8-X)/8 block */ + int d = DIV((uint8_t)bd * w, 8); + XftDrawRect(xd, fg, x + d, y, w - d, h); + + } else if (cat == BBQ) { + /* Quadrants */ + int w2 = DIV(w, 2), h2 = DIV(h, 2); + if (bd & TL) + XftDrawRect(xd, fg, x, y, w2, h2); + if (bd & TR) + XftDrawRect(xd, fg, x + w2, y, w - w2, h2); + if (bd & BL) + XftDrawRect(xd, fg, x, y + h2, w2, h - h2); + if (bd & BR) + XftDrawRect(xd, fg, x + w2, y + h2, w - w2, h - h2); + + } else if (bd & BBS) { + /* Shades - data is 1/2/3 for 25%/50%/75% alpha, respectively */ + int d = (uint8_t)bd; + XftColor xfc; + XRenderColor xrc = { .alpha = 0xffff }; + + xrc.red = DIV(fg->color.red * d + bg->color.red * (4 - d), 4); + xrc.green = DIV(fg->color.green * d + bg->color.green * (4 - d), 4); + xrc.blue = DIV(fg->color.blue * d + bg->color.blue * (4 - d), 4); + + XftColorAllocValue(xdpy, xvis, xcmap, &xrc, &xfc); + XftDrawRect(xd, &xfc, x, y, w, h); + XftColorFree(xdpy, xvis, xcmap, &xfc); + + } else if (cat == BRL) { + /* braille, each data bit corresponds to one dot at 2x4 grid */ + int w1 = DIV(w, 2); + int h1 = DIV(h, 4), h2 = DIV(h, 2), h3 = DIV(3 * h, 4); + + if (bd & 1) XftDrawRect(xd, fg, x, y, w1, h1); + if (bd & 2) XftDrawRect(xd, fg, x, y + h1, w1, h2 - h1); + if (bd & 4) XftDrawRect(xd, fg, x, y + h2, w1, h3 - h2); + if (bd & 8) XftDrawRect(xd, fg, x + w1, y, w - w1, h1); + if (bd & 16) XftDrawRect(xd, fg, x + w1, y + h1, w - w1, h2 - h1); + if (bd & 32) XftDrawRect(xd, fg, x + w1, y + h2, w - w1, h3 - h2); + if (bd & 64) XftDrawRect(xd, fg, x, y + h3, w1, h - h3); + if (bd & 128) XftDrawRect(xd, fg, x + w1, y + h3, w - w1, h - h3); + + } +} + +void +drawboxlines(int x, int y, int w, int h, XftColor *fg, ushort bd) +{ + /* s: stem thickness. width/8 roughly matches underscore thickness. */ + /* We draw bold as 1.5 * normal-stem and at least 1px thicker. */ + /* doubles draw at least 3px, even when w or h < 3. bold needs 6px. */ + int mwh = MIN(w, h); + int base_s = MAX(1, DIV(mwh, 8)); + int bold = (bd & BDB) && mwh >= 6; /* possibly ignore boldness */ + int s = bold ? MAX(base_s + 1, DIV(3 * base_s, 2)) : base_s; + int w2 = DIV(w - s, 2), h2 = DIV(h - s, 2); + /* the s-by-s square (x + w2, y + h2, s, s) is the center texel. */ + /* The base length (per direction till edge) includes this square. */ + + int light = bd & (LL | LU | LR | LD); + int double_ = bd & (DL | DU | DR | DD); + + if (light) { + /* d: additional (negative) length to not-draw the center */ + /* texel - at arcs and avoid drawing inside (some) doubles */ + int arc = bd & BDA; + int multi_light = light & (light - 1); + int multi_double = double_ & (double_ - 1); + /* light crosses double only at DH+LV, DV+LH (ref. shapes) */ + int d = arc || (multi_double && !multi_light) ? -s : 0; + + if (bd & LL) + XftDrawRect(xd, fg, x, y + h2, w2 + s + d, s); + if (bd & LU) + XftDrawRect(xd, fg, x + w2, y, s, h2 + s + d); + if (bd & LR) + XftDrawRect(xd, fg, x + w2 - d, y + h2, w - w2 + d, s); + if (bd & LD) + XftDrawRect(xd, fg, x + w2, y + h2 - d, s, h - h2 + d); + } + + /* double lines - also align with light to form heavy when combined */ + if (double_) { + /* + * going clockwise, for each double-ray: p is additional length + * to the single-ray nearer to the previous direction, and n to + * the next. p and n adjust from the base length to lengths + * which consider other doubles - shorter to avoid intersections + * (p, n), or longer to draw the far-corner texel (n). + */ + int dl = bd & DL, du = bd & DU, dr = bd & DR, dd = bd & DD; + if (dl) { + int p = dd ? -s : 0, n = du ? -s : dd ? s : 0; + XftDrawRect(xd, fg, x, y + h2 + s, w2 + s + p, s); + XftDrawRect(xd, fg, x, y + h2 - s, w2 + s + n, s); + } + if (du) { + int p = dl ? -s : 0, n = dr ? -s : dl ? s : 0; + XftDrawRect(xd, fg, x + w2 - s, y, s, h2 + s + p); + XftDrawRect(xd, fg, x + w2 + s, y, s, h2 + s + n); + } + if (dr) { + int p = du ? -s : 0, n = dd ? -s : du ? s : 0; + XftDrawRect(xd, fg, x + w2 - p, y + h2 - s, w - w2 + p, s); + XftDrawRect(xd, fg, x + w2 - n, y + h2 + s, w - w2 + n, s); + } + if (dd) { + int p = dr ? -s : 0, n = dl ? -s : dr ? s : 0; + XftDrawRect(xd, fg, x + w2 + s, y + h2 - p, s, h - h2 + p); + XftDrawRect(xd, fg, x + w2 - s, y + h2 - n, s, h - h2 + n); + } + } +} diff --git a/boxdraw.o b/boxdraw.o new file mode 100644 index 0000000000000000000000000000000000000000..8be01a89533731549ab71c7cf66c506e504eaf42 GIT binary patch literal 7624 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 KY`P>m_5TfoV0Wbe literal 0 HcmV?d00001 diff --git a/boxdraw_data.h b/boxdraw_data.h new file mode 100644 index 0000000..7890500 --- /dev/null +++ b/boxdraw_data.h @@ -0,0 +1,214 @@ +/* + * Copyright 2018 Avi Halachmi (:avih) avihpit@yahoo.com https://github.com/avih + * MIT/X Consortium License + */ + +/* + * U+25XX codepoints data + * + * References: + * http://www.unicode.org/charts/PDF/U2500.pdf + * http://www.unicode.org/charts/PDF/U2580.pdf + * + * Test page: + * https://github.com/GNOME/vte/blob/master/doc/boxes.txt + */ + +/* Each shape is encoded as 16-bits. Higher bits are category, lower are data */ +/* Categories (mutually exclusive except BDB): */ +/* For convenience, BDL/BDA/BBS/BDB are 1 bit each, the rest are enums */ +#define BDL (1<<8) /* Box Draw Lines (light/double/heavy) */ +#define BDA (1<<9) /* Box Draw Arc (light) */ + +#define BBD (1<<10) /* Box Block Down (lower) X/8 */ +#define BBL (2<<10) /* Box Block Left X/8 */ +#define BBU (3<<10) /* Box Block Upper X/8 */ +#define BBR (4<<10) /* Box Block Right X/8 */ +#define BBQ (5<<10) /* Box Block Quadrants */ +#define BRL (6<<10) /* Box Braille (data is lower byte of U28XX) */ + +#define BBS (1<<14) /* Box Block Shades */ +#define BDB (1<<15) /* Box Draw is Bold */ + +/* (BDL/BDA) Light/Double/Heavy x Left/Up/Right/Down/Horizontal/Vertical */ +/* Heavy is light+double (literally drawing light+double align to form heavy) */ +#define LL (1<<0) +#define LU (1<<1) +#define LR (1<<2) +#define LD (1<<3) +#define LH (LL+LR) +#define LV (LU+LD) + +#define DL (1<<4) +#define DU (1<<5) +#define DR (1<<6) +#define DD (1<<7) +#define DH (DL+DR) +#define DV (DU+DD) + +#define HL (LL+DL) +#define HU (LU+DU) +#define HR (LR+DR) +#define HD (LD+DD) +#define HH (HL+HR) +#define HV (HU+HD) + +/* (BBQ) Quadrants Top/Bottom x Left/Right */ +#define TL (1<<0) +#define TR (1<<1) +#define BL (1<<2) +#define BR (1<<3) + +/* Data for U+2500 - U+259F except dashes/diagonals */ +static const unsigned short boxdata[256] = { + /* light lines */ + [0x00] = BDL + LH, /* light horizontal */ + [0x02] = BDL + LV, /* light vertical */ + [0x0c] = BDL + LD + LR, /* light down and right */ + [0x10] = BDL + LD + LL, /* light down and left */ + [0x14] = BDL + LU + LR, /* light up and right */ + [0x18] = BDL + LU + LL, /* light up and left */ + [0x1c] = BDL + LV + LR, /* light vertical and right */ + [0x24] = BDL + LV + LL, /* light vertical and left */ + [0x2c] = BDL + LH + LD, /* light horizontal and down */ + [0x34] = BDL + LH + LU, /* light horizontal and up */ + [0x3c] = BDL + LV + LH, /* light vertical and horizontal */ + [0x74] = BDL + LL, /* light left */ + [0x75] = BDL + LU, /* light up */ + [0x76] = BDL + LR, /* light right */ + [0x77] = BDL + LD, /* light down */ + + /* heavy [+light] lines */ + [0x01] = BDL + HH, + [0x03] = BDL + HV, + [0x0d] = BDL + HR + LD, + [0x0e] = BDL + HD + LR, + [0x0f] = BDL + HD + HR, + [0x11] = BDL + HL + LD, + [0x12] = BDL + HD + LL, + [0x13] = BDL + HD + HL, + [0x15] = BDL + HR + LU, + [0x16] = BDL + HU + LR, + [0x17] = BDL + HU + HR, + [0x19] = BDL + HL + LU, + [0x1a] = BDL + HU + LL, + [0x1b] = BDL + HU + HL, + [0x1d] = BDL + HR + LV, + [0x1e] = BDL + HU + LD + LR, + [0x1f] = BDL + HD + LR + LU, + [0x20] = BDL + HV + LR, + [0x21] = BDL + HU + HR + LD, + [0x22] = BDL + HD + HR + LU, + [0x23] = BDL + HV + HR, + [0x25] = BDL + HL + LV, + [0x26] = BDL + HU + LD + LL, + [0x27] = BDL + HD + LU + LL, + [0x28] = BDL + HV + LL, + [0x29] = BDL + HU + HL + LD, + [0x2a] = BDL + HD + HL + LU, + [0x2b] = BDL + HV + HL, + [0x2d] = BDL + HL + LD + LR, + [0x2e] = BDL + HR + LL + LD, + [0x2f] = BDL + HH + LD, + [0x30] = BDL + HD + LH, + [0x31] = BDL + HD + HL + LR, + [0x32] = BDL + HR + HD + LL, + [0x33] = BDL + HH + HD, + [0x35] = BDL + HL + LU + LR, + [0x36] = BDL + HR + LU + LL, + [0x37] = BDL + HH + LU, + [0x38] = BDL + HU + LH, + [0x39] = BDL + HU + HL + LR, + [0x3a] = BDL + HU + HR + LL, + [0x3b] = BDL + HH + HU, + [0x3d] = BDL + HL + LV + LR, + [0x3e] = BDL + HR + LV + LL, + [0x3f] = BDL + HH + LV, + [0x40] = BDL + HU + LH + LD, + [0x41] = BDL + HD + LH + LU, + [0x42] = BDL + HV + LH, + [0x43] = BDL + HU + HL + LD + LR, + [0x44] = BDL + HU + HR + LD + LL, + [0x45] = BDL + HD + HL + LU + LR, + [0x46] = BDL + HD + HR + LU + LL, + [0x47] = BDL + HH + HU + LD, + [0x48] = BDL + HH + HD + LU, + [0x49] = BDL + HV + HL + LR, + [0x4a] = BDL + HV + HR + LL, + [0x4b] = BDL + HV + HH, + [0x78] = BDL + HL, + [0x79] = BDL + HU, + [0x7a] = BDL + HR, + [0x7b] = BDL + HD, + [0x7c] = BDL + HR + LL, + [0x7d] = BDL + HD + LU, + [0x7e] = BDL + HL + LR, + [0x7f] = BDL + HU + LD, + + /* double [+light] lines */ + [0x50] = BDL + DH, + [0x51] = BDL + DV, + [0x52] = BDL + DR + LD, + [0x53] = BDL + DD + LR, + [0x54] = BDL + DR + DD, + [0x55] = BDL + DL + LD, + [0x56] = BDL + DD + LL, + [0x57] = BDL + DL + DD, + [0x58] = BDL + DR + LU, + [0x59] = BDL + DU + LR, + [0x5a] = BDL + DU + DR, + [0x5b] = BDL + DL + LU, + [0x5c] = BDL + DU + LL, + [0x5d] = BDL + DL + DU, + [0x5e] = BDL + DR + LV, + [0x5f] = BDL + DV + LR, + [0x60] = BDL + DV + DR, + [0x61] = BDL + DL + LV, + [0x62] = BDL + DV + LL, + [0x63] = BDL + DV + DL, + [0x64] = BDL + DH + LD, + [0x65] = BDL + DD + LH, + [0x66] = BDL + DD + DH, + [0x67] = BDL + DH + LU, + [0x68] = BDL + DU + LH, + [0x69] = BDL + DH + DU, + [0x6a] = BDL + DH + LV, + [0x6b] = BDL + DV + LH, + [0x6c] = BDL + DH + DV, + + /* (light) arcs */ + [0x6d] = BDA + LD + LR, + [0x6e] = BDA + LD + LL, + [0x6f] = BDA + LU + LL, + [0x70] = BDA + LU + LR, + + /* Lower (Down) X/8 block (data is 8 - X) */ + [0x81] = BBD + 7, [0x82] = BBD + 6, [0x83] = BBD + 5, [0x84] = BBD + 4, + [0x85] = BBD + 3, [0x86] = BBD + 2, [0x87] = BBD + 1, [0x88] = BBD + 0, + + /* Left X/8 block (data is X) */ + [0x89] = BBL + 7, [0x8a] = BBL + 6, [0x8b] = BBL + 5, [0x8c] = BBL + 4, + [0x8d] = BBL + 3, [0x8e] = BBL + 2, [0x8f] = BBL + 1, + + /* upper 1/2 (4/8), 1/8 block (X), right 1/2, 1/8 block (8-X) */ + [0x80] = BBU + 4, [0x94] = BBU + 1, + [0x90] = BBR + 4, [0x95] = BBR + 7, + + /* Quadrants */ + [0x96] = BBQ + BL, + [0x97] = BBQ + BR, + [0x98] = BBQ + TL, + [0x99] = BBQ + TL + BL + BR, + [0x9a] = BBQ + TL + BR, + [0x9b] = BBQ + TL + TR + BL, + [0x9c] = BBQ + TL + TR + BR, + [0x9d] = BBQ + TR, + [0x9e] = BBQ + BL + TR, + [0x9f] = BBQ + BL + TR + BR, + + /* Shades, data is an alpha value in 25% units (1/4, 1/2, 3/4) */ + [0x91] = BBS + 1, [0x92] = BBS + 2, [0x93] = BBS + 3, + + /* U+2504 - U+250B, U+254C - U+254F: unsupported (dashes) */ + /* U+2571 - U+2573: unsupported (diagonals) */ +}; diff --git a/config.def.h b/config.def.h index 558625e..c03cd30 100644 --- a/config.def.h +++ b/config.def.h @@ -70,6 +70,18 @@ static unsigned int blinktimeout = 800; */ static unsigned int cursorthickness = 2; +/* + * 1: render most of the lines/blocks characters without using the font for + * perfect alignment between cells (U2500 - U259F except dashes/diagonals). + * Bold affects lines thickness if boxdraw_bold is not 0. Italic is ignored. + * 0: disable (render all U25XX glyphs normally from the font). + */ +const int boxdraw = 1; +const int boxdraw_bold = 0; + +/* braille (U28XX): 1: render as adjacent "pixels", 0: use font */ +const int boxdraw_braille = 1; + /* * bell volume. It must be a value between -100 and 100. Use 0 for disabling * it diff --git a/config.h b/config.h index 558625e..c03cd30 100644 --- a/config.h +++ b/config.h @@ -70,6 +70,18 @@ static unsigned int blinktimeout = 800; */ static unsigned int cursorthickness = 2; +/* + * 1: render most of the lines/blocks characters without using the font for + * perfect alignment between cells (U2500 - U259F except dashes/diagonals). + * Bold affects lines thickness if boxdraw_bold is not 0. Italic is ignored. + * 0: disable (render all U25XX glyphs normally from the font). + */ +const int boxdraw = 1; +const int boxdraw_bold = 0; + +/* braille (U28XX): 1: render as adjacent "pixels", 0: use font */ +const int boxdraw_braille = 1; + /* * bell volume. It must be a value between -100 and 100. Use 0 for disabling * it diff --git a/patches/st-boxdraw_v2-0.8.5.diff b/patches/st-boxdraw_v2-0.8.5.diff new file mode 100644 index 0000000..1ba0e46 --- /dev/null +++ b/patches/st-boxdraw_v2-0.8.5.diff @@ -0,0 +1,583 @@ +From 46a1124957b8de5e7f827656b64bfc3baeaa097f Mon Sep 17 00:00:00 2001 +From: wael <40663@protonmail.com> +Date: Mon, 11 Apr 2022 17:04:30 +0300 +Subject: [PATCH] [st][patch][boxdraw] update to 0.8.5 + +--- + Makefile | 3 +- + boxdraw.c | 194 ++++++++++++++++++++++++++++++++++++++++++++ + boxdraw_data.h | 214 +++++++++++++++++++++++++++++++++++++++++++++++++ + config.def.h | 12 +++ + st.c | 3 + + st.h | 10 +++ + x.c | 21 +++-- + 7 files changed, 451 insertions(+), 6 deletions(-) + create mode 100644 boxdraw.c + create mode 100644 boxdraw_data.h + +diff --git a/Makefile b/Makefile +index 470ac86..6dfa212 100644 +--- a/Makefile ++++ b/Makefile +@@ -4,7 +4,7 @@ + + include config.mk + +-SRC = st.c x.c ++SRC = st.c x.c boxdraw.c + OBJ = $(SRC:.c=.o) + + all: options st +@@ -23,6 +23,7 @@ config.h: + + st.o: config.h st.h win.h + x.o: arg.h config.h st.h win.h ++boxdraw.o: config.h st.h boxdraw_data.h + + $(OBJ): config.h config.mk + +diff --git a/boxdraw.c b/boxdraw.c +new file mode 100644 +index 0000000..28a92d0 +--- /dev/null ++++ b/boxdraw.c +@@ -0,0 +1,194 @@ ++/* ++ * Copyright 2018 Avi Halachmi (:avih) avihpit@yahoo.com https://github.com/avih ++ * MIT/X Consortium License ++ */ ++ ++#include ++#include "st.h" ++#include "boxdraw_data.h" ++ ++/* Rounded non-negative integers division of n / d */ ++#define DIV(n, d) (((n) + (d) / 2) / (d)) ++ ++static Display *xdpy; ++static Colormap xcmap; ++static XftDraw *xd; ++static Visual *xvis; ++ ++static void drawbox(int, int, int, int, XftColor *, XftColor *, ushort); ++static void drawboxlines(int, int, int, int, XftColor *, ushort); ++ ++/* public API */ ++ ++void ++boxdraw_xinit(Display *dpy, Colormap cmap, XftDraw *draw, Visual *vis) ++{ ++ xdpy = dpy; xcmap = cmap; xd = draw, xvis = vis; ++} ++ ++int ++isboxdraw(Rune u) ++{ ++ Rune block = u & ~0xff; ++ return (boxdraw && block == 0x2500 && boxdata[(uint8_t)u]) || ++ (boxdraw_braille && block == 0x2800); ++} ++ ++/* the "index" is actually the entire shape data encoded as ushort */ ++ushort ++boxdrawindex(const Glyph *g) ++{ ++ if (boxdraw_braille && (g->u & ~0xff) == 0x2800) ++ return BRL | (uint8_t)g->u; ++ if (boxdraw_bold && (g->mode & ATTR_BOLD)) ++ return BDB | boxdata[(uint8_t)g->u]; ++ return boxdata[(uint8_t)g->u]; ++} ++ ++void ++drawboxes(int x, int y, int cw, int ch, XftColor *fg, XftColor *bg, ++ const XftGlyphFontSpec *specs, int len) ++{ ++ for ( ; len-- > 0; x += cw, specs++) ++ drawbox(x, y, cw, ch, fg, bg, (ushort)specs->glyph); ++} ++ ++/* implementation */ ++ ++void ++drawbox(int x, int y, int w, int h, XftColor *fg, XftColor *bg, ushort bd) ++{ ++ ushort cat = bd & ~(BDB | 0xff); /* mask out bold and data */ ++ if (bd & (BDL | BDA)) { ++ /* lines (light/double/heavy/arcs) */ ++ drawboxlines(x, y, w, h, fg, bd); ++ ++ } else if (cat == BBD) { ++ /* lower (8-X)/8 block */ ++ int d = DIV((uint8_t)bd * h, 8); ++ XftDrawRect(xd, fg, x, y + d, w, h - d); ++ ++ } else if (cat == BBU) { ++ /* upper X/8 block */ ++ XftDrawRect(xd, fg, x, y, w, DIV((uint8_t)bd * h, 8)); ++ ++ } else if (cat == BBL) { ++ /* left X/8 block */ ++ XftDrawRect(xd, fg, x, y, DIV((uint8_t)bd * w, 8), h); ++ ++ } else if (cat == BBR) { ++ /* right (8-X)/8 block */ ++ int d = DIV((uint8_t)bd * w, 8); ++ XftDrawRect(xd, fg, x + d, y, w - d, h); ++ ++ } else if (cat == BBQ) { ++ /* Quadrants */ ++ int w2 = DIV(w, 2), h2 = DIV(h, 2); ++ if (bd & TL) ++ XftDrawRect(xd, fg, x, y, w2, h2); ++ if (bd & TR) ++ XftDrawRect(xd, fg, x + w2, y, w - w2, h2); ++ if (bd & BL) ++ XftDrawRect(xd, fg, x, y + h2, w2, h - h2); ++ if (bd & BR) ++ XftDrawRect(xd, fg, x + w2, y + h2, w - w2, h - h2); ++ ++ } else if (bd & BBS) { ++ /* Shades - data is 1/2/3 for 25%/50%/75% alpha, respectively */ ++ int d = (uint8_t)bd; ++ XftColor xfc; ++ XRenderColor xrc = { .alpha = 0xffff }; ++ ++ xrc.red = DIV(fg->color.red * d + bg->color.red * (4 - d), 4); ++ xrc.green = DIV(fg->color.green * d + bg->color.green * (4 - d), 4); ++ xrc.blue = DIV(fg->color.blue * d + bg->color.blue * (4 - d), 4); ++ ++ XftColorAllocValue(xdpy, xvis, xcmap, &xrc, &xfc); ++ XftDrawRect(xd, &xfc, x, y, w, h); ++ XftColorFree(xdpy, xvis, xcmap, &xfc); ++ ++ } else if (cat == BRL) { ++ /* braille, each data bit corresponds to one dot at 2x4 grid */ ++ int w1 = DIV(w, 2); ++ int h1 = DIV(h, 4), h2 = DIV(h, 2), h3 = DIV(3 * h, 4); ++ ++ if (bd & 1) XftDrawRect(xd, fg, x, y, w1, h1); ++ if (bd & 2) XftDrawRect(xd, fg, x, y + h1, w1, h2 - h1); ++ if (bd & 4) XftDrawRect(xd, fg, x, y + h2, w1, h3 - h2); ++ if (bd & 8) XftDrawRect(xd, fg, x + w1, y, w - w1, h1); ++ if (bd & 16) XftDrawRect(xd, fg, x + w1, y + h1, w - w1, h2 - h1); ++ if (bd & 32) XftDrawRect(xd, fg, x + w1, y + h2, w - w1, h3 - h2); ++ if (bd & 64) XftDrawRect(xd, fg, x, y + h3, w1, h - h3); ++ if (bd & 128) XftDrawRect(xd, fg, x + w1, y + h3, w - w1, h - h3); ++ ++ } ++} ++ ++void ++drawboxlines(int x, int y, int w, int h, XftColor *fg, ushort bd) ++{ ++ /* s: stem thickness. width/8 roughly matches underscore thickness. */ ++ /* We draw bold as 1.5 * normal-stem and at least 1px thicker. */ ++ /* doubles draw at least 3px, even when w or h < 3. bold needs 6px. */ ++ int mwh = MIN(w, h); ++ int base_s = MAX(1, DIV(mwh, 8)); ++ int bold = (bd & BDB) && mwh >= 6; /* possibly ignore boldness */ ++ int s = bold ? MAX(base_s + 1, DIV(3 * base_s, 2)) : base_s; ++ int w2 = DIV(w - s, 2), h2 = DIV(h - s, 2); ++ /* the s-by-s square (x + w2, y + h2, s, s) is the center texel. */ ++ /* The base length (per direction till edge) includes this square. */ ++ ++ int light = bd & (LL | LU | LR | LD); ++ int double_ = bd & (DL | DU | DR | DD); ++ ++ if (light) { ++ /* d: additional (negative) length to not-draw the center */ ++ /* texel - at arcs and avoid drawing inside (some) doubles */ ++ int arc = bd & BDA; ++ int multi_light = light & (light - 1); ++ int multi_double = double_ & (double_ - 1); ++ /* light crosses double only at DH+LV, DV+LH (ref. shapes) */ ++ int d = arc || (multi_double && !multi_light) ? -s : 0; ++ ++ if (bd & LL) ++ XftDrawRect(xd, fg, x, y + h2, w2 + s + d, s); ++ if (bd & LU) ++ XftDrawRect(xd, fg, x + w2, y, s, h2 + s + d); ++ if (bd & LR) ++ XftDrawRect(xd, fg, x + w2 - d, y + h2, w - w2 + d, s); ++ if (bd & LD) ++ XftDrawRect(xd, fg, x + w2, y + h2 - d, s, h - h2 + d); ++ } ++ ++ /* double lines - also align with light to form heavy when combined */ ++ if (double_) { ++ /* ++ * going clockwise, for each double-ray: p is additional length ++ * to the single-ray nearer to the previous direction, and n to ++ * the next. p and n adjust from the base length to lengths ++ * which consider other doubles - shorter to avoid intersections ++ * (p, n), or longer to draw the far-corner texel (n). ++ */ ++ int dl = bd & DL, du = bd & DU, dr = bd & DR, dd = bd & DD; ++ if (dl) { ++ int p = dd ? -s : 0, n = du ? -s : dd ? s : 0; ++ XftDrawRect(xd, fg, x, y + h2 + s, w2 + s + p, s); ++ XftDrawRect(xd, fg, x, y + h2 - s, w2 + s + n, s); ++ } ++ if (du) { ++ int p = dl ? -s : 0, n = dr ? -s : dl ? s : 0; ++ XftDrawRect(xd, fg, x + w2 - s, y, s, h2 + s + p); ++ XftDrawRect(xd, fg, x + w2 + s, y, s, h2 + s + n); ++ } ++ if (dr) { ++ int p = du ? -s : 0, n = dd ? -s : du ? s : 0; ++ XftDrawRect(xd, fg, x + w2 - p, y + h2 - s, w - w2 + p, s); ++ XftDrawRect(xd, fg, x + w2 - n, y + h2 + s, w - w2 + n, s); ++ } ++ if (dd) { ++ int p = dr ? -s : 0, n = dl ? -s : dr ? s : 0; ++ XftDrawRect(xd, fg, x + w2 + s, y + h2 - p, s, h - h2 + p); ++ XftDrawRect(xd, fg, x + w2 - s, y + h2 - n, s, h - h2 + n); ++ } ++ } ++} +diff --git a/boxdraw_data.h b/boxdraw_data.h +new file mode 100644 +index 0000000..7890500 +--- /dev/null ++++ b/boxdraw_data.h +@@ -0,0 +1,214 @@ ++/* ++ * Copyright 2018 Avi Halachmi (:avih) avihpit@yahoo.com https://github.com/avih ++ * MIT/X Consortium License ++ */ ++ ++/* ++ * U+25XX codepoints data ++ * ++ * References: ++ * http://www.unicode.org/charts/PDF/U2500.pdf ++ * http://www.unicode.org/charts/PDF/U2580.pdf ++ * ++ * Test page: ++ * https://github.com/GNOME/vte/blob/master/doc/boxes.txt ++ */ ++ ++/* Each shape is encoded as 16-bits. Higher bits are category, lower are data */ ++/* Categories (mutually exclusive except BDB): */ ++/* For convenience, BDL/BDA/BBS/BDB are 1 bit each, the rest are enums */ ++#define BDL (1<<8) /* Box Draw Lines (light/double/heavy) */ ++#define BDA (1<<9) /* Box Draw Arc (light) */ ++ ++#define BBD (1<<10) /* Box Block Down (lower) X/8 */ ++#define BBL (2<<10) /* Box Block Left X/8 */ ++#define BBU (3<<10) /* Box Block Upper X/8 */ ++#define BBR (4<<10) /* Box Block Right X/8 */ ++#define BBQ (5<<10) /* Box Block Quadrants */ ++#define BRL (6<<10) /* Box Braille (data is lower byte of U28XX) */ ++ ++#define BBS (1<<14) /* Box Block Shades */ ++#define BDB (1<<15) /* Box Draw is Bold */ ++ ++/* (BDL/BDA) Light/Double/Heavy x Left/Up/Right/Down/Horizontal/Vertical */ ++/* Heavy is light+double (literally drawing light+double align to form heavy) */ ++#define LL (1<<0) ++#define LU (1<<1) ++#define LR (1<<2) ++#define LD (1<<3) ++#define LH (LL+LR) ++#define LV (LU+LD) ++ ++#define DL (1<<4) ++#define DU (1<<5) ++#define DR (1<<6) ++#define DD (1<<7) ++#define DH (DL+DR) ++#define DV (DU+DD) ++ ++#define HL (LL+DL) ++#define HU (LU+DU) ++#define HR (LR+DR) ++#define HD (LD+DD) ++#define HH (HL+HR) ++#define HV (HU+HD) ++ ++/* (BBQ) Quadrants Top/Bottom x Left/Right */ ++#define TL (1<<0) ++#define TR (1<<1) ++#define BL (1<<2) ++#define BR (1<<3) ++ ++/* Data for U+2500 - U+259F except dashes/diagonals */ ++static const unsigned short boxdata[256] = { ++ /* light lines */ ++ [0x00] = BDL + LH, /* light horizontal */ ++ [0x02] = BDL + LV, /* light vertical */ ++ [0x0c] = BDL + LD + LR, /* light down and right */ ++ [0x10] = BDL + LD + LL, /* light down and left */ ++ [0x14] = BDL + LU + LR, /* light up and right */ ++ [0x18] = BDL + LU + LL, /* light up and left */ ++ [0x1c] = BDL + LV + LR, /* light vertical and right */ ++ [0x24] = BDL + LV + LL, /* light vertical and left */ ++ [0x2c] = BDL + LH + LD, /* light horizontal and down */ ++ [0x34] = BDL + LH + LU, /* light horizontal and up */ ++ [0x3c] = BDL + LV + LH, /* light vertical and horizontal */ ++ [0x74] = BDL + LL, /* light left */ ++ [0x75] = BDL + LU, /* light up */ ++ [0x76] = BDL + LR, /* light right */ ++ [0x77] = BDL + LD, /* light down */ ++ ++ /* heavy [+light] lines */ ++ [0x01] = BDL + HH, ++ [0x03] = BDL + HV, ++ [0x0d] = BDL + HR + LD, ++ [0x0e] = BDL + HD + LR, ++ [0x0f] = BDL + HD + HR, ++ [0x11] = BDL + HL + LD, ++ [0x12] = BDL + HD + LL, ++ [0x13] = BDL + HD + HL, ++ [0x15] = BDL + HR + LU, ++ [0x16] = BDL + HU + LR, ++ [0x17] = BDL + HU + HR, ++ [0x19] = BDL + HL + LU, ++ [0x1a] = BDL + HU + LL, ++ [0x1b] = BDL + HU + HL, ++ [0x1d] = BDL + HR + LV, ++ [0x1e] = BDL + HU + LD + LR, ++ [0x1f] = BDL + HD + LR + LU, ++ [0x20] = BDL + HV + LR, ++ [0x21] = BDL + HU + HR + LD, ++ [0x22] = BDL + HD + HR + LU, ++ [0x23] = BDL + HV + HR, ++ [0x25] = BDL + HL + LV, ++ [0x26] = BDL + HU + LD + LL, ++ [0x27] = BDL + HD + LU + LL, ++ [0x28] = BDL + HV + LL, ++ [0x29] = BDL + HU + HL + LD, ++ [0x2a] = BDL + HD + HL + LU, ++ [0x2b] = BDL + HV + HL, ++ [0x2d] = BDL + HL + LD + LR, ++ [0x2e] = BDL + HR + LL + LD, ++ [0x2f] = BDL + HH + LD, ++ [0x30] = BDL + HD + LH, ++ [0x31] = BDL + HD + HL + LR, ++ [0x32] = BDL + HR + HD + LL, ++ [0x33] = BDL + HH + HD, ++ [0x35] = BDL + HL + LU + LR, ++ [0x36] = BDL + HR + LU + LL, ++ [0x37] = BDL + HH + LU, ++ [0x38] = BDL + HU + LH, ++ [0x39] = BDL + HU + HL + LR, ++ [0x3a] = BDL + HU + HR + LL, ++ [0x3b] = BDL + HH + HU, ++ [0x3d] = BDL + HL + LV + LR, ++ [0x3e] = BDL + HR + LV + LL, ++ [0x3f] = BDL + HH + LV, ++ [0x40] = BDL + HU + LH + LD, ++ [0x41] = BDL + HD + LH + LU, ++ [0x42] = BDL + HV + LH, ++ [0x43] = BDL + HU + HL + LD + LR, ++ [0x44] = BDL + HU + HR + LD + LL, ++ [0x45] = BDL + HD + HL + LU + LR, ++ [0x46] = BDL + HD + HR + LU + LL, ++ [0x47] = BDL + HH + HU + LD, ++ [0x48] = BDL + HH + HD + LU, ++ [0x49] = BDL + HV + HL + LR, ++ [0x4a] = BDL + HV + HR + LL, ++ [0x4b] = BDL + HV + HH, ++ [0x78] = BDL + HL, ++ [0x79] = BDL + HU, ++ [0x7a] = BDL + HR, ++ [0x7b] = BDL + HD, ++ [0x7c] = BDL + HR + LL, ++ [0x7d] = BDL + HD + LU, ++ [0x7e] = BDL + HL + LR, ++ [0x7f] = BDL + HU + LD, ++ ++ /* double [+light] lines */ ++ [0x50] = BDL + DH, ++ [0x51] = BDL + DV, ++ [0x52] = BDL + DR + LD, ++ [0x53] = BDL + DD + LR, ++ [0x54] = BDL + DR + DD, ++ [0x55] = BDL + DL + LD, ++ [0x56] = BDL + DD + LL, ++ [0x57] = BDL + DL + DD, ++ [0x58] = BDL + DR + LU, ++ [0x59] = BDL + DU + LR, ++ [0x5a] = BDL + DU + DR, ++ [0x5b] = BDL + DL + LU, ++ [0x5c] = BDL + DU + LL, ++ [0x5d] = BDL + DL + DU, ++ [0x5e] = BDL + DR + LV, ++ [0x5f] = BDL + DV + LR, ++ [0x60] = BDL + DV + DR, ++ [0x61] = BDL + DL + LV, ++ [0x62] = BDL + DV + LL, ++ [0x63] = BDL + DV + DL, ++ [0x64] = BDL + DH + LD, ++ [0x65] = BDL + DD + LH, ++ [0x66] = BDL + DD + DH, ++ [0x67] = BDL + DH + LU, ++ [0x68] = BDL + DU + LH, ++ [0x69] = BDL + DH + DU, ++ [0x6a] = BDL + DH + LV, ++ [0x6b] = BDL + DV + LH, ++ [0x6c] = BDL + DH + DV, ++ ++ /* (light) arcs */ ++ [0x6d] = BDA + LD + LR, ++ [0x6e] = BDA + LD + LL, ++ [0x6f] = BDA + LU + LL, ++ [0x70] = BDA + LU + LR, ++ ++ /* Lower (Down) X/8 block (data is 8 - X) */ ++ [0x81] = BBD + 7, [0x82] = BBD + 6, [0x83] = BBD + 5, [0x84] = BBD + 4, ++ [0x85] = BBD + 3, [0x86] = BBD + 2, [0x87] = BBD + 1, [0x88] = BBD + 0, ++ ++ /* Left X/8 block (data is X) */ ++ [0x89] = BBL + 7, [0x8a] = BBL + 6, [0x8b] = BBL + 5, [0x8c] = BBL + 4, ++ [0x8d] = BBL + 3, [0x8e] = BBL + 2, [0x8f] = BBL + 1, ++ ++ /* upper 1/2 (4/8), 1/8 block (X), right 1/2, 1/8 block (8-X) */ ++ [0x80] = BBU + 4, [0x94] = BBU + 1, ++ [0x90] = BBR + 4, [0x95] = BBR + 7, ++ ++ /* Quadrants */ ++ [0x96] = BBQ + BL, ++ [0x97] = BBQ + BR, ++ [0x98] = BBQ + TL, ++ [0x99] = BBQ + TL + BL + BR, ++ [0x9a] = BBQ + TL + BR, ++ [0x9b] = BBQ + TL + TR + BL, ++ [0x9c] = BBQ + TL + TR + BR, ++ [0x9d] = BBQ + TR, ++ [0x9e] = BBQ + BL + TR, ++ [0x9f] = BBQ + BL + TR + BR, ++ ++ /* Shades, data is an alpha value in 25% units (1/4, 1/2, 3/4) */ ++ [0x91] = BBS + 1, [0x92] = BBS + 2, [0x93] = BBS + 3, ++ ++ /* U+2504 - U+250B, U+254C - U+254F: unsupported (dashes) */ ++ /* U+2571 - U+2573: unsupported (diagonals) */ ++}; +diff --git a/config.def.h b/config.def.h +index 91ab8ca..7bb3ff7 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -67,6 +67,18 @@ static unsigned int blinktimeout = 800; + */ + static unsigned int cursorthickness = 2; + ++/* ++ * 1: render most of the lines/blocks characters without using the font for ++ * perfect alignment between cells (U2500 - U259F except dashes/diagonals). ++ * Bold affects lines thickness if boxdraw_bold is not 0. Italic is ignored. ++ * 0: disable (render all U25XX glyphs normally from the font). ++ */ ++const int boxdraw = 0; ++const int boxdraw_bold = 0; ++ ++/* braille (U28XX): 1: render as adjacent "pixels", 0: use font */ ++const int boxdraw_braille = 0; ++ + /* + * bell volume. It must be a value between -100 and 100. Use 0 for disabling + * it +diff --git a/st.c b/st.c +index f43cfd3..baa2bed 100644 +--- a/st.c ++++ b/st.c +@@ -1214,6 +1214,9 @@ tsetchar(Rune u, const Glyph *attr, int x, int y) + term.dirty[y] = 1; + term.line[y][x] = *attr; + term.line[y][x].u = u; ++ ++ if (isboxdraw(u)) ++ term.line[y][x].mode |= ATTR_BOXDRAW; + } + + void +diff --git a/st.h b/st.h +index 519b9bd..07a7c66 100644 +--- a/st.h ++++ b/st.h +@@ -33,6 +33,7 @@ enum glyph_attribute { + ATTR_WRAP = 1 << 8, + ATTR_WIDE = 1 << 9, + ATTR_WDUMMY = 1 << 10, ++ ATTR_BOXDRAW = 1 << 11, + ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT, + }; + +@@ -113,6 +114,14 @@ char *xstrdup(const char *); + + int xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b); + ++int isboxdraw(Rune); ++ushort boxdrawindex(const Glyph *); ++#ifdef XFT_VERSION ++/* only exposed to x.c, otherwise we'll need Xft.h for the types */ ++void boxdraw_xinit(Display *, Colormap, XftDraw *, Visual *); ++void drawboxes(int, int, int, int, XftColor *, XftColor *, const XftGlyphFontSpec *, int); ++#endif ++ + /* config.h globals */ + extern char *utmp; + extern char *scroll; +@@ -126,3 +135,4 @@ extern unsigned int tabspaces; + extern unsigned int defaultfg; + extern unsigned int defaultbg; + extern unsigned int defaultcs; ++extern const int boxdraw, boxdraw_bold, boxdraw_braille; +diff --git a/x.c b/x.c +index 2a3bd38..bf6bbf9 100644 +--- a/x.c ++++ b/x.c +@@ -1237,6 +1237,8 @@ xinit(int cols, int rows) + xsel.xtarget = XInternAtom(xw.dpy, "UTF8_STRING", 0); + if (xsel.xtarget == None) + xsel.xtarget = XA_STRING; ++ ++ boxdraw_xinit(xw.dpy, xw.cmap, xw.draw, xw.vis); + } + + int +@@ -1283,8 +1285,13 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x + yp = winy + font->ascent; + } + +- /* Lookup character index with default font. */ +- glyphidx = XftCharIndex(xw.dpy, font->match, rune); ++ if (mode & ATTR_BOXDRAW) { ++ /* minor shoehorning: boxdraw uses only this ushort */ ++ glyphidx = boxdrawindex(&glyphs[i]); ++ } else { ++ /* Lookup character index with default font. */ ++ glyphidx = XftCharIndex(xw.dpy, font->match, rune); ++ } + if (glyphidx) { + specs[numspecs].font = font->match; + specs[numspecs].glyph = glyphidx; +@@ -1488,8 +1495,12 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i + r.width = width; + XftDrawSetClipRectangles(xw.draw, winx, winy, &r, 1); + +- /* Render the glyphs. */ +- XftDrawGlyphFontSpec(xw.draw, fg, specs, len); ++ if (base.mode & ATTR_BOXDRAW) { ++ drawboxes(winx, winy, width / len, win.ch, fg, bg, specs, len); ++ } else { ++ /* Render the glyphs. */ ++ XftDrawGlyphFontSpec(xw.draw, fg, specs, len); ++ } + + /* Render underline and strikethrough. */ + if (base.mode & ATTR_UNDERLINE) { +@@ -1532,7 +1543,7 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og) + /* + * Select the right color for the right mode. + */ +- g.mode &= ATTR_BOLD|ATTR_ITALIC|ATTR_UNDERLINE|ATTR_STRUCK|ATTR_WIDE; ++ g.mode &= ATTR_BOLD|ATTR_ITALIC|ATTR_UNDERLINE|ATTR_STRUCK|ATTR_WIDE|ATTR_BOXDRAW; + + if (IS_SET(MODE_REVERSE)) { + g.mode |= ATTR_REVERSE; +-- +2.35.1 + diff --git a/st b/st index c3f34c43bba134b636866afa4bff10f18452afe4..40cbd3abccfe85b6874bc35205d689faca3df4f0 100755 GIT binary patch literal 118984 zcmeFad3Y368a`T`bV0zxYLwQfM4|>I0veWRT4+f_BNYu00X42HA%SQ}+N2wT!xHR7 zQkD&IM`xUImvMBAjv^vr79asp18#_0M3HJ*B!Y$jLf`j0bt+V9?B~wC&+pG)eCRsw zd%kndcfPYPRW6&5drh3pCK!M5!qozynK$c9Hup%_dP*i+$P$u-Y+;~qzR(N)cKkEs ztj}F>@Wh|-Owgeak0*soCdZ#V2k5k5JdM=pN#SDst(&a-7*D~WV+tpdGf&6Xr|n&x zH=gEjEIkL;!1B~a>*0*2IULz0;}$)f_1QL35102>{b__Fb5Xde+x2kPXEwK|@igp7 zI?}%^Zcpno8-Dbc&3*;J8m^Luvp&6C-gr_P^fzs5+aLeP>=gcrsl9Hz_>JnJ z<4WRwy7{Kf-&9RHoJTU04+=vv^hX^1GybSLJb`~C!|bCcz-kHcu0yKPgn<70Z$ISE z_-|VH1R47?-iyTljQ<6R{~7;G41N*P{4@C!X#QvX@ZNvUcg4^%DMq@d$B=JFLHt>| z6Jn%0HU|Gp41Qk>efr1X&yHc|6xc2GPs;2580GjxjCkIPk?zJA_J1#iygf$zp&0yq zG2(wIhW-!7NVg>hpB;lQj=`%j>fzZj>cfT@@zlqVUl*gkO^K22kr?)QF-E!@W28Gf zMm*2NkS~d$k1s~LD6T)Phu6iZ|98dUe~po@JBFTdG4eGdMm!^9=zkzaJiBAm!=*9e z85+Y5=fx=Zni%o?0scb7W&OJ>h8lpQ0G@yJNK9mtv$lIfkA^G5A3- z>cd4b;vW!0{?-`w{2)fYvSP^3j=?XB5zk98?Ab4d{Vx zZ^W?Yg)#J3V%VV~2EQ+coma=mZ&r+W(qhCejR&KU9B z7DNB*W61v&BmTA+`e($5=am@c+Y-Y*qhjQDb&PVqK8Bt*#EAdF82T@Wk**wrUlc>1 zS7M}lZ;W*BjZrSI#)yAWjQCHB5l^oe@vMtcF1az{86Ts3KZ+55Fh)G3G3;3oL;f!@ z_#H9yZ;GK0Egt`@y?h@-pR^eA*ThKI6{8;h7{hL>W5~Bd|9--`g0K<-_%rqugc&*0 zC(W2sSY9}{xWZppK7G>olCsjm>9b~+6bdtD%$;9WI-|lrtK2_hhA#T2g86xcrE`i) z=L-4b%L`}u3&)q0l$Fn)vuQ;N7sJ^r%!M)17iN|wwtq|XzXSm>Wt zSW;NvFD@&cvaqxe5l<`h=S;eBR!N|+Ldc)Wa~dO!8)xZRm|O^R%*lmOg#7aP6sf-) zIrPr*&ze1}q7Vwqn^iiu@TTI@Ib{nyet6Cf_$hvf{x=B?ZkjZC)_jD!p|k?(jK8L= zAOPt}vwXU=ke^#tc2~fsCnMzN%_^@boLE>kztCR}Yjww(S6=2TEcb)DrX)}?&oIQq z@j|}0uxM7G#6PW|ys)s8U`e6B@RYosuN+;lxU|qPJJT(vpsZBak5ZZ>7nk~>-8G1b znQwYwrTFsr0+QrVp1qT<4GE^3rU`TU&HVw7D;@jVDWwXBR=M99Bu_PD~5 z5+UDHQc_kh4c4Jh(c=}oBgqerW_0mW*_=>@K)noEFl^Uyg-IU(U^yKtz1=(jw7Is^M!&Bzt_TO*(tFA{tKe}RA=r5rtQMWMfXn)c*q)%)4tw(X8SUp@=#K zbV8**^g{lE3Us}*(WdSaQ228KK4E_0{P|@I3JLnliu6Z`P_YR8>3jjP`W6O|NKsii z3sHiuYQ~HL{~}-EjM+1gvVgee2m$IP3riOWh;al9g)s1;enTj%EG$^y6J``vqUcEz zVZQD$V+OW^3;2LFe^zlRQpeaCS5qI*zbe72thezb_kRR zz6v%hA?U*5IsSP}C*LBWXkmFV8VIF1A9lZ*ypxhuLr%Z~}8t z;~eCX2Oq;st+&t{6Ex!b7Z)ediNP5hzsdYXVF1TxGJm^p3CE8!|9D|I$ANQ;akLR9 zi~*)U<2;2!A@3HQ&*JA_1}|_v+rm$E>hnk0!r#pKnHGK~=jU1YIh^-d_<5YKwD2XI zud?ty&evLaKj-T#d?n}eZtXb_zJv4m7Jf13XIl6w&d;;()tvWP_*%|aTKESzUuEIz zIA3ewAK`qRg@2s$t1bMKoPXNF|DE$|Ec~;aueb0oa(jzlHN%7JeJ&h1+`8hmSa)VBvRi-eKWC=X|n--_7|{ z3;!+W2V3|(oX@cEKXE?G!iPDZZQ&1aUbgTZocCGy2foq!fhr4s-q$)`YvHf>O6Th= zd|%G5vG8Agsms^L;2SLb(oMSjE(<^ZEuHVM@GCj*;OFs1KUT9>m(RBF$)D+bo`tvV z()oM~ziOw>&$IADIKO62&-!CvUtv%FE85t@U!8?-=X|||-^ckj3m@TphlTIpyn_x5 z@MqZJH_m5R_%6=pS@=IV@3Zj2Ag;fKw{yPU!Y6RP&B7;gzQe*hIPaL-Q~&;)&#>^x zoX@lH132%q@Tr`yv+$R2zTUzQ<$Rlk&)|HAg&)Ov$Go2UkLG-ag&)iLJPUsf=Y1Cb zI?mTw_^F()x9~S{zRkkl!TAmgU%+`saZml{az4YtmvTPO!dGzKXW=V3UuWSLbH3if z2RYwn;cGeHVc}PC-f?G7{U7FhhJ|0v`8*5%H_rPk{L`GTv+xgItfyCR;h*R7Z5DnF z=Q}L?E1Y-S)l>g^&SzNoH#whY;k(nyy{PU|iF1}@)b;f?m#Vc{FNyrZP2 z{zku)Vc|C!`dj!`&igF<$DFUT@Sk(O-ok&w`8EsxBj-CTe1!9k`91YN#Q6*hZ}h8q z7T)MreHQ*GkEhPU3r791@Vz+&#>?paX!z&8~wb`!W;d3 zorS-Y$5U_NhjYHo!e?>5!@`f{yrZnA{?~9m!@^JEe4d4$&Uv4OH^!Yh3vY}&^%nkC z9#5NvpUwFW3t!B6hp(spKF()Y_=TL$v+zqf@3ZhVoUgO+#yD7S;f-;y&B8yxV|=Nz@W%L3Z{dycrOm<{<4cEyH^vu7c~AX~ z@g>8;8{$m>=d@ zcw>I(v+%~erOv_|^OkxGZ_HcTEW9yq>9Fv|yv5<~ssCd8Ke7%ML znDcEG{&UWESom)^?^w`N{~tM@Vc{d3&$IA{IPbIYot&?;@FzH5Z{h8i=z6qS_|rJw zVd2laTJ>!@@tz`8*5% zSI+w^{BxYIv+)1oe7%K#o%3xL{vFPDSolWHJMQVJ|5natSoj^B&$IAfaNcL(zvFzJ zh2O{ddJBJ$^KBOX2FE&LG9 zw^{g+obRykqdD(b+*AMYoX@cEIh@b4@Yi$RXW?(=e4T}##rb**Z}jJF7T)MrJ1o4> zzd4rl)Zgf5GAz8&59C>Rqn-LJywQ&8EWA
n*%d58EufQBOK7yityhr9JgG?3`iY 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 literal 110376 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 LY(_mg{TBZh8)^mM literal 91200 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 diff --git a/x.c b/x.c index 2a4680f..d76441f 100644 --- a/x.c +++ b/x.c @@ -1371,6 +1371,8 @@ xinit(int cols, int rows) xsel.xtarget = XInternAtom(xw.dpy, "UTF8_STRING", 0); if (xsel.xtarget == None) xsel.xtarget = XA_STRING; + + boxdraw_xinit(xw.dpy, xw.cmap, xw.draw, xw.vis); } int @@ -1417,8 +1419,13 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x yp = winy + font->ascent; } - /* Lookup character index with default font. */ - glyphidx = XftCharIndex(xw.dpy, font->match, rune); + if (mode & ATTR_BOXDRAW) { + /* minor shoehorning: boxdraw uses only this ushort */ + glyphidx = boxdrawindex(&glyphs[i]); + } else { + /* Lookup character index with default font. */ + glyphidx = XftCharIndex(xw.dpy, font->match, rune); + } if (glyphidx) { specs[numspecs].font = font->match; specs[numspecs].glyph = glyphidx; @@ -1635,8 +1642,12 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i } if (dmode & DRAW_FG) { - /* Render the glyphs. */ - XftDrawGlyphFontSpec(xw.draw, fg, specs, len); + if (base.mode & ATTR_BOXDRAW) { + drawboxes(winx, winy, width / len, win.ch, fg, bg, specs, len); + } else { + /* Render the glyphs. */ + XftDrawGlyphFontSpec(xw.draw, fg, specs, len); + } /* Render underline and strikethrough. */ if (base.mode & ATTR_UNDERLINE) { @@ -1677,7 +1688,7 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og) /* * Select the right color for the right mode. */ - g.mode &= ATTR_BOLD|ATTR_ITALIC|ATTR_UNDERLINE|ATTR_STRUCK|ATTR_WIDE; + g.mode &= ATTR_BOLD|ATTR_ITALIC|ATTR_UNDERLINE|ATTR_STRUCK|ATTR_WIDE|ATTR_BOXDRAW; if (IS_SET(MODE_REVERSE)) { g.mode |= ATTR_REVERSE; diff --git a/x.o b/x.o index 194d88014d9d7aaa0b83225dce3d341d0e6c4759..9aa2ae0941e920b25678691e649aeb2743eaba5e 100644 GIT binary patch delta 25734 zcmaic30PIt`u<)AP*h|Pb#oLI3>Ame<5bQZgFHtuC5N<3#mt*!CO0g**E$k7oRE^1 z-K|YZdCSU5q8yqOr_@YEGsz*vp`^?tOU+dN-?s++T=&QGU(d6@z4!Zm(;D}{VV_$X zwrY9U!erOVRGkJPGYRn#4iO;~-O_dFvzPM*aSXAECYt_}C1t7a`(iet`jy`T>HPxFa|LPzn*Z`t zdPsLfygkQ-XAklhjAT7A|A6&Ox<9yoNbsz`^hanSQI|pa-8vgS=WNJc@5>i89?)}a zm+%>1rUlP>gPVV8l-Bc^h#9NYS#5yQ3TCj>o+4P(3u#b4nP=|IWGgD~MR7h0+kap( zR3(r!%$FbNEb{gTx2XMAtmN&f!E3(YR{}~8{_ZOfF4Kd*3FK4Ra5rOE!SvwS^|)7d zQrlOMoir@HAT=pHJy#LCwH75neCqOK_nS!z#ewCUO zQ4c))@~}@~Ge$#*2;Q;oJzl}&Pfd#Om7WUqg@{lWH-R>bn)9Ixdb{)lz|Am&wBS$P z+@C@wdvmMVjC#4Vk|JtH%{|1o)@{r7^K*3{Wl!;O_3m?Za`DgV^$w4pQ$3?cYOs=D ztCtwKkP5>qD)oZwrZX3-t6>2M&CiC46!hsVyDPXcq!EVk_B=2P+P*TRKAwe$cJ5gk zHAI}I&C#yp=uHh)pMDM80Unk2Idn7xk~2d(mF9t-TcZj-LpEP{NyX&{LgbG~3iSog z(s6JhFKGjWb!89rUfgVj!|Ic_1Psvt)|0p;7pw27&Q6N+2P^%-a_KF&5rX2%B*v&O zcXKp!KzP)gXTT1QW=GBG_9h(SyqP)4*FLmWG6aa4vj?%9&GX^pzWcpnz4v>^dB<JmRWostA66eY<@uoK*gai0CHKV{Cur!-$9;5}n2NRc^h?m)5_h_e>;Y zg@c#BggCf)R@Vf|iL>Sg>?ul#|sGJFB*LxzjlzG=d&d`Y17^3NZ zpiNgf9F0YPu?@Zlw)v)PA2o91NMC7XLg}RzZA(*G<^RV)JU9@I=p8X~xR39Q?9s9n zWECv+<(>(DIK&&Q^ajg)Fl=CfACVN79{lO_-+z@PMeVQ4+Ll~)_pcSPm%k2HSI^lnV{mHl$MxZm{pr&HtA2-qF%@2TkO-FumVP26-?o%HDi;aC+D0fs9UnM_lJy)C>h$f%H`U+i4RDb#7338 zoidlXc5f}|G+-U8?f<&E`j=Ddct(4>q*m$<7i-1K?i}bk@+ogJ@O{>TZyT86+I)gX z`V(AVuj3tj-CQrN;}d-oSXaKu*WGn>Ex!!dS8I7^e>Yd*T0Ys|jorsz@pnf@{xKyf zgBCF-;Vu?Y^6lW1+9h$r6GBT;?m5?vUErQ)+qlX@dGs7R8hU0lY~|QRP~PG>&$fwt zA|!GfOO4#a#zk&mkD(s+=k2g{C8Ez%R;e6gKx4rvg#kNxH z1YjG&@lKwZYqOL5sobtCj=!JVo~82db9=Mdyis0n_BqeUyQSGNyy!#eg91DcsT&#Y zg(bB!oL=FDd0m@zh8rX-lTd)hIHiH->AWKEAM9i9pVO4>;SbKa%@rQTU!T*2CGmB0 z2C}J~&27OJ@Wi>j**1Rv+@_e!-1hG1TIkENx}pG=(^SIA{EN9Z49Wd-yRvLvXWrmu z8Gf2(}1A6xt_vOQY#^;1Eh(xw9s~K99Sfdw`wh zPe0e*-B1w^B0nrL+BG~f9CPi!OP_1XeEi6BcB2VOr!ne4K^~eYziFL?in)&$&TqyC z<+sEv^4m8G#S0@8)fl2jVHD)w!Osl}EjgFJia|3J6%1q_@ydcHT@m&8#OFuBSY7x0 zQuip8@mpfav#kB#$7L}X5m_(T?x&-KV>ue(@F&IQ^P(5*LE+d$P<(P{U4uQ^KH5|Q zVx+-geV74=4^#SLB>_BM;gK=iweT#v$g38PcljFgy9>W$mwC*KZ?kv!x)+~xw-eU| zH7>!f9n1ps_dNIWC!5#_06`H;4D9bw?1%(@kU!t#cuT=r&E?JtD%!e*Kf7ogJIE^* z4fM|t6Uwp{DWy`SRHwBBIw*X*!n-T{5rywn_%fdLlHFvVVh1YrlwzB-;cvXuk>&HU zmj-sJXeU`Q-r=wgOi!#-WP6F@4Ih>mg}3fdGUz|enL7{XD->mJO;`K}Jjdze8tdU7 zIUU(mUg6lTVO{uTXRhZ23>);E(oI?>tC_YLESVK57Aa)ZShsfZ;>EUmuVCw0(W)|< zJ-{n~JpwEaxLlPbo?$t`W0u%FdP#Upk-_}Ny}+a_33snIn7@^;@jP=$Y$MD_Rq=X8 z^?1<|+Z_YT6S8qa--07q;&~acEyZbV>xAJwnX{K|_m?otnH3_JHZaq+9k~bCuFAGH zbQCQ;dFIPDpYU>c%+H3`G+y}flkUO7PK|0}IE*L0V)KMo!ebH$iicx)1~9{3sTJG6 zU@Yq)o&(%$u!=XhY+n3|4R@v}bA&7qa+#1NLVnJ@ui9**INmB`xsbo0bYFo?W1#-i zm1kZ5TDGy(&j|T~kZ%aNTF5OzmJ3-ajrU^M($nio>7IK=9{}%EEA(sgGDN3GD6vqyU^HW0pEToI) z6xpnSkZvJc3fW!AenR?%93y0=kdN`KH#)I7;&_3OuM4?S$WMgaBIG_Hf8d@sJFzR` zIFuK@X|re{n+w@N$R0xagd8s91eAQ(@;E+wc^sQ5&bGZC2R91nVV;l+dGYd2>@{Ao z-1ff>^9I{}X%{&(V$}#KR`^E-zE0s=6#j2DZ#D_fdxR_(@~DtM3i+pya1-*T{o-43 z%+1+bHcJq)vyjk9fcS*GM@Z-%K(d9LE94>}mkIfykn4HI+nwOC4mF{hKvtskUxNh^ zEA>z>SsTBqR5)Bm5ieG_qwvNG_w|;*TD1VRbRa zw;`LkU$F&>9jw@&6ke|IjtW1g@LH)7(03?*D?DD|Diw?I(syikoe0^g;}mkk8;sPIb${+PnA82FRiv(k3Y6>L50v|0`ICHf_v3GAziy=1U&@xqlh zd%xtJm4`w~o?A7VMNE8b=A?gSJ~?IDqz7ldSy9aD;2D4qK3;O{qjy8=D}MaUDbuE8 zmju^5>`Kzm#D8W^nL71B>-za)Qzz*Y{`(WHv2bEEVbd; zB@>Pp^D2-lcp=Eo#PN2avrFiFFOX2~-DtZ#YP4Y-e45oc^yC@fEuH6-+U`+G2g4;2 zopHRl)b>0~*p`I-C-M9R!Si?pSS=tdzKPOtR}g#y!Hap!Mw_j{oZ&GDGv7_(V)pu` z_j{fN><`3GDe+S&Z2zdiHjH~Vi7U`1+mocmA=VoG>%rSr;fSpzp1TU$z9>CuL}w$> z8A|X?1fR|eA?{9I1rjDI$TI?|;)$DWb_tI&U2sjpf^oOPrdzBI!M`GStimz>B!V|1 z`l|?jH_zE@yWb~P7zs77z}*?JI}CQEB(1Z&VzcdGYL(Y5_9PxaX=LCh6n-CPTWvOx zd$-tZ3irVAG@b>=^LP=+*HOB^FlNaJ{?5XS zzmgXl>VJiZW?3E{v(08bc@Ag}lF(!h0Jw>5B`Nk@hMPwx}`5UAf`QA^7jDe(r^E3CWZ zDW15)c0WVhZ3h$GObd9%4qS*qhrQ2pK&}-?r9jRi;=V*|ad>N6cu)fNS@o!ZiS8im ze|QCWdyRX)w%Hpz3*_el*@TFH8?o9+to9K68-o8u@ZAKj=0#uIfv9MJpyA4T+OkK9l6@$aMB|AP{jGl?3^Adbq3L5@g$zDWH= zOdYPrSegF{ujWxt}3yDPdpbrNAyH?DvHIf>!~%r3Us}p199; zA13TUVq1lA0~ZK;h_LO%-&|#zP^-rXPKWq2HQ;k=z~7QM|7l-L;60*4YxlLnv7HZ- z+zu1`c7j(BKSu~&P4wv!5GtRx1ES+;;3P?inLz`0CwNa1pqIjN0MWpy1g8Too8Wsb z-VgpxS-{zTJMc0I(2WH6FERL*;46uKcY=RhgZ^fM(;4=)#JRIS#=W2T#0u%>%Co$1 zzs(na7tt5d&e$nX!fm<7Q@lr6Bu}kag7*VV&w@l={GA=>PuM<$9Yt`Ag3Bb9i3YB7 zdYIrCeWB2{tQiES(Q_rv*L)Y_E+RTKhqb)oJKMjWu=E13L*bYm?TLc~-w&Lw?@8`G z0Jl}d8y$fm+*59|SYB9edz!_`Cq2u`!TRpJ9g1C|qmZp45(N+Wm*(I3ja2kp#pgvFH8RkKbbI1T@} z!p-W1=P$5^`dxA3AP zcA%ZXj!v*}UkO?S4+NnAVT5 z>2%ld;-m1#S;O`UI)t)`R~)r7|0e8VK(%c|bD<6)r+kpVF`USk`D7%Q&-2~r9 z^l4U=M1MHZKU;(TRfz|#4=MRU+bj3qc7@3$x%{WOA2SF9bu zL#RXJ1gD8EQ8*?#4mMqZWduJ=@OO!y->gS&7_6?r;46ZUCysU! zM|92nj^K0}o#UB5*@4T1Jx9D*t>6R-RwEQPJre8HfX5rSzE5ebaP(0Hn{JK{62H;j z`eM`9aHIog5ImDO8bt!oAv%TVPbB)&ZqkPZO=nb2h~J5U{@W|o;5@;j)H_PuLiz?{ z1ZO|n?t5!s-{(b@He1JIKyKk#m9}Sx(nSA%5dTMs2Rh<^L@W0%#EOpZztMjnOf6PA zx6i>ZmIwpavn591W)6c5{bcFJ$}n(U_qQe9Kn$5bL0LEMr#$f&n|;eOp=nML<0(Yv zA}{>e4uq;0I`wZ=$fgF4a|lZZf>Up|6a2rRr!z?>I96BtA1?75H;gCIJCyM?7(A_T zbaDYU9bg{8>3sW`=lo&^wiw>@Jo%AWT_oNv8TxuU)Ncz)P_UVn!KS14P&j6FiQrQt zUQ6`MZa(CUT_07nyDi*%#?CxRoGt}6UOnje+rbGGw4iI?7=qKex1a|6Q||fIW=DA0 z8QXtG>F9peL$Qk3UWRzOVwVZNk>KGx=d8_|aL+j#e#cyV)^@jR4>T0?90HrZ!|%o! z==2hrgHV$_%wvAD-H#J}tf3yvPYM0mJP~}(HFTDN9+m>00e%+o%yYJ9iPAwIS7Fnc zFEecaU}%XyCdV9BihN3V1ss2he%$McpKG9}{cIPp_HZxcyr1Y)6P-iCXNB;2jTil9 z2SPevEZKKkV6VN^Rk&_{{2?!vXaip+P|Ip;;IAsYDe(`#ySnZ_UE(*MGL|cY;fA9X z3cr^ZLidd4r6A#_Z0F#&LBzF-xPFn~Ap~D*cpj@fujf_JtXm0-gZqkF@4w-RRknXG z@ri%V)y>rDR_O$rDI2ZSk6Qu?$IcET`U`l>@3vErlR?pXbg`+2WF)B3lbrksH*#+CZ!eI5w@sD{Gup10k z|G*9Ycy`ea{7xd$dNt}Isv#O0v%$3pOS-}lqjwwA4ShYgUa3KUx5W9Hi!ls-M0Uw$ z$9Tm>+kL_CgKHxe=>AK#KeVen!|ulnbi372IASqmSTr>Blh6=K3!eFx9cXW`walkRD9w1kWS*NP=T#3CjNi66fJj z|AYC$5Ar~VZQz9)MInqE6D>dO+cbH6%SS&Cu69_PE6Pz`tYQpA=&L#%plJWxTa1g5$Rkalc=K?MJ)} z*bN4&Z*%qt+XDux;~wUPS8Vvts>~~P;8&%CIlD>DR}9;9Rma-hO-OQg5vR!M2{N4MM-%-qM4#TB zP9`||S*4PmF7X?`y;`n_Cwbyk_$!EErWgD9JOfy6uxB6nWFE;JTAX8@SG5yu=;H#bP{@loBSXVLVkO@lPisgtc%M zyI8bm5wT4mwnc_5E;?9Ni0ZrFCuWJnY@JgI&Eno*SnFzjC9QW7>z2g2%1I0X>q|9Q zR}1UN(A#AySlyP)`5}~bbjH?V5$*wszzLiWn;t}dCo>GX>@KG$l-ZtL0_|-EbztVNp6AQ+?;qo&)t;grA`?tza^F5lgb|%%6*jbmomT> zrwZaYvum+F&Z}W8f}NDsm9i4&4eL~89orM)LeXoO?zSdQS#6jcEfkH}orO)eP%Fbs zuizbtek%x}^?MomI*eC@aox1Azvw=WIl&z15P1J~1br-AF4x6i=! zyf`Qu=BT2vdy+}RME8>Mbg$|=kVXne{kB9undlb+ryJ~6qK{py@sSe0@xns~xR)60 zAqJD2oH{U3pCoZG2Yrv3=ahy+8@?!a%f!yTzXs(Z~F-4ZPkdf_k`j8uVH)#qy(5hV&Ui z(;K}@4yy-^VLPR`i+3_2U_EWqSK4CTSHq@L7(j4ZmsL(8n6cGPAv*cWslwe6>GHU6 z$$pjKd8u+$7&!CmvuI~keHPAIIo|q^W&3_N0%ILl%2UhZWFdWrLF+Ybj8gs{$&wL$9``=pa{;e=gr$}sKt{x{dEgQ`^@Cou|W zucEQSoykah*vSBzWeF|zgp-5HPaD4UHD;bveqJbhIC0s9xO|P^-#|FsvCEyRNN~Q{ zaIOmSgcGAqJ91qgJ8P-^FESH>2paZq< zkf$!#p$8p1(!h0_$0{6kn~`YEi9TIR+7ldYMyTZbNc=`;>-l*HF$e*J#js%+L~wL8 zRyi7J;ChOVB{=o-0Kr48;qdoz<>;}Sh#Nn@dxGE`0_$O%t8h%F7io#bPDKNl&u@xd zgLjEFYR+QLz;!>jH}Hlb z(mvh5^<*0^@d4KZ=$;>~3_`)aKdJBYh9mXf#9HiRHe~RAp3pCWscybciMuldFD3e+ zfKP%A%hygRxC>Menz}o$a5SOrnxzSAF}A%V>#hpNX8aFqI<4D@{s5vsN#gRg_#K3J zk{HAi{1Ydq5lp`?360+m)N!^r#Xtvk5c*C+A0YTZf>$UU)5iY^)9x-4{S<;n-YKiE zM+@F*V7X1=H>RI{rQkIT{s3oK1{?Spg^y7((32GH82DI)zwTtB*-An?K)TNVVDA9j~=#L=!8Kf#>BrgBO z)%H((GL(8%VFYsILYO>p)VFb z(Ert8O`uJi`GvJuKxh@(C|r-pRHOi=fR`J4%ydGku+A6yQ1HV<_Ne1pwc(Q?aSGdj- zedE?s;(_bmn$kpHWuW^><6ecU_ddc2a%l?J13~NS7EA#hEE*r8^yNSc+#oU(p~mrb zgOLi?lS?}qqwrzU|8@QQ6+XhiGZj9X;t=0@P!YPzbbu)epFj=Z_)&#VGVs%C$UbD? zGnD>R1Ahu|jDP*3R66j}${^b?$Wi!A1D~VtSq2_d_-q3&P+8u&X(f0==oJH_BGP^{<`1|6$L%t`~lpm2Rl zu4~y@_0z|OeyQ@m*1+?nemm=PgV?SNHW>IfPF4aeVTV|UpDZ#JGqIIs0)zp?w)6!c-8Lf8oBi~i7tBb8_LPAf9X`4#A}dysZAAa~C&^*ex7 zs0u~rqVYWvzK&mYGEyLmeNIja#97u_(!*3dZN1DXPGRlYF6RhpjaDq`?jf3Eocdma zj>fKpf?8vozFyYU{Xu7eSi=Z~haWguV9h>Q6ZEowuz>zp=Iu%iceq`Nl;+t6u0Nl- zz`*mPr2bk1*I&2WW8msTn*r;zLFg}P#;d16q;ZRkkpX-Lelb?!c?RxlEb$Ene%USY zlL99fEB%R2aX$q*I`BL2D1fC~sN8E@f5LN^f$L$q*1+{}|CZu-u^5pc9Y=)S9N>6M zd7f+k!mHE{iXzrzNuzwg(f&dvVy zH~j*`3_^dxFWbO}rAPw7x!Jd1w8}qy@_-n%;7UxQ6?(7hFx>I*B z>jzgZ|6tZ1c0t&=%5QOYAPP>>;WW9GGbkNSk2yg+J?C|Hz-h>Y*%tRa-^fWA!jfGN z&2|P20iF3ya0ocs;B3d;9;eP-U~vY1yELe=GvO|l%+5JMfa)aV$b5ZH*+9ZY9Bd;LqTlpYDF&_nbPlbal^U z((6`+pI;unpuMYGps3@CFi(dt%bF1PTj_}(A1acM`+ z?n0kUSVgXAixq77^Yn~bovk21X(=y6PE8NY8=1sX8lvXK^g!s~U7^!~lG9=Se34mt ze$V#*rz@s@?#~wvcc#qf7&+~;w9x6$_MaQ1rA&*NwoaZzgtn*6o1DZ_Q#xbhxcPTL z;{M!!w725&7QkW9pFg<0Ka`p@+@JrCZla3=p>1OC4{b-HPipA0KeSUpKl$g~hJi9d zX9TiQ_QS216#OU#Td1_!KW}Q%@Qit>Nf{ZTa^X7orYI2FF58+SS{yg8F{b*c$lH%S z0o^5P{*_J$e<+RnBJ1-$knlHS4^U_#I#D|=CUSv|k zbJ)u`6i@>Bqbz?YJ~WYk7TKw@m|JI)Zd6slMC>Ng{sdJb@tb-3LxbC&P3Mj3EU(in z6*{bOT4)ddyv`7NZ))6H(J?-D*%!C=K-}80(8#11-Ym+Ke92{5zRTO#)aGhJOl`0e zrf)Qa|9O&MVbkt|aFKjm)M%ez@+ZS=zS$FhYy~xon>ik0`Afcs4ieW@TIdW+!&(!3 zxm9dhbS_*05plB?@GDUr*j(N!`bpM>FNl87^#kMQqVI@oJhN(AuhdW_?-rBT;v9^% zFD~_xY+Q>gRaJ0Jg~25i1Cu+FKONKX_R3myu@7pAK1?ZzyGxv=&D5@PLZ*hQD)#+R zRRwrlUN(#)1m>T|Gzw0^<9y+h3bA9L=KPUKVgAr9gL*kHX$w^1ikmqa=Ku(&kM}2s zwP_Dv+|0v>(nX8|!;`tM0zDIWS-o;H*nkRp{_KYXbCP$I#)Diby!- z%j)(_9}NOrE9On4y?I%*C?Rg$B_8OLVa4YxdPy_g}nO?C9WD zBxH+1*FJ}&ELe5ID*9iBFwbBZ%?Y?2!p|d|k<`o&ZIAbdzNHfyW<}(*pt?g564gaw1 zWwxHb*Y0{uzr#9q^kH7y{s`O1=XDt8y8jUWt;1-Sb*R|iv4XJ$#okUI*KUxy4=%{u zZIN63xxYk;{;pWcZ*)KH8nlo9(BnGm$IE+;WYNXFZky*~uNH6XJ<<9=#1)+}FMKF}>GqZ^jjyz+l0A_Z|l33v1!Gp`&GJJ z4{hUz2aabOi~IRzF;|bB#oGsc!q}wZVCoqc`;Ya>aH=o&qCGku+9>|}Z z`FQiy@OXeljDjyVKG&5U6&vY`?g`j7UOBV3>v|aPII9V3%+qEKVdMC`SuNR1{QX&X zuuc5ztfuTR51*aP!nk*~?P*q9#IlCq4w7{ZijC|Bhdp`L>>g|)Uo?9t`;eE?GY|tZfnqswJm-5m%O+6ngb$wJr zRd=g?fxvTYR>2#F?x>T5?ocB5{h<*JpNxu4@WnQUHbPduXe%C=*LX>&K3mPd4z*^x z`PI-c){H+nw`F(&aL_+I6KD z>??zdUwUO7V-EMeI)oMS=U;u!buNnk{_4Fj-2(HMdy?v4V3=fLiL$J(;n-y{Yc^*K zY)@pIAgx%rv(6~C5%(^z)45{(iv3HmSDHwmufprXM8=rMlwMr$z%^6&l6byw!LRIP zo>TC!>#K(RRKe$LCNEt0F6+qy{5jA1W-`!t6|W=AVT|YDNBDD1{@GH(Vm`tlEH;Au zt|g!J+N({TY$fRy$~mOy{8qf)qOt5Tp1o*Dz!Db=jII)uDA8*Q$KJ$Js_-oe|C@xZ z0}4;(>~*`z*tQZLqS(`lUDcL%f4vK9#Is%>(tUDA$#zzvIzJ3%T|CRXO)0+YAw471HTPe@ znH6T;Ct*v?ed{3iEwMd^1q+j2HAb^1c=i&TuUHc4&Q%#Ick3)K1ZF=lg$8qpmo2du zz7Z)OxwRhlOspjl*29KF1mKvOYHM|BZti`<_SlMT3@Ks}L15pCXT4$b1#d*Uzc=D_ z;RWFLKFoDy)w0G5ubX~7c?qy7B20u80i#9B0A2}fnqq%4A`j(>Z$9VA6f9n~x0ZW( z(VI3u`DUa$;a0+WgqH&ozqEG!dIn=zPjUBBn-5$X*3g2LKu!K?)!(^qsm+4I&K8yn z`;M@m2>S&u1I;dRyj$3Bg{?&Ealy6jhJKi$Vv6M9IEH7vWqTSccCx`j@4jWTuEGuy z_8ws$74|t{=Lq|zuxo|=T-Y*UPYHWL*uR90;N{C~xKW@@6t?mQ!2s=sG7loZ8?7xKlgclWdh5IB%J0fhQu#EfuX|qUS-NGgb+gaE?!uo|BF6>xg zCkZ>1v$wmldE)p@VOI+Kp|D>FyGPigX!-fK8?y`Iyh_-*JaMJXnhM)S*xtep5_Xud z_X;}}EkC)kG2HvHx39p_vw{io>{VUaE4*-(9e5qC8SMFv-Q{!;cTYH6q40hNzFOhK z75)!(z5GW+-Yo1+VfPCAwXi=3`?Iir@Pc=`vN&Gyj?G#M+gaG&!rm$DC}AHJcABuc z!p;|VnXn%S`-!mIc=@|s1K+_t65DbhMYbiNX82i!H@#f~j>7*?_(yL^*BK;rA*Fv^)U`sf3l;mAV*iC~)<=r{L$N~@yG!AN21`IZqrhRA!lx*_ zk=3kp zhd}AJqOC3JnWMrbr4v+yXH^9KTr^GLFDU$PYS{kHv){8>NJO45>=I$$7j~ntn}yvW z>|S9{2zy4@OTsdqwZ>*qV0$#gyiT@}`RLnc2VMz$51#qH?HL50Dp6BmXfk;Yu=gqU ziorg@i{7`{6UC+PAFCBU{fVcZm|FaH(fy3qDXuE6_u;?7ic3F!!o^2_+K;(-`KNaA zx=*KsvnrlgVta>#%Ve;Ru-(_?sgKXWyi2Rzt zekdz~uOJF{*})xzr9Hft;MnFB%IlDUuU2>!!D*ZbSmLqhb}f~sRzr#N-lcAMKq}jX z*LYT`?dfUgS1SG8+*@k1k(_~jKjx7JQLVegvIE(-ZfZnu&9Q5HxVz| zw}%Oi(ezkcH}J`7wlMY00cv-W+-!;SLtna?pBH{zStK`5OlASG`e!b!F`!(e{#PdknAf%Ig5p)2zbc!5Iqn$v)WhxHsnRy|$;dVs&o% zs}1-N0&I8UyM_4rgzvB#d>=(N7$UwU#CH+F=@=Cm(dL5>md_15U&7XIf-eUwtgR%D zN}O-l-tRw}MUgj9204LGRatdBHxLW$==Hc3=eYMV(&R z?jycsB<572??&(-_d?A1ymFuId5>tkMDvl*>=2q$L__186Pg>S@iwUk&QLHf+Vg!C zj_t+IUAnz6nq{^pgRtm12R1AZaUZZ*B<40iweLh^;Vb2${kAusM4%(Gkl;Ot?^03k zI>PoO?8iK3za9Lh2DV(`nCSuHRYCOl7df5h`5N?AeGoyxIN!jg^)V9X@0Ph)eO`IM zX3cpSw6p^+1lvs@w+rM>f!rmK(E@o?Ad>_#RUj|&qOa`WJEX3UNnND`r_X^06t1t$ zU(}U;#K863`kMDHhh zI(>)Npnq869mO3O?;g71$BDyXg3rKoSq?8eXnWSzpt;7gu}Sci7#3_2y#m}d;9iBB zP3=YWw5j(J{ZXi+I&+EhKfZQ*CKKOdL^GEseq#sc6P89^TSMe61jp|sbdB3d99qjh zf)^8gmBc%WuGvqB#_Gd4cEQ^OZ^O&K!3kdkwl{Ylve^JU_6}2e^TN58#6fNbY*@ze z>_c|&`5M@K1Mh}uK;Z<(De{^?Eo&LU@e35)9cu`VUwml%zY>>otuGoJ0V1)Ofc z(?+zVs)KTQ;t@OWD)FMxmJysrTWv(spS?F>Zo!?zi$*&{a2l=Lh=#vXz;c=B=~bB2 zSn}BRgRto~_L4ZakGeeri3Z0+YesV4QJX!)GmqHpNuGVw_DoYstP~?og$+xH7lN_? zmEI*pgS?KmlHfjquftlrACnxuA?)TFy!LZ9cpW8PH1o5>3-ioSy>wNy=r7TtXkKy* zzD@7|4aIEH9lY|G4S%@K0y|P1j}^yHieva{9q=5UbKK54XhhI=h$9Ne`j5k=`{8>- zpP}wF*9ktD=;5pD6LwZz^<^67Nms!Z1WzSitrd>7)3vHA(IfYes=XJ_K7s8mI*w0W zg(u+4E<-s&DRX)Gal7AKgN;#a0m1Ji`MgE&A^ffrO@q4KA1DU1`Hpz3CmzU+R5ffT z_)((&hTwjJA5*x|6OU9~Bm`ZyJ2VAvD0)ih0qvr240IAUJ)jwez9(>4;5+^AY|mo` zJ6@93(>(J#J6K3!mII?>78zdpL)}ILU#X&PHE_KE?ly3}u~o;+v8~_Wx8vwD7F>%0h?^Fq6fj@MV@`q4$d@K-K}#Kj@^0+Hr)lU6P$j=Dk3-? zwoMAxxh1LGN+lkw9?wpSIBz&$Ff3PVz@wW>9uxf@Hl1igg8xA9K?=u&hQoKt)eZq( zP;LkBCT{N$w^_uE&Tog{nMA*o#5qRrZ-^dK-lCdaE^#^ZNX$^gIm1C;(ibsZ&s9>* zX;Mu%&pBnYc%BHh87~6cnrEJ}J?+(B_pt`5?=CbcLermUek3tR^YT-6)+3751G*j* zSY9Ds6>zS{VPOsW_lTZOq`yQa;k@j7+Y{ANgcdiovn1yIoc&;X#uAp+IF);WeZB@3 z{_^?*e%yrkf!BzJwsaZ6>16&u;n;S3iqvgfFS6Z8yy(<{zrvihSudV=8osJb05>SQ z_db-T*5jxNJd+?#O*Y@a+bOTb2Hsxb@Rt{;aW~e;?%?HM)4BUcJ1{O$3UKskkL4&_ z*Q+iyYrcW&Y~STYr|qow4OV;AZzXHNXb-@qd#RPevG$(`-ks=?OMneaAD;cA9ejd# z(Xp6D@WY_iwag?qZR0PbmN7(sf#6vCb=a_6k$6x{K02Jyt);*PJ9OA2Pp#exN9G2){;I^~hf(VA zXd6&L!9eF>(;b@23(wktHx#Sqpnib(&cNGa2q>owTiluqVwu8yzu1A73A++do&S7-W88!20_7b8KQ3Ww14i?1CG09-bhJYR zr_sK}481?qz(%S8LXV3iT0QPPXL|-HR<}z}%Hcc<*lgl^iTLL7f^&9YG4WkN*b?G( zncx=*PQSUohS5C3JAf1lX0jYM-Rh@#;;(k_pklEVbSe3P;1$Hn?g%GPP*3qRg8u=W zu4N*@=`G+niSrG=y1g@q<_hthN$?VabDjg4uTre;;gz7kvev*?OW0aZ@LGT^R`_Ou zW2=@be7k|`_+LwWQ1x?wuHce#z#!LP(_QeF5lCMcVZ7`&+Y_BE>(k9xqpEjvb{>B< zRtdHx_nx;sNlJ3O%@PtwLoA^+E-VQuyC?_+S z&^S{24O06AL$B+djP(XW28+Lj#quhNwhhj8UoEOZ|EB1TLeXRI5Z}Lu?;+9BZ;c2# zpVOkHKk>v$=<`mP!_6nT>+;l!=jE07Rk`nXn+@iLzuTU4Lz$|SnY;|x`wX_PV#o08 z-|fIg!cGN7w=t@-l;Jqmg8tCBP4MkRKZa*rusx3u7XRF;y`JL*7i{<~9oXP9rNO!M z1c|Vf`0gP19-@Di;D?AFXREI3M}pI(+>$?;k{<|{5r+s#h}9yTB;82ideZ9wXiD_7 zk=`2gy@=jociha>M+inLUQ7bvA}|9sEMM`G3%2)XgUyqqRky1=z;x+I*5|%Uwx_9L zaXf32x?1tH+X{to1!M{EbdF+aWb?5_d; zR^h0vL$bOeaenBM+tZ*MkWlpCt(2!$GhT2RelA4VcY)EFWDq=xL>|E_FWc~MC13*+ zhz74E?fX9jr@ntDIMvU=Xu-D#8%=8b7r|+?wFLi&)V`76*f07gBwrAG7SVqz@dw1L z-$jUX!~p{>fDOyF8t@4GI}{Y%(XYu<3w~~U1%5uLSd2vPn$5Ty*mj0*Ckz6m2QLJ6 zfWhkT<6)9rv4amAY@T$rULZBncC9eh?S!kE`3R zKJnncyj-2!5)w&#Ba@Ee7W3c+yAoC6Ux~LBRETeGj$v84mmK%Cq%fB&);711A zTIEnmaD3j{q`v0aPw-s8_2fQ8aO`P~pCmYDmZ0MQDslPu(0G#WB}|Le=Dt5|=H`jl z#IMc44nib2vAKsWITcLfWi@TlW30+J-tdM)qqbSIK6salsG?g&Fu*h4ZUKP z^YUwU;9bJvU0Zj=MuLluz_g+Ks&K^Wk<731O6Z5bcsBGy7%#YPd&R$Pfl9Z1B)UUs z*;DQ@LIV=Pi(c@H@vQ5%rytQYBpUdih#UA*9#lSpO7=J}0s9QkxnX;z6EFBFT6J4y z^P(Ge)Em-H!7mx->HA=erzozO=j zR^U@bV*vaJqHEkqaJrQ4HNxqSEnhFnfnGUouzJkCH*lTAPqIP3IR)7I%Z5sSz`7w- zO`M`y&$V9-&VXH>@BDa>Mcq z!C!%M9qxh*ccq4KRm2U$byDG?`(RLc6PO2k9j=~J5Dv-PibfZjT?;3tHnU?p67N?n zr++x>QkTm5IprW@0Vff6!yR`7>_&^w>>^!~jV<8m%u<@}xwcrA+3-rB&rVllbI6k1WatMu`p_l4e3P)@`Y`O;u zi2fsjuOT??fhJB?ENkqPL0!!2cw=EV#9_G0aIz5`Ex|ET@;J(EHdjjKOUWV$z9}W| zONXsevP(+#O36VfsgM$vQ;ESMoC4g%I+<~>Yv7c?nKM0>#XH^NSS0HwRfD8zg5!>7 zc5qgIXd4vWsh#Ah^^SpGSNMAh$L{J(Ccr^Mub)tk8MuyfQsVN@dR<7MGloN7;ILF0 zxUS%ef$IuxC>#^*O5#Th5aGlH@g@D;L9F9-!!+umc(X(9c6`uZo)N^Iwtt3`4K&LY zDmKR{MDcthR!`NIB~rXXh`p;wNSf(df`17~>zVnHNHn;~2#yyHmOl+#Kkr2PB##|J zSAxGOTsK(j>kpE8jq8WCCK7kf)Ptq1iy?}^D-X(Tj=Mf|KwpE_Pf>#%AJTqBV@kJ? zF&gG%BYnT&jSDrFN1Q^Wvkh9;JzWG3zCeOECBf$qH+o?&A~+^A5`3_{W8nHW{64|y zdh?;gZ~mg@Ar)vdali`nhov0^r-Akm9Q9*WoFfK4Ug0MR&gmbl&nW_f^ain>NG>O_ zAKgIZ2{LpG>QU(%Q>hNdUfhsEU-Hi8>n!&G$&yG5|+ypt4;?fHq| z$wZIbc-XMq=0Nl8tf7Ra;l?N&U1+%31n*C>ev8C;9ei|J|8%k;Ywup-HjucL6P$k0 z)6yw{>^$w$FjYB>gNR#K2mT~tvz|@??1Da`N+qhH3df0%M)2`O-;dzai9QT`^g>i< z;QHrq?@9dT1#%IBVOeiD{G#x!3di8LlZy8c{aWC3=ba^ZJm3vr!;*5R++)N1EC^q< zs(%|^qzJ4aKq^>H9FUtV{jC!<=+7AX@k-Bz$OC<8J%pziFw!aXFuOw|!aD%#hO|~V zO4BhfC(*;|j~Yr+yp2dQ2;P^3M0b5#OecCD(GPdBn!wZ;CwATm#Jd)Fi-cjHT?78C zQwHtu%&38WSwsyM5E^sRxA4UTe*<$>!}4#1qn2JwpAh||>+^3qSK^ax*v>apBOyoZyNG7P;~bwNMc z@il`>b2f3Kl@=IosiG3g`m6^1PD9^U=`YlvzajCPU-ao!v_n98n!V7&Va;LSAFhFZ z!tnwfoTg~(9eSb8Aox${HsJ>Xb> z^^1ozaYi{zH3I#t@aYEro5E)p_yvW(WZ-`&JP&>+FDPB{pNg1cI8-V86$7u8E`bFG z4j&a0VcCjS^kReFpyvEi1Fx_2D-3*)QwiaMO%=V`pkGjH>lyf270Ip ze%PRgIXh46BLcN8*KEdwh~aZ zrE&fKw{C`Bzc0>j;E$=*Yxw^gcOFk-ZWif0pTvf+IHx3u+3EVVb~6jmz?K4`qqk3Gzy zoD==nZ|uGed-}7kwOFQe!v}qMkBW@ZX+uUhod>};BiDT_##x-i;=RYzAFK1D)78n-3!cxG9B4gBT$5}$71Up18YhXy{=BXNBB zpIEDP1^Sha7Y&D=O{GKoFuB)y{mRBv1J|>3je+agzKh~`ulTN|3~YtpTEUa8uX|SHU6}mTxZn9l2=Vge2%)zR~Wdy z%r_aheudmY1J|#R`^Cxh!&=-v^450f*H$hzaQzlH`g$Rpe)=tL`ej0TO6s?`>6ZX$ zT)(F+wT`G)evU>`zm{#HB&r8OzmRQ)f$JBtoiuR$LbjNwTN|cd#g=pn4wFv5g>B$1 zgk|Zsu-#|i`Ymje4P3v4ZH|HK_pj|Y@YZRNApVZ=x!x=YaG>WqZF;na_VKUUTmNf$Y29pC)1s|8LWSulj)Ma$SYs4dCdPrI_EQ3 zW7o;1PSjnjzw6*oCmr_i)qm(NHh?8KrLc1?PIRK~1{7l54W|{YoVj>9&MC#ybpxEJ zVXS|xlR=A@yxPziH;lD+RRo>60K#3hbQlC0=+qewyWvg%cCN`U@vNbZoE5`adp5-> z1*p!7mt

_e0s4uT!yW@~do1NMNdv!U3Sr%z;y&7DqU@HMG=5ilPgBcYkd>4G@Q zZ!g*oQkqic1Y`?Mz5i0fv*NRC7&Tsg zh9btdhd)>zK^nMdg1HX2ndyE<;ZFO?pN9!`=dQ17??dy;CZVwQowwia4>Ny?xTEfD zpR}f6e3tohHp0c`v?kwW`GvLp`UPuly_E*;5d8Sd_ee&Gb0kG<|9?!#mx}lIMt$z* z>dy5^YYrx6nRhCC_4c%8E%z!VcQ>vQi2Koabq84;^=DP(cn3)Ch2{%=kI8KLaf~ff zeqp40_x$CJadG+Lh*b5k6$-@l)$* z>(!q+3xE7`@Snro3HLi@7twB%n41ZvAdN&yL$P&WoUe!4uolx#SznIj0Z-Uz@Wf9V z;Q2u65VluVvm70V{9LI+6e*XKAxLE@E_8CqF$(I+pS{91fECP?yBNRyi4MUGRc;g+ z3y*Y1iXe6uMA{%+?#x)Yz*xl?=QFF$Lt_`b@g{qp@NmRcFMyMLz2vT_gQqbc!& zwWI=<18|DJw^=E#b0ZSON|`(Xb;5tNIJKvE?##}%P59l!-_d!L>nlR={wCPiEPSO* zt7CA)NN3=13|ZZT;2oIo?rOpZ!va6%hY{)SIm0%d4Yu2c(x1_dk% zwG72FR9f0XDg`QKsDhR>N!v)9)Fx?*A{Gls3{{*E6&0_;+{p7KW z&x{Yeh+|WO+gtnOjSch)JSuOx1-IulRSt^5DXL?^Xt{2@Xbvtw?lD7o~0BOc7>;@CcnsAt?pD0(t^%X~Rh`x-5!++ER>9%9_zk>{dG z#=un$z~T8+P!rew0tF}x8s z;>@_X;foQ(I27gU5JKS>sd{0kh$YyI1rwHF<4kiYi1Ya@%OaG24%4J|+IR$WgZ1&b z!D<`}ktY4Q2FP&lJ7~ud7MJ_rE*pm{22DK>BE!pWMKmZ_8R1n(9LgICvfPFRBntA; zX=1Ul3o`S=gESq=3qLB+vMD5tVmw+zBC z4|OO_ct|vDQ9e2V3vI!il$P^QlCWAFG`SEP?OdR}VWG?t+=T<1h{;rhu=s*Z_*qC{ z56KN8Kk2R7uw8XOQ=UgVxDU!yE1-MKa{}sDA9NfQ(T{qDqTEHbU`xMRtHB7=Oe|FI zMoNmJ9V+qe?TCG3rpb<#6<>u{p2K+T0p@A{& z0UC;BiIvqWB@t1Cg3 z6{|!88Z*Zc%HIcx>(vvX)=TgRjEa{QC`PI7^>>6~{IjV`O-0sk+5Bbv5SdZ@2&9dSra2+u{y&v6+Wf|I0#Fg|H zu!l_RZYO!#|F@goR9p7FaNyHu27lU3dQ!42xalEp&J;Jj|3Jkhl(Y`0kmN_YI!<`<4i-4V;qSf$2S^55!)EruwF>9 zrR8G*B9xRSW4l#=%zhNxa>Q1K#GevtS(Xds$U!=J9!HE~@*UiU+eClQBc}T?O^(mE zn)Hh%-^?ku=#K_N;{)P=qqjcLR(g75{($ zW!kxAbZX87@?%D}7(k=#lIK-VA=y$i&SE}?Nfc`0e&{@#@c+C8d!CPM#|xKBU;#o6 zmgUr@Y=S3{>6tx<=`+#5Efcl0?J2Ki`9APrcNnEJH^VdMj1Zcr}735=@SzGfD zmWxg6Agt5asiyvK8{LVZqJW!4}$a7s7ZSCdU(DA69RvFG*=DO!OUzZD~}BwuZkzk)%O&c=*Q@ zz(YrMq##_~4~|2U;{d|v!cg=TIHVyJTlO1X#f!9Ybbd)F{m1tO*GB;16frD05Y}#x z+A#GZ?oWSj#d7Xf@y}5~m!*9t){v0ur$3EEMwl)j6%;u!VVX(0=qGoW;>#sHy73c& zC=HnZQI!9>5mALQcThNZJtv~=*&IewzvKsh?BGM3+l8ld;RlI1xLwp=8=Vk?1A%w~ ztB!^oiafz6E0lhi3=C!dycdytDm-xrJA7Uu8^eQ;Ryuux9&#N8Lay<>PON_??*?i9B(Wlv^lL?z7SWrB`q>?Pm>T z&Y^gFQ@lHKXvPV17Gf$;WDUjAX`bhG2~MS>Jd@F$&BVG{QNNg7!8j@>14tXrq_Mn2 z1C6HK7&&sZ{q$Whr^_=!6RinFO=U4^r(8=>4+5~)X4iGRHjPbJxP2D4v<2s}HuUr4 z0n8KNlTdxK^2Dd-!|25~ksAVL>IrbPf4rrM_6Oii1Ed%bpgB#rx<`>>$M_M=8F7q?$oru8nCRi+2?_vziLoWv_ zTC!&Bc>#@^DU-bo`yQ|;QVvXBsq;hZ|GE})1}D71_xGXj$!Kqfl9HQ3!}cb zBz75uBAN6(4o?icqiF4&Z@K1Y6cEeu zAMlqL9tK0p=eUtkZJe&0@cP4uYGj*t?r0-CMTD7cgk^1nbwsEEA^dmI-hPF1KstW2 zNu8>IWvw&+O;IAZXo)0|av8{_UrJ>1vxI2REwo>2U}t!Z1Vp+uV!$O>#YgWZ8MVE1PaK;|r{R(4MyyDhL=nA1{=Zc>ISslyyYNu~~a z88QGWi62~r?Zp3WN7R2Kt zyyM=Ey+UA-k<^HYl_>f%jQ(VZyd~!$kCO?8EyAl?@%~9M?n4O+p(tqU6H33B0@aD3 zq>Cs}I1KMgQ6MK}XHG60r|rziB7o2E1dIA(7f&!JxiQlZ`{`R{JLBr1E$FibeaXS8 zgMw50f$N5K)qc4Z=drEEXScK@K)&uZWHGIsXLuOZ6-Rbjzdn%a+-4?fgK(UQ6p~aiDtpFd?t~X4xSHVkQnra z2?+>3M~^`;#Jv6u0-2Wqg#QKQEwpRHwlrZlcrcNos<$6B#a=4erxN=Pu;)A8g^~h^ zO((1sb+PpdTT^|^4xG&t{J=K!-80cbV{y%J}6 z#1Er4e-kH0-n0^x9JaiQvpr2W3x4b$#PSQ)yS9*sApfueI&t4G`W&CSyQPeWV+WLU!YXLH#Yu z?nJNvyW6mA@fL!@6q{qduwp)0(TcAW{vx)r%C@2_8QhfFJ0ChTUxAZ*qAlq_`ppK? zX+%05Bg6mo0TDA&P^vg5wodFC>Q*2|m z_~UWFPK-YmFUFw?O+X*j`lFbIWI%(y^oD==gw_U$^F+)Yg7|7wPGP8L7Cm217Ks#7VQN`~JW?qL=a5O6&q8N-861k54`&R&l;WVe-wVw^U>Y#x zgrUj!cu3O}as^5!o=w4H?N$`dR`H`v#0daGVRY1DpEthCI#tBl_*XU7?F%DCnL^i9 z1?+Q!Ag{Wv{@@PZ0$nYiP!skVT5aqIz=o^UV4^zIII+8b7*a7+*ckDf!ee1v$aMQI zl;gr9X0Ej4)_g(|106wN4;x+f*1T(Zm7I4d+Dc?@U|Ttvk!<7;#5M!lcREhz}j}U zIKMEv@gq3+KzR3lbQyTF7Qyuh;-z)$n)wnk;j6H^hSTZg$Be}HRkupf)}6M{yo|8_ z9?Bw&()Wia9HeG|ob;1vyasiF@DP?M2*vEDL=_6;enVDa04F?+e6-2 z_%dtb(H?b{;AT4ICGvLjK-2R((AJtV+g0U2)c~1Qu=GY)ig&gGT`>6XO=_vk0>2%L zU9I1?vAqX%tp~|0Szs_ypA3~^RS&D*Um_C8i|<1MA9gpektCwZ?yzi8ihcugc$aJd z+O!=7k`_%uNq15xl=&WUou<_AdY)C^Hedy+W3s71dHY~@)3)uD?8#8V9;9TC5+0=F zt@}uh`H^%#<_;Kaw~aF`%SDyOI8-d`5%)7#R&RYD%Z1|I{&24=sV32|o>pMcgq)Ss zn~Zk96-K$EQT_Ke%b9p${!dUMFa)TV3H8tKEf*(zZlmdM@#gFoVqq)hoeBGZ!J@-1 z-xS+frl-M=T>;UWnr&w#Y=~0xGO4+X)sTXFSV6Ys#%*}&^eH|xn&gFmrFT-jkn{E* zgm0%IfGtx#*!Ky15(?W{A?CjXuI7*P>;5)7lv(pBK{><_r3=@ zvVX##E?Qu`4Wr~_JfE&zM?>T%)+0w-u7W5nO978@n0!(GIjQg4@Euo3eXUPrhb}6_ z7IH9a;k%KvrJsBf(X{ScF#{zz%tG;al*XCYyg`el!w@6oeMMB>7s;l(Uao)e?j70} z^aBoyAG26LcxGp5xI9@~lA<;oU1}SDR^a>4<#>L3B;4|W(EAB}x^pk_)$bLq ziA6Jj+gSh0bPFr}BP<(p`ZkBVEo%-ug=Pfv;1B&nMB!dS%}IOb`fM|D_5`#C4VU-T zEO#}xzJ^58KFMX&%Ap;De=sD+$M>+?P4;dpNaP@>*++K7`#+{AyC6y{y-{kNaHanZ z;ZVz_=3WhWhW;bwsFb6v&j>o+H66GEd?%xn(7BN~gfzShHJQe-wosiFh2-Zg$Rg+E zRFCj@{=>^eAccyJDV%`n#bbeZAi4%Kec;CCpsvC6Duggcxex$nm*HtD z@D~$;Isr0^0mAnzCA%^U2<0%PZw1(Vu$wLJ>M#IeC z!@!_vm{fHIVQol%DB)qjeJ}osmPnS=OHmzdjvx4WcLc=n^1Dcf=?7v@zm)!FmJ`0_ ze&A&z9aTY>enmsCs5-iA&;}sTG!7pNDO9jA07yt9K=@jC9bfWpdT`J|%92Me(=5AU`zhnUo_=R z#CmW3R-BoEGSvrX6yVSd4D7_ZSDJ<&wLTdXz-zq?IbyAZX3p}Z)7-JG*_MKjnsQ>L0on;5L-mtr@CnPzs=TIgP;4 zaGPRbJuNi8iWYqrdWd10Radd=d&>p8#M<@umie1;V|sWJdJC}Z7Uokg!%LKB?=7%Q z+Aa>m3NNK9g~HdAx#=u5RvU90a7bgJ?7gPf(~NURLGWkW=`bx2FP+kwAYOEC{Z1au z42x%@c!rx%8PUv5q(f2;QtHLCyKzL?PPJC9yMKuxDoV&Un?ruKB|ntAofg6TkE1<` z>~4JkUsZ^TvO9Lu$}bh659qH2Fu<09g^DSZg3Nt8TV^hbnASqebdnElwbBu2 z`d(6qf|vqglpiln@IeoCxztzQf^eB7e^CtacN+2y^CB_AYsqqulK47hb)UQkeM>R)@l2 zI2VtZ`?oY<>O@853n;)KVRLPdr3qeIKZ@71rRgpXNmI*UYMU!D&}Ubs!Ti+_Z@mMP zrSYc0kO}k*B@F}|J9h$B12IMm)lEP{PT!soV@rJ669Y=q{ue0GOU@Rr+PsMye$On< zw2N+NYg}e3)P!#h(D?lk!H(_!O_?^d9^sy(t|`+`;Rptl2(PCwopg%us}%kMVe-Kb zmJ8#cZ2?q-_kPB$k8B{n150=hoD*J&)!BiD#x81anDwDL&-61ex9-~N|rVlk%QZxorncwe1l~F zBB3r`+8%=*M|hN+jPxRP7buiErl>KqH`Hr>d{}${HDZ`E#t;x&V)kNliVsuV_tCb# z0ycCrqlND?pTb@EFlsZ#5s5U9?&E5V7AqqLW@Q1HVKVmydG$O~laGr|2hJ>VG<4}U=qmGHiYZTx_F zp!r77svqrtj7!SFy+|Xv+Q{3YNq9FuG=!e9!k)tzmM3T8lb7Rl@`tpg>zwgaElar%a6^S_?8j;AD7^O zAhIDB)*~Ap5+E}bAndM#Q}F&N7|JYOe80GNmt)P;Zphfl8jbGXDL0+5~Mx9Tx zE!b-ic7fT@qc*@H1)&!Ptpx0lf(#6}H-Bj*er$rl$KG45xxv?S(Ma~nMWy`^b8);K zwYTxG6`N%9_FA6)5GGq~&!BimXcgEt5UYIO+PWXW1|1p$7X*I~f4HA2EWJX#p#h(M zkA;h$oGNNR z4|XFq#CJOCR{{=ZLT}M!Q0rxI%uva>IuRv{z7uA}JdgBrlge1Wx#Dd=Bh-nI9!2TGkS^aLp3JAD`$uO)p+2mA&}2n}xrNxXNq zym?VdiyQ2;D7t(B0?~=a5XF`dH-tPz!OfppX~#+TZ;s7F8kg7x?i9I5N9lz7VhYB0uA3!fGye@scB-GsxZ0nu*%Gss?)*vub*4ezgk++K32=?vWG;so|b68a*9E!n{> z*rfPw;})cQKBXJl={#1n1GHo3NfN&c;vo~ABZW;emPcNtjoiU6EsrF902Cy1aq>mB zs5?^VN)oz62t64s1nc1JqjxKbn|OzzvzO zAsoI`)CaU89U?mqtw+Kf|2+kL|Se_MAv=)g(>y^b}3UW8dZC@m~{X$O7Z7n@LX2c=~X{T95#I@VO^ z+l~Eq@1V1@+MaETY2Ys4srq92UWtZ{<}9?)pI)rPHctPb3Fyn=o9+0X-VPjyu~i(E zkg~*=JNCCLJh_&q9bL+@m;Q?V{0BmDkQ^4ui3jMD8(P>4FOenZVu#hyMrz`7g9k+$ zpKHlGxcuuSXTkLTW9j9Ao11A!OkW(lc}x6mJoUifq%3zl;qNT;pHu0g$>6{}evyD$UnUoz z==T-{DXGU3beG;!fXuJJ7~YA(guYdyLXDpIh^Yx!tA9wybcGiv%9&6fbouG869>*w zA)!Mgg!wS${zc5yicNc_??I&L2Ob7|g~#lVWM%@lFtG3 z;zCq3sf`gjv^%p7Ov13OIO`MPSij_!6FmA{gAf^!c^-&c)i4vMVbY*0JNTrjH&W@h~Nzps50_M3zXz@<~Wz>xtoh zFJrGX8)mE@J)3R$&LLzXnFvlkZJZp(l6#dn@BE%j4<`5P|!3OV5jMH z{6*=<;*lu}LCgBn!DU)Rnq|6R+VcFvj8=Ij6D|=>r%kDWq)_?@QW?q|2eGiL zf_$XJevq>M17Z^RYK)X!%2}a66Y!lG13{%lf~mwhwOPk??B^p|p0$bEB$kjs^F=_J<>B?qk}hsKYL0oYtcuIMelrALv$wC?rv`j(V%176I+PZct z-2ZG>kq7A`q_%z}Mdfj)Y3n~g!Tyl&mDi&^-AQ>DO79`regG|OMx)V8&JaP-ft*|h;|^zohWIFcVItobAJuOoqXp*P%}1PxvKNaXh0+UFfmIN*$fl&IUzmeNAdk#|T-sfV_ z+_LK@aLfQ(%O-@--M93DAo{(7r-L2utU^k|u8E*&4MHtrh!{$Gj&$L`-monc+xiK# zz6kE{*H=MJNQh@P6Jj4B9tMIRV>g)|c(=1%qdj48cnw_LQuqs&WPY%m@^5NB#UKsQ zAO9Wqz;O>8_rP%v9QVL+4;=TvaSt5#z;O>8_rP%v9QVL+5B$%20ADc_k-BPXTs}w2 zsEncGtoa^?7qHb=6qCW!7qYjlIg{ch&f;DTAFudnik#+&F8g-D#~UFSRN<1`K?u6 zrwfuSq2gEkMtpU4x8Ln4x0b=WYPZumxWZ{Iv%4!@&T-bkz8;#R!d>aKB7IeE58`uL zodK8C@3s2ee^I+Ltd%ZLxxWI8UTdY-Q{F@4bUIyS_CTc{&NN6YoQ(YSB<8TSiwEDqmBa5wP40fEM1e8By+9(BO zF2AD!Y2>V7&w}Uevqv}x82Gu`>+!ir=gAih_6>H9N7jx*TohmZ*~bLB zX`JqHR=20tUJ3uoa&SrJVCOJvbtZXO{`^qxzRWewDh!~g+?P?lz|g_YdNNL>fJ#(Z zxzt1WJhIqYS0nQg{N8}SI^egK!F&yVo2RAB_YB3K8v5hHAF^|(R%NfO^g3iN*SMl? zeEu3|pgKDHUG;9t`Z_nV)aSSR13r=Q?zZ~SG53+E9B-h~={du1bwDv>{EM{VY^k@} z<)M@f_Kl6v5GE_D5ncMAlzPuztTD@e@0GG&a7D%bfA^H z{MB^AM3nYKQFW_xdz{`n)C0;iN{Gw{pUdN<)Rn@e3)}Kc)k25QZPiYm zm*&Br!S3;c-7__Z@)QJ+u{GW*tFOXUSt*tJT$R+`M0#@SMk~IOo^f^Y; zAI)DA@Hp&#H|So6BY;NBsf`}5rFa6Bl|wc7&{baJ4S1Ydsok-VgJAP{YuZd!1-8`g zbB!6@Lz{REMO7Ucy(*q6sVGHODt?0<^ml#_%{pzyoII;$Ey^pfTD3zfuE%vFt{ZTz z)()*%iR(7)(Aq}r&@C$v27YxA*D731xUSK*JgRMZ4552*g|tIAt;Ge&o4|3?O}Jjr z4qf{kuICYM0HpgD5nhK2GB-Vm>p@&sX@`Qi58kJ}0k+_JZOc8{7VI2~{#}emMQ7ll z0YP<*#r;%V4UB&pa3JV(5swN-LnRxHQ{g+Js_2Vw|LHXlylI{A{|uc8 zo#07t8fay>R2+e*u)Oy(RdY(j;kkl>3Rrn z&Gdl}|4&_KqdhnemmgON%102_6S(%_s)b#*<9Y*EE3Rg|fO8q%mwFGEvUeh0AX4Em zz!yi+2;ZCO7e?_Zeu5MS#hZ%jH`s6)_{bKD*M#dX+~0|NCG#ZoZvk${mF+m9jfWqv zV_)70NSoGuxEgV-z-Ch%_z<}j*CNQjjO%S&AL04}*LQsV0%(G63$8=|<<$@TXW$x* zE1PAf1J1)$!S{cpvlcwJ{|9^zg6B}>)eU*6!oP!VjiM3$eZD^}icj$qq&O(vBZz-Hu1Vk{TPR+7DWDwp zWw=)|i=pot;I4)33P&(*NhC5C7lq3J-@69o0M|(&l)Gyqk&#UjQaJirw<;1*S2X_r zw(tm~WA`mc=dJ(Gu2 zI2HKs;JIL*I68gIIT>Tejh}!QeKeslCN{2%scX0R?mc?;N-$dzd;jHxK1nB@l-yTp z?{{+l0jHd59eCR5g9Z;dBW38BXAK*kdUo1~k)!^**#AG`jzki*D=8_MW6L*OXoK9b zzXn3Z)1Mfvx#8g9qYYZ~!NWKo;EqV-7hE6W`UF=it{-q+@KGeP_rJW>V8aK=yvgvS zJ&{PpKD4d42>&!g3jf666ohv~;Z>X}{^voz23Jl&e&M7U*)wyo5+l|^G#{qa_EOC4 zeU)~PACozc-ztJur`P4Pdc0T)vSVqZhgRoumsc={3?IYdu+t=6%)x~sn#fkW>s^&J zuhpC`%;LO@axjOdiK2$(4}XDIPAoM?rQ7B4&lS^P&F#UGLy>N@%|Fl`zGpFRuDgq`S*9`6K zQn%-9Uxl17i)6BDSJVnlb&bpAbo;Zhismj2_+38D=hrY%O-mh%wXF8UI^DkNO8X+< zX!}lCMoH1EnfcSFXoD*Qn$!RSJaQiXj2J)C z20#}%W=1^%*?@G_AUp|>EYITB<@Fp|6q z0SQJ+kS@U(3C@uqLxPdyK?q1NT7q;5#z=6E1Q`S_)J{&&PQDVMbm^Hf0?Z(%Abk>~ zOE5-)Q4)*>m~p;jlOSD!F%pcDU^KvtnUYO{bP2{tFiL{a05hnTAW{j^B^V>YC;>#? zjo|VDsP0AnZeNj%KdW ztZOuLjV7+Xnn}Zo*(fvsE|+JNwg}5{-nvm}2m-E=ST`+4yJsJzITqPLq(&k=O|mkl zc6z!a-BDJiSOuqs^<=+GJKZ6EU=cqwPs2y1j}fc6NZZ6Q4(h7#3-}NXt*lw+4Y#{% zF9L8_9hG*UkAh{Qp`uW^wcO>!1BjYMbmy^p@HB!#Sl`C_??pYVZNGWLXIcGjKae2% z+k4sTTz7T~S(>^0>+YierhMQwWihwT|&DVK)l(F$@&n>koCFD~;> zMq51tOT>kEX5y;x@FFRmh`1JtCmP&q30KKAO8B+7$mP$UHph;v^o_HMWops-(~@rS z^xTde9{Pad9IVUwUHLiD%npIWnm(iyuQ-|Y5h7j0djT*RftSUi}htQU+O zSBs0pGA}r$d;RXRMOIfWikRSQ@1JzN9j%swqri;^QL=lT=Jj~TwRPT^BSwzH_`r>) z4t8HA7KB~n>;b>G0*^Dqov;?~K+|)Z8hag{-S~VNR!^mMxXXcs^5Jfz2`lr%9X`Le zy3{%?WUMR)kcD@7CISGe-{F^JC?!k6!=Qs}St{+O*0koUvIuC+H42G|VP<-ADbE5Hd;G5*82^lrdJnn0R9(au~1(Fdox`ivjxsHUg#rZUD>$d={`6@B_d~ zz(aryfWH9V1o-kzn0Et?z8U@jTn9L)H;OUf1i<;24;BMH1n39!u8Tyr0gnGG^7St$ zAAmN%mjD+4o^%iL3y{9SbuZvDz!w1Dy$|UD{B{HUcY>ys{sVde?*#M%p8O!n1K^c_ z+W_MqiA09=LH+^S0N;KLb_0F~xDN1@CnAwg0n465{v^R~fLVY;o@mbOVmwg7^Sm0o(>SZwLI8jDv@Ff*6A@H-|T88Ta;NlRkHp!fLUF;-t^0jf3%+{tZlgufrOxfnN6pI|6 z`U%$y@e^(+!t^7Y6}WqWQ{xZ9jRx)q;06#AeuT3D_bYJM35=$t0nP`mZUWZ02nRD) z#b%q6SHxwTt&LrB&1tc_dYG-iWUB;_9`gNIwBzL@gCF7U1#T5^HwujO8NKq_6Ycx? zu|WQr&lWfgeMWiQ1v(P5B9V>Isll4Y*w{@yq)RmvD{TXrjDZMQL2o1zFT+LPF2)VNL-8No~)o6tFLbYzt(IST@=}u~U^}WO_G{ zjX5aKWW%4OH!JScn9d3bL?__-5xRbbE*Hf+*_?PS+1y0sZ57$Pg34QC*VsZ~b$bch zy5rT?UbjMIG!~o&qVKCFdEu{Ib8>8H4|8I+@EYZPF?g!L^EmOq-srSZ-mlW-J^6VR zWLhCZbxb>t@}U^|wu&;a0kj`LJC$hoQMq^lxZi=hMPMXuH*iby@O+MOGtKeBU2jnRazbY<#t6@l&ht@z?lZ?z zyCfVeB;3Q<6(+JpT_&!(@4BOg7-7l_#c#V!X_Ho5aX|aLtM({b|>pv}@g>h5k49X{!gPWl10gQ!2 zyCLi2kLGyUCO-<=a*T%_0-rX;e2`p6GP{89hw;%U!lRB(=L$@=eG1wL(0=+){JbFU z?HGehrFhaXj@yTE*I5*gu+2@T2^$JPYXwbjLkj3LE{rYY_OXM{V=swzx=25GUEtO0 zA=;y$Ee1`z6^R^+eNrZr()lWAr(i6Y@aO5AV%}|y-EWZ23`!5ip$DKV4`qe&vy*mh zLF`|TZP>`hS&$9Sjzn%i7*t}!Q2#tN}A=?Vs%gKiJyv;Q)h@EM!$TnAJo9na9 z4Kdl~l`)gdt7DuXEHfhHMAsn9eW8-(J6%1I$c3mAf0{q*W8x-sHS(w&@6kLd(T{Nu z`z*RYi|Z0YgR!&CHVMy~XK*|6hxMd7ZcLZX$~E+mFCT=i%{eE?Lt=UQ=KK3(z+IUXg|b4(u1_dmYL&+A^0fp8Oykx#MrI9?~a`rRSTxj z_=EHu1b;R72eF9`kqrfi)ejSw$YNOGj&?JIreK5!Vbvee?EEAh0X$81X18oH6 z)m#3P{6xLF7saCUmP*!Bn%CcR4ca2~(SPDE^jR@+AIBN%OM{Bt(0A%;?291Vb>kpv zIGwt2C;6xgIs-doqWgpt;AxFvF7U;qE4q!c#!iXywJ4i5@HT>1lsDwp0`6B90KXb| zstY0?bIkEnr|N-k242lyI;m5IaSqf<-OPbxpM>nYH$)=+c&yclY*ySI$I4nEdl<4$ z+>H5(%=fI=Z$#csGTSDb3$HL|iTuafNbD_G!vH_oJWXc5nA4?!b{c3`kUV_S7>g!5 z?&KJA#bk5!WZ7m{nHS8D?xUTMS-2KsL)LdO>!bSy(4GJ-$nD@Cw-2$`8{~dmuNZUv zWb_x4(O*nPe=*s-7X8Nh7`M4vl<6?ydFQrBgdTHCyDt@1jK*yjROWwyb}iWuozI1F z=f#+dv&{>f=E92T9GBz036Pt5MkDF{5e=%;LgZlFI&~xBU>}^38$#4VtS_9xmW*4X?g^F`Uu1#isy_VKER%l>@e`vX6P z^<$bDpN254g-r$iQcC18bu=rsN>@jz?rea}%Db`N^q-WIM`L2YHz+7nzJG+S)%Qdq z!x5HcVWG%3N_QgG+3p67);&6u1#8?%F>1mC5~X7TcyGQp5=sB_ws4C1aGdZ}HDuOc z9q&xYYZqdkf|$vsmB4QRejVXOy^6h!j3OGX1*ZI+*9p*8*K$4)tr@fu&}NVvwc{9X zQ9DlU+CI>304;j#O86gvZ_?p2fbRvymB9DpeCd2#82d}d;UIhlSsP^M{sX5+BTPRl zuKB>N0#3}&xvfZBq*?}U|G^Uh&+7kV-iUE@%^$S?6z6W}oA_|_*q2&;%nEpIf_Q!e z&(=TSq4XrfQB$yfieZ%aQQt>vs+qw3%>MbqwhFecGa6Ju7nQZe(D(VHX!|Gz)ITx8 zwoWmpOfjd`n-e{p%_1*1fH&u{NaP~o#kvI6hvG&41HTgZsjLI;6>EV&Yy0r$Y0y%M z<}@eLT!+&3Bk->QkEL1hBi?wd>%IY;Skps0L*F!#f%NmErvi z|H1HKhL1Dc$nZIan;33kxP#$88NSZ&Erxp-e!y@)!$S-|XV}8~Phj&YO6~m5P*t_0?FsrSbh3hM5fW7*1n2 zlcBQXI6Urw;~qHff#V)H?t$YT_@DDYG55m@7^;3iZM4gKgF-}F<@pN_J9*uo-y^z4Uzcofs&$6{J|hO|#TMk(Zk z(6b);u{sUg?8R@vSP2!ro)f0*4)bPjdgMbt75^_0nI517>+gIY&+-wzSAIUs_j}oq zKlA-q#UQl*pa0V^t#gC$%BJ{DW;lmo8N*tJD;Ta}ct69940kZx!|-#4M;LZJU&eDH z!yydEFr3VA4#P5rwG3A^hU*RVK|xL9EN2KYZ%y16FGKRGbS1??|@P39H8SY@XhvDZ8k1*_7%<(fE z!f*`3$qeT(EMr*9a0SCP4DV;Sk>L)8dl-Js@Cd`Myq+YjIQH+#S+aeiziE@&`?1ar z=4e0T3yYGT-5NB9rU|7BB8qXsQEnO^>m-2 zvw)(b-w+a)DY{Nx(U&MX%iqF$ir&a{WsjbIwUTE!Jw2r8tl(Ci{_Ax5_4FH+Jj?0n zwEAJ3rC-sNe~$bK{oe-qm3=Wu(i3|9ir$s!%3pUeql&+$ zPF_#97|1JqCmP5r`pE|J%D&SKirIHzog+ zjy^*tzfnh5?U#~&T1PL^$v>l`tNuaBKdYn9)ydCfx+;J3n6B!-qN{mRsR3Qhqud5` zRe!1t=xW|rXFyl;*d+#ZHLqQ6Kv(5o-#@DKDZ0LYoTc;6DxH2sSN^%tfUf*=n*m+< z=WYYK^3MhXy7JE>26W}0jRtg;etrM0(x>S9{{4KNe_qt-S9Il{Z3cAZpH~d%%0F)z z(3OAQH=ry395kRS|9oLUSLxS}PgMF8T|Yi4()s5boqk1E{`r>yUHRu%1G@509Jjx! z{wn>-KRpcS%0Img=*mCI26UBv{rF17uju;mmGyUNscL^t)#*=Q|0(~RZa`Q1RsW;X z@6h>QKfch@_2UyoSN_$HKlF6{_(Rc^efsf-o~|E%$XNs4>EHzE#~*sSe*B^6%D?*Y zhn}tZ6pU>9WH&o|8MOX3b=P!z`^y}v@b9DOC zbov!t>DSK>6kX}p&kr`SepNos(dk!orGLBuUFFXt19}!mkZ(X&<*(3yZe{toI{HgG z`!6=2EBi|g=*oV#0bSW&Z9rG{*BQ{2{Y!N8W}W@Z4d}}LpaEUkzuJJV?7zi;uI#_l zfUfMnPe^s+huI$S-pey?d4CuB zeLD>3%D&fi^p|z^?J=M$`}P^om3^NY(3O2(8PJt|KkDfJ)Y+%+zhBYO_5I_kI=a69 zc}+*xx9_j(==%2c4IN$IzU|i0_3g`>I=a4ozonz=>(|>ly1snBqoeD~*Sk8pK7aS< z==$-|dpf#){IOR@*Z1%5>*)Ia^8+1S-+z6mqwD*ReLA|n{r*Tt*SDYhb##6EbwEeg zw;u;}bbbA$aV@R2^?eh6qJFBr5u~~`?=?x(kH1Min*OV<{*XM)-Ict4d``Z@3N0(Y~-UQQM)X|lGMSn#{SL+gL z9`eJ7DsDP+wS7N{nny&@Uy7!ydEELod8tR~&yly<`Hymdfui$cTCG5rkBY7yUmE4J zn#b$uO8!dr&xa3p9{iwTOdB~WZS+Xq-_nu0 z{f_dbi}oFBZO7AooLJ4Qb?1Hl1x!i;jKLey@AQ^As_dq1GK7C$hab#(X0x98tY;+i zH#2`9#*?|EXT1)e1w7gF80!&dMgm9ge-r-6c?jUAl1tkOVzhqR!8Ov(YC*;O34p}^ zHS>EIU&{D-Y@o8IlJQ=~4`u#(#;;|(gYgZF|Aq0qeMq|o3uhE>@MdlCNC1NATOWWQ_|DEgraaJU7?=XIcQ}X*H&^`i; z!HME)XGsOB-8jVjV_lMwx1(s^F@6=}GdSL#g`R#|)=d&oOpPmk;@Ldx*;Xd+Sxhs7 zjqJRY9rL&(i|zJ=pIRXigBX7b^FMrvL_EWIN+0o;i3373O`Kr}S~}w+RABH^)psJ} zAF7i0DH4ctLrKq%jDMc-DD+t;}j6b19GOF_6Wc9e*FjC+qn83Vf1g<#r&EqqQ=B7v@*yjAp#1(|@kQ*Dxo8DU9EJ zsYLW={RINwS6i*CzeUXd74xg~UdZ@n9ln(D+jRJaz<1Ukd4Z>VQT?LY4_e21w6)Ss zE8BTF^MB42k@_L}EoFR9e*Z_|uV#E2<9kbX?FQDrfc3|-e{N=e^?uPn=3mcv^?s4c z-}@PV3G466{0}m|k@2rH{u$t@oy_ve2-h>-4~66hH9p~HNZTs-(T}j58O$GxjjhE0 z0*_}Z7{80-9rTz)sCMsl#@iS#&PfBy7Hr6+erG`*`6=}$<6I8P11pP2uvTcmzfetu{CVa6+e#-c%>`W4pkcL$!*`_t1>zc^nF!2yil zN*x(~+$?G-j92fEnI%~}oAFb)AuMM6c*bvIyp8db8UN*WiI~9n*^KY?l0>L}wgh;} z-}PLN7BIh;`7hcm5#p>f1TPc({j|M0KU~fD-8%d&tfy|9)Wg+YyNmHdc1XN9&kVu) zSXTH5y3ZC(a@R`~-N) z-(?)HDi5?jT=ZW${MU?MrNjS=^{aW&DIyk};m&yVp56zt*lF>Ih{}(8zwmbEH#7d5 zHzeXF#-GIat9DDoFvg$Cc=bM`s;4Q8SL6Rt%s+zhYF?qn3F8^B-jC$wQk%qh^&X`- z9}K#l74-$JOSMeUdQMk9_^G^EXG?^YH|$SiJ;m=zLx!_G7chP~aDHh`Mb0d^+@PRZhJ36;eQtR6E*#Q|F2=c74|o9yQKJI zO`7%>_}@nZc>MAu(0U0x-$a2E4e)0e;4=*HGY#+#1AM>$f4RV$wd#AMk>X5O1cSi$ zMtT!<`En!U4|D&k`kmVh^gqPx{-ZQ{|X@LI;c(T8b z&i?O^kCb1D7sv>QaJ(^?*#CvY(V&mOo3(2zB$kKc+5q55|52SE&M?q3)&M`%0DqAI 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 #include #include +#include +#include #include "st.h" #include "win.h" @@ -2543,6 +2545,9 @@ tresize(int col, int row) int *bp; TCursor c; + if ( row < term.row || col < term.col ) + toggle_winmode(trt_kbdselect(XK_Escape, NULL, 0)); + if (col < 1 || row < 1) { fprintf(stderr, "tresize: error resizing to %dx%d\n", col, row); @@ -2668,3 +2673,220 @@ redraw(void) tfulldirt(); draw(); } + +void set_notifmode(int type, KeySym ksym) { + static char *lib[] = { " MOVE ", " SEL "}; + static Glyph *g, *deb, *fin; + static int col, bot; + + if ( ksym == -1 ) { + free(g); + col = term.col, bot = term.bot; + g = xmalloc(col * sizeof(Glyph)); + memcpy(g, term.line[bot], col * sizeof(Glyph)); + + } + else if ( ksym == -2 ) + memcpy(term.line[bot], g, col * sizeof(Glyph)); + + if ( type < 2 ) { + char *z = lib[type]; + for (deb = &term.line[bot][col - 6], fin = &term.line[bot][col]; deb < fin; z++, deb++) + deb->mode = ATTR_REVERSE, + deb->u = *z, + deb->fg = defaultfg, deb->bg = defaultbg; + } + else if ( type < 5 ) + memcpy(term.line[bot], g, col * sizeof(Glyph)); + else { + for (deb = &term.line[bot][0], fin = &term.line[bot][col]; deb < fin; deb++) + deb->mode = ATTR_REVERSE, + deb->u = ' ', + deb->fg = defaultfg, deb->bg = defaultbg; + term.line[bot][0].u = ksym; + } + + term.dirty[bot] = 1; + drawregion(0, bot, col, bot + 1); +} + +void select_or_drawcursor(int selectsearch_mode, int type) { + int done = 0; + + if ( selectsearch_mode & 1 ) { + selextend(term.c.x, term.c.y, type, done); + xsetsel(getsel()); + } + else + xdrawcursor(term.c.x, term.c.y, term.line[term.c.y][term.c.x], + term.ocx, term.ocy, term.line[term.ocy][term.ocx]); +} + +void search(int selectsearch_mode, Rune *target, int ptarget, int incr, int type, TCursor *cu) { + Rune *r; + int i, bound = (term.col * cu->y + cu->x) * (incr > 0) + incr; + + for (i = term.col * term.c.y + term.c.x + incr; i != bound; i += incr) { + for (r = target; r - target < ptarget; r++) { + if ( *r == term.line[(i + r - target) / term.col][(i + r - target) % term.col].u ) { + if ( r - target == ptarget - 1 ) break; + } else { + r = NULL; + break; + } + } + if ( r != NULL ) break; + } + + if ( i != bound ) { + term.c.y = i / term.col, term.c.x = i % term.col; + select_or_drawcursor(selectsearch_mode, type); + } +} + +int trt_kbdselect(KeySym ksym, char *buf, int len) { + static TCursor cu; + static Rune target[64]; + static int type = 1, ptarget, in_use; + static int sens, quant; + static char selectsearch_mode; + int i, bound, *xy; + + + if ( selectsearch_mode & 2 ) { + if ( ksym == XK_Return ) { + selectsearch_mode ^= 2; + set_notifmode(selectsearch_mode, -2); + if ( ksym == XK_Escape ) ptarget = 0; + return 0; + } + else if ( ksym == XK_BackSpace ) { + if ( !ptarget ) return 0; + term.line[term.bot][ptarget--].u = ' '; + } + else if ( len < 1 ) { + return 0; + } + else if ( ptarget == term.col || ksym == XK_Escape ) { + return 0; + } + else { + utf8decode(buf, &target[ptarget++], len); + term.line[term.bot][ptarget].u = target[ptarget - 1]; + } + + if ( ksym != XK_BackSpace ) + search(selectsearch_mode, &target[0], ptarget, sens, type, &cu); + + term.dirty[term.bot] = 1; + drawregion(0, term.bot, term.col, term.bot + 1); + return 0; + } + + switch ( ksym ) { + case -1 : + in_use = 1; + cu.x = term.c.x, cu.y = term.c.y; + set_notifmode(0, ksym); + return MODE_KBDSELECT; + case XK_s : + if ( selectsearch_mode & 1 ) + selclear(); + else + selstart(term.c.x, term.c.y, 0); + set_notifmode(selectsearch_mode ^= 1, ksym); + break; + case XK_t : + selextend(term.c.x, term.c.y, type ^= 3, i = 0); /* 2 fois */ + selextend(term.c.x, term.c.y, type, i = 0); + break; + case XK_slash : + case XK_KP_Divide : + case XK_question : + ksym &= XK_question; /* Divide to slash */ + sens = (ksym == XK_slash) ? -1 : 1; + ptarget = 0; + set_notifmode(15, ksym); + selectsearch_mode ^= 2; + break; + case XK_Escape : + if ( !in_use ) break; + selclear(); + case XK_Return : + set_notifmode(4, ksym); + term.c.x = cu.x, term.c.y = cu.y; + select_or_drawcursor(selectsearch_mode = 0, type); + in_use = quant = 0; + return MODE_KBDSELECT; + case XK_n : + case XK_N : + if ( ptarget ) + search(selectsearch_mode, &target[0], ptarget, (ksym == XK_n) ? -1 : 1, type, &cu); + break; + case XK_BackSpace : + term.c.x = 0; + select_or_drawcursor(selectsearch_mode, type); + break; + case XK_dollar : + term.c.x = term.col - 1; + select_or_drawcursor(selectsearch_mode, type); + break; + case XK_Home : + term.c.x = 0, term.c.y = 0; + select_or_drawcursor(selectsearch_mode, type); + break; + case XK_End : + term.c.x = cu.x, term.c.y = cu.y; + select_or_drawcursor(selectsearch_mode, type); + break; + case XK_Page_Up : + case XK_Page_Down : + term.c.y = (ksym == XK_Prior ) ? 0 : cu.y; + select_or_drawcursor(selectsearch_mode, type); + break; + case XK_exclam : + term.c.x = term.col >> 1; + select_or_drawcursor(selectsearch_mode, type); + break; + case XK_asterisk : + case XK_KP_Multiply : + term.c.x = term.col >> 1; + case XK_underscore : + term.c.y = cu.y >> 1; + select_or_drawcursor(selectsearch_mode, type); + break; + default : + if ( ksym >= XK_0 && ksym <= XK_9 ) { /* 0-9 keyboard */ + quant = (quant * 10) + (ksym ^ XK_0); + return 0; + } + else if ( ksym >= XK_KP_0 && ksym <= XK_KP_9 ) { /* 0-9 numpad */ + quant = (quant * 10) + (ksym ^ XK_KP_0); + return 0; + } + else if ( ksym == XK_k || ksym == XK_h ) + i = ksym & 1; + else if ( ksym == XK_l || ksym == XK_j ) + i = ((ksym & 6) | 4) >> 1; + else if ( (XK_Home & ksym) != XK_Home || (i = (ksym ^ XK_Home) - 1) > 3 ) + break; + + xy = (i & 1) ? &term.c.y : &term.c.x; + sens = (i & 2) ? 1 : -1; + bound = (i >> 1 ^ 1) ? 0 : (i ^ 3) ? term.col - 1 : term.bot; + + if ( quant == 0 ) + quant++; + + if ( *xy == bound && ((sens < 0 && bound == 0) || (sens > 0 && bound > 0)) ) + break; + + *xy += quant * sens; + if ( *xy < 0 || ( bound > 0 && *xy > bound) ) + *xy = bound; + + select_or_drawcursor(selectsearch_mode, type); + } + quant = 0; + return 0; +} diff --git a/st.h b/st.h index fd3b0d8..046cb51 100644 --- a/st.h +++ b/st.h @@ -110,6 +110,7 @@ size_t utf8encode(Rune, char *); void *xmalloc(size_t); void *xrealloc(void *, size_t); char *xstrdup(const char *); +int trt_kbdselect(KeySym, char *, int); /* config.h globals */ extern char *utmp; diff --git a/st.o b/st.o new file mode 100644 index 0000000000000000000000000000000000000000..1162a7ec5dd2a39304840ce6b631e2ab1c624af6 GIT binary patch literal 88152 zcmeF4d3+RA_UNmV1_FjuR74aQTTPS*BFG{wC~0Vu7eB;1OfyR9Y9A>R5q7xS{6|jLFjkRz4s(1mz4hA`@GNRy+5oEov!-U zsdLXg_uRFrn#v)8%Tin}gEp6OsnK{u)G!_$)kt#%&NWUpPBMJ2UBD_P$*O?1f99*AkE=-+gQ6yo1{J!hZVs#wNqKB-zR^Cg;?*I+`?$#rS7Y3JA|SjC@jO_y%M?Qfn@(g@jV; zYEF$DuAIDi5gK0S`>XF7-_^d+SC6tHKlZciP*z%={b{~c|<6ml-0ppIxzOrv1HP& z3)B>6b;yejNkT4DCs*V}j=Cll=0$#UO&YrdEeS-YWqFqGXz4ST4(J}RkHr?lWv%P1 z2w)>T+={Gn4fB2nDdm}$t+KqU%0KbF50@DM?=JJM3CUy<4NJ2-1nk|GT_0NmR}Zs) zj1Pk|LVset?|n=s-XBOFoaqJMG1O2a%EStS2H|C^rrlvHxW-z(&3(Y%X1^=kzPfhC zNtSDE9-B7A3Vv=y z-49_}IpCJSg)Y#YqEf4Or=VF-GH%PeCLFI@igJniW%yNnVCoz4_`N!%w=5~n#45r3 zI!oEE47a8Iw#ZPV4{C77R-&M}P{iMXb|egEEW6aiN?=nsj$a9(Mqq2BwZm_9bP3^!^QSz zR?ccG+WSqAZg1v@{KM|e>E?-@g?1rO6MC~9q*F8PZ<(=u5EykT-ZSlKS?QL&-~PmB zud{;63ZZ1?w3N|CxT}3A67xk4T{8JhyH-^^t7gCot2!AnF~HLoyCIp_!rvgKg1
EN`2nd)7RSvC0;C1b#lgN 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 Gi2nzstate) || + (XK_Shift_L | XK_Shift_R) & e->state ) + win.mode ^= trt_kbdselect(ksym, buf, len); + return; + } + /* 1. shortcuts */ for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { if (ksym == bp->keysym && match(bp->mod, e->state)) { @@ -2027,6 +2034,14 @@ usage(void) " [stty_args ...]\n", argv0, argv0); } +void toggle_winmode(int flag) { + win.mode ^= flag; +} + +void keyboard_select(const Arg *dummy) { + win.mode ^= trt_kbdselect(-1, NULL, 0); +} + int main(int argc, char *argv[]) { diff --git a/x.o b/x.o new file mode 100644 index 0000000000000000000000000000000000000000..76f5cf3262acdfa7d8e8d6c8161b025107608b4b GIT binary patch literal 75288 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 Date: Mon, 26 Jun 2023 10:16:41 +0100 Subject: [PATCH 2/8] wide glyphs --- patches/st-font2-0.8.5.diff | 163 ++++++++++++++ ...t-glyph-wide-support-20220411-ef05519.diff | 206 ++++++++++++++++++ st | Bin 110368 -> 110248 bytes st.h | 6 + x.c | 126 +++++------ x.o | Bin 75288 -> 75008 bytes 6 files changed, 438 insertions(+), 63 deletions(-) create mode 100644 patches/st-font2-0.8.5.diff create mode 100644 patches/st-glyph-wide-support-20220411-ef05519.diff diff --git a/patches/st-font2-0.8.5.diff b/patches/st-font2-0.8.5.diff new file mode 100644 index 0000000..9b22b8a --- /dev/null +++ b/patches/st-font2-0.8.5.diff @@ -0,0 +1,163 @@ +From 1635e04d3643dd4caa0c7c2043b585c6d7e4705f Mon Sep 17 00:00:00 2001 +From: Rizqi Nur Assyaufi +Date: Mon, 18 Jul 2022 01:15:45 +0800 +Subject: [PATCH] [st][patch][font2] Add patch for st-0.8.5 + +--- + config.def.h | 6 +++ + x.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 107 insertions(+) + +diff --git a/config.def.h b/config.def.h +index 91ab8ca..717b2f0 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -6,6 +6,12 @@ + * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html + */ + static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; ++/* Spare fonts */ ++static char *font2[] = { ++/* "Inconsolata for Powerline:pixelsize=12:antialias=true:autohint=true", */ ++/* "Hack Nerd Font Mono:pixelsize=11:antialias=true:autohint=true", */ ++}; ++ + static int borderpx = 2; + + /* +diff --git a/x.c b/x.c +index 8a16faa..220fc4f 100644 +--- a/x.c ++++ b/x.c +@@ -157,6 +157,8 @@ static void xhints(void); + static int xloadcolor(int, const char *, Color *); + static int xloadfont(Font *, FcPattern *); + static void xloadfonts(const char *, double); ++static int xloadsparefont(FcPattern *, int); ++static void xloadsparefonts(void); + static void xunloadfont(Font *); + static void xunloadfonts(void); + static void xsetenv(void); +@@ -306,6 +308,7 @@ zoomabs(const Arg *arg) + { + xunloadfonts(); + xloadfonts(usedfont, arg->f); ++ xloadsparefonts(); + cresize(0, 0); + redraw(); + xhints(); +@@ -1034,6 +1037,101 @@ xloadfonts(const char *fontstr, double fontsize) + FcPatternDestroy(pattern); + } + ++int ++xloadsparefont(FcPattern *pattern, int flags) ++{ ++ FcPattern *match; ++ FcResult result; ++ ++ match = FcFontMatch(NULL, pattern, &result); ++ if (!match) { ++ return 1; ++ } ++ ++ if (!(frc[frclen].font = XftFontOpenPattern(xw.dpy, match))) { ++ FcPatternDestroy(match); ++ return 1; ++ } ++ ++ frc[frclen].flags = flags; ++ /* Believe U+0000 glyph will present in each default font */ ++ frc[frclen].unicodep = 0; ++ frclen++; ++ ++ return 0; ++} ++ ++void ++xloadsparefonts(void) ++{ ++ FcPattern *pattern; ++ double sizeshift, fontval; ++ int fc; ++ char **fp; ++ ++ if (frclen != 0) ++ die("can't embed spare fonts. cache isn't empty"); ++ ++ /* Calculate count of spare fonts */ ++ fc = sizeof(font2) / sizeof(*font2); ++ if (fc == 0) ++ return; ++ ++ /* Allocate memory for cache entries. */ ++ if (frccap < 4 * fc) { ++ frccap += 4 * fc - frccap; ++ frc = xrealloc(frc, frccap * sizeof(Fontcache)); ++ } ++ ++ for (fp = font2; fp - font2 < fc; ++fp) { ++ ++ if (**fp == '-') ++ pattern = XftXlfdParse(*fp, False, False); ++ else ++ pattern = FcNameParse((FcChar8 *)*fp); ++ ++ if (!pattern) ++ die("can't open spare font %s\n", *fp); ++ ++ if (defaultfontsize > 0) { ++ sizeshift = usedfontsize - defaultfontsize; ++ if (sizeshift != 0 && ++ FcPatternGetDouble(pattern, FC_PIXEL_SIZE, 0, &fontval) == ++ FcResultMatch) { ++ fontval += sizeshift; ++ FcPatternDel(pattern, FC_PIXEL_SIZE); ++ FcPatternDel(pattern, FC_SIZE); ++ FcPatternAddDouble(pattern, FC_PIXEL_SIZE, fontval); ++ } ++ } ++ ++ FcPatternAddBool(pattern, FC_SCALABLE, 1); ++ ++ FcConfigSubstitute(NULL, pattern, FcMatchPattern); ++ XftDefaultSubstitute(xw.dpy, xw.scr, pattern); ++ ++ if (xloadsparefont(pattern, FRC_NORMAL)) ++ die("can't open spare font %s\n", *fp); ++ ++ FcPatternDel(pattern, FC_SLANT); ++ FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); ++ if (xloadsparefont(pattern, FRC_ITALIC)) ++ die("can't open spare font %s\n", *fp); ++ ++ FcPatternDel(pattern, FC_WEIGHT); ++ FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); ++ if (xloadsparefont(pattern, FRC_ITALICBOLD)) ++ die("can't open spare font %s\n", *fp); ++ ++ FcPatternDel(pattern, FC_SLANT); ++ FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN); ++ if (xloadsparefont(pattern, FRC_BOLD)) ++ die("can't open spare font %s\n", *fp); ++ ++ FcPatternDestroy(pattern); ++ } ++} ++ + void + xunloadfont(Font *f) + { +@@ -1131,6 +1229,9 @@ xinit(int cols, int rows) + usedfont = (opt_font == NULL)? font : opt_font; + xloadfonts(usedfont, 0); + ++ /* spare fonts */ ++ xloadsparefonts(); ++ + /* colors */ + xw.cmap = XDefaultColormap(xw.dpy, xw.scr); + xloadcols(); +-- +2.37.1 + diff --git a/patches/st-glyph-wide-support-20220411-ef05519.diff b/patches/st-glyph-wide-support-20220411-ef05519.diff new file mode 100644 index 0000000..f88c5ee --- /dev/null +++ b/patches/st-glyph-wide-support-20220411-ef05519.diff @@ -0,0 +1,206 @@ +From 68de38fadd04f2f454bceccea0fccc8276b635cb Mon Sep 17 00:00:00 2001 +From: wael <40663@protonmail.com> +Date: Mon, 11 Apr 2022 16:45:49 +0300 +Subject: [PATCH] add glyph wide support patch + +--- + st.h | 6 +++ + x.c | 134 +++++++++++++++++++++++++++++------------------------------ + 2 files changed, 73 insertions(+), 67 deletions(-) + +diff --git a/st.h b/st.h +index 519b9bd..4f74621 100644 +--- a/st.h ++++ b/st.h +@@ -36,6 +36,12 @@ enum glyph_attribute { + ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT, + }; + ++enum drawing_mode { ++ DRAW_NONE = 0, ++ DRAW_BG = 1 << 0, ++ DRAW_FG = 1 << 1, ++}; ++ + enum selection_mode { + SEL_IDLE = 0, + SEL_EMPTY = 1, +diff --git a/x.c b/x.c +index 2a3bd38..d60df52 100644 +--- a/x.c ++++ b/x.c +@@ -142,7 +142,7 @@ typedef struct { + + static inline ushort sixd_to_16bit(int); + static int xmakeglyphfontspecs(XftGlyphFontSpec *, const Glyph *, int, int, int); +-static void xdrawglyphfontspecs(const XftGlyphFontSpec *, Glyph, int, int, int); ++static void xdrawglyphfontspecs(const XftGlyphFontSpec *, Glyph, int, int, int, int); + static void xdrawglyph(Glyph, int, int); + static void xclear(int, int, int, int); + static int xgeommasktogravity(int); +@@ -1372,7 +1372,7 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x + } + + void +-xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y) ++xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y, int dmode) + { + int charlen = len * ((base.mode & ATTR_WIDE) ? 2 : 1); + int winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, +@@ -1463,47 +1463,40 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i + if (base.mode & ATTR_INVISIBLE) + fg = bg; + +- /* Intelligent cleaning up of the borders. */ +- if (x == 0) { +- xclear(0, (y == 0)? 0 : winy, borderpx, +- winy + win.ch + +- ((winy + win.ch >= borderpx + win.th)? win.h : 0)); +- } +- if (winx + width >= borderpx + win.tw) { +- xclear(winx + width, (y == 0)? 0 : winy, win.w, +- ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch))); +- } +- if (y == 0) +- xclear(winx, 0, winx + width, borderpx); +- if (winy + win.ch >= borderpx + win.th) +- xclear(winx, winy + win.ch, winx + width, win.h); +- +- /* Clean up the region we want to draw to. */ +- XftDrawRect(xw.draw, bg, winx, winy, width, win.ch); +- +- /* Set the clip region because Xft is sometimes dirty. */ +- r.x = 0; +- r.y = 0; +- r.height = win.ch; +- r.width = width; +- XftDrawSetClipRectangles(xw.draw, winx, winy, &r, 1); +- +- /* Render the glyphs. */ +- XftDrawGlyphFontSpec(xw.draw, fg, specs, len); +- +- /* Render underline and strikethrough. */ +- if (base.mode & ATTR_UNDERLINE) { +- XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent * chscale + 1, +- width, 1); +- } +- +- if (base.mode & ATTR_STRUCK) { +- XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent * chscale / 3, +- width, 1); +- } +- +- /* Reset clip to none. */ +- XftDrawSetClip(xw.draw, 0); ++ if (dmode & DRAW_BG) { ++ /* Intelligent cleaning up of the borders. */ ++ if (x == 0) { ++ xclear(0, (y == 0)? 0 : winy, borderpx, ++ winy + win.ch + ++ ((winy + win.ch >= borderpx + win.th)? win.h : 0)); ++ } ++ if (winx + width >= borderpx + win.tw) { ++ xclear(winx + width, (y == 0)? 0 : winy, win.w, ++ ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch))); ++ } ++ if (y == 0) ++ xclear(winx, 0, winx + width, borderpx); ++ if (winy + win.ch >= borderpx + win.th) ++ xclear(winx, winy + win.ch, winx + width, win.h); ++ /* Fill the background */ ++ XftDrawRect(xw.draw, bg, winx, winy, width, win.ch); ++ } ++ ++ if (dmode & DRAW_FG) { ++ /* Render the glyphs. */ ++ XftDrawGlyphFontSpec(xw.draw, fg, specs, len); ++ ++ /* Render underline and strikethrough. */ ++ if (base.mode & ATTR_UNDERLINE) { ++ XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent + 1, ++ width, 1); ++ } ++ ++ if (base.mode & ATTR_STRUCK) { ++ XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent / 3, ++ width, 1); ++ } ++ } + } + + void +@@ -1513,7 +1506,7 @@ xdrawglyph(Glyph g, int x, int y) + XftGlyphFontSpec spec; + + numspecs = xmakeglyphfontspecs(&spec, &g, 1, x, y); +- xdrawglyphfontspecs(&spec, g, numspecs, x, y); ++ xdrawglyphfontspecs(&spec, g, numspecs, x, y, DRAW_BG | DRAW_FG); + } + + void +@@ -1648,32 +1641,39 @@ xstartdraw(void) + void + xdrawline(Line line, int x1, int y1, int x2) + { +- int i, x, ox, numspecs; ++ int i, x, ox, numspecs, numspecs_cached; + Glyph base, new; +- XftGlyphFontSpec *specs = xw.specbuf; +- +- numspecs = xmakeglyphfontspecs(specs, &line[x1], x2 - x1, x1, y1); +- i = ox = 0; +- for (x = x1; x < x2 && i < numspecs; x++) { +- new = line[x]; +- if (new.mode == ATTR_WDUMMY) +- continue; +- if (selected(x, y1)) +- new.mode ^= ATTR_REVERSE; +- if (i > 0 && ATTRCMP(base, new)) { +- xdrawglyphfontspecs(specs, base, i, ox, y1); +- specs += i; +- numspecs -= i; +- i = 0; +- } +- if (i == 0) { +- ox = x; +- base = new; ++ XftGlyphFontSpec *specs; ++ ++ numspecs_cached = xmakeglyphfontspecs(xw.specbuf, &line[x1], x2 - x1, x1, y1); ++ ++ /* Draw line in 2 passes: background and foreground. This way wide glyphs ++ won't get truncated (#223) */ ++ for (int dmode = DRAW_BG; dmode <= DRAW_FG; dmode <<= 1) { ++ specs = xw.specbuf; ++ numspecs = numspecs_cached; ++ i = ox = 0; ++ for (x = x1; x < x2 && i < numspecs; x++) { ++ new = line[x]; ++ if (new.mode == ATTR_WDUMMY) ++ continue; ++ if (selected(x, y1)) ++ new.mode ^= ATTR_REVERSE; ++ if (i > 0 && ATTRCMP(base, new)) { ++ xdrawglyphfontspecs(specs, base, i, ox, y1, dmode); ++ specs += i; ++ numspecs -= i; ++ i = 0; ++ } ++ if (i == 0) { ++ ox = x; ++ base = new; ++ } ++ i++; + } +- i++; ++ if (i > 0) ++ xdrawglyphfontspecs(specs, base, i, ox, y1, dmode); + } +- if (i > 0) +- xdrawglyphfontspecs(specs, base, i, ox, y1); + } + + void +-- +2.35.1 + diff --git a/st b/st index 7d1fc907aee8d3872957071a317661611847deb6..4f1378946f2aa458a9c28df64f36f2b25887fb55 100755 GIT binary patch delta 28044 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 Z`$9bqTgARe*6sAM;v= borderpx + win.th)? win.h : 0)); - } - if (winx + width >= borderpx + win.tw) { - xclear(winx + width, (y == 0)? 0 : winy, win.w, - ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch))); - } - if (y == 0) - xclear(winx, 0, winx + width, borderpx); - if (winy + win.ch >= borderpx + win.th) - xclear(winx, winy + win.ch, winx + width, win.h); + if (dmode & DRAW_BG) { + /* Intelligent cleaning up of the borders. */ + if (x == 0) { + xclear(0, (y == 0)? 0 : winy, borderpx, + winy + win.ch + + ((winy + win.ch >= borderpx + win.th)? win.h : 0)); + } + if (winx + width >= borderpx + win.tw) { + xclear(winx + width, (y == 0)? 0 : winy, win.w, + ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch))); + } + if (y == 0) + xclear(winx, 0, winx + width, borderpx); + if (winy + win.ch >= borderpx + win.th) + xclear(winx, winy + win.ch, winx + width, win.h); + /* Fill the background */ + XftDrawRect(xw.draw, bg, winx, winy, width, win.ch); + } - /* Clean up the region we want to draw to. */ - XftDrawRect(xw.draw, bg, winx, winy, width, win.ch); + if (dmode & DRAW_FG) { + /* Render the glyphs. */ + XftDrawGlyphFontSpec(xw.draw, fg, specs, len); - /* Set the clip region because Xft is sometimes dirty. */ - r.x = 0; - r.y = 0; - r.height = win.ch; - r.width = width; - XftDrawSetClipRectangles(xw.draw, winx, winy, &r, 1); + /* Render underline and strikethrough. */ + if (base.mode & ATTR_UNDERLINE) { + XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent + 1, + width, 1); + } - /* Render the glyphs. */ - XftDrawGlyphFontSpec(xw.draw, fg, specs, len); - - /* Render underline and strikethrough. */ - if (base.mode & ATTR_UNDERLINE) { - XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent * chscale + 1, - width, 1); - } - - if (base.mode & ATTR_STRUCK) { - XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent * chscale / 3, - width, 1); - } - - /* Reset clip to none. */ - XftDrawSetClip(xw.draw, 0); + if (base.mode & ATTR_STRUCK) { + XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent / 3, + width, 1); + } + } } void @@ -1513,7 +1506,7 @@ xdrawglyph(Glyph g, int x, int y) XftGlyphFontSpec spec; numspecs = xmakeglyphfontspecs(&spec, &g, 1, x, y); - xdrawglyphfontspecs(&spec, g, numspecs, x, y); + xdrawglyphfontspecs(&spec, g, numspecs, x, y, DRAW_BG | DRAW_FG); } void @@ -1648,32 +1641,39 @@ xstartdraw(void) void xdrawline(Line line, int x1, int y1, int x2) { - int i, x, ox, numspecs; + int i, x, ox, numspecs, numspecs_cached; Glyph base, new; - XftGlyphFontSpec *specs = xw.specbuf; + XftGlyphFontSpec *specs; - numspecs = xmakeglyphfontspecs(specs, &line[x1], x2 - x1, x1, y1); - i = ox = 0; - for (x = x1; x < x2 && i < numspecs; x++) { - new = line[x]; - if (new.mode == ATTR_WDUMMY) - continue; - if (selected(x, y1)) - new.mode ^= ATTR_REVERSE; - if (i > 0 && ATTRCMP(base, new)) { - xdrawglyphfontspecs(specs, base, i, ox, y1); - specs += i; - numspecs -= i; - i = 0; + numspecs_cached = xmakeglyphfontspecs(xw.specbuf, &line[x1], x2 - x1, x1, y1); + + /* Draw line in 2 passes: background and foreground. This way wide glyphs + won't get truncated (#223) */ + for (int dmode = DRAW_BG; dmode <= DRAW_FG; dmode <<= 1) { + specs = xw.specbuf; + numspecs = numspecs_cached; + i = ox = 0; + for (x = x1; x < x2 && i < numspecs; x++) { + new = line[x]; + if (new.mode == ATTR_WDUMMY) + continue; + if (selected(x, y1)) + new.mode ^= ATTR_REVERSE; + if (i > 0 && ATTRCMP(base, new)) { + xdrawglyphfontspecs(specs, base, i, ox, y1, dmode); + specs += i; + numspecs -= i; + i = 0; + } + if (i == 0) { + ox = x; + base = new; + } + i++; } - if (i == 0) { - ox = x; - base = new; - } - i++; + if (i > 0) + xdrawglyphfontspecs(specs, base, i, ox, y1, dmode); } - if (i > 0) - xdrawglyphfontspecs(specs, base, i, ox, y1); } void diff --git a/x.o b/x.o index 76f5cf3262acdfa7d8e8d6c8161b025107608b4b..9e7c08e52b7eae95605a0ab61c95fc4fb8f1cf3d 100644 GIT binary patch delta 23220 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 delta 23399 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 Ay#N3J From 5cba0f67ecbef03bc5e740f57dde43d644c99cf8 Mon Sep 17 00:00:00 2001 From: mrsu Date: Mon, 26 Jun 2023 10:18:49 +0100 Subject: [PATCH 3/8] xresources --- config.def.h | 42 + config.def.h.orig | 481 ++++ config.h | 42 + patches/st-xresources-20200604-9ba7ecf.diff | 184 ++ st | Bin 110248 -> 109776 bytes x.c | 179 +- x.c.orig | 2215 +++++++++++++++++++ x.o | Bin 75008 -> 80776 bytes 8 files changed, 3139 insertions(+), 4 deletions(-) create mode 100644 config.def.h.orig create mode 100644 patches/st-xresources-20200604-9ba7ecf.diff create mode 100644 x.c.orig diff --git a/config.def.h b/config.def.h index addb201..aa63b99 100644 --- a/config.def.h +++ b/config.def.h @@ -6,6 +6,12 @@ * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html */ static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; +/* Spare fonts */ +static char *font2[] = { +/* "Inconsolata for Powerline:pixelsize=12:antialias=true:autohint=true", */ +/* "Hack Nerd Font Mono:pixelsize=11:antialias=true:autohint=true", */ +}; + static int borderpx = 2; /* @@ -170,6 +176,42 @@ static unsigned int defaultattr = 11; */ static uint forcemousemod = ShiftMask; +/* + * Xresources preferences to load at startup + */ +ResourcePref resources[] = { + { "font", STRING, &font }, + { "color0", STRING, &colorname[0] }, + { "color1", STRING, &colorname[1] }, + { "color2", STRING, &colorname[2] }, + { "color3", STRING, &colorname[3] }, + { "color4", STRING, &colorname[4] }, + { "color5", STRING, &colorname[5] }, + { "color6", STRING, &colorname[6] }, + { "color7", STRING, &colorname[7] }, + { "color8", STRING, &colorname[8] }, + { "color9", STRING, &colorname[9] }, + { "color10", STRING, &colorname[10] }, + { "color11", STRING, &colorname[11] }, + { "color12", STRING, &colorname[12] }, + { "color13", STRING, &colorname[13] }, + { "color14", STRING, &colorname[14] }, + { "color15", STRING, &colorname[15] }, + { "background", STRING, &colorname[256] }, + { "foreground", STRING, &colorname[257] }, + { "cursorColor", STRING, &colorname[258] }, + { "termname", STRING, &termname }, + { "shell", STRING, &shell }, + { "minlatency", INTEGER, &minlatency }, + { "maxlatency", INTEGER, &maxlatency }, + { "blinktimeout", INTEGER, &blinktimeout }, + { "bellvolume", INTEGER, &bellvolume }, + { "tabspaces", INTEGER, &tabspaces }, + { "borderpx", INTEGER, &borderpx }, + { "cwscale", FLOAT, &cwscale }, + { "chscale", FLOAT, &chscale }, +}; + /* * Internal mouse shortcuts. * Beware that overloading Button1 will disable the selection. diff --git a/config.def.h.orig b/config.def.h.orig new file mode 100644 index 0000000..27582bd --- /dev/null +++ b/config.def.h.orig @@ -0,0 +1,481 @@ +/* See LICENSE file for copyright and license details. */ + +/* + * appearance + * + * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html + */ +static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; +/* Spare fonts */ +static char *font2[] = { +/* "Inconsolata for Powerline:pixelsize=12:antialias=true:autohint=true", */ +/* "Hack Nerd Font Mono:pixelsize=11: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: scroll and/or utmp + * 3: SHELL environment variable + * 4: value of shell in /etc/passwd + * 5: value of shell in config.h + */ +static char *shell = "/bin/sh"; +char *utmp = NULL; +/* scroll program: to enable use a string like "scroll" */ +char *scroll = 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 */ +static float cwscale = 1.0; +static float chscale = 1.0; + +/* + * word delimiter string + * + * More advanced example: L" `'\"()[]{}" + */ +wchar_t *worddelimiters = L" "; + +/* selection timeouts (in milliseconds) */ +static unsigned int doubleclicktimeout = 300; +static unsigned int tripleclicktimeout = 600; + +/* alt screens */ +int allowaltscreen = 1; + +/* allow certain non-interactive (insecure) window operations such as: + setting the clipboard text */ +int allowwindowops = 0; + +/* + * draw latency range in ms - from new content/keypress/etc until drawing. + * within this range, st draws when content stops arriving (idle). mostly it's + * near minlatency, but it waits longer for slow updates to avoid partial draw. + * low minlatency will tear/flicker more, as it can "detect" idle too early. + */ +static double minlatency = 8; +static double maxlatency = 33; + +/* + * 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[] = { + /* 8 normal colors */ + "black", + "red3", + "green3", + "yellow3", + "blue2", + "magenta3", + "cyan3", + "gray90", + + /* 8 bright colors */ + "gray50", + "red", + "green", + "yellow", + "#5c5cff", + "magenta", + "cyan", + "white", + + [255] = 0, + + /* more colors can be added after 255 to use with DefaultXX */ + "#cccccc", + "#555555", + "gray90", /* default foreground colour */ + "black", /* default background colour */ +}; + + +/* + * Default colors (colorname index) + * foreground, background, cursor, reverse cursor + */ +unsigned int defaultfg = 258; +unsigned int defaultbg = 259; +unsigned int defaultcs = 256; +static unsigned int defaultrcs = 257; + +/* + * Default shape of cursor + * 2: Block ("█") + * 4: Underline ("_") + * 6: Bar ("|") + * 7: Snowman ("☃") + */ +static unsigned int cursorshape = 2; + +/* + * 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_xterm; +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; + +/* + * Force mouse select/shortcuts 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 forcemousemod = ShiftMask; + +/* + * Internal mouse shortcuts. + * Beware that overloading Button1 will disable the selection. + */ +static MouseShortcut mshortcuts[] = { + /* mask button function argument release */ + { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, + { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} }, + { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, + { ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} }, + { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} }, +}; + +/* Internal keyboard shortcuts. */ +#define MODKEY Mod1Mask +#define TERMMOD (ControlMask|ShiftMask) + +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} }, + { TERMMOD, XK_Home, zoomreset, {.f = 0} }, + { TERMMOD, XK_C, clipcopy, {.i = 0} }, + { TERMMOD, XK_V, clippaste, {.i = 0} }, + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, + { TERMMOD, XK_Escape, keyboard_select,{ 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 + * + * 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; + +/* + * 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, "\033Ox", +1, 0}, + { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1}, + { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1}, + { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0}, + { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1}, + { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1}, + { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0}, + { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1}, + { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1}, + { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0}, + { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1}, + { XK_KP_Right, XK_ANY_MOD, "\033OC", 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, "\033Oj", +2, 0}, + { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0}, + { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0}, + { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0}, + { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0}, + { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0}, + { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0}, + { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0}, + { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0}, + { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0}, + { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0}, + { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0}, + { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0}, + { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0}, + { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0}, + { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0}, + { XK_KP_9, XK_ANY_MOD, "\033Oy", +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, "\033OA", 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, "\033OB", 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, "\033OD", 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, "\033OC", 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, "\033OP" , 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, "\033OQ" , 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, "\033OR" , 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, "\033OS" , 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{|}~"; diff --git a/config.h b/config.h index addb201..aa63b99 100644 --- a/config.h +++ b/config.h @@ -6,6 +6,12 @@ * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html */ static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; +/* Spare fonts */ +static char *font2[] = { +/* "Inconsolata for Powerline:pixelsize=12:antialias=true:autohint=true", */ +/* "Hack Nerd Font Mono:pixelsize=11:antialias=true:autohint=true", */ +}; + static int borderpx = 2; /* @@ -170,6 +176,42 @@ static unsigned int defaultattr = 11; */ static uint forcemousemod = ShiftMask; +/* + * Xresources preferences to load at startup + */ +ResourcePref resources[] = { + { "font", STRING, &font }, + { "color0", STRING, &colorname[0] }, + { "color1", STRING, &colorname[1] }, + { "color2", STRING, &colorname[2] }, + { "color3", STRING, &colorname[3] }, + { "color4", STRING, &colorname[4] }, + { "color5", STRING, &colorname[5] }, + { "color6", STRING, &colorname[6] }, + { "color7", STRING, &colorname[7] }, + { "color8", STRING, &colorname[8] }, + { "color9", STRING, &colorname[9] }, + { "color10", STRING, &colorname[10] }, + { "color11", STRING, &colorname[11] }, + { "color12", STRING, &colorname[12] }, + { "color13", STRING, &colorname[13] }, + { "color14", STRING, &colorname[14] }, + { "color15", STRING, &colorname[15] }, + { "background", STRING, &colorname[256] }, + { "foreground", STRING, &colorname[257] }, + { "cursorColor", STRING, &colorname[258] }, + { "termname", STRING, &termname }, + { "shell", STRING, &shell }, + { "minlatency", INTEGER, &minlatency }, + { "maxlatency", INTEGER, &maxlatency }, + { "blinktimeout", INTEGER, &blinktimeout }, + { "bellvolume", INTEGER, &bellvolume }, + { "tabspaces", INTEGER, &tabspaces }, + { "borderpx", INTEGER, &borderpx }, + { "cwscale", FLOAT, &cwscale }, + { "chscale", FLOAT, &chscale }, +}; + /* * Internal mouse shortcuts. * Beware that overloading Button1 will disable the selection. diff --git a/patches/st-xresources-20200604-9ba7ecf.diff b/patches/st-xresources-20200604-9ba7ecf.diff new file mode 100644 index 0000000..78ba00a --- /dev/null +++ b/patches/st-xresources-20200604-9ba7ecf.diff @@ -0,0 +1,184 @@ +From 2752a599ee01305a435729bfacf43b1dde7cf0ef Mon Sep 17 00:00:00 2001 +From: Benji Encalada Mora +Date: Thu, 4 Jun 2020 00:41:10 -0500 +Subject: [PATCH] fix: replace xfps and actionfps variables + +--- + config.def.h | 36 ++++++++++++++++++++++++ + x.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++--- + 2 files changed, 110 insertions(+), 4 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 6f05dce..9b99782 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -168,6 +168,42 @@ static unsigned int defaultattr = 11; + */ + static uint forcemousemod = ShiftMask; + ++/* ++ * Xresources preferences to load at startup ++ */ ++ResourcePref resources[] = { ++ { "font", STRING, &font }, ++ { "color0", STRING, &colorname[0] }, ++ { "color1", STRING, &colorname[1] }, ++ { "color2", STRING, &colorname[2] }, ++ { "color3", STRING, &colorname[3] }, ++ { "color4", STRING, &colorname[4] }, ++ { "color5", STRING, &colorname[5] }, ++ { "color6", STRING, &colorname[6] }, ++ { "color7", STRING, &colorname[7] }, ++ { "color8", STRING, &colorname[8] }, ++ { "color9", STRING, &colorname[9] }, ++ { "color10", STRING, &colorname[10] }, ++ { "color11", STRING, &colorname[11] }, ++ { "color12", STRING, &colorname[12] }, ++ { "color13", STRING, &colorname[13] }, ++ { "color14", STRING, &colorname[14] }, ++ { "color15", STRING, &colorname[15] }, ++ { "background", STRING, &colorname[256] }, ++ { "foreground", STRING, &colorname[257] }, ++ { "cursorColor", STRING, &colorname[258] }, ++ { "termname", STRING, &termname }, ++ { "shell", STRING, &shell }, ++ { "minlatency", INTEGER, &minlatency }, ++ { "maxlatency", INTEGER, &maxlatency }, ++ { "blinktimeout", INTEGER, &blinktimeout }, ++ { "bellvolume", INTEGER, &bellvolume }, ++ { "tabspaces", INTEGER, &tabspaces }, ++ { "borderpx", INTEGER, &borderpx }, ++ { "cwscale", FLOAT, &cwscale }, ++ { "chscale", FLOAT, &chscale }, ++}; ++ + /* + * Internal mouse shortcuts. + * Beware that overloading Button1 will disable the selection. +diff --git a/x.c b/x.c +index 210f184..76f167f 100644 +--- a/x.c ++++ b/x.c +@@ -14,6 +14,7 @@ + #include + #include + #include ++#include + + char *argv0; + #include "arg.h" +@@ -45,6 +46,19 @@ typedef struct { + signed char appcursor; /* application cursor */ + } Key; + ++/* Xresources preferences */ ++enum resource_type { ++ STRING = 0, ++ INTEGER = 1, ++ FLOAT = 2 ++}; ++ ++typedef struct { ++ char *name; ++ enum resource_type type; ++ void *dst; ++} ResourcePref; ++ + /* X modifiers */ + #define XK_ANY_MOD UINT_MAX + #define XK_NO_MOD 0 +@@ -828,8 +842,8 @@ xclear(int x1, int y1, int x2, int y2) + void + xhints(void) + { +- XClassHint class = {opt_name ? opt_name : termname, +- opt_class ? opt_class : termname}; ++ XClassHint class = {opt_name ? opt_name : "st", ++ opt_class ? opt_class : "St"}; + XWMHints wm = {.flags = InputHint, .input = 1}; + XSizeHints *sizeh; + +@@ -1104,8 +1118,6 @@ xinit(int cols, int rows) + pid_t thispid = getpid(); + XColor xmousefg, xmousebg; + +- if (!(xw.dpy = XOpenDisplay(NULL))) +- die("can't open display\n"); + xw.scr = XDefaultScreen(xw.dpy); + xw.vis = XDefaultVisual(xw.dpy, xw.scr); + +@@ -1964,6 +1976,59 @@ run(void) + } + } + ++int ++resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst) ++{ ++ char **sdst = dst; ++ int *idst = dst; ++ float *fdst = dst; ++ ++ char fullname[256]; ++ char fullclass[256]; ++ char *type; ++ XrmValue ret; ++ ++ snprintf(fullname, sizeof(fullname), "%s.%s", ++ opt_name ? opt_name : "st", name); ++ snprintf(fullclass, sizeof(fullclass), "%s.%s", ++ opt_class ? opt_class : "St", name); ++ fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0'; ++ ++ XrmGetResource(db, fullname, fullclass, &type, &ret); ++ if (ret.addr == NULL || strncmp("String", type, 64)) ++ return 1; ++ ++ switch (rtype) { ++ case STRING: ++ *sdst = ret.addr; ++ break; ++ case INTEGER: ++ *idst = strtoul(ret.addr, NULL, 10); ++ break; ++ case FLOAT: ++ *fdst = strtof(ret.addr, NULL); ++ break; ++ } ++ return 0; ++} ++ ++void ++config_init(void) ++{ ++ char *resm; ++ XrmDatabase db; ++ ResourcePref *p; ++ ++ XrmInitialize(); ++ resm = XResourceManagerString(xw.dpy); ++ if (!resm) ++ return; ++ ++ db = XrmGetStringDatabase(resm); ++ for (p = resources; p < resources + LEN(resources); p++) ++ resource_load(db, p->name, p->type, p->dst); ++} ++ + void + usage(void) + { +@@ -2037,6 +2102,11 @@ run: + + setlocale(LC_CTYPE, ""); + XSetLocaleModifiers(""); ++ ++ if(!(xw.dpy = XOpenDisplay(NULL))) ++ die("Can't open display\n"); ++ ++ config_init(); + cols = MAX(cols, 1); + rows = MAX(rows, 1); + tnew(cols, rows); +-- +2.26.2 + diff --git a/st b/st index 4f1378946f2aa458a9c28df64f36f2b25887fb55..01e4acaae87a6930839c17220ff1d36539f62e8f 100755 GIT binary patch literal 109776 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