From e9dc2639a3f4a3c9dc8b085bcffe63cee73f8242 Mon Sep 17 00:00:00 2001 From: Jakub Trzeciak Date: Mon, 11 Sep 2023 17:32:23 +0200 Subject: Xresources Patch --- README | 24 --------------------- README.md | 4 ++++ config.def.h | 33 +++++++++++++++++++++++------ dmenu.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- drw.c | 2 +- drw.h | 2 +- flake.lock | 25 ++++++++++++++++++++++ flake.nix | 41 ++++++++++++++++++++++++++++++++++++ 8 files changed, 167 insertions(+), 33 deletions(-) delete mode 100644 README create mode 100644 README.md create mode 100644 flake.lock create mode 100644 flake.nix 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 #include #include +#include #ifdef XINERAMA #include #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"} + ''; + }; + }; +} -- cgit v1.2.3