From ba67a7807b0501e2e877144fa000e9d80663c87c Mon Sep 17 00:00:00 2001 From: cxl Date: Sun, 25 Jan 2009 12:23:43 +0000 Subject: [PATCH] X11 fixes (PopupEffect, autorepeat issue) git-svn-id: svn://ultimatepp.org/upp/trunk@804 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/CtrlCore/X11Proc.cpp | 28 +++++++++-------- uppsrc/CtrlCore/X11Wnd.cpp | 1 + uppsrc/CtrlLib/ChGtk.cpp | 7 +++++ uppsrc/CtrlLib/CtrlUtil.cpp | 61 +++++++++++++++++++------------------ 4 files changed, 55 insertions(+), 42 deletions(-) diff --git a/uppsrc/CtrlCore/X11Proc.cpp b/uppsrc/CtrlCore/X11Proc.cpp index cae4246d4..db5e825ef 100644 --- a/uppsrc/CtrlCore/X11Proc.cpp +++ b/uppsrc/CtrlCore/X11Proc.cpp @@ -4,7 +4,7 @@ NAMESPACE_UPP #ifdef PLATFORM_X11 -#define LLOG(x) //DLOG(x) +#define LLOG(x) // DLOG(x) #define LTIMING(x) //TIMING(x) @@ -126,18 +126,22 @@ void Ctrl::EventProc(XWindow& w, XEvent *event) while(ev1->type == NoExpose && IsWaitingEvent()); LLOG("ev1 type:" << ev1->type << " state:" << ev1->xkey.state << "keycode:" << ev1->xkey.keycode); - if(ev1->type != KeyRelease || - ev1->xkey.state != event->xkey.state || - ev1->xkey.keycode != event->xkey.keycode || - !IsWaitingEvent()) { - XPutBackEvent(Xdisplay, ev1); - break; + if(ev1->type == KeyPress) + *ev2 = *ev1; + else { + if(ev1->type != KeyRelease || + ev1->xkey.state != event->xkey.state || + ev1->xkey.keycode != event->xkey.keycode || + !IsWaitingEvent()) { + XPutBackEvent(Xdisplay, ev1); + break; + } + do + XNextEvent(Xdisplay, ev2); + while(ev2->type == NoExpose && IsWaitingEvent()); + LLOG("ev2 type:" << ev2->type << " state:" << ev2->xkey.state << + "keycode:" << ev2->xkey.keycode); } - do - XNextEvent(Xdisplay, ev2); - while(ev2->type == NoExpose && IsWaitingEvent()); - LLOG("ev2 type:" << ev2->type << " state:" << ev2->xkey.state << - "keycode:" << ev2->xkey.keycode); if(ev2->type != KeyPress || ev2->xkey.state != event->xkey.state || ev2->xkey.keycode != event->xkey.keycode) { diff --git a/uppsrc/CtrlCore/X11Wnd.cpp b/uppsrc/CtrlCore/X11Wnd.cpp index 9444686a7..dfef808de 100644 --- a/uppsrc/CtrlCore/X11Wnd.cpp +++ b/uppsrc/CtrlCore/X11Wnd.cpp @@ -280,6 +280,7 @@ void Ctrl::TimerAndPaint() { } SyncCaret(); AnimateCaret(); + XSync(Xdisplay, false); } bool Ctrl::ProcessEvent(bool *) diff --git a/uppsrc/CtrlLib/ChGtk.cpp b/uppsrc/CtrlLib/ChGtk.cpp index af7690dab..48de4766a 100644 --- a/uppsrc/CtrlLib/ChGtk.cpp +++ b/uppsrc/CtrlLib/ChGtk.cpp @@ -1239,6 +1239,13 @@ void ChHostSkin() DropEdge_Write(ViewEdge()); SwapOKCancel_Write(true); + + GUI_GlobalStyle_Write(GUISTYLE_XP); + GUI_DragFullWindow_Write(1); + GUI_PopUpEffect_Write(Ctrl::IsCompositedGui() ? GUIEFFECT_NONE : GUIEFFECT_SLIDE); + GUI_DropShadows_Write(1); + GUI_AltAccessKeys_Write(1); + GUI_AKD_Conservative_Write(0); } END_UPP_NAMESPACE diff --git a/uppsrc/CtrlLib/CtrlUtil.cpp b/uppsrc/CtrlLib/CtrlUtil.cpp index c9d617a75..1013dc943 100644 --- a/uppsrc/CtrlLib/CtrlUtil.cpp +++ b/uppsrc/CtrlLib/CtrlUtil.cpp @@ -15,38 +15,39 @@ void Animate(Ctrl& c, const Rect& target, int type) type = GUI_PopUpEffect(); Rect r0 = c.GetRect(); dword time0 = GetTickCount(); - for(;;) { - dword t = (GetTickCount() - time0); - if(t > 200) - break; - if(type == GUIEFFECT_SLIDE) { - int q = 25 * t / 200; - q *= q; - Rect r = r0; - if(r.left > target.left) - r.left = max(r.left - q, target.left); - if(r.top > target.top) - r.top = max(r.top - q, target.top); - if(r.right < target.right) - r.right = min(r.right + q, target.right); - if(r.bottom < target.bottom) - r.bottom = min(r.bottom + q, target.bottom); - if(r.GetWidth() > target.GetWidth()) - r.right = r.left + target.GetWidth(); - if(r.GetHeight() > target.GetHeight()) - r.bottom = r.top + target.GetHeight(); - if(r == target) + if(type) + for(;;) { + dword t = (GetTickCount() - time0); + if(t > 200) break; - c.SetRect(r); + if(type == GUIEFFECT_SLIDE) { + int q = 25 * t / 200; + q *= q; + Rect r = r0; + if(r.left > target.left) + r.left = max(r.left - q, target.left); + if(r.top > target.top) + r.top = max(r.top - q, target.top); + if(r.right < target.right) + r.right = min(r.right + q, target.right); + if(r.bottom < target.bottom) + r.bottom = min(r.bottom + q, target.bottom); + if(r.GetWidth() > target.GetWidth()) + r.right = r.left + target.GetWidth(); + if(r.GetHeight() > target.GetHeight()) + r.bottom = r.top + target.GetHeight(); + if(r == target) + break; + c.SetRect(r); + } + else + if(type == GUIEFFECT_FADE) + c.SetAlpha((byte)(255 * t / 200)); + else + break; + c.Sync(); + Sleep(0); } - else - if(type == GUIEFFECT_FADE) - c.SetAlpha((byte)(255 * t / 200)); - else - break; - c.Sync(); - Sleep(0); - } c.SetRect(target); c.SetAlpha(255); }