BSPWM: Como trocar indicador da polybar, reorganizar monitores e criar regras

Olá @thespation, tudo bem?

Instalei o Arch BSPWM unando uma dica sua sobre o ArchGUI (inclusive, obrigado mais uma vez pela dica). Ficou bem limpa a instalação. Mas ainda assim queria mudar algumas coisinhas e, mesmo pesquisando a respeito, não consegui encontrar como fazer. Como você é um dos magos dos TWMs queria saber se poderia me ajudar com alguns pontos (tentarei ser o mais claro possível):

Na saída do comando xrandr foram identificadas da seguinte forma:

  • LVDS-1: Tela do Notebook
  • VGA-1: Monitor da Esquerda
  • HDMI-1: Monitor da Direita

Não sei se é a forma mais correta de ser fazer, mas consegui colocá-las na disposição correta. Quero a polybar somente no monitor principal mesmo. Mas ela está identificando as áreas de trabalho virtuais do monitor principal como na imagem abaixo e não como queria: I II III IV. Além de que a área de trabalho virtual 1 é acessada pelo Mod+2 e assim por diante no monitor principal. Enquanto que o Mod+1 vai para a tela da esquerda e acessa a que queria que fosse a área de trabalho virtual 5.

image

Meu arquivo bspwmrc segue abaixo:

#! /bin/sh

pgrep -x sxhkd > /dev/null || sxhkd &
sxhkd &
nm-applet &
$HOME/.config/polybar/launch.sh
feh --bg-fill /usr/share/backgrounds/bspwm/wall.png
picom &
numlockx on &
xrandr --output LVDS-1 --primary --mode 1366x768 --rotate normal --output VGA-1 --mode 1366x768 --rotate normal --left-of LVDS-1 --output HDMI-1 --mode 1366x768 --rotate normal --right-of LVDS-1 &
#bspc monitor -d I II III IV V VI VII VIII IX X

bspc monitor VGA-1 -d 'V'
bspc monitor LVDS-1 -d 'I' 'II' 'III' 'IV'
bspc monitor HDMI-1 -d 'VI'

bspc config border_width         1
bspc config window_gap           8

bspc config automatic_scheme spiral
bspc config initial_polarity first_child
bspc config split_ratio          0.5
bspc config borderless_monocle   true
bspc config gapless_monocle      true

#bspc config focus_follows_pointer true

bspc rule -a Gimp desktop='^8' state=floating follow=on
bspc rule -a brave desktop='^1'
bspc rule -a alacritty desktop='^6'
bspc rule -a mplayer2 state=floating
bspc rule -a Kupfer.py focus=on
bspc rule -a Screenkey manage=off

No arquivo de configuração da polybar a única coisa que modifiquei foi a ordem de exibição da data e hora.

Poderia me ajudar a solucionar isso, por favor?

Além de uma outra coisa, queria determinar para que certos programas abrissem em áreas de trabalho específicas. Exemplo, o brave abrir sempre na área de trabalho da esquerda e o terminal na da direita, independente de qual área de trabalho eu esteja no momento de usar o rofi.

Desculpa se não fui claro ou se não era o local correto pra colocar minha dúvida e desde já agradeço a atenção!

2 curtidas

Olá, Tudo ótimo! Espero que esteja tudo bem contigo também.

Se funcionou como desejava, é a forma correta para você. Pode não ser a forma mais fácil ou que a maioria faz, entre tanto, é a que lhe proporcionou exito.

Essa configuração no arquivo bspwmrc gerencia a quantidades de áreas e, dependendo do módulo da sua polybar, também os ícones. Acredito que, como está configurado como deseja no arquivo bspwmrc pode ser interessante olhar o arquivo config do módulo da sua polybar.

Em alguns casos, os módulos voltados especificamente para Openbox, não mostram os valores dos ícones, ficando apenas uma referência simbólica, por exemplo:

image

Exemplo do módulo que normalmente uso:

Config
[module/bspwm]
type = internal/bspwm

