KDE terkenal dengan banyaknya fitur2, tampilan dan settings yang bisa dikustom sesuai kebutuhan para penggunanya. Bukan berarti kalo Destop Environment lainnya seperti GNOME, XFCE, Unity-nya Ubuntu gk bisa dikustom (hampir semua aplikasi di Linux bisa dikustom), tapi secara umum, KDE-lah yang paling banyak customization-nya. Terkadang hal ini bisa jadi malah membuat user kerepotan karena terlalu banyak-nya settingan yang harus disetting.
Kalo gw sih, banyaknya setting justru mempermudah untuk pekerjaan sehari2. Tanpa adanya customization, yaa mentok sampai disitu. Mau di-begini-in gk bisa, mau di-begitu-in gk ada settingan-nya. Mentok. Stuck. Sucks. Dan ternyata, di Desktop KDE4 yang gw pake, gw nemuin fitur yang ganggu banget karena tidak ada-nya option untuk men-disable-nya.
Bagi yang berangkat dari alam Micro$oft Window$, mungkin akan sedikit canggung saat berinteraksi dengan Desktop Environment di Linux, terutama ketika menggunakan mouse dan melakukan scrolling wheel’nya. Hampir semua element GUI dari Linux akan merespon action dari mouse scrolling. For example, cukup mengarahkan cursor mouse ke icon volume di systray di KDE, kita bisa me-naik-turun-kan volume hanya dengan scrolling wheel mouse, tanpa klik. Berbeda dengan Windows, di mana hampir semua GUI component harus di-click terlebih dahulu untuk mendapatkan fokus untuk kemudian baru bisa merespon mouse action. Di environment KDE, hanya dengan scrolling wheel mouse saat cursor tepat diatas Virtual Desktop Pager atau Taskbar Manager akan mentrigger perubahan. Virtual Desktop bakal berganti sesuai scrolling atau window-window bakal bergantian Minimize/Maximize.
Sialnya, sampai versi KDE4 yang sekarang dipakai oleh Debian Wheezy (KDE 4.8.4), opsi untuk men-disable action scroll mouse di beberapa bagian itu ternyata tidak ada. Bahkan sampai KDE versi paling anyar sekalipun (v4.11). Sebenarnya fitur scrolling ini usefull sih, User eXperience yang mempercepat interaksi dengan Desktop. Hanya saja, eXperience itu cukup mengganggu ketika kita menggunakan Touchpad di laptop tanpa menggunakan mouse. Sangat sering terjadi, ketika gw ngetik dilaptop, tanpa sengaja menyentuh touchpad, membuat scrolling gesture dan kebetulan cursor mouse tepat diatas Virtual Desktop Pager atau di Taskbar Manager. Asli, hal2 kayak gitu bikin kesel, lagi asik2nya ngetik, ehhh, focus window berubah.
Tapi tenang broo. Sudah jadi nature gw untuk memperbaiki segala sesuatu yang mengganggu hidup gw. Gw bertekad akan merubah Desktop gw supaya nurut sama kemauan gw. Hahahahaha.
Okee, ada beberapa opsi yang terlintas dipikiran gw supaya scrolling wheel ini bisa sesuai dengan kebutuhan gw.
Disable sepenuhnya scrolling wheel di Touchpad.
Feature Request ke KDE Developer untuk bikin opsi disable scroll wheel di specific area di KDE4.
…… gw lagi mikir … apalagi ya ….
Browsing aja dulu di Google, siapa tau ada yg berpikiran sama dengan gw.
Opsi pertama sepertinya kurang pas, karena kalo disable sepenuhnya scrolling wheel, yang ada kita malah kerepotan sendiri. Scrolling wheel berguna di hal2 yang lain seperti scrolling long page di browser, scrolling history di Virtual Terminal, etc. Scrolling wheel cuma bikin gw eneg kalo cursor lagi di atas Virtual Desktop Pager atau Taskbar Manager aja.
Opsi ke 2, hmmmm, kalaupun Request tsb dipenuhi oleh KDE Developer, bakalan nunggu lama agar fitur tsb masuk ke versi Debian. Debian terkenal dengan ke-stabil-annya, yang berarti Debian lebih prefer untuk mantain versi software2 yang sudah ada dari pada mengambil versi baru dengan fitur baru dan bug baru.
Opsi ke 4 sepertinya perlu dicoba. Kalo beruntung, mungkin kita bisa dapet Patch yang bisa kita apply ke Source Code KDE Debian dan dicompile ulang sendiri. Dari hasil Google, ternyata gk banyak yang komplain tentang hal ini. Tapi untungnya mereka yang ngalamin hal yang sama dengan gw, sempat melaporkan bug/feature request ini. Salah seorang user-nya bahkan membuatkan Patch yang bisa kita pakai. Sayangnya, Patch tsb dinilai tidak sesuai dengan coding style-nya KDE oleh Developernya. Walaupun sempet masuk ke mainline Source Code KDE, Developer yang maintain code tersebut me-reject-nya. No problem, at least kita dapet Patch-nya.
Dari Patch ini, kita bisa tau bahwa untuk mendisable scroll wheel di Taskbar
Manager, hanya file taskgroupitem.cpp dari source kde-worspace aja yang perlu
dimodifikasi. Sebenarnya Patch tsb cukup komplet sih, si pembuat Patch bahkan
membuat sebuah opsi baru di Taskbar Manager Setting, jadi bisa
di-enable-disable. Karena gw cuman perlu disable doank, cukup taskgroupitem.cpp
yang gw modifikasi. Langkah selanjutnya, kita perlu download build dependency
KDE Workspace dari Debian Repository. Build Dependency ini diperlukan agar
Source Code dari kde-workspace bisa kita compile. Pastikan source repo kita ada
di file /etc/apt/sources.list.

