Dmenu hay gọi đầy đủ là dynamic menu, là một phần mềm phát triển bởi cộng đồng Suckless.
Dmenu hoạt động bằng cách chuyển stdin thành danh sách các lựa chọn. Rất khó để mô tả cách hoạt động và công dụng của dmenu nhưng tóm gọn lại là vậy!
Cài đặt gói cần thiết
Trên Void Linux, mình dùng lệnh sau:
sudo xbps-install -S base-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 dmenu 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
Dùng lệnh sau để tải mã nguồn dmenu về máy từ git server của Suckless.
git clone https://git.suckless.org/dmenu
mkdir dmenu/patches
cd dmenu
Cài đặt patch
Mình đã giải thích về khái niệm patch (bản vá) trong Suckless - Vá phần mềm.
Password
Mình dùng dmenu làm giao diện nhập mật khẩu trong một số trường hợp.
Patch này sẽ cho đúng ta lựa chọn -P
, tất cả dữ liệu nhập vào dmenu sẽ được che lại bằng một ký tự được đặt trong dmenu.c
.
curl https://gitlab.com/khiemtu27/dmenu/-/raw/master/patches/password.diff -o patches/password.diff
patch -i patches/password.diff
Để thay đổi ký tự .
mặc định thành một ký tự khác, bạn có thể vào dmenu.c
và thay đổi dòng sau:
memset(censort, '*', strlen(text));
Reject no match
Ví dụ khi chỉ có hai lựa chọn yes
và no
.
Khi đưa dmenu tùy chọn -r
, bạn sẽ không thể nhập m vì không có kết quả nào chứa ký tự m
.
curl https://gitlab.com/khiemtu27/dmenu/-/raw/master/patches/reject-no-match.diff -o patches/reject-no-match.diff
patch -i patches/reject-no-match.diff
Case insensitive
Mặc định dmenu sẽ phân biệt ký tự hoa và thường.
Muốn tắt phân biệt hoa thường ta phải đưa dmenu tùy chọn -i
.
Patch này sẽ khiến dmenu mặc định không phân biệt hoa thường.
Muốn phân biệt hoa thường phải đưa dmenu tùy chọn -s
.
Lưu ý
Hầu hết các script trên mạng đều viết cho bản mặc định của dmenu. Do đó các tác giả thường dùng lựa chọn
-i
để tắt phân biệt hoa thường.Sau khi cài patch này, các script đó sẽ báo lỗi. Muốn khắc phục chỉ cần xóa
-i
trong các script đó thôi.
curl https://gitlab.com/khiemtu27/dmenu/-/raw/master/patches/case-insensitive.diff -o patches/case-insensitive.diff
patch -i patches/case-insensitive.diff
Thay đổi chiều cao
Tương tự như dwm, mình sẽ không dùng patch để đưa lựa chọn chiều cao vào config.def.h
mà sẽ chỉnh sửa trực tiếp trong dmenu.c
.
Trong dmenu.c
, hãy tìm kiếm dòng sau:
bh = drw->fonts->h + 2;
Chỉ cần thay đổi phần + 2
thành bất cứ giá trị dương nào bạn muốn.
Mình thấy 6 là vừa vặn nhất nên dòng này của mình trông như sau.
bh = drw->fonts->h + 6;
Màu sắc
Tương tự như st và dwm, mình sẽ tách phần cài đặt màu sắc, giao diện vào những files riêng biệt để dễ dàng thay đổi. Chỉ cần đổi một dòng thay vì từng giá trị một.
Trong patch này mình sẽ thay gói màu [SchemeOut]
thành [SchemeDim]
để có thể dùng chung file màu sắc với dwm của mình.
Mình sẽ đính kèm các bảng màu tương tự như dwm và st. Bạn có thể đến đây để tham khảo các bảng màu.
curl https://gitlab.com/khiemtu27/dmenu/-/raw/master/patches/colors.diff -o patches/colors.diff
patch -i patches/colors.diff
Mặc định mình sẽ để bảng màu colors-dark
, ví dụ muốn đổi sang nord
, hãy vào config.h thay dòng:
#include "colors-dark.c"
thành:
#include "colors-nord.c"
Kết lại
Để cài đặt dmenu lên máy và sử dụng, bạn có thể tham khảo bài viết này.