dwm - Dynamic Window Manager

20240505 #tech #linux #suckless

dwmtrình quản lý cửa sổ của Suckless. Tính đến nay mình dùng dwm được tầm một năm rưỡi, cũng có bỏ túi được tí kinh nghiệm. Bài viết này sẽ ghi lại quá trình mình setup dwm của mình.


Cài đặt gói cần thiết

Trước hết ta cần một môi trường linux đủ các "gói cần thiết" (dependencies) để dwm hoạt động. Trên Void Linux mình dùng lệnh sau:

sudo xbps-install -S git curl base-devel libX11-devel libXft-devel libXinerama-devel

Nếu máy không có nhiều màn hình, bạn có thể comment hoặc xóa hai dòng sau trong config.mk và không cần cài đặt libXinerama-devel. Thư viện này giúp dwm hỗ trợ đa màn hình, nếu không cần, xóa đi cho gọn!

# XINERAMALIBS  = -lXinerama
# XINERAMAFLAGS = -DXINERAMA

Tải mã nguồn

Để tải mã nguồn dwm về máy, bạn có thể dùng lệnh sau:

git clone https://git.suckless.org/dwm
mkdir dwm/patches
cd dwm

Cài đặt patch

Mình đã giải thích về khái niệm bản vá trong Suckless - Vá phần mềm.

Pertag

Bạn có thể hiểu tag trong dwm gần giống như workspace hay màn hình ảo (virtual desktop). Patch này giúp những tùy chỉnh về số lượng master, layout... sẽ được lưu ở mỗi tag thay vì đồng bộ chúng như mặc định dwm làm. Nghĩa là sau khi cài patch này, ta có thể để tag 1 ở layout tile và tag 2 ở layout monocle.

curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/pertag.diff -o patches/pertag.diff
patch -i ./patches/pertag.diff

Sticky

Patch này cho phép ta gán phím tắt để chuyển cửa sổ bình thường thành cửa sổ "dính". Cửa sổ dính sẽ theo ta cho dù ta ở tag nào đi nữa. Thích hợp dùng chung với chức năng "Picture-in-picture" của trình duyệt web.

Cửa sổ dính sẽ đi theo bạn ở mọi tags

curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/sticky.diff -o patches/sticky.diff
patch -i patches/sticky.diff

Save floats

Patch này lưu vị trí float của cửa sổ khi bạn chuyển đổi qua lại float-tiling.

curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/save-floats.diff -o patches/save-floats.diff
patch -i patches/save-floats.diff

Hide vacant tags

Patch này sẽ ẩn các tags trống (không chứa cửa sổ nào), làm gọn gàng thanh trạng thái!

curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/hide-vacant-tags.diff -o patches/hide-vacant-tags.diff
patch -i patches/hide-vacant-tags.diff

Remove border

Ẩn viền cửa sổ (border) khi chỉ có một cửa sổ trên màn hình.

curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/remove-border.diff -o patches/remove-border.diff
patch -i patches/remove-border.diff

Always center

Cửa sổ floating khi bật sẽ luôn nằm ngay giữa màn hình thay vì góc trên cùng bên trái.

curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/always-center.diff -o patches/always-center.diff
patch -i patches/always-center.diff

Shift tools

Patch này thêm chức năng để di chuyển cửa sổ qua lại giữa các tags. Giống như Alt+Tab trên Windows, nhưng thay vì chuyển cửa sổ, ta chuyển tag.

curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/shift-tools.diff -o patches/shift-tools.diff
patch -i patches/shift-tools.diff

Monocle symbol

Mặc định biểu tượng layout (bên phải dãy tags) hiển thị số cửa sổ đang mở trong tag hiện tại. Patch này khiến vùng này chỉ hiện biểu tượng của monocle layout thôi.

curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/monocle-symbol.diff -o patches/monocle-symbol.diff
patch -i patches/monocle-symbol.diff

Gỡ bỏ thanh tiêu đề

Gỡ bỏ hoàn toàn hiển thị tên cửa sổ trên thanh trạng thái.

curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/notitle.diff -o patches/notitle.diff
patch -i patches/notitle.diff

Gỡ ràng buộc với dmenu

Mặc định trong file cài đặt của dwm (config.def.h) có các biến và cài đặt như dmenufont, dmenumon, dmenucmd. Ngoài ra trong dwm.c cũng có nhắc đến dmenu. Patch này gỡ bỏ hoàn toàn dmenu khỏi mã nguồn của dwm.

curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/nodmenu.diff -o patches/nodmenu.diff
patch -i patches/nodmenu.diff

Chiều cao thanh trạng thái

Trước đây mình dùng patch statuspadding để thay đổi chiều cao cũng như căn lề của thanh trạng thái.

Nhưng suy nghĩ lại, việc vào config.h để tùy chỉnh cũng không khác gì vào dwm.c. Cài thêm một patch chỉ làm tăng khả năng mâu thuẫn với các patches khác.

Do đó mình quyết định nếu có muốn tùy chỉnh chiều cao thanh trạng thái, mình sẽ vào dwm.c và thay đổi dòng này:

bh = drw->fonts->h + 2;

Mình thay đổi phần + 2 để thay đổi chiều cao thanh trạng thái. Mình thấy + 6 là ổn nhất. Do đó, biến bh của mình sẽ trông như sau.

bh = drw->fonts->h + 6;

Màu sắc

Để thuận tiện cho việc thay đổi giao diện của dwm, cụ thể là màu sắc thanh trạng thái và viền cửa sổ. Mình thường không thay đổi từng màu trong config.h mà sẽ tạo riêng lẻ từng file màu sắc riêng và chỉ cần thay đổi một dòng trong config.h là đã có thể thay đổi tất cả các màu của dwm.

curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/colors.diff -o patches/colors.diff
patch -i patches/colors.diff

Mẫu các bảng màu bạn có thể xem tại đây.


Thành quả!

Thế là sau khi cài đặt các patches, chúng ta đã có một dwm "đầy đủ" chức năng rồi. Phần còn lại chỉ là tùy chỉnh file config.h, thêm các phím tắt, thay đổi màu sắc, font... sau đó xóa file config.h và cài đặt dwm lên máy của mình là xong.

Các bước cài đặt bạn có thể tìm hiểu tại đây.


Bài viết liên quan