pin-workspaces = true
inline-mode = false

enable-click = true
enable-scroll = true
reverse-scroll = true

fuzzy-match = true

; ws-icon-[0-9]+ = label;icon
; Note that the label needs to correspond with the bspwm workspace name
;;ws-icon-0 = code;♚
;;ws-icon-1 = office;♛
;;ws-icon-2 = graphics;♜
;;ws-icon-3 = mail;♝
;;ws-icon-4 = web;♞
;;ws-icon-default = ♟

format = <label-state>

label-monitor = %name%

; If any values for label-dimmed-N are defined, the workspace/mode
; colors will get overridden with those values if the monitor is out of focus
; To only override workspaces in a specific state, use:
;   label-dimmed-focused
;   label-dimmed-occupied
;   label-dimmed-urgent
;   label-dimmed-empty
;label-dimmed-foreground = ${color.FOREGROUND}
;label-dimmed-underline = ${color.YELLOW}
;label-dimmed-focused-background = ${color.BACKGROUND}

label-focused = %name%
label-focused-foreground = ${color.BACKGROUND}
label-focused-background = ${color.BLUE}
;label-focused-underline = ${color.RED}
label-focused-padding = 1

label-occupied = %name%
label-occupied-foreground = ${color.BACKGROUND}
label-occupied-background = ${color.GREEN}
;label-occupied-underline = ${color.GREEN}
label-occupied-padding = 1

label-urgent = %name%
label-urgent-foreground = ${color.BACKGROUND}
label-urgent-background = ${color.RED}
;label-urgent-underline = ${color.RED}
label-urgent-padding = 1

label-empty = %name%
label-empty-foreground = ${color.FOREGROUND}
label-empty-padding = 1

; Separator in between workspaces
label-separator = " "
label-separator-padding = 0
;label-separator-foreground = ${color.YELLOW}

;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

Link do arquivo config: xubuntu_bspwm/config/bspwm/polybar/config at main · thespation/xubuntu_bspwm · GitHub


Essa aqui é bem simples, acredito que mudando a ordem já resolverá:

bspc monitor LVDS-1 -d 'I' 'II' 'III' 'IV'
bspc monitor VGA-1 -d 'V'
bspc monitor HDMI-1 -d 'VI'

Isso porque o sistema não entende que “V” significa necessariamente 5, ele apenas interpreta como um simbolo da área, com isso não importa o que é definido. Por ser a primeira referência no arquivo é entendido com o primeiro elemento.


Essa é uma regra que normalmente removo, mas vejo que pode ser interessante em alguns casos. Vou te passar as regras que tenho no script que deixei no github, acredito que será bem simples de entender a lógica e implementar conforme a sua necessidade.

Dentro do arquivo bspwmrc pode deixar dessa forma:

## Window rules ----------------------------------------------#

# remove all rules first
bspc rule -r *:*

# 1 > terminal
bspc rule -a Alacritty desktop='^1' follow=on focus=on
bspc rule -a Xfce4-terminal desktop='^1' follow=on focus=on
bspc rule -a gnome-terminal desktop='^1' follow=on focus=on

# 2 > web
bspc rule -a firefox desktop='^2' follow=on focus=on
bspc rule -a chromium desktop='^2' follow=on focus=on

# 3 > files
declare -a files=(Pcmanfm Thunar Nautilus qBittorrent)
for i in ${files[@]}; do
   bspc rule -a $i desktop='^3' follow=on focus=on; done

# 4 > code
declare -a code=(Geany code-oss)
for i in ${code[@]}; do
   bspc rule -a $i desktop='^4' follow=on focus=on; done

# 5 > office and docs
declare -a office=(Gucharmap Atril Evince \
libreoffice-writer libreoffice-calc libreoffice-impress \
libreoffice-startcenter libreoffice Soffice *:libreofficedev *:soffice)
for i in ${office[@]}; do
   bspc rule -a $i desktop='^5' follow=on focus=on; done

