summaryrefslogtreecommitdiff
path: root/core/dwm/dwm.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/dwm/dwm.c')
-rw-r--r--core/dwm/dwm.c111
1 files changed, 85 insertions, 26 deletions
diff --git a/core/dwm/dwm.c b/core/dwm/dwm.c
index 4adbf21..fc150c0 100644
--- a/core/dwm/dwm.c
+++ b/core/dwm/dwm.c
@@ -47,6 +47,7 @@
#include <X11/extensions/Xinerama.h>
#endif /* XINERAMA */
#include <X11/Xft/Xft.h>
+#include <mpd/client.h>
#include "drw.h"
#include "util.h"
@@ -249,6 +250,7 @@ static void zoom(const Arg *arg);
static void clickstatus(const Arg *arg);
static void getcpu(char *buf, size_t len);
static void getram(char *buf, size_t len);
+static void getmusic(char *buf, size_t len);
static void gettime(char *buf, size_t len);
static void getdunst(char *buf, size_t len);
@@ -286,7 +288,7 @@ static Drw *drw;
static Monitor *mons, *selmon;
static Window root, wmcheckwin;
-enum { SNoti, SCPU, SRAM, STime, SPower, StatusLast };
+enum { SNoti, SCPU, SRAM, SMusic, STime, SPower, StatusLast };
typedef struct {
char text[64];
@@ -502,8 +504,10 @@ buttonpress(XEvent *e)
}
for (i = 0; i < LENGTH(buttons); i++)
if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button
- && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state))
- buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg);
+ && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state))
+ buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg :
+ click == ClkStatusText && buttons[i].arg.i == 0 ? &arg :
+ &buttons[i].arg);
}
void
@@ -765,13 +769,16 @@ void
drawbar(Monitor *m)
{
int x, w, tw = 0;
- int boxs = drw->fonts->h / 9;
- int boxw = drw->fonts->h / 6 + 2;
+ int boxs = drw->fonts->h / 9;
+ int boxw = drw->fonts->h / 4 + 3;
unsigned int i, occ = 0, urg = 0;
Client *c;
- if (!m->showbar)
- return;
+ if (!m->showbar)
+ return;
+
+ drw_setscheme(drw, scheme[SchemeNorm]);
+ drw_rect(drw, 0, 0, m->ww, bh - 3, 1, 1);
/* draw status first so it can be overdrawn by tags later */
if (m == selmon) { /* status is only drawn on selected monitor */
@@ -783,7 +790,7 @@ drawbar(Monitor *m)
continue;
w = TEXTW(statusitems[i].text);
statusitems[i].width = w;
- drw_text(drw, m->ww - tw - w, 0, w, bh, 0,
+ drw_text(drw, m->ww - tw - w, 0, w, bh - 3, 0,
statusitems[i].text, 0);
tw += w;
}
@@ -797,11 +804,9 @@ drawbar(Monitor *m)
}
x = 0;
for (i = 0; i < LENGTH(tags); i++) {
- if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i))
- continue;
w = TEXTW(tags[i]);
drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
- drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i);
+ drw_text(drw, x, 0, w, bh - 3, lrpad / 2, tags[i], urg & 1 << i);
if (occ & 1 << i)
drw_rect(drw, x + boxs, boxs, boxw, boxw,
m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
@@ -810,20 +815,29 @@ drawbar(Monitor *m)
}
w = TEXTW(m->ltsymbol);
drw_setscheme(drw, scheme[SchemeNorm]);
- x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
-
- if ((w = m->ww - tw - x) > bh) {
- if (m->sel) {
- drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
- if (m->sel->isfloating)
- drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
- } else {
- drw_setscheme(drw, scheme[SchemeNorm]);
- drw_rect(drw, x, 0, w, bh, 1, 1);
- }
- }
- drw_map(drw, m->barwin, 0, 0, m->ww, bh);
+ x = drw_text(drw, x, 0, w, bh - 3, lrpad / 2, m->ltsymbol, 0);
+
+ if ((w = m->ww - tw - x) > bh) {
+ if (m->sel) {
+ int tx = x + (w - TEXTW(m->sel->name)) / 2;
+ int twid = TEXTW(m->sel->name);
+ drw_setscheme(drw, scheme[SchemeNorm]);
+ drw_text(drw, tx, 0, twid, bh - 3, lrpad / 2, m->sel->name, 0);
+ if (m == selmon) {
+ drw_setscheme(drw, scheme[SchemeSel]);
+ for (i = 0; i < 3; i++)
+ drw_rect(drw, tx - i, 0, twid + 2 * i, bh - 3, 0, 1);
+ }
+ if (m->sel->isfloating)
+ drw_rect(drw, tx + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
+ } else {
+ drw_setscheme(drw, scheme[SchemeNorm]);
+ drw_rect(drw, x, 0, w, bh - 3, 1, 1);
+ }
+ }
+ drw_setscheme(drw, scheme[SchemeSel]);
+ drw_rect(drw, 0, bh - 3, m->ww, 3, 1, 1);
+ drw_map(drw, m->barwin, 0, 0, m->ww, bh);
}
void
@@ -1681,7 +1695,7 @@ setup(void)
if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
die("no fonts could be loaded.");
lrpad = drw->fonts->h;
- bh = drw->fonts->h + 2;
+ bh = drw->fonts->h + 8;
updategeom();
/* init atoms */
utf8string = XInternAtom(dpy, "UTF8_STRING", False);
@@ -2201,6 +2215,47 @@ getram(char *buf, size_t len)
}
static void
+getmusic(char *buf, size_t len)
+{
+ struct mpd_connection *conn = mpd_connection_new(NULL, 0, 30000);
+ if (!conn || mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS) {
+ if (conn)
+ mpd_connection_free(conn);
+ buf[0] = '\0';
+ return;
+ }
+ struct mpd_status *status = mpd_run_status(conn);
+ if (!status) {
+ mpd_connection_free(conn);
+ buf[0] = '\0';
+ return;
+ }
+ enum mpd_state state = mpd_status_get_state(status);
+ mpd_status_free(status);
+ if (state != MPD_STATE_PLAY) {
+ mpd_connection_free(conn);
+ buf[0] = '\0';
+ return;
+ }
+ struct mpd_song *song = mpd_run_current_song(conn);
+ if (!song) {
+ mpd_connection_free(conn);
+ buf[0] = '\0';
+ return;
+ }
+ const char *artist = mpd_song_get_tag(song, MPD_TAG_ARTIST, 0);
+ const char *title = mpd_song_get_tag(song, MPD_TAG_TITLE, 0);
+ if (title && artist)
+ snprintf(buf, len, "%s - %s", artist, title);
+ else if (title)
+ snprintf(buf, len, "%s", title);
+ else
+ buf[0] = '\0';
+ mpd_song_free(song);
+ mpd_connection_free(conn);
+}
+
+static void
gettime(char *buf, size_t len)
{
time_t now = time(NULL);
@@ -2254,6 +2309,7 @@ updatestatus(void)
getdunst(statusitems[SNoti].text, sizeof statusitems[SNoti].text);
getcpu(statusitems[SCPU].text, sizeof statusitems[SCPU].text);
getram(statusitems[SRAM].text, sizeof statusitems[SRAM].text);
+ getmusic(statusitems[SMusic].text, sizeof statusitems[SMusic].text);
gettime(statusitems[STime].text, sizeof statusitems[STime].text);
strncpy(statusitems[SPower].text, "⏻", sizeof statusitems[SPower].text);
@@ -2279,6 +2335,9 @@ clickstatus(const Arg *arg)
case STime:
spawn(&(Arg){ .v = calendarcmd });
break;
+ case SMusic:
+ spawn(&(Arg){ .v = mediaplaypause });
+ break;
case SPower:
spawn(&(Arg){ .v = powermenucmd });
break;