바이너리 스페이스 파티셔닝 윈도우 매니저(BSPWM, Binary Space Partitioning Window Manager)는 리눅스용 미니멀리스트 윈도우 매니저로, 강력하면서도 높은 수준의 커스터마이징이 가능한 도구입니다. C 언어로 작성되었으며 어떤 프로그래밍 언어로든 설정할 수 있어, 윈도우 매니저 사용자화의 정점이라 불릴 만합니다. 자신만의 고유한 작업 환경(workflow)을 만들고 싶은 파워 유저와 취미 개발자들에게 특히 매력적인 선택지입니다.
바이너리 스페이스 파티셔닝(Binary Space Partitioning)이란?
바이너리 스페이스 파티셔닝은 데스크톱의 창들을 완전 이진 트리(full binary tree)의 잎 노드(leaf node)로 표현한다는 개념입니다. 완전 이진 트리는 계층적 노드 구조로 정보를 정렬하는 방식으로, 루트 노드가 항상 두 개의 하위 노드를 가지며 모든 정보가 두 개씩 분류됩니다.
bspwm은 이러한 노드 단위로 동작합니다. 빈 데스크톱에서 새 창을 생성하면 bspwm은 해당 창을 위한 하나의 노드를 만듭니다. 이 노드는 잎 노드라고 생각할 수 있습니다. 그런데 같은 데스크톱에 또 다른 창을 추가하면 기존 잎 노드가 루트 노드로 바뀌고, bspwm은 여기에 연결된 두 개의 새 잎 노드를 생성해 현재 창과 새로 만든 창을 각각 배치합니다.
이후 생성되는 모든 새 창은 기존 잎 노드 중 하나에 연결되며, 해당 잎 노드는 각자의 루트 노드가 됩니다.
이런 방식으로 창을 배치하면 데스크톱 내부에 명확한 계층 구조가 형성됩니다. 어떤 잎 노드가 먼저 생성되었고, 어떤 것들이 특정 루트 노드 그룹에 속하는지 한눈에 파악할 수 있습니다. 이는 특정 창이나 창 배치에 대한 커스텀 규칙을 만들 때 매우 유용합니다.
키 바인딩과 상태 바
주목할 점은 bspwm이 오직 창 관리만 담당한다는 것입니다. 즉, 창 관리와 관련 없는 기능들은 bspwm 패키지에 포함되어 있지 않습니다. 키를 특정 기능에 바인딩하는 기능이나 상태 바 표시 기능 등이 대표적인 예입니다.
bspwm에서 키 바인딩을 사용하기 위해 개발자들은 키 바인딩만 전담하는 별도 프로그램인 sxhkd(Simple X Hotkey Daemon)를 만들었습니다. 상태 바는 polybar, lemonbar 등 다양한 서드파티 애플리케이션 중 원하는 것을 설치해 사용할 수 있습니다.
bspwm과 sxhkd 설치하기
bspwm과 sxhkd 설치는 비교적 간단하며, 두 프로그램 모두 대부분의 리눅스 저장소에서 제공됩니다.
Debian이나 Ubuntu에서는 apt로 설치할 수 있습니다:
sudo apt install bspwm sxhkd
Arch Linux에서는 pacman을 사용합니다:
sudo pacman -Syu bspwm sxhkd
Fedora에서는 dnf를 사용합니다:
sudo dnf install bspwm sxhkd
Void Linux에서는 xbps를 사용합니다:
sudo xbps-install bspwm sxhkd
이 글에서는 Void Linux 시스템에 설치하는 예시를 보여드리겠습니다.
bspc: bspwm의 만능 컨트롤러
bspwm을 사용하려면 사실상 하나의 프로그램, 즉 bspc와만 상호작용하면 됩니다. bspc는 bspwm의 동작을 제어하고 설정할 수 있는 강력한 유틸리티로, 실제로 창을 조작하고 bspwm을 설정하는 모든 명령어가 곧 bspc 명령어입니다.
bspwm 설정 파일 준비하기
bspwm 설정을 시작하려면 먼저 설정 파일을 만들어야 합니다. bspwm은 처음 실행될 때 이 파일에서 실행할 bspc 명령어를 읽어옵니다. 기본적으로 bspwm은 "/home/$USER/.config/bspwm/bspwmrc" 파일을 찾습니다. 다음 명령어로 파일을 생성할 수 있습니다:
mkdir -p /home/$USER/.config/bspwm && touch /home/$USER/.config/bspwm/bspwmrc
이 명령어는 "/home/$USER/.config/" 아래에 bspwm 폴더를 만들고, 그 안에 bspwmrc 파일을 생성합니다.
bspwmrc 파일은 실행 가능하기만 하다면 어떤 언어로 작성해도 됩니다. 따라서 먼저 파일 속성을 실행 가능으로 변경해야 합니다. 다음 명령어를 입력하세요:
sudo chmod 774 /home/$USER/.config/bspwm/bspwmrc
이렇게 하면 본인과 같은 사용자 그룹에 속한 사람들이 파일을 실행할 수 있습니다.
이제 bspwmrc 파일을 열어 편집합니다. 필자는 vim을 사용했습니다:
vim /home/$USER/.config/bspwm/bspwmrc
빈 파일이 열리면 본격적으로 설정 내용을 작성할 수 있습니다.
bspwm 설정하기
bspwm의 기본 설정은 다음과 같습니다:
#!/bin/bash xsetroot -cursor_name left_ptr sxhkd & bspc config border_width 2 bspc config window_gap 0 bspc config split_ratio 0.62 bspc config focus_follows_pointer true bspc config pointer_modifier mod1 bspc config automatic_scheme spiral bspc rule -a Chromium desktop='^2' bspc rule -a Gimp desktop='^8' state=floating follow=on
첫 줄의 셔뱅(shebang)에서 알 수 있듯이 이 설정은 Bash로 작성되었습니다. 첫 몇 개의 명령어는 bspwm 설정을 시작하기 전에 실행하고 싶은 프로그램들입니다.
첫 번째 명령어인 xsetroot는 X의 기본 커서를 더 익숙한 왼쪽 포인터로 변경합니다. 두 번째 명령어는 핫키 데몬(sxhkd)을 백그라운드에서 초기화합니다.
bspc config와 bspc rule
설정 파일의 나머지 명령어들은 bspc 전용입니다. bspc config는 윈도우 매니저의 전반적인 설정을 담당하며, 외관과 기능 관련 옵션을 모두 포함합니다.
- border_width: 창 테두리의 두께를 픽셀 단위로 지정합니다.
- window_gap: 창 주변의 간격을 픽셀 단위로 지정합니다.
- split_ratio: 분할 시 두 잎 노드 사이의 비율을 결정합니다.
- focus_follows_pointer: 마우스 포인터가 포커스를 받을 창을 제어할 수 있는지 설정합니다.
- pointer_modifier: 마우스로 창 크기를 조절할 때 사용할 키보드 수정 키를 결정합니다.
- automatic_scheme: 자동 모드에서 창이 분할될 때의 레이아웃 방식을 결정합니다.
bspc rule은 반대로 프로그램이 bspwm에서 열릴 때의 동작 방식을 다룹니다.
- 예시 설정의 첫 번째 규칙은 Chromium이 항상 2번째 데스크톱에서 실행되도록 강제합니다.
- 두 번째 규칙은 Gimp가 8번째 데스크톱에서 실행되도록 하며, 기본 타일링 방식 대신 플로팅(floating) 상태로 열리게 하고, Gimp가 로드될 때 창 포커스도 함께 이동시킵니다.
이제 bspwm의 기본 설정이 완성되었습니다. 다만 bspc config와 bspc rule의 옵션은 매우 방대하다는 점을 기억하세요. bspwmrc를 더 세밀하게 조정하고 싶다면 GitHub 공식 문서에서 가능한 모든 설정 목록을 확인할 수 있습니다.
sxhkd: bspwm의 키 바인딩 유틸리티
sxhkd는 매우 단순한 프로그램입니다. 키보드 입력 이벤트를 감청하고 눌린 키에 따라 명령어를 실행합니다. 코드(chording) 방식을 통해 다중 키 입력을 처리할 수 있으며, 설정 파일도 직관적이고 이해하기 쉽습니다.
sxhkd 설정 파일 준비하기
sxhkd 설정 파일 준비 과정은 bspwmrc와 거의 같습니다. 먼저 설정 폴더와 파일을 생성합니다:
mkdir -p /home/$USER/.config/sxhkd/ && touch /home/$USER/.config/sxhkd/sxhkdrc
그다음 sxhkdrc 파일을 실행 가능으로 변경합니다:
sudo chmod 774 /home/$USER/.config/sxhkd/sxhkdrc
이제 키 바인딩을 입력할 sxhkd 설정 파일이 준비되었습니다.
sxhkd 설정하기
sxhkd는 특정 패턴으로 키 바인딩을 인식합니다. 먼저 수정 키(modifier key)를 지정해야 하는데, Alt, Super, Hyper, Control 중 하나를 사용할 수 있습니다. 그다음 수정 키와 짝을 이룰 일반 키를 지정하고, 두 키 사이에 "+" 기호를 넣어 키 바인딩으로 조합합니다.
따라서 sxhkd 키 바인딩의 일반적인 형태는 다음과 같습니다:
modifier key + normal key (+ {_, additional, keys})
작성 후에는 Enter를 누르고 Tab을 눌러 들여쓰기된 줄을 만들어야 합니다. 그리고 그 줄에 해당 키 바인딩이 눌렸을 때 실행할 명령어를 지정합니다.
sxhkd 설정 파일의 예시는 다음과 같습니다:
# make sxhkd reload its configuration files
alt + Escape
pkill -USR1 -x sxhkd
# quit or restart bspwm
alt + shift + {q,r}
bspc {quit,wm -r}
# create a new terminal window or swap the current one to the biggest one in the screen
alt + {_,shift + }Return
{st, bspc node -s biggest.local}
# close or kill a window
alt + {_,shift + }c
bspc node -{k,c}
# change the window state
alt + {t,ctrl + t,l,f}
bspc node -t {tiled,pseudo_tiled,floating,fullscreen}
# expand a window by moving one of its side outward
super + alt + {h,j,k,l}
bspc node -z {left -20 0,bottom 0 20,top 0 -20,right 20 0}
# focus or send a window to the given desktop
alt + {_,shift + }{1-9,0}
bspc {desktop -f,node -d} '^{1-9,10}'
키 바인딩 문법 살펴보기
위에서 언급했듯이 sxhkd의 키 바인딩 문법은 비교적 간단합니다. 게다가 sxhkd는 여러 키 바인딩을 묶을 수 있고, 코드(chording) 방식으로 분기 명령어까지 실행할 수 있습니다.
예를 들어 이 설정 파일의 많은 명령어가 중괄호({})를 활용합니다. 이를 통해 비슷한 키 조합에 여러 기능을 할당할 수 있습니다. 다음 명령어를 살펴보세요:
alt + shift + {q,r}
bspc {quit, wm -r}
이 명령어는 bspwm 종료 및 재시작을 처리합니다. 키 바인딩의 중괄호는 명령어 줄의 중괄호와 순서대로 매칭됩니다. 따라서 Alt + Shift + Q를 누르면 bspc quit이 실행되고, Alt + Shift + R을 누르면 bspc wm -r이 실행됩니다.
분기 시 추가 키 입력 없이 기본 키 바인딩을 만들 수도 있습니다. 다음 예시를 보세요:
alt + {_,shift + }Return
{st, bspc node -s biggest.local}
이 명령어는 터미널을 새로 열거나, 데스크톱에서 창을 화면에서 가장 큰 창과 교체합니다. Alt + Enter로 첫 번째 명령을, Alt + Shift + Enter로 두 번째 명령을 실행할 수 있습니다.
이것은 밑줄(_) 문자가 키 바인딩의 통로(pass-through) 역할을 하기 때문입니다. 덕분에 하나의 명령에는 기본 키 바인딩을, 다른 명령에는 "수정된" 키 바인딩을 동시에 부여할 수 있습니다.
마지막으로 sxhkd는 단일 분기에 국한되지 않습니다. 다음 예시를 보세요:
alt + {_,shift + }{1-9,0}
bspc {desktop -f,node -d} '^{1-9,10}'
이 명령어는 데스크톱 전환과 데스크톱 간 창 이동을 처리합니다. Alt + 1~0을 누르면 첫 번째 명령이 실행되고, Shift 수정 키를 함께 누르면 두 번째 명령이 실행됩니다.
여기서는 두 개의 중괄호를 사용해 통로 키와 데스크톱 번호를 설정했으며, 이 두 옵션은 아래 명령어의 두 중괄호와 각각 대응됩니다.
설치 마무리하기
이제 bspwm과 sxhkd 설정의 기본기를 갖추었습니다. 마지막으로 bspwm을 윈도우 매니저로 활성화해야 합니다. Xorg를 통해 직접 설정하거나 디스플레이 매니저를 통해 설정할 수 있습니다.
xinitrc로 bspwm 실행하기
bspwm을 초기화하는 가장 쉬운 방법은 .xinitrc 파일에 추가하는 것입니다. 미니멀 리눅스 배포판을 사용한다면 이미 이 방식으로 윈도우 매니저를 로드하고 있을 가능성이 높습니다.
.xinitrc 파일의 마지막 줄에 다음 내용만 추가하면 됩니다:
exec bspwm
디스플레이 매니저로 bspwm 실행하기
반면 Linux Mint나 Ubuntu처럼 완전한 데스크톱 환경을 사용한다면 로그인 화면에서 bspwm을 선택해야 할 수 있습니다.
예를 들어 필자의 Ubuntu 설치 환경에서는 로그인 화면의 톱니바퀴 아이콘을 클릭하고 컨텍스트 메뉴에서 bspwm을 선택해야 로드됩니다.
축하합니다! 이제 bspwm이 정상적으로 설치되어 동작합니다. 설정 파일을 세밀하게 조정하고 서드파티 독(dock)을 설치하면서 데스크톱을 더욱 자유롭게 꾸밀 수 있습니다. 영감을 얻고 싶다면 다양한 커스터마이징 데스크톱 예시를 참고해 보세요.
자주 묻는 질문(FAQ)
1. 처음 로그인했을 때 화면이 검게 나오는 이유는?
아직 데스크톱 배경화면을 설정하지 않았기 때문일 가능성이 높습니다. 미니멀 설치 환경에서 흔히 발생하는 현상입니다. feh 같은 이미지 뷰어 프로그램을 사용해 배경 테마를 변경할 수 있습니다.
2. 키 바인딩이 작동하지 않는 이유는?
대체로 다음 두 가지 원인 중 하나입니다:
- sxhkd가 실행되고 있지 않아 키 바인딩이 로드되지 않은 경우.
- sxhkdrc 파일에 문법 오류가 있는 경우. 가장 흔한 실수는 들여쓰기입니다. 명령어가 올바르게 실행되려면 들여쓰기 줄에 반드시 Tab 공백을 사용해야 합니다.
3. 로그인했는데 시스템 프롬프트로 되돌아가는 이유는?
여러 가지 원인이 있을 수 있지만, 가장 흔한 원인은 .xinitrc 파일의 문제입니다. bspwm이 Xorg가 로드하는 마지막 프로그램이고 백그라운드 프로세스로 실행되고 있지 않은지 확인해야 합니다.