# 6 > Communication
declare -a comm=(Thunderbird TelegramDesktop Hexchat)
for i in ${comm[@]}; do
   bspc rule -a $i desktop='^6' follow=on focus=on; done

# 7 > media
declare -a media=(Audacity Music MPlayer Lxmusic Inkscape Gimp-2.10 obs)
for i in ${media[@]}; do
   bspc rule -a $i desktop='^7' state=floating follow=on focus=on; done

# 8 > settings
bspc rule -a 'VirtualBox Manager' desktop='^8' follow=on focus=on
bspc rule -a GParted desktop='^8' follow=on focus=on
declare -a settings=(Lxappearance Lxtask Lxrandr Arandr \
System-config-printer.py Pavucontrol Exo-helper-1 \
Xfce4-power-manager-settings)
for i in ${settings[@]}; do
   bspc rule -a $i desktop='^8' state=floating follow=on focus=on; done

# special rules
declare -a floating=(alacritty-float Pcmanfm Onboard Yad 'Firefox:Places' \
Viewnior feh Nm-connection-editor)
for i in ${floating[@]}; do
   bspc rule -a $i state=floating follow=on focus=on; done

bspc rule -a Conky state=floating manage=off
bspc rule -a stalonetray state=floating manage=off

Note que para cada área há uma ou mais regras, é só editar como desejado.

Segue link para esse arquivo completo: dpux_bspwm/home/config/bspwm/bspwmrc at main · thespation/dpux_bspwm · GitHub

2 curtidas

Que bom! Também estou!

Valeu!

Show! Até aqui consegui e entendi tudo com sucesso.

Infelizmente só não tive sucesso na questão determinar a área de trabalho específica para determinados programas. Mas vou revisar a sua dica sobre isso e procurar um pouco mais sobre também.
Voltarei com o retorno aqui assim que tiver tempo de tentar novamente.

Muito obrigado pela ajuda!

2 curtidas

Excelente! Daqui a pouco é você quem estará nos ensinando os truques do bspwm rs

Amanhã testarei com o Brave, assim te passo o comando exato, só não consigo fazer isso ainda hoje, chegarei bem tarde do serviço.

2 curtidas

Espero poder contribuir também com aquilo que aprendo com a comunidade! :smiley:

Ótimo! Agradeço muito a atenção!

2 curtidas

Fiz um teste aqui e consegui.

Para descobrir a classe do Brave rodei o comando:

  • xprop | grep CLASS
  • Cliquei no navegador e me mostrou a seguinte informação:
    WM_CLASS(STRING) = "brave-browser", "Brave-browser"

Com isso atualizei o trecho:

# 2 > web
bspc rule -a firefox desktop='^2' follow=on focus=on
bspc rule -a chromium desktop='^2' follow=on focus=on
bspc rule -a Brave-browser desktop='^2' follow=on focus=on

Observe que a palavra “Brave” está com B maiúsculo, minúsculo não funcionou.

2 curtidas

Show!

Vou tentar assim que chegar em casa.

Esta vai para minhas anotações! :grin:

2 curtidas

Sempre será necessário usar o segundo campo. Se não me engano, o primeiro é a instância e o segundo a classe propriamente dita. Lembro de ter lido alguma coisa do tipo na documentação do i3wm. Então, se usar o conteúdo do primeiro campo, você nunca conseguirá obter a classe de fato, a não ser que o conteúdo de ambos seja o mesmo, o que acontece de vez em quando. Mas, como o exemplo do Brave mostrou, não é raro um dos campos vir com letras maiúsculas. E, como o linux é case sensitive, se tiver diferença não vai funcionar mesmo.

Muito bom o tópico. Como voltei a usar o bspwm de vez em quando, to pegando umas dicas aqui!

2 curtidas

Olá @thespation e @Tuxraldo !
Fiz exatamente o que você falou e realmente deu certo.
Já usei o comando xprop | grep CLASS para identificar a Classe de acordo com o que o @Tuxraldo explicou aqui:

