Hal yang paling menyenangkan dari DWM adalah menyempurnakannya sesuai keinginan penggunanya baik dengan cara patching ataupun memodifikasi DWM dengan menulis kode secara manual. Saya sendiri lebih suka menggunakan patch karena semuanya sudah tersedia di website dwm.suckless, selain itu karena belum terlalu memahami bahasa C secara keseluruhan, khususnya menggunakan librari X11.

Menggunakan Patch DWM

Untuk mendapatkan patch DWM kamu bisa mendownloadnya dari link dwm patches. Disana kamu bisa memilih patch yang kamu butuhkan untuk DWM yang kamu miliki.

Selanjutnya cukup arahkan ke direktori source kode dwm dan simpan patchnya disana. Setelah mendapatkan patchnya cukup jalankan perintah patch:

patch -p1 < dwm-patchyangdidownload-versi-dwm.diff

Untuk patch awal di dwm akan lebih mudah dibanding menggunakan patch berikutnya, karena masih belum banyak berubah. Tapi kalau sudah banyak patch yang digunakan maka kamu perlu melakukan tahap selanjunya.

Yang perlu kamu perhatikan saat patch adalah pastikan setiap status Hunk adalah suksess.

Contoh Hasil Patching

Jika kamu belum pernah menggunakan patch di dwm-mu, besar kemungkinan setiap Hunk sukses. Tapi karena disini dwm yang saya gunakan sudah pernah di patch sebelumnya maka hasilnya seperti ini;

> $ patch -p1 < dwm-fakefullscreen-20210714-138b405.diff
patching file config.def.h
Reversed (or previously applied) patch detected!  Assume -R? [n] y
Hunk #1 succeeded at 51 with fuzz 1 (offset 16 lines).
patching file dwm.c
Reversed (or previously applied) patch detected!  Assume -R? [n] y
Hunk #1 succeeded at 769 (offset 247 lines).
Hunk #2 succeeded at 799 (offset 247 lines).
Hunk #3 FAILED at 565.
Hunk #4 succeeded at 1469 (offset 328 lines).
---baris disembunyikan--
1 out of 8 hunks FAILED -- saving rejects to file dwm.c.rej

Seperti yang bisa dilihat, pada Hunk #3, kode patch gagal di gunakan. Tapi tidak perlu khawatir karena pada saat menjalankan perintah patch semua file yang di rubah menggunakan patch dibackup dan jika kita list file dwm.c hasilnya seperti berikut:

> $ ls -l dwm.c*
-rw-rw-r-- 1 ya ya 70K Mei  6 11:36 dwm.c
-rw-rw-r-- 1 ya ya 70K Mei  6 11:30 dwm.c.orig
-rw-rw-r-- 1 ya ya 360 Mei  6 11:36 dwm.c.rej

Dari list tersebut:

  • file dwm.c adalah file yang telah di patch tapi belum sepenuhnya
  • file dwm.c.orig adalah file backup original dan tidak ter-patch
  • file dwm.c.rej adalah file dimana berisi kode hunk yang direjek saat patching

Memperbaiki Patching Secara Manual.

Dari informasi yang di tampikan di terminal tersebut, maka kita tetap bisa melanjutkannya dengan cara memindahkan kode yang di reject ke file yang di patch. Dari contoh praktik ini kode patch yang direject dwm.c.rej seperti berikut:

--- dwm.c
+++ dwm.c
@@ -565,6 +566,9 @@ configurenotify(XEvent *e)
        drw_resize(drw, sw, bh);
        updatebars();
        for (m = mons; m; m = m->next) {
-            for (c = m->clients; c; c = c->next)
-               if (c->isfullscreen)
-                   resizeclient(c, m->mx, m->my, m->mw, m->mh);
             XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
        }
        focus(NULL);

Dari kode diatas, baris yang diberi tanda plus (-) diawal adalah baris yang perlu kita hapus.

Sedangkan baris yang di file source code dwm.c seperti berikut:

        drw_resize(drw, sw, bh);
        updatebars();
        for (m = mons; m; m = m->next) {
            for (c = m->clients; c; c = c->next)
                if (c->isfullscreen)
                        resizeclient(c, m->mx, m->my, m->mw, m->mh);
            resizebarwin(m);
        }
        focus(NULL);

Mengidentifikasi Baris Kode

Jika dibandingkan dari dua kode tersebut path gagal karena pada file source kode ada baris resizebarwin(m); sedangkan di patchnya adalah XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);.

Coba kita lihat pendefinisian fungsi resizebarwin(m); lebih detail untuk mengetahui apakah fungsi XMoveResizeWindow juga digunakan disana.

void
resizebarwin(Monitor *m) {
        unsigned int w = m->ww;
        if (showsystray && m == systraytomon(m) && !systrayonleft)
                w -= getsystraywidth();
        XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, w, bh);
}

Seperti yang kita lihat pada pendefinisian fungsi resizebarwin terdapat fungsi XMoveResizeWindow di dalamnya, maka kita akan gunakan fungsi resizebarwin saja dari source code yang di patch.

Memperbaiki Secara Manual

Setelah kita mengidentifikasi kode yang direjek dan source kode aslinya untuk memastikan tidak ada lagi kesalahan maka kita bisa langsung menggabung baris file reject dwm.c.rej ke file source kodenya dwm.c seperti berikut:

        drw_resize(drw, sw, bh);
        updatebars();
        for (m = mons; m; m = m->next) {
                resizebarwin(m);
        }
        focus(NULL);

Sekarang yang kita perlukan adalah cek untuk memastikan DWM berjalan sesuai dengan keinginan atau fitur dari patchnya bekerja dengan baik.

Pertama kompile dwm menggunakan file konfigurasi config.def.h dengan cara menghapus config.h

rm -f config.h && sudo make clean install

Keluar dari dwm Mod + shift + q kemudian relogin ke system. cek fiturnya sudah berkerja dengan baik.

Pembersihan file backup dan rejec

Jika semua dirasa sudah sempurna, atau tidak ingin membatalkan patch yang sudah digunakan, maka kita bisa menghapus file reject dan backupnya. Ini diperlukan untuk memudahkan kita melakukan patch lagi jadi kita tidak bingung jika patchnya ada yang gagal lagi.

rm *.orig *.rej

Membatalkan Patch

Ketika kita tidak tahu lagi cara memperbaiki patch yang kita gunakan karena terlalu rumit, Atau karena fiturnya yang kurang memuaskan, maka kita bisa mengembalikan source code dwm ke asal mulanya cukup dengan menjalankan patchnya lagi atau hapus file yang telah diubah menggunakan patch dan file rejectnya.

> $ ls -al *.orig
-rw-rw-r-- 1 ya ya 12634 Mei  6 11:30 config.def.h.orig
-rw-rw-r-- 1 ya ya 70901 Mei  6 11:30 dwm.c.orig

Dari praktik ini file yang telah diubah adalah config.def.h dan dwm.c, maka hapus file tersebut dengan file rejectnya

rm -f config.def.h dwm.c *.rej

Gunakan file backup sebagai file aslinya dengan cara memindahkan atau rename:

mv config.def.h.orig config.def.h 
mv dwm.c.orig dwm.c