From c86e0af2349656e1a3079e638634342f11f8ef16 Mon Sep 17 00:00:00 2001 From: Přemysl Janouch Date: Sun, 10 Jan 2016 04:05:04 +0100 Subject: dwmstatus: add volume and brightness settings --- dwmstatus.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 107 insertions(+), 18 deletions(-) diff --git a/dwmstatus.c b/dwmstatus.c index e3e3a29..03d9f03 100644 --- a/dwmstatus.c +++ b/dwmstatus.c @@ -29,9 +29,11 @@ #include #include +#include #include #include +#include #include #include @@ -2546,16 +2548,39 @@ on_make_context (void *user_data) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -#define MPD_SIMPLE(name, ...) \ - static void \ - on_mpd_ ## name (struct app_context *ctx) \ - { \ - struct mpd_client *c = &ctx->mpd_client; \ - if (c->state != MPD_CONNECTED) \ - return; \ - mpd_client_send_command (c, __VA_ARGS__); \ - mpd_client_add_task (c, NULL, NULL); \ - mpd_client_idle (c, 0); \ +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, ...) \ + static void \ + on_mpd_ ## name (struct app_context *ctx, int arg) \ + { \ + (void) arg; \ + struct mpd_client *c = &ctx->mpd_client; \ + if (c->state != MPD_CONNECTED) \ + return; \ + mpd_client_send_command (c, __VA_ARGS__); \ + mpd_client_add_task (c, NULL, NULL); \ + mpd_client_idle (c, 0); \ } // XXX: pause without argument is deprecated, we can watch play state @@ -2567,21 +2592,85 @@ MPD_SIMPLE (next, "next", NULL) MPD_SIMPLE (forward, "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 { unsigned mod; KeySym keysym; - void (*handler) (struct app_context *ctx); + void (*handler) (struct app_context *ctx, int arg); + int arg; } g_keys[] = { - { Mod4Mask, XK_Up, on_mpd_play }, - { Mod4Mask, XK_Down, on_mpd_stop }, - { Mod4Mask, XK_Left, on_mpd_prev }, - { Mod4Mask, XK_Right, on_mpd_next }, + // MPD + { Mod4Mask, XK_Up, on_mpd_play, 0 }, + { Mod4Mask, XK_Down, on_mpd_stop, 0 }, + { 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 */ - { Mod4Mask | Mod5Mask, XK_Left, on_mpd_backward }, - { Mod4Mask | Mod5Mask, XK_Right, on_mpd_forward }, + { Mod4Mask | Mod5Mask, XK_Left, on_mpd_backward, 0 }, + { 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 && CLEANMASK (g_keys[i].mod) == CLEANMASK (ev->state) && g_keys[i].handler) - g_keys[i].handler (ctx); + g_keys[i].handler (ctx, g_keys[i].arg); } static void -- cgit v1.2.3-70-g09d2