sudo apt-get update
sudo apt-get build-deb kde-workspace

WTF !!!. build dependency-nya gede jek. 37.3 MB. Belum lagi gw harus download source code kde-workspace yg juga berukuran ~30MB. Maannn, gw cuma mau modifikasi 1 file cpp doank, kenapa banyak banget yg harus gw download. Gw harus mikir ulang nih. Kita liat lagi Patch tsb.

Sebenarnya hal yang perlu kita lakukan di file taskgroupitem.cpp tuh cuma buang
1 baris code doank di function TaskGroupItem::wheelEvent. Dalam artian, ketika
function tsb dipanggil oleh action Mouse Wheel (Scrolling), kita gk perlu
melakukan apa2. Baris ke 10 dari patch diatas gk perlu gw lakukan karena gw cuma
pengen totally disable scroll wheel, gw gk butuh opsi setting-nya. Function itu
kita bikin kosong. Ketika kita compile file taskgroupitem.cpp tanpa patch,
compiler akan menggenerate suatu perintah assembler (bahasa mesin) berdasarkan
baris code focusSubTask((event->delta() > 0), true);. Tapi kalo kita buang
baris tsb, compiler tidak akan men-generate apa2, langsung keluar dari function,
kembali kepada siapa yang memanggilnya …… kembali. Yaaaaa, kembali a.k.a
return a.k.a ret. Kenapa kita gak ganti aja perintah itu dengan perintah
assembler ret (hexcode 0xC3). ret adalah perintah assembler yang akan keluar
dari function dimana dia berada sekarang ke fungsi yang memanggilnya. Masuk dan
langsung keluar lagi. Cuma lewat aja. Jadi daripada gw harus download segitu
banyaknya package build dependency dan source code, gw binary patch aja file-nya
langsung. Hahahahaha, ini enaknya gw ngarti bahasa assembler. Untung gw dulu
sempet maen2 nge-crack pake bahasa assembler.
Taktik-nya berganti. Yang harus kita cari tau sekarang adalah, file apa yang
harus kita binary patch. Karena gw gk jadi download source code kde-workspace
tadi, mending kita liat langsung source code kde-workspace via gitweb-nya.
Alamat-nya ada di http://quickgit.kde.org/?p=kde-workspace.git&a=tag&t=v4.8.4.
Tepatnya lagi di folder plasma/desktop/applets/tasks/. Ada file
CMakeLists.txt disitu. CMakeLists.txt adalah semacam pre-Makefile yang
mendefinisikan apa aja yang harus dicompile di folder tsb dan output apa yang
bakal dihasilkan. Kita liat file itu.

Di baris 10 dijelaskan bahwa compiler akan men-generate file Library dengan nama
awal plasma_applet_tasks. Karena library di Linux extension-nya adalah .so, maka
output akhir dari folder tsb adalah plasma_applet_tasks.so. Bakal di install
di /usr/lib/kde4/plasma_applet_tasks.so. Kita copy file tsb ke folder /tmp
untuk analisa. Tool analisa yang bisa kita pake adalah objdump, part dari
package binutils. So, silahkan install package binutils sebelumnya. objdump ini
kita gunakan untuk melihat bahasa assembly dari file plasma_applet_tasks.so.
sudo apt-get install binutils
Opsi yang gw pake di objdump adalah -d -M intel-mnemonic. -d digunakan untuk
disassembly code, dan -M intel-mnemonic untuk syntax assembly cara intel. Ada
2 macam format syntax assembly yang disupport oleh objdump, yang satu intel yang
satunya at&t. Itu hanya masalah syntax aja sih, untuk lebih jelasnya bisa
dilihat di sini.
Naahh, output dari objdump gw lempar lewat pipe ke less, jadi bisa lebih enak
liat-nya, bisa di-naik-turun-kan dan bisa di search.

objdump -d -M intel-mnemonic /tmp/plasma_applet_tasks.so | less
Dari file taskgroupitem.cpp, yang perlu kita cari adalah dimana alamat dari
function TaskGroupItem::wheelEvent. Alamat/offset dari function tsb bisa cepat
kita cari sih kalo kita punya versi debug package dari kde-workspace. Tapi
ternyata size-nya malah lebih besar daripada size build dependency + source
package. Coba kita cari melalui string QGraphicsSceneWheelEvent. Tekan
tombol / untuk search string di less dan ketik string yang ingin dicari +
enter.


