-
Notifications
You must be signed in to change notification settings - Fork 30
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
341 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,282 @@ | ||
From 516cab50e59fcce289f457f3e42ccd5389e2f73a Mon Sep 17 00:00:00 2001 | ||
From: bakkeby <bakkeby@gmail.com> | ||
Date: Thu, 28 May 2020 16:58:12 +0200 | ||
Subject: [PATCH] Adding alpha patch | ||
|
||
--- | ||
config.def.h | 9 +++++++++ | ||
config.mk | 6 +++++- | ||
dmenu.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++------ | ||
drw.c | 26 +++++++++++++----------- | ||
drw.h | 9 ++++++--- | ||
5 files changed, 84 insertions(+), 22 deletions(-) | ||
|
||
diff --git a/config.def.h b/config.def.h | ||
index 1edb647..5c512d3 100644 | ||
--- a/config.def.h | ||
+++ b/config.def.h | ||
@@ -7,6 +7,15 @@ static const char *fonts[] = { | ||
"monospace:size=10" | ||
}; | ||
static const char *prompt = NULL; /* -p option; prompt to the left of input field */ | ||
+ | ||
+static const unsigned int baralpha = 0xd0; | ||
+static const unsigned int borderalpha = OPAQUE; | ||
+static const unsigned int alphas[][3] = { | ||
+ /* fg bg border */ | ||
+ [SchemeNorm] = { OPAQUE, baralpha, borderalpha }, | ||
+ [SchemeSel] = { OPAQUE, baralpha, borderalpha }, | ||
+}; | ||
+ | ||
static const char *colors[SchemeLast][2] = { | ||
/* fg bg */ | ||
[SchemeNorm] = { "#bbbbbb", "#222222" }, | ||
diff --git a/config.mk b/config.mk | ||
index 137f7c8..1857846 100644 | ||
--- a/config.mk | ||
+++ b/config.mk | ||
@@ -15,13 +15,17 @@ XINERAMAFLAGS = -DXINERAMA | ||
# freetype | ||
FREETYPELIBS = -lfontconfig -lXft | ||
FREETYPEINC = /usr/include/freetype2 | ||
+ | ||
+# alpha | ||
+XRENDERLIBS = -lXrender | ||
+ | ||
# OpenBSD (uncomment) | ||
#FREETYPEINC = $(X11INC)/freetype2 | ||
#MANPREFIX = ${PREFIX}/man | ||
|
||
# includes and libs | ||
INCS = -I$(X11INC) -I$(FREETYPEINC) | ||
-LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) | ||
+LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) ${XRENDERLIBS} | ||
|
||
# flags | ||
CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS) | ||
diff --git a/dmenu.c b/dmenu.c | ||
index 40f93e0..e26bb9d 100644 | ||
--- a/dmenu.c | ||
+++ b/dmenu.c | ||
@@ -23,6 +23,7 @@ | ||
#define INTERSECT(x,y,w,h,r) (MAX(0, MIN((x)+(w),(r).x_org+(r).width) - MAX((x),(r).x_org)) \ | ||
* MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org))) | ||
#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) | ||
+#define OPAQUE 0xffU | ||
|
||
/* enums */ | ||
enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ | ||
@@ -49,6 +50,11 @@ static Display *dpy; | ||
static Window root, parentwin, win; | ||
static XIC xic; | ||
|
||
+static int useargb = 0; | ||
+static Visual *visual; | ||
+static int depth; | ||
+static Colormap cmap; | ||
+ | ||
static Drw *drw; | ||
static Clr *scheme[SchemeLast]; | ||
|
||
@@ -545,6 +551,43 @@ paste(void) | ||
drawmenu(); | ||
} | ||
|
||
+static void | ||
+xinitvisual() | ||
+{ | ||
+ XVisualInfo *infos; | ||
+ XRenderPictFormat *fmt; | ||
+ int nitems; | ||
+ int i; | ||
+ | ||
+ XVisualInfo tpl = { | ||
+ .screen = screen, | ||
+ .depth = 32, | ||
+ .class = TrueColor | ||
+ }; | ||
+ long masks = VisualScreenMask | VisualDepthMask | VisualClassMask; | ||
+ | ||
+ infos = XGetVisualInfo(dpy, masks, &tpl, &nitems); | ||
+ visual = NULL; | ||
+ for(i = 0; i < nitems; i ++) { | ||
+ fmt = XRenderFindVisualFormat(dpy, infos[i].visual); | ||
+ if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) { | ||
+ visual = infos[i].visual; | ||
+ depth = infos[i].depth; | ||
+ cmap = XCreateColormap(dpy, root, visual, AllocNone); | ||
+ useargb = 1; | ||
+ break; | ||
+ } | ||
+ } | ||
+ | ||
+ XFree(infos); | ||
+ | ||
+ if (! visual) { | ||
+ visual = DefaultVisual(dpy, screen); | ||
+ depth = DefaultDepth(dpy, screen); | ||
+ cmap = DefaultColormap(dpy, screen); | ||
+ } | ||
+} | ||
+ | ||
static void | ||
readstdin(void) | ||
{ | ||
@@ -627,7 +670,7 @@ setup(void) | ||
#endif | ||
/* init appearance */ | ||
for (j = 0; j < SchemeLast; j++) | ||
- scheme[j] = drw_scm_create(drw, colors[j], 2); | ||
+ scheme[j] = drw_scm_create(drw, colors[j], alphas[j], 2); | ||
|
||
clip = XInternAtom(dpy, "CLIPBOARD", False); | ||
utf8 = XInternAtom(dpy, "UTF8_STRING", False); | ||
@@ -682,14 +725,14 @@ setup(void) | ||
|
||
/* create menu window */ | ||
swa.override_redirect = True; | ||
- swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; | ||
+ swa.background_pixel = 0; | ||
+ swa.colormap = cmap; | ||
swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; | ||
win = XCreateWindow(dpy, root, x, y, mw, mh, 0, | ||
- CopyFromParent, CopyFromParent, CopyFromParent, | ||
- CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); | ||
+ depth, InputOutput, visual, | ||
+ CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &swa); | ||
XSetClassHint(dpy, win, &ch); | ||
|
||
- | ||
/* input methods */ | ||
if ((xim = XOpenIM(dpy, NULL, NULL, NULL)) == NULL) | ||
die("XOpenIM failed: could not open input device"); | ||
@@ -772,7 +815,8 @@ main(int argc, char *argv[]) | ||
if (!XGetWindowAttributes(dpy, parentwin, &wa)) | ||
die("could not get embedding window attributes: 0x%lx", | ||
parentwin); | ||
- drw = drw_create(dpy, screen, root, wa.width, wa.height); | ||
+ xinitvisual(); | ||
+ drw = drw_create(dpy, screen, root, wa.width, wa.height, visual, depth, cmap); | ||
if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) | ||
die("no fonts could be loaded."); | ||
lrpad = drw->fonts->h; | ||
diff --git a/drw.c b/drw.c | ||
index 78a2b27..4c1790e 100644 | ||
--- a/drw.c | ||
+++ b/drw.c | ||
@@ -61,7 +61,7 @@ utf8decode(const char *c, long *u, size_t clen) | ||
} | ||
|
||
Drw * | ||
-drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) | ||
+drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap) | ||
{ | ||
Drw *drw = ecalloc(1, sizeof(Drw)); | ||
|
||
@@ -70,8 +70,11 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h | ||
drw->root = root; | ||
drw->w = w; | ||
drw->h = h; | ||
- drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); | ||
- drw->gc = XCreateGC(dpy, root, 0, NULL); | ||
+ drw->visual = visual; | ||
+ drw->depth = depth; | ||
+ drw->cmap = cmap; | ||
+ drw->drawable = XCreatePixmap(dpy, root, w, h, depth); | ||
+ drw->gc = XCreateGC(dpy, drw->drawable, 0, NULL); | ||
XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); | ||
|
||
return drw; | ||
@@ -87,7 +90,7 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h) | ||
drw->h = h; | ||
if (drw->drawable) | ||
XFreePixmap(drw->dpy, drw->drawable); | ||
- drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); | ||
+ drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, drw->depth); | ||
} | ||
|
||
void | ||
@@ -181,21 +184,22 @@ drw_fontset_free(Fnt *font) | ||
} | ||
|
||
void | ||
-drw_clr_create(Drw *drw, Clr *dest, const char *clrname) | ||
+drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha) | ||
{ | ||
if (!drw || !dest || !clrname) | ||
return; | ||
|
||
- if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), | ||
- DefaultColormap(drw->dpy, drw->screen), | ||
+ if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap, | ||
clrname, dest)) | ||
die("error, cannot allocate color '%s'", clrname); | ||
+ | ||
+ dest->pixel = (dest->pixel & 0x00ffffffU) | (alpha << 24); | ||
} | ||
|
||
/* Wrapper to create color schemes. The caller has to call free(3) on the | ||
* returned color scheme when done using it. */ | ||
Clr * | ||
-drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) | ||
+drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount) | ||
{ | ||
size_t i; | ||
Clr *ret; | ||
@@ -205,7 +209,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) | ||
return NULL; | ||
|
||
for (i = 0; i < clrcount; i++) | ||
- drw_clr_create(drw, &ret[i], clrnames[i]); | ||
+ drw_clr_create(drw, &ret[i], clrnames[i], alphas[i]); | ||
return ret; | ||
} | ||
|
||
@@ -261,9 +265,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp | ||
} else { | ||
XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); | ||
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); | ||
- d = XftDrawCreate(drw->dpy, drw->drawable, | ||
- DefaultVisual(drw->dpy, drw->screen), | ||
- DefaultColormap(drw->dpy, drw->screen)); | ||
+ d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap); | ||
x += lpad; | ||
w -= lpad; | ||
} | ||
diff --git a/drw.h b/drw.h | ||
index fd7631b..81d8647 100644 | ||
--- a/drw.h | ||
+++ b/drw.h | ||
@@ -20,6 +20,9 @@ typedef struct { | ||
Display *dpy; | ||
int screen; | ||
Window root; | ||
+ Visual *visual; | ||
+ unsigned int depth; | ||
+ Colormap cmap; | ||
Drawable drawable; | ||
GC gc; | ||
Clr *scheme; | ||
@@ -27,7 +30,7 @@ typedef struct { | ||
} Drw; | ||
|
||
/* Drawable abstraction */ | ||
-Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); | ||
+Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap); | ||
void drw_resize(Drw *drw, unsigned int w, unsigned int h); | ||
void drw_free(Drw *drw); | ||
|
||
@@ -39,8 +42,8 @@ unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int | ||
void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); | ||
|
||
/* Colorscheme abstraction */ | ||
-void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); | ||
-Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); | ||
+void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha); | ||
+Clr *drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount); | ||
|
||
/* Cursor abstraction */ | ||
Cur *drw_cur_create(Drw *drw, int shape); | ||
-- | ||
2.45.2 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
From dfc9dd2553999b10dc45d4d678452b5e5324dc90 Mon Sep 17 00:00:00 2001 | ||
From: bakkeby <bakkeby@gmail.com> | ||
Date: Sun, 20 Mar 2022 15:26:13 +0100 | ||
Subject: [PATCH] Adding barpadding patch for dmenu | ||
|
||
--- | ||
config.def.h | 3 +++ | ||
dmenu.c | 7 ++++++- | ||
2 files changed, 9 insertions(+), 1 deletion(-) | ||
|
||
diff --git a/config.def.h b/config.def.h | ||
index 1edb647..4251c09 100644 | ||
--- a/config.def.h | ||
+++ b/config.def.h | ||
@@ -2,6 +2,9 @@ | ||
/* Default settings; can be overriden by command line. */ | ||
|
||
static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ | ||
+static const int vertpad = 10; /* vertical padding of bar */ | ||
+static const int sidepad = 10; /* horizontal padding of bar */ | ||
+ | ||
/* -fn option overrides fonts[0]; default X11 font or font set */ | ||
static const char *fonts[] = { | ||
"monospace:size=10" | ||
diff --git a/dmenu.c b/dmenu.c | ||
index 40f93e0..f75c480 100644 | ||
--- a/dmenu.c | ||
+++ b/dmenu.c | ||
@@ -38,6 +38,8 @@ static char *embed; | ||
static int bh, mw, mh; | ||
static int inputw = 0, promptw; | ||
static int lrpad; /* sum of left and right padding */ | ||
+static int vp; /* vertical padding for bar */ | ||
+static int sp; /* side padding for bar */ | ||
static size_t cursor; | ||
static struct item *items = NULL; | ||
static struct item *matches, *matchend; | ||
@@ -684,7 +686,7 @@ setup(void) | ||
swa.override_redirect = True; | ||
swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; | ||
swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; | ||
- win = XCreateWindow(dpy, root, x, y, mw, mh, 0, | ||
+ win = XCreateWindow(dpy, root, x + sp, y + vp, mw - 2 * sp, mh, 0, | ||
CopyFromParent, CopyFromParent, CopyFromParent, | ||
CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); | ||
XSetClassHint(dpy, win, &ch); | ||
@@ -777,6 +779,9 @@ main(int argc, char *argv[]) | ||
die("no fonts could be loaded."); | ||
lrpad = drw->fonts->h; | ||
|
||
+ sp = sidepad; | ||
+ vp = (topbar == 1) ? vertpad : - vertpad; | ||
+ | ||
#ifdef __OpenBSD__ | ||
if (pledge("stdio rpath", NULL) == -1) | ||
die("pledge"); | ||
-- | ||
2.45.2 | ||
|