wmstatus: improve Sway forwards of xkb-lock-group
All checks were successful
Alpine 3.20 Success
OpenBSD 7.5 Success

This commit is contained in:
Přemysl Eric Janouch 2024-08-08 14:57:45 +02:00
parent e83cfa3c15
commit 94bc8c251c
Signed by: p
GPG Key ID: A0420B94F92B9493
2 changed files with 47 additions and 27 deletions

View File

@ -2581,7 +2581,7 @@ action_xkb_lock_group (struct app_context *ctx, const struct strv *args)
return; return;
} }
long group = strtol (args->vector[0], NULL, 10) - 1; long group = strtol (args->vector[0], NULL, 10);
if (group < XkbGroup1Index || group > XkbGroup4Index) if (group < XkbGroup1Index || group > XkbGroup4Index)
print_warning ("invalid XKB group index: %s", args->vector[0]); print_warning ("invalid XKB group index: %s", args->vector[0]);
else else
@ -3039,6 +3039,30 @@ sway_append_command_argument (struct str *out, const char *word)
str_append_c (out, '\''); str_append_c (out, '\'');
} }
static char *
sway_shell_command_for_action (const struct strv *args)
{
// The i3/Sway quoting is properly fucked up,
// and its exec command forwards to `sh -c`.
struct str shell_command = str_make ();
if (strcmp (args->vector[0], "exec"))
{
// argv[0] would need realpath() applied on it.
shell_quote (PROGRAM_NAME, &shell_command);
str_append (&shell_command, " -- ");
shell_quote (args->vector[0], &shell_command);
str_append_c (&shell_command, ' ');
}
for (size_t i = 1; i < args->len; i++)
{
shell_quote (args->vector[i], &shell_command);
str_append_c (&shell_command, ' ');
}
if (shell_command.len)
shell_command.str[--shell_command.len] = 0;
return str_steal (&shell_command);
}
static const char * static const char *
sway_bindsym (const char *combination, const char *action) sway_bindsym (const char *combination, const char *action)
{ {
@ -3063,25 +3087,6 @@ sway_bindsym (const char *combination, const char *action)
goto out; goto out;
} }
// The i3/Sway quoting is properly fucked up,
// and its exec command forwards to `sh -c`.
struct str shell_command = str_make ();
if (strcmp (handler.name, "exec"))
{
// argv[0] would need realpath() applied on it.
shell_quote (PROGRAM_NAME, &shell_command);
str_append (&shell_command, " -- ");
shell_quote (handler.name, &shell_command);
str_append_c (&shell_command, ' ');
}
for (size_t i = 1; i < args.len; i++)
{
shell_quote (args.vector[i], &shell_command);
str_append_c (&shell_command, ' ');
}
if (shell_command.len)
shell_command.str[--shell_command.len] = 0;
// This command name may not be quoted. // This command name may not be quoted.
// Note that i3-msg doesn't accept bindsym at all, only swaymsg does. // Note that i3-msg doesn't accept bindsym at all, only swaymsg does.
struct str sway_command = str_make (); struct str sway_command = str_make ();
@ -3089,9 +3094,24 @@ sway_bindsym (const char *combination, const char *action)
char *recombined = strv_join (&keys, "+"); char *recombined = strv_join (&keys, "+");
sway_append_command_argument (&sway_command, recombined); sway_append_command_argument (&sway_command, recombined);
free (recombined); free (recombined);
if (handler.handler == action_xkb_lock_group)
{
// This should also switch the XWayland layout,
// though it has been observed to not take effect immediately.
sway_append_command_argument (&sway_command, "input");
sway_append_command_argument (&sway_command, "type:keyboard");
sway_append_command_argument (&sway_command, "xkb_switch_layout");
for (size_t i = 1; i < args.len; i++)
sway_append_command_argument (&sway_command, args.vector[i]);
}
else
{
sway_append_command_argument (&sway_command, "exec"); sway_append_command_argument (&sway_command, "exec");
sway_append_command_argument (&sway_command, shell_command.str); char *shell_command = sway_shell_command_for_action (&args);
str_free (&shell_command); sway_append_command_argument (&sway_command, shell_command);
free (shell_command);
}
struct strv argv = strv_make (); struct strv argv = strv_make ();
strv_append (&argv, "swaymsg"); strv_append (&argv, "swaymsg");

View File

@ -16,10 +16,10 @@ keys = {
"XF86AudioPrev" = "mpd previous" "XF86AudioPrev" = "mpd previous"
"XF86AudioNext" = "mpd next" "XF86AudioNext" = "mpd next"
"Mod4 F1" = "xkb-lock-group 1" "Mod4 F1" = "xkb-lock-group 0"
"Mod4 F2" = "xkb-lock-group 2" "Mod4 F2" = "xkb-lock-group 1"
"Mod4 F3" = "xkb-lock-group 3" "Mod4 F3" = "xkb-lock-group 2"
"Mod4 F4" = "xkb-lock-group 4" "Mod4 F4" = "xkb-lock-group 3"
"Mod4 Control F1" = "exec input-switch vga 1" "Mod4 Control F1" = "exec input-switch vga 1"
"Mod4 Control Shift F1" = "exec input-switch vga 2" "Mod4 Control Shift F1" = "exec input-switch vga 2"