st-focus-20230610-68d1ad9.diff (14084B)
1 From e08d495aaa29c53273942985f40212ef72715604 Mon Sep 17 00:00:00 2001 2 From: Julius Huelsmann <juliusHuelsmann@gmail.com> 3 Date: Sat, 30 May 2020 01:11:42 +0200 4 Subject: [PATCH 1/7] chore: add alpha patch 5 6 --- 7 config.def.h | 11 +++++++---- 8 config.mk | 2 +- 9 st.h | 1 + 10 x.c | 40 ++++++++++++++++++++++++++++++---------- 11 4 files changed, 39 insertions(+), 15 deletions(-) 12 13 diff --git a/config.def.h b/config.def.h 14 index 91ab8ca..6bd6e8d 100644 15 --- a/config.def.h 16 +++ b/config.def.h 17 @@ -93,6 +93,9 @@ char *termname = "st-256color"; 18 */ 19 unsigned int tabspaces = 8; 20 21 +/* bg opacity */ 22 +float alpha = 0.8; 23 + 24 /* Terminal colors (16 first used in escape sequence) */ 25 static const char *colorname[] = { 26 /* 8 normal colors */ 27 @@ -120,8 +123,7 @@ static const char *colorname[] = { 28 /* more colors can be added after 255 to use with DefaultXX */ 29 "#cccccc", 30 "#555555", 31 - "gray90", /* default foreground colour */ 32 - "black", /* default background colour */ 33 + "black", 34 }; 35 36 37 @@ -129,8 +131,9 @@ static const char *colorname[] = { 38 * Default colors (colorname index) 39 * foreground, background, cursor, reverse cursor 40 */ 41 -unsigned int defaultfg = 258; 42 -unsigned int defaultbg = 259; 43 +unsigned int defaultfg = 7; 44 +unsigned int defaultbg = 258; 45 +//static 46 unsigned int defaultcs = 256; 47 static unsigned int defaultrcs = 257; 48 49 diff --git a/config.mk b/config.mk 50 index 1e306f8..47c615e 100644 51 --- a/config.mk 52 +++ b/config.mk 53 @@ -16,7 +16,7 @@ PKG_CONFIG = pkg-config 54 INCS = -I$(X11INC) \ 55 `$(PKG_CONFIG) --cflags fontconfig` \ 56 `$(PKG_CONFIG) --cflags freetype2` 57 -LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft \ 58 +LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft -lXrender\ 59 `$(PKG_CONFIG) --libs fontconfig` \ 60 `$(PKG_CONFIG) --libs freetype2` 61 62 diff --git a/st.h b/st.h 63 index fd3b0d8..9f91e2a 100644 64 --- a/st.h 65 +++ b/st.h 66 @@ -124,3 +124,4 @@ extern unsigned int tabspaces; 67 extern unsigned int defaultfg; 68 extern unsigned int defaultbg; 69 extern unsigned int defaultcs; 70 +extern float alpha; 71 diff --git a/x.c b/x.c 72 index 2a3bd38..27e81d1 100644 73 --- a/x.c 74 +++ b/x.c 75 @@ -105,6 +105,7 @@ typedef struct { 76 XSetWindowAttributes attrs; 77 int scr; 78 int isfixed; /* is fixed geometry? */ 79 + int depth; /* bit depth */ 80 int l, t; /* left and top offset */ 81 int gm; /* geometry mask */ 82 } XWindow; 83 @@ -243,6 +244,7 @@ static char *usedfont = NULL; 84 static double usedfontsize = 0; 85 static double defaultfontsize = 0; 86 87 +static char *opt_alpha = NULL; 88 static char *opt_class = NULL; 89 static char **opt_cmd = NULL; 90 static char *opt_embed = NULL; 91 @@ -752,7 +754,7 @@ xresize(int col, int row) 92 93 XFreePixmap(xw.dpy, xw.buf); 94 xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, 95 - DefaultDepth(xw.dpy, xw.scr)); 96 + xw.depth); 97 XftDrawChange(xw.draw, xw.buf); 98 xclear(0, 0, win.w, win.h); 99 100 @@ -812,6 +814,13 @@ xloadcols(void) 101 else 102 die("could not allocate color %d\n", i); 103 } 104 + 105 + /* set alpha value of bg color */ 106 + if (opt_alpha) 107 + alpha = strtof(opt_alpha, NULL); 108 + dc.col[defaultbg].color.alpha = (unsigned short)(0xffff * alpha); 109 + dc.col[defaultbg].pixel &= 0x00FFFFFF; 110 + dc.col[defaultbg].pixel |= (unsigned char)(0xff * alpha) << 24; 111 loaded = 1; 112 } 113 114 @@ -1134,11 +1143,23 @@ xinit(int cols, int rows) 115 Window parent; 116 pid_t thispid = getpid(); 117 XColor xmousefg, xmousebg; 118 + XWindowAttributes attr; 119 + XVisualInfo vis; 120 121 if (!(xw.dpy = XOpenDisplay(NULL))) 122 die("can't open display\n"); 123 xw.scr = XDefaultScreen(xw.dpy); 124 - xw.vis = XDefaultVisual(xw.dpy, xw.scr); 125 + 126 + if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) { 127 + parent = XRootWindow(xw.dpy, xw.scr); 128 + xw.depth = 32; 129 + } else { 130 + XGetWindowAttributes(xw.dpy, parent, &attr); 131 + xw.depth = attr.depth; 132 + } 133 + 134 + XMatchVisualInfo(xw.dpy, xw.scr, xw.depth, TrueColor, &vis); 135 + xw.vis = vis.visual; 136 137 /* font */ 138 if (!FcInit()) 139 @@ -1148,7 +1169,7 @@ xinit(int cols, int rows) 140 xloadfonts(usedfont, 0); 141 142 /* colors */ 143 - xw.cmap = XDefaultColormap(xw.dpy, xw.scr); 144 + xw.cmap = XCreateColormap(xw.dpy, parent, xw.vis, None); 145 xloadcols(); 146 147 /* adjust fixed window geometry */ 148 @@ -1168,19 +1189,15 @@ xinit(int cols, int rows) 149 | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; 150 xw.attrs.colormap = xw.cmap; 151 152 - if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) 153 - parent = XRootWindow(xw.dpy, xw.scr); 154 xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t, 155 - win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput, 156 + win.w, win.h, 0, xw.depth, InputOutput, 157 xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity 158 | CWEventMask | CWColormap, &xw.attrs); 159 160 memset(&gcvalues, 0, sizeof(gcvalues)); 161 gcvalues.graphics_exposures = False; 162 - dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures, 163 - &gcvalues); 164 - xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, 165 - DefaultDepth(xw.dpy, xw.scr)); 166 + xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, xw.depth); 167 + dc.gc = XCreateGC(xw.dpy, xw.buf, GCGraphicsExposures, &gcvalues); 168 XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel); 169 XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h); 170 171 @@ -2035,6 +2052,9 @@ main(int argc, char *argv[]) 172 case 'a': 173 allowaltscreen = 0; 174 break; 175 + case 'A': 176 + opt_alpha = EARGF(usage()); 177 + break; 178 case 'c': 179 opt_class = EARGF(usage()); 180 break; 181 -- 182 2.34.1 183 184 185 From 292b70d7b9976e624931f8ec264a8875e29d2f3c Mon Sep 17 00:00:00 2001 186 From: Julius Huelsmann <juliusHuelsmann@gmail.com> 187 Date: Sat, 30 May 2020 01:13:35 +0200 188 Subject: [PATCH 2/7] [patch:focus] add initial patch 189 190 --- 191 config.def.h | 6 +++--- 192 st.h | 2 +- 193 x.c | 33 +++++++++++++++++++-------------- 194 3 files changed, 23 insertions(+), 18 deletions(-) 195 196 diff --git a/config.def.h b/config.def.h 197 index 6bd6e8d..cdfbaf1 100644 198 --- a/config.def.h 199 +++ b/config.def.h 200 @@ -94,7 +94,7 @@ char *termname = "st-256color"; 201 unsigned int tabspaces = 8; 202 203 /* bg opacity */ 204 -float alpha = 0.8; 205 +float alpha = 0.8, alphaUnfocused = 0.6; 206 207 /* Terminal colors (16 first used in escape sequence) */ 208 static const char *colorname[] = { 209 @@ -132,10 +132,10 @@ static const char *colorname[] = { 210 * foreground, background, cursor, reverse cursor 211 */ 212 unsigned int defaultfg = 7; 213 -unsigned int defaultbg = 258; 214 -//static 215 +unsigned int defaultbg = 0; 216 unsigned int defaultcs = 256; 217 static unsigned int defaultrcs = 257; 218 +unsigned int bg = 17, bgUnfocused = 16; 219 220 /* 221 * Default shape of cursor 222 diff --git a/st.h b/st.h 223 index 9f91e2a..62e3486 100644 224 --- a/st.h 225 +++ b/st.h 226 @@ -124,4 +124,4 @@ extern unsigned int tabspaces; 227 extern unsigned int defaultfg; 228 extern unsigned int defaultbg; 229 extern unsigned int defaultcs; 230 -extern float alpha; 231 +extern float alpha, alphaUnfocused; 232 diff --git a/x.c b/x.c 233 index 27e81d1..05d6e2e 100644 234 --- a/x.c 235 +++ b/x.c 236 @@ -255,6 +255,7 @@ static char *opt_name = NULL; 237 static char *opt_title = NULL; 238 239 static uint buttons; /* bit field of pressed buttons */ 240 +static int focused = 0; 241 242 void 243 clipcopy(const Arg *dummy) 244 @@ -792,35 +793,38 @@ xloadcolor(int i, const char *name, Color *ncolor) 245 return XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, ncolor); 246 } 247 248 +void 249 +xloadalpha(void) 250 +{ 251 + float const usedAlpha = focused ? alpha : alphaUnfocused; 252 + if (opt_alpha) alpha = strtof(opt_alpha, NULL); 253 + dc.col[defaultbg].color.alpha = (unsigned short)(0xffff * usedAlpha); 254 + dc.col[defaultbg].pixel &= 0x00FFFFFF; 255 + dc.col[defaultbg].pixel |= (unsigned char)(0xff * usedAlpha) << 24; 256 +} 257 + 258 void 259 xloadcols(void) 260 { 261 - int i; 262 static int loaded; 263 Color *cp; 264 265 - if (loaded) { 266 - for (cp = dc.col; cp < &dc.col[dc.collen]; ++cp) 267 - XftColorFree(xw.dpy, xw.vis, xw.cmap, cp); 268 - } else { 269 - dc.collen = MAX(LEN(colorname), 256); 270 - dc.col = xmalloc(dc.collen * sizeof(Color)); 271 + if (!loaded) { 272 + dc.collen = 1 + (defaultbg = MAX(LEN(colorname), 256)); 273 + dc.col = xmalloc((dc.collen) * sizeof(Color)); 274 } 275 276 - for (i = 0; i < dc.collen; i++) 277 + for (int i = 0; i+1 < dc.collen; ++i) 278 if (!xloadcolor(i, NULL, &dc.col[i])) { 279 if (colorname[i]) 280 die("could not allocate color '%s'\n", colorname[i]); 281 else 282 die("could not allocate color %d\n", i); 283 } 284 + if (dc.collen) // cannot die, as the color is already loaded. 285 + xloadcolor(focused ?bg :bgUnfocused, NULL, &dc.col[defaultbg]); 286 287 - /* set alpha value of bg color */ 288 - if (opt_alpha) 289 - alpha = strtof(opt_alpha, NULL); 290 - dc.col[defaultbg].color.alpha = (unsigned short)(0xffff * alpha); 291 - dc.col[defaultbg].pixel &= 0x00FFFFFF; 292 - dc.col[defaultbg].pixel |= (unsigned char)(0xff * alpha) << 24; 293 + xloadalpha(); 294 loaded = 1; 295 } 296 297 @@ -2106,6 +2110,7 @@ run: 298 XSetLocaleModifiers(""); 299 cols = MAX(cols, 1); 300 rows = MAX(rows, 1); 301 + defaultbg = MAX(LEN(colorname), 256); 302 tnew(cols, rows); 303 xinit(cols, rows); 304 xsetenv(); 305 -- 306 2.34.1 307 308 309 From 9bb6788325306d9ec2bead559dacd031287a2b8c Mon Sep 17 00:00:00 2001 310 From: Julius Huelsmann <juliusHuelsmann@gmail.com> 311 Date: Fri, 5 Jun 2020 20:48:06 +0200 312 Subject: [PATCH 3/7] [patch:focus]: fix 313 314 --- 315 x.c | 10 ++++++++++ 316 1 file changed, 10 insertions(+) 317 318 diff --git a/x.c b/x.c 319 index 05d6e2e..97481ba 100644 320 --- a/x.c 321 +++ b/x.c 322 @@ -1798,12 +1798,22 @@ focus(XEvent *ev) 323 xseturgency(0); 324 if (IS_SET(MODE_FOCUS)) 325 ttywrite("\033[I", 3, 0); 326 + if (!focused) { 327 + xloadcols(); 328 + redraw(); 329 + } 330 + focused = 1; 331 } else { 332 if (xw.ime.xic) 333 XUnsetICFocus(xw.ime.xic); 334 win.mode &= ~MODE_FOCUSED; 335 if (IS_SET(MODE_FOCUS)) 336 ttywrite("\033[O", 3, 0); 337 + if (focused) { 338 + xloadcols(); 339 + redraw(); 340 + } 341 + focused = 0; 342 } 343 } 344 345 -- 346 2.34.1 347 348 349 From 62b6683ddf40aff222b59d5e074770d8d7336342 Mon Sep 17 00:00:00 2001 350 From: Julius Huelsmann <juliusHuelsmann@gmail.com> 351 Date: Sat, 6 Jun 2020 12:57:43 +0200 352 Subject: [PATCH 4/7] [patch:focus]: fix 353 354 --- 355 x.c | 4 ++-- 356 1 file changed, 2 insertions(+), 2 deletions(-) 357 358 diff --git a/x.c b/x.c 359 index 97481ba..c4a4b00 100644 360 --- a/x.c 361 +++ b/x.c 362 @@ -1799,10 +1799,10 @@ focus(XEvent *ev) 363 if (IS_SET(MODE_FOCUS)) 364 ttywrite("\033[I", 3, 0); 365 if (!focused) { 366 + focused = 1; 367 xloadcols(); 368 redraw(); 369 } 370 - focused = 1; 371 } else { 372 if (xw.ime.xic) 373 XUnsetICFocus(xw.ime.xic); 374 @@ -1810,10 +1810,10 @@ focus(XEvent *ev) 375 if (IS_SET(MODE_FOCUS)) 376 ttywrite("\033[O", 3, 0); 377 if (focused) { 378 + focused = 0; 379 xloadcols(); 380 redraw(); 381 } 382 - focused = 0; 383 } 384 } 385 386 -- 387 2.34.1 388 389 390 From dc6c039192e887e70a2e6f07ac55c317e6b1c3be Mon Sep 17 00:00:00 2001 391 From: Julius Huelsmann <juliusHuelsmann@gmail.com> 392 Date: Thu, 23 Jul 2020 18:17:50 +0200 393 Subject: [PATCH 5/7] potential fix: exchange redraw with tfulldirt 394 395 --- 396 st.c | 1 - 397 st.h | 1 + 398 x.c | 4 ++-- 399 3 files changed, 3 insertions(+), 3 deletions(-) 400 401 diff --git a/st.c b/st.c 402 index 62def59..8ee76a3 100644 403 --- a/st.c 404 +++ b/st.c 405 @@ -194,7 +194,6 @@ static void tsetscroll(int, int); 406 static void tswapscreen(void); 407 static void tsetmode(int, int, const int *, int); 408 static int twrite(const char *, int, int); 409 -static void tfulldirt(void); 410 static void tcontrolcode(uchar ); 411 static void tdectest(char ); 412 static void tdefutf8(char); 413 diff --git a/st.h b/st.h 414 index 62e3486..13be339 100644 415 --- a/st.h 416 +++ b/st.h 417 @@ -79,6 +79,7 @@ typedef union { 418 419 void die(const char *, ...); 420 void redraw(void); 421 +void tfulldirt(void); 422 void draw(void); 423 424 void printscreen(const Arg *); 425 diff --git a/x.c b/x.c 426 index c4a4b00..92c87b4 100644 427 --- a/x.c 428 +++ b/x.c 429 @@ -1801,7 +1801,7 @@ focus(XEvent *ev) 430 if (!focused) { 431 focused = 1; 432 xloadcols(); 433 - redraw(); 434 + tfulldirt(); 435 } 436 } else { 437 if (xw.ime.xic) 438 @@ -1812,7 +1812,7 @@ focus(XEvent *ev) 439 if (focused) { 440 focused = 0; 441 xloadcols(); 442 - redraw(); 443 + tfulldirt(); 444 } 445 } 446 } 447 -- 448 2.34.1 449 450 451 From 4da97936d57e3528ef7cf36c254c0985f6640132 Mon Sep 17 00:00:00 2001 452 From: Wim Stockman <wim@yasendfile.org> 453 Date: Sat, 4 Feb 2023 13:46:02 +0100 454 Subject: [PATCH 6/7] Performs upgrade avoid reloading all the colors again and 455 again also avoids problem when colors are set dynamically when focus in and 456 out that the colourpallette is not reset each time. 457 458 --- 459 x.c | 7 +++---- 460 1 file changed, 3 insertions(+), 4 deletions(-) 461 462 diff --git a/x.c b/x.c 463 index 92c87b4..879bf0e 100644 464 --- a/x.c 465 +++ b/x.c 466 @@ -796,6 +796,7 @@ xloadcolor(int i, const char *name, Color *ncolor) 467 void 468 xloadalpha(void) 469 { 470 + xloadcolor(focused ?bg :bgUnfocused, NULL, &dc.col[defaultbg]); 471 float const usedAlpha = focused ? alpha : alphaUnfocused; 472 if (opt_alpha) alpha = strtof(opt_alpha, NULL); 473 dc.col[defaultbg].color.alpha = (unsigned short)(0xffff * usedAlpha); 474 @@ -821,8 +822,6 @@ xloadcols(void) 475 else 476 die("could not allocate color %d\n", i); 477 } 478 - if (dc.collen) // cannot die, as the color is already loaded. 479 - xloadcolor(focused ?bg :bgUnfocused, NULL, &dc.col[defaultbg]); 480 481 xloadalpha(); 482 loaded = 1; 483 @@ -1800,7 +1799,7 @@ focus(XEvent *ev) 484 ttywrite("\033[I", 3, 0); 485 if (!focused) { 486 focused = 1; 487 - xloadcols(); 488 + xloadalpha(); 489 tfulldirt(); 490 } 491 } else { 492 @@ -1811,7 +1810,7 @@ focus(XEvent *ev) 493 ttywrite("\033[O", 3, 0); 494 if (focused) { 495 focused = 0; 496 - xloadcols(); 497 + xloadalpha(); 498 tfulldirt(); 499 } 500 } 501 -- 502 2.34.1 503 504 505 From ec16984d95e0ff9ac33b2b3d30f292c3a327c473 Mon Sep 17 00:00:00 2001 506 From: Julius Huelsmann <juliusHuelsmann@gmail.com> 507 Date: Sat, 10 Jun 2023 13:16:11 +0200 508 Subject: [PATCH 7/7] changed default config a bit 509 510 --- 511 config.def.h | 4 ++-- 512 1 file changed, 2 insertions(+), 2 deletions(-) 513 514 diff --git a/config.def.h b/config.def.h 515 index cdfbaf1..779178f 100644 516 --- a/config.def.h 517 +++ b/config.def.h 518 @@ -94,7 +94,7 @@ char *termname = "st-256color"; 519 unsigned int tabspaces = 8; 520 521 /* bg opacity */ 522 -float alpha = 0.8, alphaUnfocused = 0.6; 523 +float alpha = 0.93, alphaUnfocused = 0.6; 524 525 /* Terminal colors (16 first used in escape sequence) */ 526 static const char *colorname[] = { 527 @@ -135,7 +135,7 @@ unsigned int defaultfg = 7; 528 unsigned int defaultbg = 0; 529 unsigned int defaultcs = 256; 530 static unsigned int defaultrcs = 257; 531 -unsigned int bg = 17, bgUnfocused = 16; 532 +unsigned int bg = 0, bgUnfocused = 16; 533 534 /* 535 * Default shape of cursor 536 -- 537 2.34.1 538