dwm - Dynamic Window Manager

một window manager đến từ Suckless

1. dwm - Dynamic window manager

dwmtrình quản lý cửa sổ của Suckless. Tính đến nay tôi 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 tôi setup dwm của mình, dưới đây là một danh sách những thứ tôi sẽ làm:


2. 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. Lệnh cài đặt các gói này tùy vào distro và package manager bạn dùng:

# Debian/Ubuntu/PopOS
sudo apt install git curl build-essential libx11-dev libxft-dev libxinerama-dev

# Arch Linux
sudo pacman -Sy git curl base-devel libx11 libxft libxinerama

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

Nếu máy của bạn không có nhiều màn hình (multi-monitor), bạn có thể comment hoặc xóa hai dòng sau trong config.mk và không cần cài đặt các gói Xinerama tương ứng với từng distro. Hai thư viện này giúp dwm hỗ trợ đa màn hình, nếu không cần, xóa đi cũng đỡ được tí mã nguồn đấy!

XINERAMALIBS  = -lXinerama
XINERAMAFLAGS = -DXINERAMA

3. Tải mã nguồn

Vào lúc tôi viết bài viết này thì bản cập nhật gần đây nhất của dwm là 6.5, công bố ngày 19/03/2024. Để 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

4. Cài đặt patch

Tôi sẽ giải thích về khái niệm patch (bản vá) trong bài viết về Suckless, bạn có thể tham khảo cụ thể vấn đề này tại đây.

4.1. 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.

Thao tác

Đầu tiên chúng ta sẽ tải file diff của pertag về máy, ở đây tôi sẽ dùng lệnh curl. Link của các files diff tôi sẽ để ở ghi chú số nhỏ cạnh tên các patch. Để thư mục gọn gàng hơn tôi sẽ tạo một thư mục con chỉ để chứa các files diff.

# tạo thư mục patches để chứa các files diff
$ mkdir dwm/patches

# cd vào folder mã nguồn của dwm
$ cd dwm

# tải file diff của patch pertag vào thư mục patches
$ curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/pertag.diff -o patches/pertag.diff

Để tiến hành apply patch tự động, ta dùng lệnh patch, lưu ý bạn phải đang ở trong thư mục gốc của dwm nhé:

$ patch -i ./patches/pertag.diff
patching file dwm.c
Hunk #3 succeeded at 273 (offset 1 line).
Hunk #4 succeeded at 644 (offset -6 lines).
Hunk #5 succeeded at 655 (offset -6 lines).
Hunk #6 succeeded at 1006 (offset -1 lines).
Hunk #7 succeeded at 1536 (offset -7 lines).
Hunk #8 succeeded at 1561 with fuzz 2 (offset -7 lines).
Hunk #9 succeeded at 1783 (offset 23 lines).
Hunk #10 succeeded at 2100 (offset 22 lines).

Như bạn thấy, lệnh tôi nhập là patch -i ./patches/pertag.diff và bên dưới trả kết quả mọi thứ đều "succeeded" nghĩa là okela hết!


4.2. 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" (sticky), điều này khiến cửa sổ đó 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 các trình duyệt web để việc xem video và đa nhiệm được tiện lợi hơn!

Sticky
Thao tác
$ curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/sticky.diff -o patches/sticky.diff
$ patch -i patches/sticky.diff

4.3. Save floats

Mặc định khi chuyển đổi nhanh (toggle) giữa floating mode và tiling mode, cửa sổ sẽ nằm ở vị trí tương tự khi nó đang tiling và các cửa sổ khác sẽ lấp đầy vị trí cũ của nó. Patch này sẽ lưu vị trí khi đang float của cửa sổ và khôi phục lại vị trí đó khi bạn chuyển đổi chế độ của nó. Ví dụ một cửa sổ đang float ở chính giữa màn hình, khi tôi đưa nó vào tiling mode nó sẽ nằm ngay ngắn vào chung các cửa sổ khác, khi tôi chuyển nó thành floating mode lại, nó sẽ nằm ngay giữa màn hình như lúc đầu.

Thao tác
$ curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/save-floats.diff -o patches/save-floats.diff
$ patch -i patches/save-floats.diff

4.4. Hide vacant tags

