Binary Space Partitioning Window Manager (bspwm) เป็น window manager แบบมินิมอลลิสต์ที่ทรงพลังสำหรับ Linux มีการตั้งค่าที่ยืดหยุ่นสูง และนำเสนอแนวทางนวัตกรรมในการจัดการหน้าต่าง bspwm เขียนด้วย C และตั้งค่าได้ด้วยภาษาใดก็ได้ bspwm คือจิตวิญญาณของการปรับแต่งโดยผู้ใช้ใน window manager ทำให้ดึงดูด power users และนักทดลองที่สนใจสร้าง workflow เฉพาะตัว
Binary Space Partitioning อธิบาย
Binary Space Partitioning เป็นแนวคิดที่หน้าต่างบนเดสก์ท็อปสามารถแสดงเป็น leaves ใน full binary tree Full binary tree คือโครงสร้างจัดเรียงข้อมูลด้วย nodes แบบลำดับชั้น ข้อมูลภายใน tree จะจัดเรียงเป็นคู่ โดย root node จะมี 2 nodes เสมอ
bspwm ทำงานกับ nodes ในทางปฏิบัติ เมื่อสร้างหน้าต่างบนเดสก์ท็อปว่าง bspwm จะสร้าง single node สำหรับหน้าต่างนั้น คิดว่า node นั้นเป็น leaf node แต่เมื่อสร้างหน้าต่างเพิ่มในเดสก์ท็อปเดิม leaf node นั้นจะกลายเป็น root node และ bspwm สร้าง leaf node ใหม่ 2 ตัว attached กับมัน จากนั้นวางหน้าต่างปัจจุบันและหน้าต่างใหม่ใน leaf nodes นั้น
หน้าต่างใหม่ที่สร้างหลังจากนี้ จะเชื่อมโยงกับ leaf nodes ทั้งสอง ทำให้กลายเป็น root nodes ของตัวเอง
การจัดเรียงหน้าต่างแบบนี้สร้างลำดับชั้นที่ชัดเจนภายในเดสก์ท็อป ชัดเจนว่า leaf nodes ไหนถูกสร้างก่อน และไหนมาจากกลุ่ม root nodes เฉพาะ เรื่องนี้มีประโยชน์เมื่อสร้าง custom behavior rules สำหรับหน้าต่างเฉพาะและ window layouts
Keybindings และ Status Bars
สำคัญคือ bspwm จัดการแค่หน้าต่าง ฟังก์ชันอื่นที่ไม่เกี่ยวกับการจัดการหน้าต่าง ไม่ได้รวมอยู่ในแพ็กเกจ bspwm รวมถึงการ bind keys กับฟังก์ชัน และการแสดง status bar
เพื่อใช้ keybindings ใน bspwm นักพัฒนาสร้างโปรแกรมแยกชื่อ Simple X Hotkey Daemon (sxhkd) ที่จัดการ keybindings เท่านั้น สำหรับ status bar ผู้ใช้ติดตั้งแอปพลิเคชันบุคคลที่สามอย่าง polybar และ lemonbar
ติดตั้ง bspwm และ sxhkd
ติดตั้ง bspwm และ sxhkd ง่าย ทั้งสองโปรแกรมมีใน repository ของ Linux ส่วนใหญ่ ตัวอย่างเช่น 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 ใช้ XBPS
bspc: Universal Controller สำหรับ bspwm
เพื่อใช้ bspwm ต้องโต้ตอบกับโปรแกรมเดียว: bspc utility อันทรงพลังควบคุมและตั้งค่าพฤติกรรม bspwm คำสั่งทั้งหมดที่ใช้จัดการหน้าต่างและตั้งค่าพฤติกรรม คือคำสั่ง bspc
เตรียมไฟล์ config สำหรับ bspwm
เริ่มตั้งค่า bspwm ต้องสร้างไฟล์ config ก่อน นี่คือที่ bspwm จะหา คำสั่ง bspc ที่จะรันตอนเริ่มต้น โดยค่าเริ่มต้น bspwm หาไฟล์ "/home/$USER/.config/bspwm/bspwmrc" สร้างไฟล์ด้วย:
mkdir -p /home/$USER/.config/bspwm && touch /home/$USER/.config/bspwm/bspwmrc
คำสั่งนี้สร้างโฟลเดอร์ bspwm ใน "/home/$USER/.config/" และสร้างไฟล์ bspwmrc ในโฟลเดอร์นั้น
ไฟล์ bspwmrc เขียนได้ด้วยภาษาไหนก็ได้ ถ้า executable ต้องตั้งคุณสมบัติไฟล์ให้เป็น executable ก่อน:
sudo chmod 774 /home/$USER/.config/bspwm/bspwmrc
ทำให้เราและคนใน usergroup เดียวกันรันไฟล์นี้ได้
จากนั้นเปิดไฟล์ bspwmrc ในกรณีของผม ใช้ vim แก้ไข:
vim /home/$USER/.config/bspwm/bspwmrc
จะเปิดไฟล์ว่าง พร้อมเริ่มเขียน config
ตั้งค่า bspwm
basic config สำหรับ 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 บรรทัดแรก config นี้เขียนด้วย Bash คำสั่งแรกๆ คือโปรแกรมที่ต้องการรันก่อนตั้งค่า bspwm
คำสั่งแรก xsetroot เปลี่ยน X cursor เริ่มต้นเป็น left pointer คำสั่งที่สอง เริ่ม hotkey daemon ในพื้นหลัง
bspc config และ bspc rule
คำสั่งต่อไปใน config เฉพาะ bspc bspc config จัดการ config ทั่วไปของ window manager รวมทั้งการตั้งค่าแสตเทิกและฟังก์ชัน
- border_width กำหนดความหนาของขอบหน้าต่างเป็นพิกเซล
- window_gap จัดการช่องว่างรอบหน้าต่างเป็นพิกเซล
- split_ratio กำหนดอัตราส่วนระหว่าง leaf nodes 2 ตัวเมื่อ split
- focus_follows_pointer ตั้งค่าว่าเมาส์ควบคุม focus หน้าต่างได้ไหม
- pointer_modifier กำหนดปุ่มคีย์บอร์ดสำหรับ resize หน้าต่างด้วยเมาส์
- automatic_scheme กำหนด layout ของหน้าต่างเมื่อ split ในโหมด automatic
bspc rule จัดการพฤติกรรมโปรแกรมเมื่อเปิดใน bspwm
- rule แรก บังคับให้ Chromium รันใน desktop ที่ 2
- rule ที่สอง บังคับให้ Gimp รันใน desktop ที่ 8 บังคับให้รันแบบ floating แทน tiled เริ่มต้น และบังคับ focus หน้าต่าง Gimp ตอนโหลด
ตอนนี้มี basic config สำหรับ bspwm แล้ว สำคัญคือ options สำหรับ bspc config และ bpsc rule มีมากมาย อยากรู้เพิ่มเติมดูเอกสาร GitHub สำหรับรายการตั้งค่าทั้งหมด
sxhkd: Keybinding Utility สำหรับ bspwm
sxhkd เป็นโปรแกรมเรียบง่าย ฟัง keyboard input events และรันคำสั่งตามปุ่มที่กด จัดการ multi-key inputs ผ่าน chording และมี config file ที่เข้าใจง่าย
เตรียมไฟล์ config สำหรับ sxhkd
เตรียม config file sxhkd คล้าย bspwmrc สร้างโฟลเดอร์และไฟล์ config sxhkd:
mkdir -p /home/$USER/.config/sxhkd/ && touch /home/$USER/.config/sxhkd/sxhkdrc
ตั้งค่า sxhkdrc ให้ executable:
sudo chmod 774 /home/$USER/.config/sxhkd/sxhkdrc
เสร็จแล้ว มีไฟล์ config sxhkd สำหรับใส่ keybindings ทั้งหมด
ตั้งค่า sxhkd
sxhkd รู้จัก keybindings ในรูปแบบเฉพาะ ขอ modifier key ก่อน คือ Alt, Super, Hyper หรือ Control จากนั้นให้ normal key เสริม modifier key รวมเป็น keybinding ด้วยเครื่องหมาย "+" ระหว่างกัน
รูปแบบทั่วไปของ keybinding sxhkd:
modifier key + normal key (+ {_, additional, keys})
เสร็จแล้ว กด Enter และ Tab สร้างบรรทัดย่อยใต้ keybinding ระบุคำสั่งที่จะรันเมื่อกด keybinding
ตัวอย่าง config 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}'
อธิบายไวยากรณ์ Keybinding
ตามที่กล่าว ไวยากรณ์ keybinding sxhkd เรียบง่าย เพิ่มเติม sxhkd จัดกลุ่ม keybindings และรัน branching commands ผ่าน key chording
ตัวอย่าง คำสั่งหลายอย่างใช้ curly braces ใส่หลายฟังก์ชันบน keybinds คล้ายกัน ดูคำสั่งนี้ใน config:
alt + shift + {q,r} bspc {quit, wm -r}
คำสั่งนี้จัดการปิดและ restart bspwm curly braces ใน keybinding ตรงกับ curly braces ใน command line ดังนั้น กด Alt + Shift + Q รัน bspc quit กด Alt + Shift + R รัน bspc wm -r
ข้าม keypad เพิ่มได้ ดูตัวอย่าง:
alt + {_,shift + }Return {st, bspc node -s biggest.local}
คำสั่งนี้จัดการ spawn terminal และ swap windows ในเดสก์ท็อป ทำคำสั่งแรกด้วย Alt + Enter คำสั่งที่สองด้วย Alt + Shift + Enter
เพราะ underscore character เป็น pass-through สำหรับ keybindings ให้มี default keybinding สำหรับคำสั่งหนึ่ง และ "modified" keybinding สำหรับคำสั่งอื่น
สุดท้าย sxhkd ไม่จำกัด single branching ดูตัวอย่าง:
alt + {_,shift + }{1-9,0} bspc {desktop -f,node -d} '^{1-9,10}'
คำสั่งนี้จัดการสลับเดสก์ท็อป และจัดการเคลื่อนย้ายหน้าต่างภายในเดสก์ท็อป คำสั่งแรกรันตอนกด Alt + 1-0 คำสั่งที่สองกับ modifier Shift
ใช้ curly braces 2 ชุด สำหรับ pass-through key และ หมายเลขเดสก์ท็อป 2 ตัวเลือกนี้ตรงกับ curly braces 2 ชุดในคำสั่งด้านล่าง
เสร็จสิ้นการติดตั้ง
ตอนนี้เข้าใจพื้นฐาน config bspwm และ sxhkd แล้ว สิ่งสุดท้ายคือ enable bspwm เป็น window manager ทำได้ผ่าน Xorg หรือ display manager
รัน bspwm ด้วย xinitrc
วิธีง่ายที่สุด initialize bspwm คือ append ในไฟล์ .xinitrc ถ้าใช้ Linux distribution minimal นี่คือวิธีที่คุณใช้ load window manager
แค่ append บรรทัดนี้ท้าย .xinitrc:
exec bspwm
รัน bspwm ด้วย Display Manager
แต่ถ้าใช้ full-featured desktop เช่น Linux Mint หรือ Ubuntu อาจต้องเลือก bspwm ในหน้าจอ login
ตัวอย่าง ใน Ubuntu ของผม ต้องคลิกไอคอนเกียร์หน้าจอ login เลือก bspwm จาก context menu โหลด
ยินดีด้วย! ตอนนี้คุณมีการติดตั้ง bspwm ที่ทำงานแล้ว ปรับแต่ง desktop เพิ่มเติมได้โดยแก้ไข config files และติดตั้ง third-party docks นี่คือ desktop ที่ปรับแต่งแล้วให้แรงบันดาลใจ
คำถามที่พบบ่อย
1. ทำไมหน้าจอดูดเวลา login ครั้งแรก?
น่าจะเป็นเพราะยังไม่ตั้ง wallpaper กรณีรัน minimal installation มักเกิดขึ้น เปลี่ยน theme พื้นหลังด้วย image viewer เช่น feh
2. ทำไม keybindings ไม่ทำงาน?
น่าจะเป็น 2 สาเหตุ:
- Keybindings โหลดไม่ได้เพราะ sxhkd ไม่ได้รัน
- Syntax error ใน sxhkdrc ผิดพลาดทั่วไปคือ indent ต้อง insert Tab-spaces ในบรรทัดย่อยเพื่อ initialize commands ให้ถูกต้อง
3. Login แล้วกลับสู่ system prompt ทันที?
อาจเกิดจากหลายอย่าง แต่น่าเป็นปัญหา .xinitrc ต้องแน่ใจว่า bspwm เป็นโปรแกรมสุดท้ายที่ Xorg โหลด และไม่รันเป็น background process