Skip to content

Shell command options for media keys #256

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Aug 26, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion i3lock-bash
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ _i3lock() {
"--debug"

# i3lock-color OPTIONS

"--screen -S"
"--blur -B"
"--clock --force-clocl -k"
Expand Down Expand Up @@ -81,6 +80,20 @@ _i3lock() {
"--pass-screen-keys"
"--pass-power-keys"
"--pass-volume-keys"
"--custom-key-commands"
"--cmd-brightness-up"
"--cmd-brightness-down"
"--cmd-media-play"
"--cmd-media-pause"
"--cmd-media-stop"
"--cmd-media-next"
"--cmd-media-prev"
"--cmd-audio-mute"
"--cmd-volume-up"
"--cmd-volume-down"
"--cmd-power-down"
"--cmd-power-off"
"--cmd-power-sleep"
# Bar mode
"--bar-indicator"
"--bar-direction"
Expand Down
14 changes: 14 additions & 0 deletions i3lock-zsh
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,20 @@ _i3lock() {
"--pass-screen-keys[Allow screen keys to be used while the screen is locked]"
"--pass-power-keys[Allow power keys to be used while the screen is locked]"
"--pass-volume-keys[Allow volume keys to be used while the screen is locked]"
"--custom-key-commands[Enable shell commands for media keys]"
"--cmd-brightness-up[Command for XF86MonBrightnessUp]"
"--cmd-brightness-down[Command for XF86MonBrightnessDown]"
"--cmd-media-play[Command for XF86AudioPlay]"
"--cmd-media-pause[Command for XF86AudioPause]"
"--cmd-media-stop[Command for XF86AudioStop]"
"--cmd-media-next[Command for XF86AudioNext]"
"--cmd-media-prev[Command for XF86AudioPrev]"
"--cmd-audio-mute[Command for XF86AudioMute]"
"--cmd-volume-up[Command for XF86AudioRaiseVolume]"
"--cmd-volume-down[Command for XF86AudioLowerVolume]"
"--cmd-power-down[Command for XF86PowerDown] "
"--cmd-power-off[Command for XF86PowerOff]"
"--cmd-power-sleep[Command for XF86Sleep]"
# Bar mode
"--bar-indicator[Replaces the usual ring indicator with a bar indicator]"
"--bar-direction[Sets the direction the bars grow in]:direction:((0\:'default' 1\:'reverse' 2\:'both'))"
Expand Down
37 changes: 37 additions & 0 deletions i3lock.1
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,43 @@ power - XF86PowerDown, XF86PowerOff, XF86Sleep
volume - XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume
.RE


.TP
.B \-\-custom\-key\-commands
Enables custom shell commands for media, screen, power and volume keys. An alternative to \-\-pass\-media\0keys that will work in any environment.

.TP
.B \-\-cmd\-**
Shell command to run when the corresponding key is pressed. Requires \-\-custom\-key\-commands
.RS
.IP \[bu] 2
brightness\-up - XF86MonBrightnessUp
.IP \[bu]
brightness\-down - XF86MonBrightnessDown
.IP \[bu]
media\-play - XF86AudioPlay
.IP \[bu]
media\-pause - XF86AudioPause
.IP \[bu]
media\-stop - XF86AudioStop
.IP \[bu]
media\-next - XF86AudioNext
.IP \[bu]
media\-prev - XF86AudioPrev
.IP \[bu]
audio\-mute - XF86AudioMute
.IP \[bu]
volume\-up - XF86AudioRaiseVolume
.IP \[bu]
volume\-down - XF86AudioLowerVolume
.IP \[bu]
power\-down - XF86PowerDown
.IP \[bu]
power\-off - XF86PowerOff
.IP \[bu]
power\-sleep - XF86Sleep
.RE

.TP
.B \-\-bar\-indicator
Replaces the usual ring indicator with a bar indicator. Comes with perks.
Expand Down
168 changes: 168 additions & 0 deletions i3lock.c
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,24 @@ bool pass_screen_keys = false;
bool pass_power_keys = false;
bool pass_volume_keys = false;

bool hotkeys = false;
char* cmd_brightness_up = NULL;
char* cmd_brightness_down = NULL;

char* cmd_media_play = NULL;
char* cmd_media_pause = NULL;
char* cmd_media_stop = NULL;
char* cmd_media_next = NULL;
char* cmd_media_prev = NULL;

char* cmd_audio_mute = NULL;
char* cmd_volume_up = NULL;
char* cmd_volume_down = NULL;

char* cmd_power_down = NULL;
char* cmd_power_off = NULL;
char* cmd_power_sleep = NULL;

// for the rendering thread, so we can clean it up
pthread_t draw_thread;
// main thread still sometimes calls redraw()
Expand Down Expand Up @@ -703,6 +721,90 @@ static void handle_key_press(xcb_key_press_event_t *event) {
n = xkb_keysym_to_utf8(ksym, buffer, sizeof(buffer));
#endif

//custom key commands
if (hotkeys) {
switch(ksym) {
case XKB_KEY_XF86MonBrightnessUp:
if (cmd_brightness_up) {
system(cmd_brightness_up);
return;
}
break;
case XKB_KEY_XF86MonBrightnessDown:
if (cmd_brightness_down) {
system(cmd_brightness_down);
return;
}
break;
case XKB_KEY_XF86AudioPlay:
if (cmd_media_play) {
system(cmd_media_play);
return;
}
break;
case XKB_KEY_XF86AudioPause:
if (cmd_media_pause) {
system(cmd_media_pause);
return;
}
break;
case XKB_KEY_XF86AudioStop:
if (cmd_media_stop) {
system(cmd_media_stop);
return;
}
break;
case XKB_KEY_XF86AudioPrev:
if (cmd_media_prev) {
system(cmd_media_prev);
return;
}
break;
case XKB_KEY_XF86AudioNext:
if (cmd_media_next) {
system(cmd_media_next);
return;
}
break;
case XKB_KEY_XF86AudioMute:
if (cmd_audio_mute) {
system(cmd_audio_mute);
return;
}
break;
case XKB_KEY_XF86AudioLowerVolume:
if (cmd_volume_down) {
system(cmd_volume_down);
return;
}
break;
case XKB_KEY_XF86AudioRaiseVolume:
if (cmd_volume_up) {
system(cmd_volume_up);
return;
}
break;
case XKB_KEY_XF86PowerDown:
if (cmd_power_down) {
system(cmd_power_down);
return;
}
break;
case XKB_KEY_XF86PowerOff:
if (cmd_power_off) {
system(cmd_power_off);
return;
}
break;
case XKB_KEY_XF86Sleep:
if (cmd_power_sleep) {
system(cmd_power_sleep);
return;
}
break;
}
}

// media keys
if (pass_media_keys) {
switch(ksym) {
Expand Down Expand Up @@ -1558,6 +1660,25 @@ int main(int argc, char *argv[]) {
{"pass-power-keys", no_argument, NULL, 603},
{"pass-volume-keys", no_argument, NULL, 604},

// custom commands for pass keys
{"custom-key-commands", no_argument, NULL, 610},
{"cmd-brightness-up", required_argument, NULL, 620},
{"cmd-brightness-down", required_argument, NULL, 621},

{"cmd-media-play", required_argument, NULL, 630},
{"cmd-media-pause", required_argument, NULL, 631},
{"cmd-media-stop", required_argument, NULL, 632},
{"cmd-media-next", required_argument, NULL, 633},
{"cmd-media-prev", required_argument, NULL, 634},

{"cmd-audio-mute", required_argument, NULL, 640},
{"cmd-volume-up", required_argument, NULL, 641},
{"cmd-volume-down", required_argument, NULL, 642},

{"cmd-power-down", required_argument, NULL, 650},
{"cmd-power-off", required_argument, NULL, 651},
{"cmd-power-sleep", required_argument, NULL, 652},

// bar indicator stuff
{"bar-indicator", no_argument, NULL, 700},
{"bar-direction", required_argument, NULL, 701},
Expand Down Expand Up @@ -2119,6 +2240,53 @@ int main(int argc, char *argv[]) {
pass_volume_keys = true;
break;

//custom key commands
case 610:
hotkeys = true;
break;
case 620:
cmd_brightness_up = optarg;
break;
case 621:
cmd_brightness_down = optarg;
break;

case 630:
cmd_media_play = optarg;
break;
case 631:
cmd_media_pause = optarg;
break;
case 632:
cmd_media_stop = optarg;
break;
case 633:
cmd_media_next = optarg;
break;
case 634:
cmd_media_prev = optarg;
break;

case 640:
cmd_audio_mute = optarg;
break;
case 641:
cmd_volume_up = optarg;
break;
case 642:
cmd_volume_down = optarg;
break;

case 650:
cmd_power_down = optarg;
break;
case 651:
cmd_power_off = optarg;
break;
case 652:
cmd_power_sleep = optarg;
break;

// Bar indicator
case 700:
bar_enabled = true;
Expand Down