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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user