Só que infelizmente não estou conseguindo criar uma rule para o ranger, o que eu já imaginava que não daria certo. Pois a saída do comando quando clico no ranger é a seguinte: WM_CLASS(STRING) = "Alacritty", "Alacritty". Como disse, já imaginava que iria pegar a classe do Alacritty que é onde o ranger está sendo executado.
Será se existe uma maneira de criar uma rule para o Alacritty executando o ranger e/ou algum script/comando em específico? Se fosse possível, seria interessante, não acham?

2 curtidas

Consegui criar a regra usando o parâmetro -name, ficando da seguinte forma:

# 3 > files
   bspc rule -a Alacritty -name 'Ranger' desktop='^3' follow=on focus=on

O problema é que acabou sobrepondo a regra que tinha para o terminal da área 1. Vou tentar encontrar uma forma de especificar e manter a outra regra, esse pode ser o caminho.

Testei com o htop e também funcionou dessa forma.

Caso abra pelo menu (Rofi, dmenu, etc) vai respeitar a regra. Caso esteja com o terminal aberto em alguma outra área e rode o comando, a janela não será movida para a área da regra, ficando no local de origem do terminal.

2 curtidas

Não sei como se faz isso, fiquei curioso. Vou pesquisar e tentar descobrir uma forma. Se conseguir volto aqui com o resultado.

Nas pesquisas que fiz, na documentação do bspwm e na internet, só consegui chegar ao mesmo resultado do @thespation.

EDIT: Aparentemente, usando a opção -o resolve o problema. Aqui, ao que tudo indica funcionou. Segui a ideia do William e, só trocando o Alacritty pelo xfc4-terminal, parece que deu certo. Se conseguirem, testem ai e me falem.

bspc rule -a Xfce4-terminal -name ‘cmus’ -o desktop=‘^1’ follow=on focus=on

Apenas mude o 1 pela área de trabalho pela de sua preferência e, se não quiser, remova os “follow” e “focus”. As duas últimas opções servem para dar foco e mover para a área de trabalho que a aplicação abrir.

Obs: fiz o teste criando um arquivo .desktop do cmus e mandando o xfce4-terminal abri-lo com o comando “xfce4-terminal -e /usr/bin/cmus” e depois executei com o rofi.

2 curtidas

Opa!

Vou testar assim que chegar em casa também e volto com o retorno!

2 curtidas

@Nildo_Lacerda esse opção só tem um problema. O -o significa one-shot, ou seja, se abrir o ranger novamente, ele não seguirá essa regra. Ele só seguirá ela na primeira vez que abrir o ranger. Depois só se der um reload no bspwm. Ainda não consegui descobrir um jeito e fazer isso de forma permanente. Vou ver mais um pouco a documentação e pesquisar pela net pra ver se acho um jeito de fazer de forma permanente.

1 curtida

Cara, vocês realmente são demais!

Deu certo…

E observei isso aqui também!

Pior que durante o dia, por conta do trabalho, não tenho como pesquisar e testar possibilidades. E vocês estão ajudando demais da conta aqui! Muito obrigado mesmo!
Já à noite o tempo é bem curto pra fazer os testes. Mas no fim de semana pretendo estudar melhor a documentação e fazer alguns testes também.

Tenho quase certeza de que irá funcionar com WebApps do Brave também. Assim que testar, dou o retorno aqui!

1 curtida

Testei com o Arch e o Alacritty, porque uso o xfce4-terminal e tem alguns recursos que ele não tem. Principalmente esse da classe, o xfce4-terminal é meio chato com isso.

É usando a opção de classe mesmo que vai resolver. Dessa vez sem truque de funcionar somente uma vez kkkkkkk Não sei se essa é a melhor forma de fazer isso, mas funcionou perfeitamente aqui.

Você terá que fazer modificações em dois arquivos, no bspwmrc e no (s) arquivo (s) .desktop do (s) programas que quer lançar.

