dwm เป็นซอฟต์แวร์แบบมินิมอลลิสต์ที่ยอดเยี่ยม เพียง 2,000 บรรทัดของโค้ด นักพัฒนาสามารถสร้างหน้าต่างจัดการ (window manager) ที่รวดเร็วและเบาได้ แนวทางการพัฒนาซอฟต์แวร์แบบสเปอร์ตันนี้อย่างไรก็ตามก็ต้องแลกมาด้วยราคาบางอย่าง บางฟีเจอร์ถูกตัดทิ้งเพื่อให้ขนาดโปรแกรมเล็กที่สุด
แม้กระนั้น ยังสามารถเพิ่มฟีเจอร์ใหม่ๆ ให้ dwm ได้โดยการแพตช์ซอร์สโค้ด เนื่องจาก dwm เป็นโปรแกรมที่พัฒนาจากซอร์สโค้ด เพื่อการตั้งค่าพื้นฐาน เราจำเป็นต้องแก้ไขไฟล์ config.h ซึ่งเป็นส่วนหนึ่งของซอร์สโค้ด dwm
แม้จะดูซับซ้อนในตอนแรก แต่การแพตช์ dwm จะกลายเป็นเรื่องง่ายเมื่อเข้าใจกระบวนการขั้นพื้นฐาน บทความนี้มีจุดประสงค์เพื่อสอนทักษะที่จำเป็นสำหรับการแพตช์ dwm ของคุณเองให้สำเร็จ รวมถึงนำเสนอ 5 แพตช์ที่เป็นประโยชน์
แพตช์คืออะไร?
แพตช์คือส่วนของโค้ดขนาดเล็กที่สามารถแทรกเข้าไปในโค้ดหลักได้ สิ่งนี้มีประโยชน์เมื่อร่วมมือกันในโปรเจกต์ซอฟต์แวร์ขนาดใหญ่ เพราะช่วยให้นักเขียนโปรแกรมเห็นการเปลี่ยนแปลงที่ผู้อื่นทำได้อย่างรวดเร็ว
แพตช์อาจเป็นการเปลี่ยนแปลงเพียงบรรทัดเดียวเพื่อแก้บั๊ก หรืออาจเป็นการเปลี่ยนแปลงหลายไฟล์ที่เพิ่มฟีเจอร์ใหม่ทั้งหมด
วิธีการแพตช์ซอร์สโค้ดสำหรับ dwm
มีหลายวิธีในการนำแพตช์ไปใช้กับซอร์สโค้ด วิธีที่พบบ่อยที่สุดคือผ่านคำสั่ง git ตัวอย่างเช่น เพื่อนำแพตช์ไปใช้ใน Git repository ให้พิมพ์คำสั่งดังนี้:
git apply -3 path/to/the/patch.diff
applyจะพยายามแทรกเนื้อหาของไฟล์แพตช์เข้าไปในไฟล์ซอร์สที่ระบุ-3จะพยายามแก้ไขความไม่สอดคล้องและอนุญาตให้ผู้ใช้แก้ไขข้อผิดพลาดในกระบวนการแพตช์ได้
อีกทางหนึ่ง หากเราแก้ไขซอร์สโค้ดโดยไม่มีระบบควบคุมเวอร์ชัน สามารถใช้โปรแกรม GNU patch ได้ โดยพิมพ์คำสั่งดังนี้:
patch -p1 < path/to/the/patch.diff
-p1ทำให้ไฟล์แพตช์ถูกติดฉลากอย่างถูกต้องสำหรับโปรแกรม patch เพื่อแทรกโค้ด
อย่างไรก็ตาม เมื่อแพตช์ dwm โปรแกรมเหล่านี้อาจล้มเหลว เพราะสมมติว่าซอร์สโค้ดที่จะแพตช์จะคล้ายกับการติดตั้ง dwm แบบพื้นฐาน
นั่นหมายความว่า ยิ่งเราติดตั้งแพตช์มากเท่าไร โปรแกรมแพตช์ก็จะยิ่งยากที่จะแทรกแพตช์ใหม่们ได้ ดังนั้น จึงสำคัญมากที่จะเข้าใจว่าไฟล์แพตช์ทำงานอย่างไร เพื่อที่เราจะสามารถติดตั้งแพตช์ด้วยตนเองได้
วิธีอ่านไฟล์แพตช์
ไฟล์แพตช์ประกอบด้วย 3 ส่วนหลัก:
- Header (ส่วนหัว) ที่แสดงว่าโค้ดควรแทรกในไฟล์ไหน
- Subheading (ส่วนหัวย่อย) ที่แสดงหมายเลขบรรทัดหรือฟังก์ชันที่ต้องแทรก
- โค้ดเอง
ตามที่กล่าวไว้ ไฟล์แพตช์เดียวอาจมีหลายชิ้นของโค้ดที่ตั้งใจจะไปไฟล์ต่างๆ รูปแบบนี้ช่วยให้เราเผยแพร่ไฟล์เดียวแทนที่จะต้องมีไฟล์แพตช์แยกสำหรับแต่ละไฟล์ซอร์ส
การอ่านไฟล์แพตช์จึงต้องเข้าใจไวยากรณ์ของ header เท่านั้น เมื่อเข้าใจแล้ว การแพตช์จริงๆ ก็แค่การคัดลอกและวางโค้ดเท่านั้น
ไวยากรณ์ Header ของแพตช์
Header ของแพตช์มีข้อมูลสำคัญเกี่ยวกับตำแหน่งของไฟล์ซอร์ส ตัวอย่างเช่น นี่คือ header สำหรับแพตช์ autoresize ของ dwm:
diff --git a/dwm.c b/dwm.c index 0362114..e4e8514 100644 --- a/dwm.c +++ b/dwm.c
บรรทัดที่ 1, 3 และ 4 บ่งบอกว่าเป็น diff ระหว่างสองเวอร์ชันของไฟล์ dwm.c บอกว่าไฟล์ที่เราจะแก้ไขคือ "dwm.c"
อย่างไรก็ตาม การรู้แค่ว่าจะแก้ไขไฟล์ไหนยังไม่พอ เรายังต้องรู้ว่าจะแทรกโค้ดที่ไหนในไฟล์ นี่คือที่มาของ subheading ในไฟล์แพตช์
ตัวอย่างเช่น นี่คือส่วนหนึ่งของแพตช์ autoresize เดียวกัน:
@@ -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;
สิ่งนี้อาจดูน่ากลัว แต่เราต้องสนใจเพียง 3 อย่าง:
- บรรทัดแรกบ่งบอกหมายเลขบรรทัดที่ต้องแทรกโค้ด ตัวอย่างนี้คือบรรทัดที่ 92
- อาร์กิวเมนต์ที่สองในบรรทัดแรก -
struct Client {- บอกฟังก์ชันเฉพาะที่ต้องแก้ไข มีประโยชน์เมื่อซอร์สโค้ดถูกแพตช์ไปแล้วหลายครั้ง และหมายเลขบรรทัดทางซ้ายไม่ตรงกันอีกต่อไป - สัญลักษณ์
+และ-ในบล็อกโค้ด เครื่องหมายลบหมายถึงบรรทัดที่จะลบ เครื่องหมายบวกหมายถึงบรรทัดที่จะเพิ่ม
ตอนนี้เราเข้าใจพื้นฐานการแพตช์ไฟล์ซอร์สแล้ว มาดู 5 แพตช์ที่เป็นประโยชน์สำหรับ dwm กัน
1. Systray (ระบบถาดระบบ)
ไม่เหมือนกับเดสก์ท็อปเอนไวรอนเมนต์ส่วนใหญ่ dwm ไม่มาพร้อมกับ system tray โดยค่าเริ่มต้น System tray คือส่วนของเดสก์ท็อปที่แอปพลิเคชันบางตัวสามารถวางไอคอนพร้อมฟังก์ชันของแอปไว้ เพื่อให้โต้ตอบกับโปรแกรมที่ทำงานในพื้นหลังได้อย่างรวดเร็ว
แพตช์นี้เพิ่มฟีเจอร์ดังกล่าวให้ dwm เมื่อติดตั้งแล้ว แพตช์ systray จะจัดสรรมุมขวาสุดของแถบ dwm ให้กับโปรแกรม system tray ปัจจุบัน รองรับการตั้งค่าหน้าจอหลายจอ โดย tray จะแสดงบนหน้าจอที่มีเคอร์เซอร์เมาส์อยู่
2. Xresources
แพตช์ Xresources ทำให้โปรแกรม xrdb สามารถตั้งค่ากราฟิกสำหรับ dwm ได้ ช่วยให้เราใช้ไฟล์ .Xresources เปลี่ยนสีและฟอนต์ได้โดยไม่ต้องคอมไพล์โปรแกรมใหม่ เหมาะสำหรับผู้ใช้ที่ใช้ไฟล์เดียวกันสำหรับธีมสีของเทอร์มินัล
เพิ่มเติมคือ การให้ xrdb ควบคุมลักษณะของ dwm ยังช่วยให้ใช้ธีมหลายแบบได้ โดยแก้ไขไฟล์ .Xresources สำหรับธีมสีที่ต้องการ และเปิดใช้งานโดยโหลด dwm ใหม่
3. Tatami
Tatami เป็นเลย์เอาต์จัดการหน้าต่างทางเลือกสำหรับ dwm แสดงหน้าต่างบนหน้าจอเป็นไทล์ที่จัดเรียงเหมือนพื้นยaponese แบบดั้งเดิม แนวทางนี้ต่างจากเลย์เอาต์ master และ stack แบบดั้งเดิม ที่หน้าต่างแต่ละอันนอกจาก master จะแคบลงในแนวตั้ง ทำให้หน้าต่างใน stack อ่านไม่ออก
เลย์เอาต์ Tatami มีประโยชน์มากเมื่อจัดการ 4-5 หน้าต่างพร้อมกัน ให้พื้นที่หน้าจอเพียงพอต่อหน้าต่างแต่ละอันสำหรับการอ่าน
4. Focus Master
วิธีที่ dwm จัดเรียงหน้าต่างคล้ายการวางบล็อกในสแต็ก หน้าต่างใหม่จะถูกวางบนหน้าต่างเก่า สร้างลำดับเชิงเส้นระหว่างหน้าต่าง ทำให้รู้ว่าหน้าต่างไหนมาก่อน
แต่มีข้อจำกัดคือ ไม่ให้เลือก master window จาก stack ได้อย่างอิสระ ต้อง cycle ผ่านทุกหน้าต่างจนถึงบล็อกบนสุด แพตช์นี้เปลี่ยนพฤติกรรมนี้ ให้เลือก master window ปัจจุบันจากตำแหน่งไหนใน stack ก็ได้
มีประโยชน์มากเมื่อจัดการหลายหน้าต่าง ช่วยเลือก master ใน stack อัตโนมัติ แทนที่จะ cycle ทีละอัน
5. dwmc
การแก้ไขทุกด้านของ dwm ต้องคอมไพล์โปรแกรมใหม่ทุกครั้งที่ต้องการนำการเปลี่ยนแปลงไปใช้ รวมถึงธีมสีและพฤติกรรมเริ่มต้น
dwmc เป็นแพตช์ง่ายๆ ที่เปลี่ยนพฤติกรรม dwm ผ่านโปรแกรม client คล้ายกับ bspwm ที่ใช้ bspc แม้ dwmc จะเรียบง่ายกว่า bspc แต่ก็มีการตั้งค่าที่มีประโยชน์หลายอย่าง
ตัวอย่างเช่น ฟังก์ชัน togglebar ใน dwmc รัน dwmc togglebar เพื่อเปิด/ปิดแถบ dwm แบบไดนามิก ทำให้ dwmc มีประโยชน์เมื่อสร้างสคริปต์สำหรับพฤติกรรมหน้าต่างกำหนดเอง
ยินดีด้วย! ตอนนี้คุณเข้าใจพื้นฐานการแพตช์โค้ดแล้ว พร้อมกับ 5 แพตช์ที่สามารถนำไปใช้กับ dwm ของคุณได้ หากมองหาประสบการณ์มินิมอลลิสต์คล้ายกันในเบราว์เซอร์ ดูบทช่วยสอนนี้ต่อไป
คำถามที่พบบ่อย
1. แพตช์ dwm ปลอดภัยไหม?
ปลอดภัย! ผู้ดูแลหลายคนตรวจสอบแพตช์ในเว็บไซต์ suckless ทำให้มั่นใจได้ว่าแพตช์ทุกตัวทำงานกับเวอร์ชัน dwm ที่เขียนไว้
2. ใช้ git apply แตแพตช์ล้มเหลว และ dwm คอมไพล์ไม่ผ่าน ต้องทำไง?
อาจเกิดจากหลายสาเหตุ สาเหตุทั่วไปคือ header ของ git ไม่ถูกลบออกจากไฟล์ซอร์ส แก้ไขง่าย คือ ลบ header ออกและแพตช์ด้วยตนเอง
เมื่อเปิดไฟล์ซอร์ส จะเห็นบรรทัดที่ติดฉลาก HEAD บ่งบอกจุดเริ่มต้นของการแก้ไข ตามด้วยฟังก์ชันที่ต้องแก้ ต้องลบบรรทัดนั้นและแพตช์ด้วยตนเอง จะมีเครื่องหมาย + และ - ด้านซ้ายโค้ดบอกว่าต้องเปลี่ยนอะไร
3. แพตช์สำเร็จแต dwm คอมไพล์ไม่ผ่าน ขอตัวแปรหรือการประกาศที่หายไป?
โปรแกรมแพตช์ไม่ได้แพตช์ไฟล์ config.h โดยค่าเริ่มต้น แพตช์จะแก้ไข config.def.h เพื่อกันขัดแย้งกับการตั้งค่าปัจจุบัน
แต่ทำให้ config.h ไม่โหลดค่าการตั้งค่าที่ถูกต้องสำหรับแพตช์ตัวนั้น ต้องนำการเปลี่ยนแปลงใน config.def.h ไปไว้ใน config.h เอง