Patch này đơn giản 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!

Thao tác
$ 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

4.5. Remove border

Đơn giản là ẩn khung cửa sổ (border) khi chỉ có một cửa sổ trên màn hình.

Thao tác
$ curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/remove-border.diff -o patches/remove-border.diff
$ patch -i patches/remove-border.diff

4.6. 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 màn hình. Tuyệt vời nhất khi phối hợp với save floats.

Thao tác
$ curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/always-center.diff -o patches/always-center.diff
$ patch -i patches/always-center.diff

4.7. Shift tools

Ở patch này sẽ có tí khác biệt, vì tôi sẽ không dùng tất cả các hàm (functions) mà nó mang lại, do đó sẽ có một số tinh chỉnh gỡ bỏ bớt các chức năng không dùng tới. Nhưng đầu tiên ta vẫn sẽ làm các bước như trước, chỉ là bạn sẽ tải file diff tôi viết tại repo GitLab chứ không phải trên trang chủ của Suckless.

Thao tác
$ curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/shift-tools.diff -o patches/shift-tools.diff
$ patch -i patches/shift-tools.diff

4.8. Monocle symbol

Mặc định biểu tượng layout (bên phải dãy số các tags trên thanh trạng thái) sẽ hiển thị số cửa sổ đang mở trong tag hiện tại. Tôi không thích chức năng này và chỉ muốn nó hiện biểu tượng của monocle layout thôi.

Thao tác
$ curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/monocle-symbol.diff -o patches/monocle-symbol.diff
$ patch -i patches/monocle-symbol.diff

5. Gỡ bỏ thanh tiêu đề

Mặc định phần tên cửa sổ trên thanh trạng thái của dwm sẽ dùng màu accent để làm background, đây có thể là điểm nhấn thẩm mỹ, nhưng tôi lại không thích điều này. Do đó tôi viết một patch để gỡ bỏ hoàn toàn hiển thị tên cửa sổ trên thanh trạng thái.

Thao tác
$ curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/notitle.diff -o patches/notitle.diff
$ patch -i patches/notitle.diff

6. 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. Tôi thích các script gọi dmenu của mình nằm riêng biệt với mã nguồn của dwm nên thường xóa các dòng này trong config.h. Một điều bạn có thể thấy ngay khi xóa các dòng này là dwm sẽ lỗi khi build. Vì trong dwm.c cũng có một chỗ phụ thuộc vào những biến này. Thế nên tôi đã viết một patch để gỡ bỏ hoàn toàn dmenu khỏi mã nguồn dwm. Lưu ý là tôi sẽ giữ lại chức năng gọi dmenu bằng tố hợp phím Mod+P.

Thao tác
$ curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/nodmenu.diff -o patches/nodmenu.diff
$ patch -i patches/nodmenu.diff

7. Chiều cao thanh trạng thái

Trước đây tôi dùng patch statuspadding để thay đổi chiều cao cũng như căn ngang hai bên lề của thanh trạng thái. Nhưng suy đi 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.

Thao tác

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

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

Dòng này quyết định biến bh viết tắt của barheight, nói chung nó sẽ lấy chiều cao của font chữ, cộng thêm 2 pixels. Từ đây, để điều chỉnh chiều cao thanh trạng thái, hãy tự tin thay đổi phần + 2 thành bất cứ số gì bạn muốn. Đối với tôi, + 6 là ổn nhất. Do đó, biến bh của tôi sẽ trông như sau.

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

8. 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ổ. Tôi 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.

Thao tác
$ curl https://gitlab.com/khiemtu27/dwm/-/raw/master/patches/colors.diff -o patches/colors.diff
$ patch -i patches/colors.diff

Tôi đã đính kèm sẵn các bảng màu sau:

Màu viền và active tag tôi sẽ dùng màu xanh lá. Nếu bạn không thích thì hãy vào các file colors-???.c và thay đổi màu có tên col_af tôi cố tình viết tắt của colors_active-foreground.

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


9. 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ản hoàn thiện sau khi cài đặt tất cả các patches, đồng thời các thay đổi nhỏ chưa được cập nhật trong bài viết tôi sẽ để ở đây.

Ngày 5 tháng 5, 2024

#tech

Tìm kiếm