No seu bspwmrc adicione (trocando o 1 pela área de trabalho de sua preferência e vifm pelo programa que quiser. Novamente, follow e focus são opcionais):

bspc rule -a ‘Alacritty:vifm’ desktop=‘^1’ focus=on follow=on

No arquivo .desktop do ranger, na linha Exec, troque o conteúdo atual pelo seguinte:

alacritty --class vifm -e vifm

No comando acima, a primeira parte, auto explicativa, é a classe (definida também lá no bspwmrc), no segundo, o -e é de --command. Com a opção -e o terminal funcionará executando o comando predefinido, no meu exemplo, o vifm. O -e é apenas um atalho para não precisar digitar --command vifm e usar apenas -e vifm. Essa opção -e, disponível em praticamente todos os terminais, é útil para lançar programas que rodam via terminal através de lançadores de aplicações como o rofi, dmenu, ulauncher etc. Sem precisar abrir o terminal e digitar o comando, essa opção já abre o terminal e roda o comando ao mesmo tempo.

Aqui no Arch está funcionando perfeitamente. Consigo abrir somente o ranger na área de trabalho 1 sem alterar a regra do Alacritty, ou seja, consigo abrir ele em outra área de trabalho específica se quiser ou posso abrir em qualquer área de trabalho.

Obs: normalmente os arquivos .desktop ficam em /usr/share/applications ou em $HOME/.local/share/applications.

3 curtidas

Desculpem o sumiço!

Foi meio corrido estes últimos dias e fiz alguns testes. Inclusive os que você sugeriu @Tuxraldo.

Obtive sucesso (em parte).

Como mexi em outras coisa, acho que acabei bugando o meu sistema. Mas pretendo, em breve, refazer a minha instalação e ir configurando tudo aos poucos me baseando nas dicas que vocês deram. E quando fizer, posto aqui o resultado geral.

Mas claro, tudo mais que vocês puderem e quiserem adicionar aqui vai, com certeza, me ajudar ainda mais! :smile:

2 curtidas

Testei aqui no Arch novamente, agorinha mesmo, e funcionou de boa.

Se quiser, poste o conteúdo do arquivo .desktop e do seu bspwmrc completos aqui que a gente dá um olhada. Tá usando com o alacritty mesmo? E, também, se quiser, descreve o que ocorreu, ou seja, porque funcionou apenas em parte.

O conteúdo no meu bspwm tá:

bspc rule -a 'Alacritty:ranger' desktop='^1'

Testei com e sem as opções follow e focus individualmente. Para ver se poderia ser algum bug ou limitações das opções e tudo funcionou normal, com ou sem elas.

O conteúdo do arquivo .desktop ($HOME/.local/share/applications) é seguinte (aberto através do rofi):

[Desktop Entry]
Type=Application
Name=ranger
GenericName=ranger
Comment= CLI File Manager
Exec=alacritty --class ranger -e ranger
Categories=System;Utility;FileManager;
2 curtidas

Este é o conteúdo do meu bsprc:

╰─ bat .config/bspwm/bspwmrc                                                                                                                                                                 
───────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
       │ File: .config/bspwm/bspwmrc
       │ Size: 1.4 KB
