Přepínač oken pro Sway
21.8.2025
Pokud postrádáte ve Sway (nebo jiném odlehčeném správci oken založeném na wlroots) jednoduchý přepínač toplevel oken, jaký poskytuje např. rofi v prostředích běžících na xorg serveru, zde je k dispozici. Je to jednoduchý program napsaný v C, který se znalostí C a Linuxu je napsaný za pár minut. Pro svůj běh využívá nástroje tofi a wlrctl, takže musíte nainstalovat stejnojmenné balíčky.
Princip je takový, že pomocí nástroje wlrctl získáme seznam existujících toplevel oken, který pošleme do aplikace tofi, která uživateli zobrazí tento seznam s možností výběru a vrátí do standardního výstupu text vybraného řádku. Ten je pak rozparsován na název okna a jeho titulek, které jsou pak použity v příkazu wlrctl pro nastavení fokusu na toto okno.
Zdrojový kód
Celý program je v jednom souboru main.c:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
static int is_regular_file(const char *path)
{
struct stat ss;
if (stat(path, &ss) != 0)
return 0;
else
return ((ss.st_mode & S_IFMT) == S_IFREG) ? 1 : 0;
}
static int command_to_buffer(const char *cmd, char *outbuff, size_t buffsize)
{
FILE *pf = popen(cmd, "r");
if (NULL == pf) {
return -1;
}
int retval = 1;
if (!feof(pf)) {
if (fgets(outbuff, buffsize, pf) != NULL) {
if (strlen(outbuff) > 0) {
if (*(outbuff + strlen(outbuff) - 1) == '\n')
*(outbuff + strlen(outbuff) - 1) = 0;
}
else {
retval = 0;
}
}
else {
retval = -1;
}
}
pclose(pf);
return retval;
}
int main(int argv, char **argc)
{
char cmd[1088];
char buff[1024];
char *sep;
char *title = NULL;
if (0 == is_regular_file("/usr/bin/tofi")) {
return EXIT_FAILURE;
}
if (0 == is_regular_file("/usr/bin/wlrctl")) {
return EXIT_FAILURE;
}
strcpy(cmd, "wlrctl toplevel list | tofi");
*buff = 0;
if (1 != command_to_buffer(cmd, buff, sizeof(buff)))
return EXIT_FAILURE;
if (0 == *buff)
return EXIT_SUCCESS;
sep = strstr(buff, ": ");
if (NULL == sep) {
}
else {
*sep = 0;
if (sep < buff + sizeof(buff) - 4)
title = sep + 2;
}
strcpy(cmd, "wlrctl toplevel focus ");
strcat(cmd, buff);
if (title) {
strcat(cmd, " title:\"");
strcat(cmd, title);
strcat(cmd, "\"");
}
system(cmd);
return EXIT_SUCCESS;
}
Pro překlad a sestavení můžete použít následující makefile, obsahující také instalaci do /usr/local/bin, kterou musíte samozřejmě spustit jako root, přesněji řečeno s administrátorskými právy.
CC = gcc
CFLAGS = -Wall -pedantic -Werror -O2
target = wlrwinswitch
source = main.c
$(target): Makefile $(source)
@echo "sestavuji"
$(CC) $(CFLAGS) -o $(target) $(source)
clean:
@echo "provadim clean"
rm -f $(target)
install: $(target)
@echo "Instaluji"
cp -f $(target) /usr/local/bin
sync
Použití ve Sway
Pro rychlé použití ve správci oken Sway stačí přidat do konfiguračního souboru řádek s definicí klávesové zkratky (např. Super+F8):
bindsym $mod+F8 exec /usr/local/bin/wlrwinswitch