summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Trzeciak <jptrzy@gmail.com>2023-09-11 17:32:23 +0200
committerJakub Trzeciak <jptrzy@gmail.com>2023-09-11 17:32:23 +0200
commite9dc2639a3f4a3c9dc8b085bcffe63cee73f8242 (patch)
treebf0f793b9a417af3ef65ee9622cf6d2819070b92
parent7ab0cb5ef0e19352fc5d64ae0d57a5cf4540acbf (diff)
downloaddmenu-e9dc2639a3f4a3c9dc8b085bcffe63cee73f8242.tar.gz
dmenu-e9dc2639a3f4a3c9dc8b085bcffe63cee73f8242.tar.bz2
dmenu-e9dc2639a3f4a3c9dc8b085bcffe63cee73f8242.zip
Xresources Patch
-rw-r--r--README24
-rw-r--r--README.md4
-rw-r--r--config.def.h33
-rw-r--r--dmenu.c69
-rw-r--r--drw.c2
-rw-r--r--drw.h2
-rw-r--r--flake.lock25
-rw-r--r--flake.nix41
8 files changed, 167 insertions, 33 deletions
diff --git a/README b/README
deleted file mode 100644
index a8fcdfe..0000000
--- a/README
+++ /dev/null
@@ -1,24 +0,0 @@
-dmenu - dynamic menu
-====================
-dmenu is an efficient dynamic menu for X.
-
-
-Requirements
-------------
-In order to build dmenu you need the Xlib header files.
-
-
-Installation
-------------
-Edit config.mk to match your local setup (dmenu is installed into
-the /usr/local namespace by default).
-
-Afterwards enter the following command to build and install dmenu
-(if necessary as root):
-
- make clean install
-
-
-Running dmenu
--------------
-See the man page for details.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..a9ab9f1
--- /dev/null
+++ b/README.md
@@ -0,0 +1,4 @@
+# Jptrzy's dmenu
+
+## Patches
+* [xresources-alt](https://tools.suckless.org/dmenu/patches/xresources-alt/)
diff --git a/config.def.h b/config.def.h
index 1edb647..298e91a 100644
--- a/config.def.h
+++ b/config.def.h
@@ -2,16 +2,25 @@
/* Default settings; can be overriden by command line. */
static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */
+
/* -fn option overrides fonts[0]; default X11 font or font set */
+static char font[] = "monospace:size=10";
static const char *fonts[] = {
- "monospace:size=10"
+ font,
+ "monospace:size=10",
};
-static const char *prompt = NULL; /* -p option; prompt to the left of input field */
-static const char *colors[SchemeLast][2] = {
+
+static char *prompt = NULL; /* -p option; prompt to the left of input field */
+
+static char normfgcolor[] = "#bbbbbb";
+static char normbgcolor[] = "#222222";
+static char selfgcolor[] = "#eeeeee";
+static char selbgcolor[] = "#005577";
+static char *colors[SchemeLast][2] = {
/* fg bg */
- [SchemeNorm] = { "#bbbbbb", "#222222" },
- [SchemeSel] = { "#eeeeee", "#005577" },
- [SchemeOut] = { "#000000", "#00ffff" },
+ [SchemeNorm] = { normfgcolor, normbgcolor },
+ [SchemeSel] = { selfgcolor, selbgcolor },
+ [SchemeOut] = { "#000000", "#00ffff" },
};
/* -l option; if nonzero, dmenu uses vertical list with given number of lines */
static unsigned int lines = 0;
@@ -21,3 +30,15 @@ static unsigned int lines = 0;
* for example: " /?\"&[]"
*/
static const char worddelimiters[] = " ";
+
+/*
+ * Xresources preferences to load at startup
+ */
+ResourcePref resources[] = {
+ { "font", STRING, &font },
+ { "normfgcolor", STRING, &normfgcolor },
+ { "normbgcolor", STRING, &normbgcolor },
+ { "selfgcolor", STRING, &selfgcolor },
+ { "selbgcolor", STRING, &selbgcolor },
+ { "prompt", STRING, &prompt },
+};
diff --git a/dmenu.c b/dmenu.c
index 40f93e0..379233e 100644
--- a/dmenu.c
+++ b/dmenu.c
@@ -11,6 +11,7 @@
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/Xutil.h>
+#include <X11/Xresource.h>
#ifdef XINERAMA
#include <X11/extensions/Xinerama.h>
#endif
@@ -52,6 +53,21 @@ static XIC xic;
static Drw *drw;
static Clr *scheme[SchemeLast];
+/* Xresources preferences */
+enum resource_type {
+ STRING = 0,
+ INTEGER = 1,
+ FLOAT = 2
+};
+typedef struct {
+ char *name;
+ enum resource_type type;
+ void *dst;
+} ResourcePref;
+
+static void load_xresources(void);
+static void resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst);
+
#include "config.h"
static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
@@ -413,7 +429,7 @@ keypress(XKeyEvent *ev)
switch(ksym) {
default:
-insert:
+ insert:
if (!iscntrl((unsigned char)*buf))
insert(buf, len);
break;
@@ -572,6 +588,54 @@ readstdin(void)
lines = MIN(lines, i);
}
+void
+resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst)
+{
+ char *sdst = NULL;
+ int *idst = NULL;
+ float *fdst = NULL;
+ sdst = dst;
+ idst = dst;
+ fdst = dst;
+ char fullname[256];
+ char *type;
+ XrmValue ret;
+ snprintf(fullname, sizeof(fullname), "%s.%s", "dmenu", name);
+ fullname[sizeof(fullname) - 1] = '\0';
+ XrmGetResource(db, fullname, "*", &type, &ret);
+ if (!(ret.addr == NULL || strncmp("String", type, 64)))
+ {
+ switch (rtype) {
+ case STRING:
+ strcpy(sdst, ret.addr);
+ break;
+ case INTEGER:
+ *idst = strtoul(ret.addr, NULL, 10);
+ break;
+ case FLOAT:
+ *fdst = strtof(ret.addr, NULL);
+ break;
+ }
+ }
+}
+
+void
+load_xresources(void)
+{
+ Display *display;
+ char *resm;
+ XrmDatabase db;
+ ResourcePref *p;
+ display = XOpenDisplay(NULL);
+ resm = XResourceManagerString(display);
+ if (!resm)
+ return;
+ db = XrmGetStringDatabase(resm);
+ for (p = resources; p < resources + LENGTH(resources); p++)
+ resource_load(db, p->name, p->type, p->dst);
+ XCloseDisplay(display);
+}
+
static void
run(void)
{
@@ -725,6 +789,9 @@ main(int argc, char *argv[])
XWindowAttributes wa;
int i, fast = 0;
+ XrmInitialize();
+ load_xresources();
+
for (i = 1; i < argc; i++)
/* these options take no arguments */
if (!strcmp(argv[i], "-v")) { /* prints version information */
diff --git a/drw.c b/drw.c
index 78a2b27..85496b5 100644
--- a/drw.c
+++ b/drw.c
@@ -195,7 +195,7 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
/* 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, char *clrnames[], size_t clrcount)
{
size_t i;
Clr *ret;
diff --git a/drw.h b/drw.h
index fd7631b..0d91aad 100644
--- a/drw.h
+++ b/drw.h
@@ -40,7 +40,7 @@ void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned in
/* 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);
+Clr *drw_scm_create(Drw *drw, char *clrnames[], size_t clrcount);
/* Cursor abstraction */
Cur *drw_cur_create(Drw *drw, int shape);
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..22f9440
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,25 @@
+{
+ "nodes": {
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1690720142,
+ "narHash": "sha256-GywuiZjBKfFkntQwpNQfL+Ksa2iGjPprBGL0/psgRZM=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "3acb5c4264c490e7714d503c7166a3fde0c51324",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "type": "indirect"
+ }
+ },
+ "root": {
+ "inputs": {
+ "nixpkgs": "nixpkgs"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..2053d70
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,41 @@
+{
+ description = "jp3's dmenu";
+
+ outputs = { self, nixpkgs }:
+ let
+ system = "x86_64-linux";
+
+ overlay = final: prev: {
+ dmenu = prev.dmenu.overrideAttrs (old: {
+ version = "5.2";
+ src = builtins.path { path = ./.; name = "dmenu"; };
+ });
+ };
+
+ dmenu = (
+ import nixpkgs {
+ inherit system;
+ overlays = [ overlay ];
+ }
+ ).dmenu;
+ in
+ {
+ overlays.default = overlay;
+
+ packages.${system}.default = dmenu;
+
+ checks.${system} = {
+ build = dmenu;
+
+ version = nixpkgs.legacyPackages.${system}.runCommand "version-check" { } ''
+ dmenu_version="$(${dmenu}/bin/dmenu -v)"
+
+ echo "package version: ${dmenu.name}"
+ echo "dmenu version: $dmenu_version"
+
+ [[ "${dmenu.name}" == "$dmenu_version" ]]
+ touch ${placeholder "out"}
+ '';
+ };
+ };
+}
Software created with 💖