diff --git a/i3lock-bash b/i3lock-bash index ce44074..61d12c0 100644 --- a/i3lock-bash +++ b/i3lock-bash @@ -23,7 +23,6 @@ _i3lock() { "--debug" # i3lock-color OPTIONS - "--screen -S" "--blur -B" "--clock --force-clocl -k" @@ -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" diff --git a/i3lock-zsh b/i3lock-zsh index 1432776..5138c73 100644 --- a/i3lock-zsh +++ b/i3lock-zsh @@ -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'))" diff --git a/i3lock.1 b/i3lock.1 index 2ef335d..cc97e5a 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -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. diff --git a/i3lock.c b/i3lock.c index b7c320a..eebef39 100644 --- a/i3lock.c +++ b/i3lock.c @@ -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() @@ -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) { @@ -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}, @@ -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;