dwmstatus: add volume and brightness settings

This commit is contained in:
Přemysl Eric Janouch 2016-01-10 04:05:04 +01:00
parent a91e24930c
commit c86e0af234
1 changed files with 107 additions and 18 deletions

View File

@ -29,9 +29,11 @@
#include <dirent.h> #include <dirent.h>
#include <sys/un.h> #include <sys/un.h>
#include <spawn.h>
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <X11/keysym.h> #include <X11/keysym.h>
#include <X11/XF86keysym.h>
#include <pulse/mainloop.h> #include <pulse/mainloop.h>
#include <pulse/context.h> #include <pulse/context.h>
@ -2546,10 +2548,33 @@ on_make_context (void *user_data)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
static void
spawn (struct app_context *ctx, char *argv[])
{
posix_spawn_file_actions_t actions;
posix_spawn_file_actions_init (&actions);
posix_spawn_file_actions_addclose (&actions, ConnectionNumber (ctx->dpy));
if (ctx->mpd_client.socket != -1)
posix_spawn_file_actions_addclose (&actions, ctx->mpd_client.socket);
if (ctx->nut_client.socket != -1)
posix_spawn_file_actions_addclose (&actions, ctx->nut_client.socket);
posix_spawnattr_t attr;
posix_spawnattr_init (&attr);
posix_spawnattr_setpgroup (&attr, 0);
posix_spawnp (NULL, argv[0], &actions, &attr, argv, environ);
posix_spawn_file_actions_destroy (&actions);
posix_spawnattr_destroy (&attr);
}
#define MPD_SIMPLE(name, ...) \ #define MPD_SIMPLE(name, ...) \
static void \ static void \
on_mpd_ ## name (struct app_context *ctx) \ on_mpd_ ## name (struct app_context *ctx, int arg) \
{ \ { \
(void) arg; \
struct mpd_client *c = &ctx->mpd_client; \ struct mpd_client *c = &ctx->mpd_client; \
if (c->state != MPD_CONNECTED) \ if (c->state != MPD_CONNECTED) \
return; \ return; \
@ -2567,21 +2592,85 @@ MPD_SIMPLE (next, "next", NULL)
MPD_SIMPLE (forward, "seekcur", "+10", NULL) MPD_SIMPLE (forward, "seekcur", "+10", NULL)
MPD_SIMPLE (backward, "seekcur", "-10", NULL) MPD_SIMPLE (backward, "seekcur", "-10", NULL)
static void
on_volume_finish (pa_context *context, int success, void *userdata)
{
(void) context;
(void) success;
(void) userdata;
// Just like... whatever, man
}
static void
on_volume_mute (struct app_context *ctx, int arg)
{
(void) arg;
if (!ctx->context)
return;
pa_operation_unref (pa_context_set_sink_mute_by_name (ctx->context,
ctx->sink_name, !ctx->muted, on_volume_finish, ctx));
}
static void
on_volume_set (struct app_context *ctx, int arg)
{
if (!ctx->context)
return;
pa_cvolume volume = ctx->volume;
if (arg > 0)
pa_cvolume_inc (&volume, (pa_volume_t) arg * PA_VOLUME_NORM / 100);
else
pa_cvolume_dec (&volume, (pa_volume_t) -arg * PA_VOLUME_NORM / 100);
pa_operation_unref (pa_context_set_sink_volume_by_name (ctx->context,
ctx->sink_name, &volume, on_volume_finish, ctx));
}
static void
on_brightness (struct app_context *ctx, int arg)
{
char *value = xstrdup_printf ("%d", arg);
char *argv[] = { "brightness", value, NULL };
spawn (ctx, argv);
free (value);
}
struct struct
{ {
unsigned mod; unsigned mod;
KeySym keysym; KeySym keysym;
void (*handler) (struct app_context *ctx); void (*handler) (struct app_context *ctx, int arg);
int arg;
} }
g_keys[] = g_keys[] =
{ {
{ Mod4Mask, XK_Up, on_mpd_play }, // MPD
{ Mod4Mask, XK_Down, on_mpd_stop }, { Mod4Mask, XK_Up, on_mpd_play, 0 },
{ Mod4Mask, XK_Left, on_mpd_prev }, { Mod4Mask, XK_Down, on_mpd_stop, 0 },
{ Mod4Mask, XK_Right, on_mpd_next }, { Mod4Mask, XK_Left, on_mpd_prev, 0 },
{ Mod4Mask, XK_Right, on_mpd_next, 0 },
/* xmodmap | grep -e Alt_R -e Meta_R -e ISO_Level3_Shift -e Mode_switch */ /* xmodmap | grep -e Alt_R -e Meta_R -e ISO_Level3_Shift -e Mode_switch */
{ Mod4Mask | Mod5Mask, XK_Left, on_mpd_backward }, { Mod4Mask | Mod5Mask, XK_Left, on_mpd_backward, 0 },
{ Mod4Mask | Mod5Mask, XK_Right, on_mpd_forward }, { Mod4Mask | Mod5Mask, XK_Right, on_mpd_forward, 0 },
// Brightness
{ Mod4Mask, XK_Home, on_brightness, 10 },
{ Mod4Mask, XK_End, on_brightness, -10 },
{ 0, XF86XK_MonBrightnessUp, on_brightness, 10 },
{ 0, XF86XK_MonBrightnessDown, on_brightness, -10 },
// Volume
{ Mod4Mask, XK_Delete, on_volume_mute, 0 },
{ Mod4Mask, XK_Page_Up, on_volume_set, 10 },
{ Mod4Mask | Mod5Mask, XK_Page_Up, on_volume_set, 1 },
{ Mod4Mask, XK_Page_Down, on_volume_set, -10 },
{ Mod4Mask | Mod5Mask, XK_Page_Down, on_volume_set, -1 },
{ 0, XF86XK_AudioMute, on_volume_mute, 0 },
{ 0, XF86XK_AudioRaiseVolume, on_volume_set, 10 },
{ 0, XF86XK_AudioLowerVolume, on_volume_set, -10 },
}; };
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -2613,7 +2702,7 @@ on_x_keypress (struct app_context *ctx, XEvent *e)
if (keysym == g_keys[i].keysym if (keysym == g_keys[i].keysym
&& CLEANMASK (g_keys[i].mod) == CLEANMASK (ev->state) && CLEANMASK (g_keys[i].mod) == CLEANMASK (ev->state)
&& g_keys[i].handler) && g_keys[i].handler)
g_keys[i].handler (ctx); g_keys[i].handler (ctx, g_keys[i].arg);
} }
static void static void