06 เมษายน 2551

KDE4.1-svn กับ compiz - kde4-window-decorator

ตั้งแต่เปลี่ยนมาใช้ KDE4.1-svn ได้ร่วมเดือนแล้วก็ติดปัญหาหลาย ๆ อย่างที่ตัวจัดการหน้าต่าง (kwin) ของ KDE4.1 มันยังไม่ได้ดังใจ เช่น


- ส่วนตัวแล้ว ถ้าขาดลูกเล่น Composite แล้วหงุดหงิด แบบเป็นคนติด Eye Candy อ่ะ :p

- ลูกเล่น Composite ของหน้าต่างยังอืด ๆ ทำงานช้า และบางทีก็ทำให้ KDE freeze ไปซะเฉย ๆ



เลยจำเป็นต้องหันมาใช้ compiz-fusion เจ้าเก่าเจ้าเดิม ที่ทำงานได้ดีบน KDE 4.0.x โดยตอนนั้นผมเลือกใช้ kde4-window-decorator เป็น WM เจ้าประจำ

ครั้นพอเปลี่ยนมาใช้ KDE4.1-svn ก็ปรากฏว่า เจ้า kde4-window-decorator ดันมีปัญหากับ KDE4.1 เสียแล้ว



- ถ้าเปิดหน้าต่างตั้งแต่ 2 หน้าต่างขึ้นไป จะไม่สามารถสลับหน้าต่างผ่านการคลิกเมาส์บนหัวหน้าต่างได้

- คลิกแล้วมันกลายเป็นการปรับขนาดหน้าต่างของตัวหน้าต่างที่ได้รับโฟกัสเป็นตัวแรกแทนซะงั้น

- ไล่ ๆ ดูบนอินเทอร์เน็ต ไม่พบคำตอบ แม้กระทั่งบนเว็บไซต์ของ compiz-fusion เอง ฤาจะไม่มีคนใช้ kde4-window-decorator กับ KDE 4.1-svn ???

- ตามไปถามใน IRC ทั้งที่ห้อง KDE และห้อง compiz ฝรั่งก็ตอบไม่ได้ (ไม่มีใครใช้แบบผม ???)



ถ้าให้เดาผมว่าน่าจะเป็นบั๊กที่ไลบรารีของ KDE 4.1 มากกว่า ก็ไปแจ้งให้ผู้พัฒนา KDE ทราบบน IRC แล้ว ตั้งแต่ 2 อาทิตย์ก่อน ไม่รู้เค้าลองหรือยังเห็นบอกว่ากำลังคอมไพล์ :-P



มันคันมันคาใจ พอแจ้งเสร็จก็เลยไล่แก้เองซะ แก้ที่ตัว kde4-window-decorator ของ compiz-fusion มันนี่แหละ ง่ายดีแต่ลืมมาบล็อกไว้ เผื่อมีคนอยากใช้อย่างผม

ผมแก้ที่ไฟล์ kde/window-decorator-kde4/decorator.cpp ในต้นฉบับของ compiz แก้แบบไม่เอาความสมบูรณ์เอาพอใช้ได้:-P ได้ผลลัพธ์ออกมาเป็นแพตช์ดังนี้ (ใช้กับ compiz-0.7.2)




diff -uNr compiz-0.7.2.orig/kde/window-decorator-kde4/decorator.cpp compiz-0.7.2/kde/window-decorator-kde4/decorator.cpp
--- compiz-0.7.2.orig/kde/window-decorator-kde4/decorator.cpp 2008-02-05 23:06:18.000000000 +0700
+++ compiz-0.7.2/kde/window-decorator-kde4/decorator.cpp 2008-04-06 19:32:19.000000000 +0700
@@ -598,10 +598,23 @@
xbe2.x = xbe->x - child->pos ().x ();
xbe2.y = xbe->y - child->pos ().y ();
}
-
- QApplication::x11ProcessEvent ((XEvent *) &xbe2);
-
- return true;
+ bool chk = xbe->button==1 && (xbe->x == xbe2.x && xbe->y == xbe2.y);
+ if (client->activeChild() != child) client->setActiveChild(child);
+ if (chk)
+ {
+ Qt::MouseButton mouseBtn = xbe->button==1 ? Qt::LeftButton : (xbe->button==3 ? Qt::RightButton : Qt::NoButton);
+ QPoint qp2 (xbe2.x, xbe2.y);
+ QMouseEvent qme (xevent->type==ButtonPress ? QEvent::MouseButtonPress : QEvent::MouseButtonRelease,
+ qp2,
+ mouseBtn,
+ mouseBtn,
+ Qt::NoModifier);
+ QApplication::sendEvent (child, &qme);
+ return false;
+ }
+ else {
+ return QApplication::x11ProcessEvent ( (XEvent *) &xbe2);
+ }
}
} break;
case ClientMessage:



โดยยังมีบั๊กอยู่คือ

- ไม่ตอบสนองการดับเบิลคลิกที่หัวหน้าต่าง

- เมนูผุดจากการคลิกเมาส์ปุ่มขวาจะไม่แสดงค้างถ้าปล่อยปุ่มเมาส์ ต้องคลิกขวาค้างไว้เพื่อเรียกเมนู

- อื่น ๆ ที่ยังไม่รู้



เอาเป็นว่าผมได้ Eye Candy คืนมาละ ในขณะที่ยังได้ใช้กรอบหน้าต่างแบบ Oxygen ต่อไปได้อีกด้วย โฮ่ะ ๆ ๆ

พอใจแล้ว ไม่แก้เพิ่มแล้ว ไม่มีเวลา ใครว่าง ๆ แก้ให้สมบูรณ์ด้วยก็ดีครับ โค้ดยังห่วยเลยไม่ส่งกลับ compiz ขออภัย ลอล

1 ความคิดเห็น:

udomsakc กล่าวว่า...

อ่ะ ผมกำลังจะโหลดตัว 4.3 มาลองพอดีเลย เห็นมี bug แบบนี้ไม่กล้าแล้วแฮะ - -"