Вернуться назад

waybar



    # Глобальный конфиг:
        /etc/xdg/waybar/config.jsonc
    # Локальный конфиг:
        ~/.config/waybar/config
        
    # Скопируем глобальный себе в домашнюю директорию:
        mkdir -p ~/.config/waybar
        cp /etc/xdg/waybar/config.jsonc ~/.config/waybar/config
        cp /etc/xdg/waybar/style.css ~/.config/waybar/
    
    ## Чтобы заработали иконки в конфиге, нужно установить шрифты:
        sudo pacman -S ttf-nerd-fonts-symbols
        sudo pacman -S ttf-nerd-fonts-symbols-mono
        ## Можно поставить дополнительно:
            sudo pacman -S ttf-fonts-awesome
            
    ## Чтобы при старте системы запускался наш waybar, а не дефолтный swaybar, надо
        ## - закомментировать раздел bar в ~/.config/sway/config
        ## - и добавить вместо него:
            exec_always "pgrep -x waybar || waybar"   # если процесс waybar существует, то ничего не делаем, иначе запускаем новый
           
    "modules-right": [
    "sway/language",      // раскладка
    "clock"               // время
    ],
    "sway/language": {      // указываем формат для раскладки
    "format": "{}"
    }
    
    // У меня вылезала ошибка из модуля "custom/media", потому что запускались py-скрипты, которых не было.
    // [warning] 'swap-icon-label' must be a bool. - предупреждение вылезает из-за модуля sway/window

    ## Пример простого simple_media.py (первая закомментированная строка тоже нужна!!!!!):
        #!/usr/bin/env python3
        import subprocess
        import json
        
        def get_status():
            try:
                # Получаем статус проигрывания от strawberry
                result = subprocess.run(
                    ["playerctl", "--player=strawberry", "status"],
                    capture_output=True, text=True, timeout=1
                )
                status = result.stdout.strip()
                if status == "Playing":
                    return "A"
            except Exception:
                pass
            return "🎜"
    
        print(json.dumps({"text": get_status()}))
    
    ## И соответственно, пример модуля "custom/media" в файле ~/.config/waybar/config, который запускает этот скрипт:
        "custom/media": {
        // "format": "{icon} {text}",
        //  "return-type": "json",
        //  "max-length": 40,
        //  "format-icons": {
        //     "spotify": "",
        //     "default": "🎜"
        //  },
        //  "escape": true
        //  "exec": "$HOME/.config/waybar/mediaplayer.py 2> /dev/null" // Script in resources folder
        // "exec": "$HOME/.config/waybar/mediaplayer.py --player spotify 2> /dev/null" // Filter player based on name
    
            "exec": "$HOME/.config/waybar/scripts/simple_media.py",
            "return-type": "json",
            "interval": 1
    
        },


    ### Улучшенный пример.
    ## Теперь когда плеер не запущен, значка нет. Когда запущен, отображается его имя. А когда играет, отображается значок игры.
    
        #!/usr/bin/env python3
        import subprocess
        import json
        
        PLAYER = "strawberry"
        
        def is_player_running():
            try:
                result = subprocess.run(
                    ["playerctl", "--list-all"],
                    capture_output=True, text=True, timeout=1
                )
                players = result.stdout.strip().splitlines()
                return PLAYER in players
            except:
                return False
        
        def get_status():
            try:
                result = subprocess.run(
                    ["playerctl", "--player=" + PLAYER, "status"],
                    capture_output=True, text=True, timeout=1
                )
                return result.stdout.strip()
            except:
                return None
        
        def main():
            if not is_player_running():
                return  # Не выводим ничего
        
            status = get_status()
            if status == "Playing":
                text = "🎜"
            else:
                text = PLAYER
        
            print(json.dumps({"text": text}))
        
        if __name__ == "__main__":
            main()
            
    ## Модуль "custom/media":
    
        "custom/media": {
        // "format": "{icon} {text}",
        //  "return-type": "json",
        //  "max-length": 40,
        //  "format-icons": {
        //     "spotify": "",
        //     "default": "🎜"
        //  },
        //  "escape": true
    
            "exec": "$HOME/.config/waybar/scripts/simple_media.py",
            "return-type": "json",
            "interval": 2,
            "max-length": 40,
            "format-icons": {
            "default": "🎜"
            }
        }
        
        
    ## Улучшенный пример. Теперь он работает с разными проигрывателями (для DeaDBeeF нужен плагин deadbeef-mpris2-plugin, чтобы playerctl его понимал):
        #!/usr/bin/env python3
        import subprocess
        import json
        
        def get_players():
            try:
                result = subprocess.run(
                    ["playerctl", "--list-all"],
                    capture_output=True, text=True, timeout=1
                )
                return result.stdout.strip().splitlines()
            except:
                return []
        
        def get_status(player):
            try:
                result = subprocess.run(
                    ["playerctl", "--player", player, "status"],
                    capture_output=True, text=True, timeout=1
                )
                return result.stdout.strip()
            except:
                return None
        
        def main():
            players = get_players()
            for player in players:
                status = get_status(player)
                if status == "Playing":
                    print(json.dumps({"text": "🎜"}))
                    return
                elif status in ["Paused", "Stopped"]:
                    print(json.dumps({"text": player}))
                    return
            # Ни одного активного плеера
            print(json.dumps({}))
        
        if __name__ == "__main__":
            main()
            
    ## Модуль "custom/media": 
    "custom/media": {
       // "format": "{icon} {text}",
       //  "return-type": "json",
       //  "max-length": 40,
       //  "format-icons": {
       //     "spotify": "",
       //     "default": "🎜"
       //  },
       //  "escape": true
       //  "exec": "$HOME/.config/waybar/mediaplayer.py 2> /dev/null" // Script in resources folder
       // "exec": "$HOME/.config/waybar/mediaplayer.py --player spotify 2> /dev/null" // Filter player based on name

       "exec": "~/.config/waybar/scripts/simple_media.py",
       "interval": 2,
       "return-type": "json",
       "format": "{}",
       "on-click": "playerctl play-pause"
     },
     
     ## Цвета для модуля "cutom/media":
        #custom-media {
            background-color: #3a6e56;
            color: #0f1b14;
            min-width: 100px;
        }
        #custom-media:hover {
            color: #1f3f2f;
            background-color: #4d9970;
        }
    
    ## Цвета для модуля "pulseaudio":
        #pulseaudio:hover {
            background-color: #f1c40f;
        }
        #pulseaudio {
            background-color: #a37800;
            color: #000000;
        }