───────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1   │ #! /bin/sh
   2   │
   3   │ pgrep -x sxhkd > /dev/null || sxhkd &
   4   │ sxhkd &
   5   │ nm-applet &
   6   │ $HOME/.config/polybar/launch.sh
   7   │ #feh --bg-fill /usr/share/backgrounds/bspwm/wall.png
   8   │ feh --bg-fill $HOME/.NLacerdaTI_Wallpaper.jpg
   9   │ picom &
  10   │ numlockx on &
  11   │ xrandr --output LVDS-1 --primary --mode 1366x768 --rotate normal --output VGA-1 --mode 1366x768 --rotate normal --left-of LVDS-1 --output HDMI-1 --mode 1366x768 --rotate normal --righ
       │ t-of LVDS-1 &
  12   │ #bspc monitor -d I II III IV V VI VII VIII IX X
  13   │
  14   │ bspc monitor VGA-1 -d 'I' 'II'
  15   │ bspc monitor LVDS-1 -d 'III' 'IV' 'V'
  16   │ bspc monitor HDMI-1 -d 'VI' 'VII'
  17   │
  18   │ bspc config border_width         1
  19   │ bspc config window_gap           8
  20   │
  21   │ bspc config automatic_scheme spiral
  22   │ bspc config initial_polarity first_child
  23   │ bspc config split_ratio          0.5
  24   │ bspc config borderless_monocle   true
  25   │ bspc config gapless_monocle      true
  26   │
  27   │ #bspc config focus_follows_pointer true
  28   │
  29   │ # remove all rules first
  30   │ bspc rule -r *:*
  31   │
  32   │ #bspc rule -a Gimp desktop='^8' state=floating follow=on
  33   │ bspc rule -a Brave-browser desktop='^1' follow=on focus=on
  34   │ bspc rule -a Alacritty desktop='^6' follow=on focus=on
  35   │ bspc rule -a ‘Alacritty:ranger’ desktop=’^2’ focus=on follow=on
  36   │ #bspc rule -a Alacritty -name 'ranger' -o desktop='^3' follow=on focus=on
  37   │ bspc rule -a Org.gnome.Nautilus desktop='^2' follow=on focus=on
  38   │ #bspc rule -a mplayer2 state=floating
  39   │ #bspc rule -a Kupfer.py focus=on
  40   │ #bspc rule -a Screenkey manage=off
  41   │
  42   │
───────┴─────────────────────────────────────────────────────────────────

E o conteúdo do meu arquivo ranger.desktop:

╰─ bat /usr/share/applications/ranger.desktop
───────┬─────────────────────────────────────────────────────────────────
       │ File: /usr/share/applications/ranger.desktop
       │ Size: 304 B
───────┼─────────────────────────────────────────────────────────────────
   1   │ [Desktop Entry]
   2   │ Type=Application
   3   │ Name=Ranger
   4   │ Comment=Launches the ranger file manager
   5   │ Icon=utilities-terminal
   6   │ Terminal=true
   7   │ Exec=alacritty --class ranger -e ranger
   8   │ Categories=ConsoleOnly;System;FileTools;FileManager
   9   │ MimeType=inode/directory;
  10   │ Keywords=File;Manager;Browser;Explorer;Launcher;Vi;Vim;Python
───────┴─────────────────────────────────────────────────────────────────

Sim, estou usando o Alacritty.

O ranger as vezes abre no desktop 6, onde o alacritty já está aberto. Mesmo que seja a primeira vez que vou abri-lo.

Ah, e um outro problema (não relacionado) que venho tendo, é que a transparência não fuinciona mais. Mas isso, acho que desde o começo quando instalei o Alacritty e removi o Kitty.

Peguei suas configs do Alacritty e consegui reproduzir o mesmo comportamento que você citou.

Não entendo muito do bspwm, mas, provavelmente, o problema é sua regra para o Alacritty.

bspc rule -a Alacritty desktop='^6' follow=on focus=on

Acho que o bspwm entende, em alguns momentos, que todas as janelas do Alacritty devem seguir o comportamento definido por essa linha. Para resolver, eu apenas defini uma regra específica para o próprio Alacritty. Basta modificar sua linha para (e mandar um reload no bspwm):

bspc rule -a 'Alacritty:Alacritty' desktop='^6' follow=on focus=on

Desse modo, aqui tudo funcionou normal. E não tive mais esse problema que você citou. Veja se resolve ai.

Ih, não uso transparência. Então nisso não posso ajudar.

2 curtidas

@Nildo_Lacerda e @thespation testaram por ai? Definindo a regra para o próprio alacritty resolve, certo?

Aproveitei e testei com o kittty também. Embora não use nem o alacritty nem o kitty, o pessoal gosta bastante deles. Quando tiver tempo, posto aqui como fazer a mesma coisa só que com o kitty.

2 curtidas