Radek Chalupa - Přepínač oken pro Sway

Radek Chalupa   programování, Linux, online konzultace a školení

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