Dwm là một phần mềm tối giản tuyệt vời. Chỉ với 2000 dòng mã, các nhà phát triển đã tạo ra một trình quản lý cửa sổ nhanh nhẹ. Tuy nhiên, cách tiếp cận thưa thớt này trong phát triển phần mềm đi kèm với cái giá riêng. Một số tính năng đã bị loại bỏ để giữ cho chương trình gọn nhẹ.
Mặc dù vậy, bạn vẫn có thể thêm tính năng mới cho dwm bằng cách vá mã nguồn, vì dwm dựa trên mã nguồn. Chỉ để cấu hình cơ bản, ta cần sửa đổi config.h, một phần của mã nguồn dwm.
Patch Là Gì?
Patch là các đoạn mã nhỏ có thể chèn vào một khối công việc lớn hơn. Điều này hữu ích khi cộng tác trên dự án phần mềm lớn, vì nó cho phép lập trình viên nhanh chóng xem các thay đổi do người khác thực hiện.
Patch có thể đơn giản như một thay đổi một dòng để sửa lỗi, hoặc một thay đổi đa tệp lớn giới thiệu tính năng mới.
Cách Vá Mã Nguồn Cho dwm
Có nhiều cách để đưa patch vào mã nguồn. Cách phổ biến nhất là thông qua lệnh git. Ví dụ, để áp dụng patch trong kho git, hãy gõ:
git apply -3 path/to/the/patch.diff
- Hàm
applysẽ cố gắng chèn nội dung của tệp patch vào các tệp nguồn được chỉ định. - Tùy chọn
-3sẽ cố gắng khắc phục bất kỳ sự không nhất quán nào và cho phép người dùng sửa lỗi trong quá trình vá.
Ngược lại, nếu bạn chỉnh sửa mã nguồn không dùng bất kỳ hệ thống kiểm soát phiên bản nào, bạn có thể dùng chương trình GNU patch. Để áp dụng patch bằng cách đó, hãy gõ:
patch -p1 < path/to/the/patch.diff
- Tùy chọn
-p1đảm bảo tệp patch sẽ được gắn nhãn đúng cho chương trình patch để chèn.
Tuy nhiên, khi vá dwm, đôi khi các chương trình này sẽ thất bại, vì chúng giả định mã nguồn được vá tương tự như cài đặt dwm cơ bản.
Điều này có nghĩa là khi bạn cài đặt nhiều patch, chương trình vá sẽ càng khó chèn các patch đó. Vì vậy, việc hiểu cách tệp patch hoạt động để tự tay cài đặt patch là rất quan trọng.
Cách Đọc Tệp Patch
Một tệp patch bao gồm ba thành phần:
- Phần đầu (header) cho biết tệp nào cần chèn mã
- Phần phụ (subheading) cho biết số dòng hoặc hàm cần chèn
- Mã nguồn chính
Như đã thảo luận, một tệp patch đơn lẻ có thể chứa nhiều đoạn mã dành cho nhiều tệp. Định dạng này cho phép phân phối một tệp duy nhất thay vì một tệp patch cho mỗi tệp nguồn.
Với điều đó, đọc tệp patch chỉ yêu cầu hiểu cú pháp của các header. Khi đã nắm được, việc vá thực tế chỉ là sao chép và dán mã.
Cú Pháp Header Của Patch
Header của patch chứa thông tin quan trọng về vị trí tệp nguồn. Ví dụ, đây là header cho patch autoresize của dwm.
diff --git a/dwm.c b/dwm.c index 0362114..e4e8514 100644 --- a/dwm.c +++ b/dwm.c
Dòng đầu, dòng ba và dòng bốn cho biết đây là sự khác biệt giữa hai phiên bản của tệp dwm.c. Nó cho biết tệp cần sửa đổi là "dwm.c".
Tuy nhiên, chỉ biết sửa tệp nào là chưa đủ. Ta vẫn cần biết chèn mã ở đâu trong tệp. Đây là lúc dùng subheading của tệp patch.
Ví dụ, đây là đoạn của patch autoresize trên:
@@ -92,7 +92,7 @@ struct Client { int basew, baseh, incw, inch, maxw, maxh, minw, minh; int bw, oldbw; unsigned int tags; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; + int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, needresize; Client *next; Client *snext; Monitor *mon;
Điều này có thể trông rắc rối, nhưng ta chỉ cần chú ý ba điểm:
- Dòng đầu cho biết số dòng cần chèn mã. Ví dụ này là dòng 92.
- Tham số thứ hai trên dòng đầu –
struct Client {– cho biết hàm cụ thể cần sửa. Hữu ích khi tệp nguồn đã được vá nhiều và số dòng không khớp nữa. - Dấu
+và-trong khối mã. Dấu trừ chỉ dòng cần xóa, dấu cộng chỉ dòng cần thêm.
Với đó, ta đã có hiểu biết cơ bản về cách vá tệp nguồn. Bây giờ hãy thảo luận năm patch hữu ích cho dwm.
1. Systray
Khác với hầu hết môi trường máy tính để bàn, dwm không có khay hệ thống (system tray) mặc định. Khay hệ thống là khu vực trên thanh thanh công cụ nơi các ứng dụng để lại biểu tượng để tương tác nhanh với chương trình chạy ngầm.
Patch này đưa tính năng đó vào dwm. Sau khi cài, patch systray sẽ dành góc phải nhất của thanh dwm cho các chương trình khay hệ thống hiện tại. Nó cũng hỗ trợ đa màn hình, khay luôn xuất hiện trên màn hình có con trỏ chuột.
2. Xresources
Patch Xresources cho phép chương trình xrdb thiết lập cài đặt đồ họa cho dwm. Nó cho phép dùng tệp .Xresources để thay đổi màu sắc và font mà không cần biên dịch lại. Đặc biệt hữu ích cho người dùng đã dùng tệp đó cho chủ đề màu terminal.
Hơn nữa, nhờ xrdb điều khiển giao diện dwm, ta có thể dùng nhiều chủ đề. Chỉ cần sửa .Xresources cho cấu hình màu mong muốn và tải lại dwm.
3. Tatami
Tatami là bố cục cửa sổ thay thế cho dwm. Nó biểu diễn các cửa sổ trên màn hình như các ô gạch xếp theo kiểu sàn nhà truyền thống Nhật Bản. Cách này khác với bố cục master và stack truyền thống, nơi mỗi cửa sổ ngoài master bị ép mỏng dọc, làm cho các cửa sổ trong stack khó đọc.
Bố cục tatami đặc biệt hữu ích khi xử lý bốn đến năm cửa sổ cùng lúc, vì nó cấp cho mỗi cửa sổ không gian màn hình rộng rãi để đọc.
4. Focus Master
Cách dwm sắp xếp cửa sổ giống như xếp khối trong ngăn xếp. Mỗi cửa sổ mới được đặt lên trên cửa sổ trước. Điều này tạo ra thứ tự tuyến tính giữa các cửa sổ và cho biết cửa sổ nào đến trước.
Tuy nhiên, một hạn chế của thiết kế này là không cho phép tự do chọn cửa sổ master từ ngăn xếp. Để chọn master, ta phải lần lượt chọn từng cửa sổ cho đến khối cao nhất. Patch này thay đổi hành vi đó, cho phép chọn cửa sổ master hiện tại từ bất kỳ đâu trong ngăn xếp.
Nó đặc biệt hữu ích khi làm việc với nhiều cửa sổ, vì cho phép tự động chọn master trong ngăn xếp thay vì duyệt qua từng cửa sổ.
5. dwmc
Sửa đổi bất kỳ khía cạnh nào của dwm đều yêu cầu biên dịch lại chương trình khi muốn áp dụng thay đổi. Điều này bao gồm chủ đề màu và hành vi mặc định.
dwmc là một patch đơn giản cho phép thay đổi hành vi dwm qua một chương trình khách. Cách tiếp cận này tương tự như bspwm dùng bspc để sửa cài đặt bspwm. Mặc dù dwmc đơn giản hơn bspc rất nhiều, nó vẫn có một số cài đặt hữu ích.
Ví dụ, một hàm trong dwmc là togglebar. Chạy dwmc togglebar cho phép bật/tắt thanh dwm động. Điều này làm cho dwmc hữu ích khi viết script thực hiện hành vi cửa sổ tùy chỉnh.
Chúc mừng! Bây giờ bạn đã có hiểu biết cơ bản về cách vá mã cũng như năm patch hữu ích để áp dụng cho cài đặt dwm của mình. Nếu bạn tìm kiếm trải nghiệm tối giản tương tự trên trình duyệt, hãy xem hướng dẫn này.
Câu Hỏi Thường Gặp
1. Patch dwm có an toàn không?
Có! Nhiều người bảo trì kiểm tra các patch trên trang web suckless. Điều này đảm bảo tất cả các patch trên trang web hoạt động cho phiên bản dwm mà chúng được viết.
2. Tôi dùng git apply nhưng patch thất bại và dwm không biên dịch được. Làm sao?
Điều này có thể xảy ra vì nhiều lý do. Lý do phổ biến nhất là header git không bị xóa trong tệp nguồn. Việc sửa khá dễ dàng. Ta cần xóa header và tự tay áp dụng patch.
Khi mở tệp nguồn, bạn sẽ thấy dòng có nhãn HEAD. Điều này chỉ điểm bắt đầu sửa đổi. Theo sau là hàm cần sửa. Bạn cần xóa dòng đó và tự thực hiện vá. Ở đây cũng sẽ có dấu + và - bên trái mã để hướng dẫn thay đổi gì.
3. Làm sao khi đã áp dụng patch thành công nhưng dwm không muốn biên dịch và yêu cầu biến hoặc khai báo bị thiếu?
Chương trình vá không vá tệp config.h. Mặc định, patch sẽ sửa tệp config.def.h để tránh xung đột với cấu hình hiện tại.
Tuy nhiên, điều đó có nghĩa là tệp config.h sẽ không tải với giá trị cấu hình đúng cho patch đó. Để khắc phục, bạn cần đưa các thay đổi trong config.def.h vào tệp config.h của mình.