diff options
| author | Sam Chudnick <sam@chudnick.com> | 2023-02-16 20:53:20 -0500 |
|---|---|---|
| committer | Sam Chudnick <sam@chudnick.com> | 2023-02-16 20:53:20 -0500 |
| commit | 07109bb861018f4de7785c082262c1e0ff3fede0 (patch) | |
| tree | d4e90ebfb6aa88006afb978658add050a9cdbdce /patches | |
Diffstat (limited to 'patches')
| -rw-r--r-- | patches/alpha.diff | 122 | ||||
| -rw-r--r-- | patches/tabbed-autohide-0.6.diff | 50 | ||||
| -rw-r--r-- | patches/tabbed-bar-height-0.6.diff | 24 | ||||
| -rw-r--r-- | patches/tabbed-clientnumber-0.6.diff | 23 | ||||
| -rw-r--r-- | patches/tabbed-xresources-20210317-dabf6a2.diff | 178 |
5 files changed, 397 insertions, 0 deletions
diff --git a/patches/alpha.diff b/patches/alpha.diff new file mode 100644 index 0000000..3ce77a7 --- /dev/null +++ b/patches/alpha.diff | |||
| @@ -0,0 +1,122 @@ | |||
| 1 | diff --git a/config.mk b/config.mk | ||
| 2 | index 3a71529..095cead 100644 | ||
| 3 | --- a/config.mk | ||
| 4 | +++ b/config.mk | ||
| 5 | @@ -9,7 +9,7 @@ MANPREFIX = ${PREFIX}/share/man | ||
| 6 | |||
| 7 | # includes and libs | ||
| 8 | INCS = -I. -I/usr/include -I/usr/include/freetype2 | ||
| 9 | -LIBS = -L/usr/lib -lc -lX11 -lfontconfig -lXft | ||
| 10 | +LIBS = -L/usr/lib -lc -lX11 -lfontconfig -lXft -lXrender | ||
| 11 | |||
| 12 | # flags | ||
| 13 | CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE | ||
| 14 | diff --git a/tabbed.c b/tabbed.c | ||
| 15 | index 9a44795..b4d47d1 100644 | ||
| 16 | --- a/tabbed.c | ||
| 17 | +++ b/tabbed.c | ||
| 18 | @@ -170,6 +170,9 @@ static char **cmd; | ||
| 19 | static char *wmname = "tabbed"; | ||
| 20 | static const char *geometry; | ||
| 21 | |||
| 22 | +static Colormap cmap; | ||
| 23 | +static Visual *visual = NULL; | ||
| 24 | + | ||
| 25 | char *argv0; | ||
| 26 | |||
| 27 | /* configuration, allows nested code to access above variables */ | ||
| 28 | @@ -255,8 +258,8 @@ configurenotify(const XEvent *e) | ||
| 29 | ww = ev->width; | ||
| 30 | wh = ev->height; | ||
| 31 | XFreePixmap(dpy, dc.drawable); | ||
| 32 | - dc.drawable = XCreatePixmap(dpy, root, ww, wh, | ||
| 33 | - DefaultDepth(dpy, screen)); | ||
| 34 | + dc.drawable = XCreatePixmap(dpy, win, ww, wh, | ||
| 35 | + 32); | ||
| 36 | if (sel > -1) | ||
| 37 | resize(sel, ww, wh - bh); | ||
| 38 | XSync(dpy, False); | ||
| 39 | @@ -399,7 +402,7 @@ drawtext(const char *text, XftColor col[ColLast]) | ||
| 40 | ; | ||
| 41 | } | ||
| 42 | |||
| 43 | - d = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen)); | ||
| 44 | + d = XftDrawCreate(dpy, dc.drawable, visual, cmap); | ||
| 45 | XftDrawStringUtf8(d, &col[ColFG], dc.font.xfont, x, y, (XftChar8 *) buf, len); | ||
| 46 | XftDrawDestroy(d); | ||
| 47 | } | ||
| 48 | @@ -564,7 +567,7 @@ getcolor(const char *colstr) | ||
| 49 | { | ||
| 50 | XftColor color; | ||
| 51 | |||
| 52 | - if (!XftColorAllocName(dpy, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen), colstr, &color)) | ||
| 53 | + if (!XftColorAllocName(dpy, visual, cmap, colstr, &color)) | ||
| 54 | die("%s: cannot allocate color '%s'\n", argv0, colstr); | ||
| 55 | |||
| 56 | return color; | ||
| 57 | @@ -1016,18 +1019,60 @@ setup(void) | ||
| 58 | wy = dh + wy - wh - 1; | ||
| 59 | } | ||
| 60 | |||
| 61 | + XVisualInfo *vis; | ||
| 62 | + XRenderPictFormat *fmt; | ||
| 63 | + int nvi; | ||
| 64 | + int i; | ||
| 65 | + | ||
| 66 | + XVisualInfo tpl = { | ||
| 67 | + .screen = screen, | ||
| 68 | + .depth = 32, | ||
| 69 | + .class = TrueColor | ||
| 70 | + }; | ||
| 71 | + | ||
| 72 | + vis = XGetVisualInfo(dpy, VisualScreenMask | VisualDepthMask | VisualClassMask, &tpl, &nvi); | ||
| 73 | + for(i = 0; i < nvi; i ++) { | ||
| 74 | + fmt = XRenderFindVisualFormat(dpy, vis[i].visual); | ||
| 75 | + if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) { | ||
| 76 | + visual = vis[i].visual; | ||
| 77 | + break; | ||
| 78 | + } | ||
| 79 | + } | ||
| 80 | + | ||
| 81 | + XFree(vis); | ||
| 82 | + | ||
| 83 | + if (! visual) { | ||
| 84 | + fprintf(stderr, "Couldn't find ARGB visual.\n"); | ||
| 85 | + exit(1); | ||
| 86 | + } | ||
| 87 | + | ||
| 88 | + cmap = XCreateColormap( dpy, root, visual, None); | ||
| 89 | dc.norm[ColBG] = getcolor(normbgcolor); | ||
| 90 | dc.norm[ColFG] = getcolor(normfgcolor); | ||
| 91 | dc.sel[ColBG] = getcolor(selbgcolor); | ||
| 92 | dc.sel[ColFG] = getcolor(selfgcolor); | ||
| 93 | dc.urg[ColBG] = getcolor(urgbgcolor); | ||
| 94 | dc.urg[ColFG] = getcolor(urgfgcolor); | ||
| 95 | - dc.drawable = XCreatePixmap(dpy, root, ww, wh, | ||
| 96 | - DefaultDepth(dpy, screen)); | ||
| 97 | - dc.gc = XCreateGC(dpy, root, 0, 0); | ||
| 98 | |||
| 99 | - win = XCreateSimpleWindow(dpy, root, wx, wy, ww, wh, 0, | ||
| 100 | - dc.norm[ColFG].pixel, dc.norm[ColBG].pixel); | ||
| 101 | + XSetWindowAttributes attrs; | ||
| 102 | + attrs.background_pixel = dc.norm[ColBG].pixel; | ||
| 103 | + attrs.border_pixel = dc.norm[ColFG].pixel; | ||
| 104 | + attrs.bit_gravity = NorthWestGravity; | ||
| 105 | + attrs.event_mask = FocusChangeMask | KeyPressMask | ||
| 106 | + | ExposureMask | VisibilityChangeMask | StructureNotifyMask | ||
| 107 | + | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; | ||
| 108 | + attrs.background_pixmap = None ; | ||
| 109 | + attrs.colormap = cmap; | ||
| 110 | + | ||
| 111 | + win = XCreateWindow(dpy, root, wx, wy, | ||
| 112 | + ww, wh, 0, 32, InputOutput, | ||
| 113 | + visual, CWBackPixmap | CWBorderPixel | CWBitGravity | ||
| 114 | + | CWEventMask | CWColormap, &attrs); | ||
| 115 | + | ||
| 116 | + dc.drawable = XCreatePixmap(dpy, win, ww, wh, | ||
| 117 | + 32); | ||
| 118 | + dc.gc = XCreateGC(dpy, dc.drawable, 0, 0); | ||
| 119 | + | ||
| 120 | XMapRaised(dpy, win); | ||
| 121 | XSelectInput(dpy, win, SubstructureNotifyMask | FocusChangeMask | | ||
| 122 | ButtonPressMask | ExposureMask | KeyPressMask | | ||
diff --git a/patches/tabbed-autohide-0.6.diff b/patches/tabbed-autohide-0.6.diff new file mode 100644 index 0000000..fd641b4 --- /dev/null +++ b/patches/tabbed-autohide-0.6.diff | |||
| @@ -0,0 +1,50 @@ | |||
| 1 | diff --git a/tabbed.c b/tabbed.c | ||
| 2 | index ff3ada0..c41db0c 100644 | ||
| 3 | --- a/tabbed.c | ||
| 4 | +++ b/tabbed.c | ||
| 5 | @@ -152,7 +152,7 @@ static void (*handler[LASTEvent]) (const XEvent *) = { | ||
| 6 | [MapRequest] = maprequest, | ||
| 7 | [PropertyNotify] = propertynotify, | ||
| 8 | }; | ||
| 9 | -static int bh, wx, wy, ww, wh; | ||
| 10 | +static int bh, wx, wy, ww, wh, vbh; | ||
| 11 | static unsigned int numlockmask = 0; | ||
| 12 | static Bool running = True, nextfocus, doinitspawn = True, | ||
| 13 | fillagain = False, closelastclient = False; | ||
| 14 | @@ -307,6 +307,6 @@ void | ||
| 15 | drawbar(void) { | ||
| 16 | unsigned long *col; | ||
| 17 | - int c, fc, width, n = 0; | ||
| 18 | + int c, fc, width, n = 0, nbh, i; | ||
| 19 | char *name = NULL; | ||
| 20 | |||
| 21 | if (nclients == 0) { | ||
| 22 | @@ -314,10 +314,19 @@ drawbar(void) | ||
| 23 | dc.w = ww; | ||
| 24 | XFetchName(dpy, win, &name); | ||
| 25 | drawtext(name ? name : "", dc.norm); | ||
| 26 | - XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, ww, bh, 0, 0); | ||
| 27 | + XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, ww, vbh, 0, 0); | ||
| 28 | XSync(dpy, False); | ||
| 29 | |||
| 30 | return; | ||
| 31 | } | ||
| 32 | |||
| 33 | + nbh = nclients > 1 ? vbh : 0; | ||
| 34 | + if (bh != nbh) { | ||
| 35 | + bh = nbh; | ||
| 36 | + for (i = 0; i < nclients; i++) | ||
| 37 | + XMoveResizeWindow(dpy, clients[i]->win, 0, bh, ww, wh - bh); | ||
| 38 | + } | ||
| 39 | + if (bh == 0) | ||
| 40 | + return; | ||
| 41 | + | ||
| 42 | width = ww; | ||
| 43 | @@ -920,6 +929,6 @@ setup(void) | ||
| 44 | screen = DefaultScreen(dpy); | ||
| 45 | root = RootWindow(dpy, screen); | ||
| 46 | initfont(font); | ||
| 47 | - bh = dc.h = dc.font.height + 2; | ||
| 48 | + vbh = dc.h = dc.font.height + 2; | ||
| 49 | |||
| 50 | /* init atoms */ | ||
diff --git a/patches/tabbed-bar-height-0.6.diff b/patches/tabbed-bar-height-0.6.diff new file mode 100644 index 0000000..fddcb28 --- /dev/null +++ b/patches/tabbed-bar-height-0.6.diff | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | diff --color -up tabbed-0.6-clean/config.def.h tabbed-0.6-modified/config.def.h | ||
| 2 | --- tabbed-0.6-clean/config.def.h 2014-01-21 10:22:03.000000000 -0800 | ||
| 3 | +++ tabbed-0.6-modified/config.def.h 2021-03-30 20:23:45.752478278 -0700 | ||
| 4 | @@ -10,7 +10,7 @@ static const char before[] = "<"; | ||
| 5 | static const char after[] = ">"; | ||
| 6 | static const int tabwidth = 200; | ||
| 7 | static const Bool foreground = True; | ||
| 8 | - | ||
| 9 | +static const int barHeight = 24; | ||
| 10 | /* | ||
| 11 | * Where to place a new tab when it is opened. When npisrelative is True, | ||
| 12 | * then the current position is changed + newposition. If npisrelative | ||
| 13 | diff --color -up tabbed-0.6-clean/tabbed.c tabbed-0.6-modified/tabbed.c | ||
| 14 | --- tabbed-0.6-clean/tabbed.c 2014-01-21 10:22:03.000000000 -0800 | ||
| 15 | +++ tabbed-0.6-modified/tabbed.c 2021-03-30 20:24:23.712477426 -0700 | ||
| 16 | @@ -920,7 +920,7 @@ setup(void) { | ||
| 17 | screen = DefaultScreen(dpy); | ||
| 18 | root = RootWindow(dpy, screen); | ||
| 19 | initfont(font); | ||
| 20 | - bh = dc.h = dc.font.height + 2; | ||
| 21 | + bh = dc.h = barHeight; | ||
| 22 | |||
| 23 | /* init atoms */ | ||
| 24 | wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); | ||
diff --git a/patches/tabbed-clientnumber-0.6.diff b/patches/tabbed-clientnumber-0.6.diff new file mode 100644 index 0000000..430245c --- /dev/null +++ b/patches/tabbed-clientnumber-0.6.diff | |||
| @@ -0,0 +1,23 @@ | |||
| 1 | diff --git a/tabbed.c b/tabbed.c | ||
| 2 | index d30206b..70642cb 100644 | ||
| 3 | --- a/tabbed.c | ||
| 4 | +++ b/tabbed.c | ||
| 5 | @@ -308,6 +308,7 @@ drawbar(void) { | ||
| 6 | unsigned long *col; | ||
| 7 | int c, fc, width, n = 0; | ||
| 8 | char *name = NULL; | ||
| 9 | + char tabtitle[256]; | ||
| 10 | |||
| 11 | if(nclients == 0) { | ||
| 12 | dc.x = 0; | ||
| 13 | @@ -353,7 +354,9 @@ drawbar(void) { | ||
| 14 | } else { | ||
| 15 | col = dc.norm; | ||
| 16 | } | ||
| 17 | - drawtext(clients[c]->name, col); | ||
| 18 | + snprintf(tabtitle, sizeof(tabtitle), "%d: %s", | ||
| 19 | + c + 1, clients[c]->name); | ||
| 20 | + drawtext(tabtitle, col); | ||
| 21 | dc.x += dc.w; | ||
| 22 | clients[c]->tabx = dc.x; | ||
| 23 | } | ||
diff --git a/patches/tabbed-xresources-20210317-dabf6a2.diff b/patches/tabbed-xresources-20210317-dabf6a2.diff new file mode 100644 index 0000000..15610a7 --- /dev/null +++ b/patches/tabbed-xresources-20210317-dabf6a2.diff | |||
| @@ -0,0 +1,178 @@ | |||
| 1 | From 8c48f1564c555bbd21758a3a70a9984e61c34a35 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: 6d6f7274686f6e <4648531+6d6f7274686f6e@users.noreply.github.com> | ||
| 3 | Date: Wed, 17 Mar 2021 10:59:18 +0100 | ||
| 4 | Subject: [PATCH] xresources support | ||
| 5 | |||
| 6 | --- | ||
| 7 | config.def.h | 27 ++++++++++++++------ | ||
| 8 | tabbed.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||
| 9 | 2 files changed, 89 insertions(+), 7 deletions(-) | ||
| 10 | |||
| 11 | diff --git a/config.def.h b/config.def.h | ||
| 12 | index defa426..244e288 100644 | ||
| 13 | --- a/config.def.h | ||
| 14 | +++ b/config.def.h | ||
| 15 | @@ -1,13 +1,13 @@ | ||
| 16 | /* See LICENSE file for copyright and license details. */ | ||
| 17 | |||
| 18 | /* appearance */ | ||
| 19 | -static const char font[] = "monospace:size=9"; | ||
| 20 | -static const char* normbgcolor = "#222222"; | ||
| 21 | -static const char* normfgcolor = "#cccccc"; | ||
| 22 | -static const char* selbgcolor = "#555555"; | ||
| 23 | -static const char* selfgcolor = "#ffffff"; | ||
| 24 | -static const char* urgbgcolor = "#111111"; | ||
| 25 | -static const char* urgfgcolor = "#cc0000"; | ||
| 26 | +static char font[] = "monospace:size=9"; | ||
| 27 | +static char* normbgcolor = "#222222"; | ||
| 28 | +static char* normfgcolor = "#cccccc"; | ||
| 29 | +static char* selbgcolor = "#555555"; | ||
| 30 | +static char* selfgcolor = "#ffffff"; | ||
| 31 | +static char* urgbgcolor = "#111111"; | ||
| 32 | +static char* urgfgcolor = "#cc0000"; | ||
| 33 | static const char before[] = "<"; | ||
| 34 | static const char after[] = ">"; | ||
| 35 | static const char titletrim[] = "..."; | ||
| 36 | @@ -33,6 +33,19 @@ static Bool npisrelative = False; | ||
| 37 | } \ | ||
| 38 | } | ||
| 39 | |||
| 40 | +/* | ||
| 41 | + * Xresources preferences to load at startup | ||
| 42 | + */ | ||
| 43 | +ResourcePref resources[] = { | ||
| 44 | + { "font", STRING, &font }, | ||
| 45 | + { "color0", STRING, &normbgcolor }, | ||
| 46 | + { "color4", STRING, &normfgcolor }, | ||
| 47 | + { "color4", STRING, &selbgcolor }, | ||
| 48 | + { "color7", STRING, &selfgcolor }, | ||
| 49 | + { "color2", STRING, &urgbgcolor }, | ||
| 50 | + { "color3", STRING, &urgfgcolor }, | ||
| 51 | +}; | ||
| 52 | + | ||
| 53 | #define MODKEY ControlMask | ||
| 54 | static Key keys[] = { | ||
| 55 | /* modifier key function argument */ | ||
| 56 | diff --git a/tabbed.c b/tabbed.c | ||
| 57 | index eafe28a..c5bffc7 100644 | ||
| 58 | --- a/tabbed.c | ||
| 59 | +++ b/tabbed.c | ||
| 60 | @@ -13,6 +13,7 @@ | ||
| 61 | #include <X11/Xatom.h> | ||
| 62 | #include <X11/Xlib.h> | ||
| 63 | #include <X11/Xproto.h> | ||
| 64 | +#include <X11/Xresource.h> | ||
| 65 | #include <X11/Xutil.h> | ||
| 66 | #include <X11/XKBlib.h> | ||
| 67 | #include <X11/Xft/Xft.h> | ||
| 68 | @@ -85,11 +86,26 @@ typedef struct { | ||
| 69 | Bool urgent; | ||
| 70 | Bool closed; | ||
| 71 | } Client; | ||
| 72 | + | ||
| 73 | +/* Xresources preferences */ | ||
| 74 | +enum resource_type { | ||
| 75 | + STRING = 0, | ||
| 76 | + INTEGER = 1, | ||
| 77 | + FLOAT = 2 | ||
| 78 | +}; | ||
| 79 | + | ||
| 80 | +typedef struct { | ||
| 81 | + char *name; | ||
| 82 | + enum resource_type type; | ||
| 83 | + void *dst; | ||
| 84 | +} ResourcePref; | ||
| 85 | + | ||
| 86 | |||
| 87 | /* function declarations */ | ||
| 88 | static void buttonpress(const XEvent *e); | ||
| 89 | static void cleanup(void); | ||
| 90 | static void clientmessage(const XEvent *e); | ||
| 91 | +static void config_init(void); | ||
| 92 | static void configurenotify(const XEvent *e); | ||
| 93 | static void configurerequest(const XEvent *e); | ||
| 94 | static void createnotify(const XEvent *e); | ||
| 95 | @@ -120,6 +136,7 @@ static void move(const Arg *arg); | ||
| 96 | static void movetab(const Arg *arg); | ||
| 97 | static void propertynotify(const XEvent *e); | ||
| 98 | static void resize(int c, int w, int h); | ||
| 99 | +static int resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst); | ||
| 100 | static void rotate(const Arg *arg); | ||
| 101 | static void run(void); | ||
| 102 | static void sendxembed(int c, long msg, long detail, long d1, long d2); | ||
| 103 | @@ -245,6 +262,23 @@ clientmessage(const XEvent *e) | ||
| 104 | } | ||
| 105 | } | ||
| 106 | |||
| 107 | +void | ||
| 108 | +config_init(void) | ||
| 109 | +{ | ||
| 110 | + char *resm; | ||
| 111 | + XrmDatabase db; | ||
| 112 | + ResourcePref *p; | ||
| 113 | + | ||
| 114 | + XrmInitialize(); | ||
| 115 | + resm = XResourceManagerString(dpy); | ||
| 116 | + if (!resm) | ||
| 117 | + return; | ||
| 118 | + | ||
| 119 | + db = XrmGetStringDatabase(resm); | ||
| 120 | + for (p = resources; p < resources + LENGTH(resources); p++) | ||
| 121 | + resource_load(db, p->name, p->type, p->dst); | ||
| 122 | +} | ||
| 123 | + | ||
| 124 | void | ||
| 125 | configurenotify(const XEvent *e) | ||
| 126 | { | ||
| 127 | @@ -897,6 +931,40 @@ resize(int c, int w, int h) | ||
| 128 | (XEvent *)&ce); | ||
| 129 | } | ||
| 130 | |||
| 131 | +int | ||
| 132 | +resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst) | ||
| 133 | +{ | ||
| 134 | + char **sdst = dst; | ||
| 135 | + int *idst = dst; | ||
| 136 | + float *fdst = dst; | ||
| 137 | + | ||
| 138 | + char fullname[256]; | ||
| 139 | + char fullclass[256]; | ||
| 140 | + char *type; | ||
| 141 | + XrmValue ret; | ||
| 142 | + | ||
| 143 | + snprintf(fullname, sizeof(fullname), "%s.%s", "tabbed", name); | ||
| 144 | + snprintf(fullclass, sizeof(fullclass), "%s.%s", "tabbed", name); | ||
| 145 | + fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0'; | ||
| 146 | + | ||
| 147 | + XrmGetResource(db, fullname, fullclass, &type, &ret); | ||
| 148 | + if (ret.addr == NULL || strncmp("String", type, 64)) | ||
| 149 | + return 1; | ||
| 150 | + | ||
| 151 | + switch (rtype) { | ||
| 152 | + case STRING: | ||
| 153 | + *sdst = ret.addr; | ||
| 154 | + break; | ||
| 155 | + case INTEGER: | ||
| 156 | + *idst = strtoul(ret.addr, NULL, 10); | ||
| 157 | + break; | ||
| 158 | + case FLOAT: | ||
| 159 | + *fdst = strtof(ret.addr, NULL); | ||
| 160 | + break; | ||
| 161 | + } | ||
| 162 | + return 0; | ||
| 163 | +} | ||
| 164 | + | ||
| 165 | void | ||
| 166 | rotate(const Arg *arg) | ||
| 167 | { | ||
| 168 | @@ -1354,6 +1422,7 @@ main(int argc, char *argv[]) | ||
| 169 | if (!(dpy = XOpenDisplay(NULL))) | ||
| 170 | die("%s: cannot open display\n", argv0); | ||
| 171 | |||
| 172 | + config_init(); | ||
| 173 | setup(); | ||
| 174 | printf("0x%lx\n", win); | ||
| 175 | fflush(NULL); | ||
| 176 | -- | ||
| 177 | 2.30.2 | ||
| 178 | |||
