dwmstatus: add volume and brightness settings
This commit is contained in:
parent
a91e24930c
commit
c86e0af234
125
dwmstatus.c
125
dwmstatus.c
@ -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,16 +2548,39 @@ on_make_context (void *user_data)
|
|||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
#define MPD_SIMPLE(name, ...) \
|
static void
|
||||||
static void \
|
spawn (struct app_context *ctx, char *argv[])
|
||||||
on_mpd_ ## name (struct app_context *ctx) \
|
{
|
||||||
{ \
|
posix_spawn_file_actions_t actions;
|
||||||
struct mpd_client *c = &ctx->mpd_client; \
|
posix_spawn_file_actions_init (&actions);
|
||||||
if (c->state != MPD_CONNECTED) \
|
|
||||||
return; \
|
posix_spawn_file_actions_addclose (&actions, ConnectionNumber (ctx->dpy));
|
||||||
mpd_client_send_command (c, __VA_ARGS__); \
|
if (ctx->mpd_client.socket != -1)
|
||||||
mpd_client_add_task (c, NULL, NULL); \
|
posix_spawn_file_actions_addclose (&actions, ctx->mpd_client.socket);
|
||||||
mpd_client_idle (c, 0); \
|
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
|
// 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 (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
|
||||||
|
Loading…
Reference in New Issue
Block a user