Well, hasil pertama yang didapat sepertinya bukan yang kita cari. Baris tsb
hanya mereferensikan dimana QGraphicsSceneWheelEvent itu berada, bukan
function TaskGroupItem::wheelEvent yang kita cari. Tekan n untuk next search.

Ini dia yang gw cari. Disinilah function TaskGroupItem::wheelEvent berada.
Kenapa gw yakin itu baris assembler-nya dari TaskGroupItem::wheelEvent ??
Karena kalo kita liat di file taskgroupitem.cpp, hanya
TaskGroupItem::wheelEvent yang menggunakan QGraphicsSceneWheelEvent. Tidak
ada function lain yang menggunakannya. Function itu dimulai dari offset 25e80
dan berakhir di offset 25e97. Offset 25e98 dan 25e9a adalah prepare jump
keluar dari function tsb. Jadi yang perlu kita ganti adalah hex di offset
25e80, hanya 1 bytes. Dari hex 0x53 (push rbx/push ebx) ke hex 0xC3
(ret). Saatnya kita binary patch file plasma_applet_tasks.so dengan
menggunakan hex-editor. Gw sendiri pake okteta, silahkan install kalo belum ada.
sudo apt-get install okteta
Buka file plasma_applet_tasks.so dengan okteta dan search hex string berikut:
534889fb4889f7e864d4feff4889dfc1e81fba010000005b atau langsung aja goto
offset 25e80.

Ganti byte di offset 25e80 tersebut dengan 0xC3 seperti gambar dibawah.

Simpan file tersebut. Bisa dicheck ulang hasil disassembly dari sebelum dipatch dan yang sudah dipatch.
Sebelum dipatch:
25e7c: 41 5e pop r14
25e7e: c3 ret
25e7f: 90 nop
25e80: 53 push rbx
25e81: 48 89 fb mov rbx,rdi
25e84: 48 89 f7 mov rdi,rsi
25e87: e8 64 d4 fe ff call 132f0 <_znk24qgraphicsscenewheelevent5deltaEv@plt>
25e8c: 48 89 df mov rdi,rbx
25e8f: c1 e8 1f shr eax,0x1f
25e92: ba 01 00 00 00 mov edx,0x1
25e97: 5b pop rbx
25e98: 89 c6 mov esi,eax
25e9a: e9 01 ff ff ff jmp 25da0 <qt_plugin_instance+xe5b0>
Setelah dipatch:
25e7c: 41 5e pop r14
25e7e: c3 ret
25e7f: 90 nop
25e80: c3 ret
25e81: 48 89 fb mov rbx,rdi
25e84: 48 89 f7 mov rdi,rsi
25e87: e8 64 d4 fe ff call 132f0 <_znk24qgraphicsscenewheelevent5deltaEv@plt>
25e8c: 48 89 df mov rdi,rbx
25e8f: c1 e8 1f shr eax,0x1f
25e92: ba 01 00 00 00 mov edx,0x1
25e97: 5b pop rbx
25e98: 89 c6 mov esi,eax
25e9a: e9 01 ff ff ff jmp 25da0 <qt_plugin_instance+xe5b0>
Kemudian copy kembali ke tempat asalnya di
/usr/lib/kde4/plasma_applet_tasks.so (pake root ya).
sudo cp -v /tmp/plasma_applet_tasks.so /usr/lib/kde4/plasma_applet_tasks.so
Done !!!, Selesei !!!
Mungkin bakal terjadi crash sebentar karena ada perubahan binary di system, tapi don’t worry, bukan crash system koq, hanya Taskbar-nya aja, itupun otomatis akan reload ulang dengan library baru yang sudah kita patch. Seharusnya scrolling di Taskbar Manager tidak akan membuat window-window-nya kacrut lagi. Hehehehe.
Another usefull knowledge from the past. Gak ada ilmu yang gak berguna. Gw kira ilmu2 cracking+assembly jaman windows dulu gk kepake karena di Linux semua ada source code-nya. Ternyata, simple binary patching bisa menghemat waktu gw. Tentunya cara yang baik dan benar seharusnya gw compile ulang, report bug ke KDE Debian Maintainer dll, tp karena gw lagi pgen cepet ya cara binary patching itu yang gw pake. Dan memang point dari artikel ini sebenarnya adalah binary patching, sooo … semoga artikel ini berguna :). Cheers …
PS:
Perintah perintah assembly diatas mungkin sedikit berbeda jika Debian yang dipake adalah 32bit. Kebetulan yang gw pake adalah Debian Wheezy 64bit (AMD64), KDE versi 4:4.8.4-6. Arsitektur selain x86 seperti arm, mips, dll sudah pasti juga berbeda.