From 1a4ac1fea3f629a08481a9b8b43ea1fc38461445 Mon Sep 17 00:00:00 2001 From: auric <104602845+ihateamongus@users.noreply.github.com> Date: Sun, 7 Sep 2025 17:44:04 -0500 Subject: Add Aero transparency and dynamic tags --- dmenu/config.def.h | 8 +-- dmenu/dmenu.c | 163 ++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 128 insertions(+), 43 deletions(-) (limited to 'dmenu') diff --git a/dmenu/config.def.h b/dmenu/config.def.h index 1edb647..bc17068 100644 --- a/dmenu/config.def.h +++ b/dmenu/config.def.h @@ -8,10 +8,10 @@ static const char *fonts[] = { }; static const char *prompt = NULL; /* -p option; prompt to the left of input field */ static const char *colors[SchemeLast][2] = { - /* fg bg */ - [SchemeNorm] = { "#bbbbbb", "#222222" }, - [SchemeSel] = { "#eeeeee", "#005577" }, - [SchemeOut] = { "#000000", "#00ffff" }, + /* fg bg */ + [SchemeNorm] = { "#dddddd", "#000000" }, + [SchemeSel] = { "#ffffff", "#66ccff" }, + [SchemeOut] = { "#000000", "#66ccff" }, }; /* -l option; if nonzero, dmenu uses vertical list with given number of lines */ static unsigned int lines = 0; diff --git a/dmenu/dmenu.c b/dmenu/dmenu.c index fd49549..066d20f 100644 --- a/dmenu/dmenu.c +++ b/dmenu/dmenu.c @@ -7,6 +7,11 @@ #include #include #include +#include +#include +#include +#include +#include #include #include @@ -52,6 +57,20 @@ static XIC xic; static Drw *drw; static Clr *scheme[SchemeLast]; +#define SHMNAME "/breathing_color_shm" +typedef struct { +uint32_t seq; +char color[8]; +} ColorShm; +static ColorShm *accentshm; +static char accentcol[8] = "#005577"; +static const double opacity = 0.85; + +static void initaccent(void); +static void updateaccent(void); +static int openaccent(void); +static void setopacity(Window w, double opacity); + #include "config.h" static int (*fstrncmp)(const char *, const char *, size_t) = strncmp; @@ -111,6 +130,47 @@ cleanup(void) XCloseDisplay(dpy); } +static int +openaccent(void) +{ + int fd; + if (accentshm) + return 1; + if ((fd = shm_open(SHMNAME, O_RDONLY, 0)) < 0) + return 0; + accentshm = mmap(NULL, sizeof(ColorShm), PROT_READ, MAP_SHARED, fd, 0); + close(fd); + if (accentshm == MAP_FAILED) { + accentshm = NULL; + return 0; + } + return 1; +} + +static void +updateaccent(void) +{ + uint32_t s1, s2; + char tmp[8]; + + if (!accentshm && !openaccent()) + return; + do { + s1 = accentshm->seq; + memcpy(tmp, accentshm->color, 8); + s2 = accentshm->seq; + } while (s1 != s2); + if (tmp[0] != '#') + return; + memcpy(accentcol, tmp, 8); + drw_clr_create(drw, &scheme[SchemeSel][ColBg], accentcol); +} + +static void +initaccent(void) +{ + updateaccent(); +} static char * cistrstr(const char *h, const char *n) { @@ -191,6 +251,15 @@ drawmenu(void) drw_map(drw, win, 0, 0, mw, mh); } +static void +setopacity(Window w, double op) +{ + unsigned long val = op * 0xffffffff; + XChangeProperty(dpy, w, XInternAtom(dpy, "_NET_WM_WINDOW_OPACITY", False), + XA_CARDINAL, 32, PropModeReplace, + (unsigned char *)&val, 1); +} + static void grabfocus(void) { @@ -575,39 +644,53 @@ readstdin(void) static void run(void) { - XEvent ev; - - while (!XNextEvent(dpy, &ev)) { - if (XFilterEvent(&ev, win)) - continue; - switch(ev.type) { - case DestroyNotify: - if (ev.xdestroywindow.window != win) - break; - cleanup(); - exit(1); - case Expose: - if (ev.xexpose.count == 0) - drw_map(drw, win, 0, 0, mw, mh); - break; - case FocusIn: - /* regrab focus from parent window */ - if (ev.xfocus.window != win) - grabfocus(); - break; - case KeyPress: - keypress(&ev.xkey); - break; - case SelectionNotify: - if (ev.xselection.property == utf8) - paste(); - break; - case VisibilityNotify: - if (ev.xvisibility.state != VisibilityUnobscured) - XRaiseWindow(dpy, win); - break; - } - } + XEvent ev; + int xfd; + fd_set fds; + struct timeval tv; + + xfd = ConnectionNumber(dpy); + for (;;) { + FD_ZERO(&fds); + FD_SET(xfd, &fds); + tv.tv_sec = 0; + tv.tv_usec = 50000; + if (select(xfd + 1, &fds, NULL, NULL, &tv) > 0) { + while (XPending(dpy)) { + XNextEvent(dpy, &ev); + if (XFilterEvent(&ev, win)) + continue; + switch (ev.type) { + case DestroyNotify: + if (ev.xdestroywindow.window != win) + break; + cleanup(); + exit(1); + case Expose: + if (ev.xexpose.count == 0) + drw_map(drw, win, 0, 0, mw, mh); + break; + case FocusIn: + if (ev.xfocus.window != win) + grabfocus(); + break; + case KeyPress: + keypress(&ev.xkey); + break; + case SelectionNotify: + if (ev.xselection.property == utf8) + paste(); + break; + case VisibilityNotify: + if (ev.xvisibility.state != VisibilityUnobscured) + XRaiseWindow(dpy, win); + break; + } + } + } + updateaccent(); + drawmenu(); + } } static void @@ -696,10 +779,11 @@ setup(void) xic = XCreateIC(xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, XNClientWindow, win, XNFocusWindow, win, NULL); - XMapRaised(dpy, win); - if (embed) { - XReparentWindow(dpy, win, parentwin, x, y); - XSelectInput(dpy, parentwin, FocusChangeMask | SubstructureNotifyMask); + XMapRaised(dpy, win); + setopacity(win, opacity); + if (embed) { + XReparentWindow(dpy, win, parentwin, x, y); + XSelectInput(dpy, parentwin, FocusChangeMask | SubstructureNotifyMask); if (XQueryTree(dpy, parentwin, &dw, &w, &dws, &du) && dws) { for (i = 0; i < du && dws[i] != win; ++i) XSelectInput(dpy, dws[i], FocusChangeMask); @@ -707,8 +791,9 @@ setup(void) } grabfocus(); } - drw_resize(drw, mw, mh); - drawmenu(); + drw_resize(drw, mw, mh); + initaccent(); + drawmenu(); } static void -- cgit v1.2.3 From 5cf3a788d2335d79c2e26c133f013c994f035ad7 Mon Sep 17 00:00:00 2001 From: auric Date: Sun, 7 Sep 2025 18:15:42 -0500 Subject: Fix duplicated definitions in dwm.c around scratchtag --- dmenu/config.h | 23 ++++++++++ dmenu/dmenu | Bin 0 -> 42688 bytes dmenu/dmenu.o | Bin 0 -> 33704 bytes dmenu/drw.o | Bin 0 -> 11464 bytes dmenu/stest | Bin 0 -> 16288 bytes dmenu/stest.o | Bin 0 -> 5344 bytes dmenu/util.o | Bin 0 -> 2472 bytes dwm/config.h | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ dwm/drw.o | Bin 0 -> 11464 bytes dwm/dwm | Bin 0 -> 71408 bytes dwm/dwm.c | 34 --------------- dwm/dwm.o | Bin 0 -> 62104 bytes dwm/util.o | Bin 0 -> 2472 bytes 13 files changed, 157 insertions(+), 34 deletions(-) create mode 100644 dmenu/config.h create mode 100755 dmenu/dmenu create mode 100644 dmenu/dmenu.o create mode 100644 dmenu/drw.o create mode 100755 dmenu/stest create mode 100644 dmenu/stest.o create mode 100644 dmenu/util.o create mode 100644 dwm/config.h create mode 100644 dwm/drw.o create mode 100755 dwm/dwm create mode 100644 dwm/dwm.o create mode 100644 dwm/util.o (limited to 'dmenu') diff --git a/dmenu/config.h b/dmenu/config.h new file mode 100644 index 0000000..1edb647 --- /dev/null +++ b/dmenu/config.h @@ -0,0 +1,23 @@ +/* See LICENSE file for copyright and license details. */ +/* 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 const char *fonts[] = { + "monospace:size=10" +}; +static const char *prompt = NULL; /* -p option; prompt to the left of input field */ +static const char *colors[SchemeLast][2] = { + /* fg bg */ + [SchemeNorm] = { "#bbbbbb", "#222222" }, + [SchemeSel] = { "#eeeeee", "#005577" }, + [SchemeOut] = { "#000000", "#00ffff" }, +}; +/* -l option; if nonzero, dmenu uses vertical list with given number of lines */ +static unsigned int lines = 0; + +/* + * Characters not considered part of a word while deleting words + * for example: " /?\"&[]" + */ +static const char worddelimiters[] = " "; diff --git a/dmenu/dmenu b/dmenu/dmenu new file mode 100755 index 0000000..27d9aed Binary files /dev/null and b/dmenu/dmenu differ diff --git a/dmenu/dmenu.o b/dmenu/dmenu.o new file mode 100644 index 0000000..025b008 Binary files /dev/null and b/dmenu/dmenu.o differ diff --git a/dmenu/drw.o b/dmenu/drw.o new file mode 100644 index 0000000..69dbfa9 Binary files /dev/null and b/dmenu/drw.o differ diff --git a/dmenu/stest b/dmenu/stest new file mode 100755 index 0000000..7ba4cf1 Binary files /dev/null and b/dmenu/stest differ diff --git a/dmenu/stest.o b/dmenu/stest.o new file mode 100644 index 0000000..3d5045e Binary files /dev/null and b/dmenu/stest.o differ diff --git a/dmenu/util.o b/dmenu/util.o new file mode 100644 index 0000000..5dd48bf Binary files /dev/null and b/dmenu/util.o differ diff --git a/dwm/config.h b/dwm/config.h new file mode 100644 index 0000000..0424ce8 --- /dev/null +++ b/dwm/config.h @@ -0,0 +1,134 @@ +/* See LICENSE file for copyright and license details. */ + +/* appearance */ +static const unsigned int borderpx = 3; /* border pixel of windows */ +static const unsigned int gappx = 3; /* gaps between windows */ +static const unsigned int snap = 32; /* snap pixel */ +static const int showbar = 1; /* 0 means no bar */ +static const int topbar = 1; /* 0 means bottom bar */ +static const char *fonts[] = { "monospace:size=10" }; +static const char dmenufont[] = "monospace:size=10"; +static const char col_gray1[] = "#222222"; +static const char col_gray2[] = "#444444"; +static const char col_gray3[] = "#bbbbbb"; +static const char col_gray4[] = "#eeeeee"; +static const char col_cyan[] = "#005577"; +static const char *colors[][3] = { + /* fg bg border */ + [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, + [SchemeSel] = { col_gray4, col_cyan, col_cyan }, +}; + +/* tagging */ +static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; + +static const Rule rules[] = { + /* xprop(1): + * WM_CLASS(STRING) = instance, class + * WM_NAME(STRING) = title + */ + /* class instance title tags mask isfloating monitor */ + { "Gimp", NULL, NULL, 0, 1, -1 }, + { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, +}; + +/* layout(s) */ +static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ +static const int nmaster = 1; /* number of clients in master area */ +static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ +static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ +static const int refreshrate = 120; /* refresh rate (per second) for client move/resize */ + +static const Layout layouts[] = { + /* symbol arrange function */ + { "[]=", tile }, /* first entry is default */ + { "><>", NULL }, /* no layout function means floating behavior */ + { "[M]", monocle }, +}; + +/* key definitions */ +#define MODKEY Mod4Mask +#define TAGKEYS(KEY,TAG) \ + { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ + { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, + +/* helper for spawning shell commands in the pre dwm-5.0 fashion */ +#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } + +/* commands */ +static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ +static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; +static const char *termcmd[] = { "st", NULL }; +static const char scratchpadname[] = "scratchpad"; +static const char *scratchpadcmd[] = { "st", "-t", scratchpadname, "-g", "120x34", NULL }; +static const char *browsercmd[] = { "/bin/sh", "-c", "$BROWSER", NULL }; +static const char *screenshotcmd[] = { "flameshot", "gui", NULL }; +static const char *mediaplaypause[] = { "playerctl", "play-pause", NULL }; +static const char *medianext[] = { "playerctl", "next", NULL }; +static const char *mediaprev[] = { "playerctl", "previous", NULL }; + +static const Key keys[] = { + /* modifier key function argument */ + { MODKEY, XK_p, spawn, {.v = dmenucmd } }, + { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, + { MODKEY, XK_F1, spawn, {.v = browsercmd } }, + { 0, XK_Print, spawn, {.v = screenshotcmd } }, + { MODKEY, XK_grave, togglescratch, {.v = scratchpadcmd } }, + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_j, focusstack, {.i = +1 } }, + { MODKEY, XK_k, focusstack, {.i = -1 } }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, setmfact, {.f = -0.05} }, + { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY, XK_Return, zoom, {0} }, + { MODKEY, XK_Tab, view, {0} }, + { MODKEY|ShiftMask, XK_c, killclient, {0} }, + { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, + { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, + { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_space, setlayout, {0} }, + { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, + { MODKEY, XK_0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, + { MODKEY, XK_comma, focusmon, {.i = -1 } }, + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + { MODKEY, XK_minus, setgaps, {.i = -1 } }, + { MODKEY, XK_equal, setgaps, {.i = +1 } }, + { MODKEY|ShiftMask, XK_equal, setgaps, {.i = 0 } }, + { MODKEY, XK_KP_End, spawn, {.v = mediaprev } }, + { MODKEY, XK_KP_Down, spawn, {.v = mediaplaypause } }, + { MODKEY, XK_KP_Page_Down, spawn, {.v = medianext } }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + TAGKEYS( XK_3, 2) + TAGKEYS( XK_4, 3) + TAGKEYS( XK_5, 4) + TAGKEYS( XK_6, 5) + TAGKEYS( XK_7, 6) + TAGKEYS( XK_8, 7) + TAGKEYS( XK_9, 8) + { MODKEY|ShiftMask, XK_q, quit, {0} }, +}; + +/* button definitions */ +/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ +static const Button buttons[] = { + /* click event mask button function argument */ + { ClkLtSymbol, 0, Button1, setlayout, {0} }, + { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, + { ClkClientWin, MODKEY, Button1, movemouse, {0} }, + { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, + { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, + { ClkTagBar, 0, Button1, view, {0} }, + { ClkTagBar, 0, Button3, toggleview, {0} }, + { ClkTagBar, MODKEY, Button1, tag, {0} }, + { ClkTagBar, MODKEY, Button3, toggletag, {0} }, +}; + diff --git a/dwm/drw.o b/dwm/drw.o new file mode 100644 index 0000000..69dbfa9 Binary files /dev/null and b/dwm/drw.o differ diff --git a/dwm/dwm b/dwm/dwm new file mode 100755 index 0000000..f98c0c2 Binary files /dev/null and b/dwm/dwm differ diff --git a/dwm/dwm.c b/dwm/dwm.c index 8f70a83..515cd33 100644 --- a/dwm/dwm.c +++ b/dwm/dwm.c @@ -284,40 +284,6 @@ static Window root, wmcheckwin; #define BAROPACITY 1.0 #endif -static unsigned int scratchtag = 1 << LENGTH(tags); - -#define SHMNAME "/breathing_color_shm" -typedef struct { - uint32_t magic; - uint32_t version; - volatile uint32_t seq; - char color[8]; -} ColorShm; - -static ColorShm *accentshm; -static char accentcol[8] = "#005577"; - -#ifndef BAROPACITY -#define BAROPACITY 1.0 -#endif - -static unsigned int scratchtag = 1 << LENGTH(tags); - -#define SHMNAME "/breathing_color_shm" -typedef struct { - uint32_t magic; - uint32_t version; - volatile uint32_t seq; - char color[8]; -} ColorShm; - -static ColorShm *accentshm; -static char accentcol[8] = "#005577"; - -#ifndef BAROPACITY -#define BAROPACITY 1.0 -#endif - /* tag used for scratchpad clients */ static const unsigned int scratchtag = 1 << LENGTH(tags); diff --git a/dwm/dwm.o b/dwm/dwm.o new file mode 100644 index 0000000..707e9d4 Binary files /dev/null and b/dwm/dwm.o differ diff --git a/dwm/util.o b/dwm/util.o new file mode 100644 index 0000000..5dd48bf Binary files /dev/null and b/dwm/util.o differ -- cgit v1.2.3