From 52f68cc6b459b27f04df95441793bc36bb1670bc Mon Sep 17 00:00:00 2001 From: cxl Date: Sun, 24 Jul 2011 17:18:53 +0000 Subject: [PATCH] .Developing rainbow git-svn-id: svn://ultimatepp.org/upp/trunk@3707 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- rainbow/Framebuffer/DnD.cpp | 1 - rainbow/Framebuffer/Event.cpp | 4 +++ rainbow/Framebuffer/Fb.h | 7 +++++ rainbow/Framebuffer/TopFrame.cpp | 40 +++++++++++++++++++++++++++-- rainbow/Framebuffer/Wnd.cpp | 20 +++++++-------- rainbow/SysShutdown/SysShutdown.upp | 11 ++++++++ rainbow/SysShutdown/init | 5 ++++ rainbow/SysShutdown/main.cpp | 10 ++++++++ rainbow/UWord/UWord.cpp | 1 - rainbow/WinFb/Proc.cpp | 4 +++ rainbow/WinFb/Win.cpp | 4 +++ 11 files changed, 92 insertions(+), 15 deletions(-) create mode 100644 rainbow/SysShutdown/SysShutdown.upp create mode 100644 rainbow/SysShutdown/init create mode 100644 rainbow/SysShutdown/main.cpp diff --git a/rainbow/Framebuffer/DnD.cpp b/rainbow/Framebuffer/DnD.cpp index 61aa2d953..945de0fd7 100644 --- a/rainbow/Framebuffer/DnD.cpp +++ b/rainbow/Framebuffer/DnD.cpp @@ -82,7 +82,6 @@ void DnDLoop::DnD(bool paste) void DnDLoop::Sync() { GuiLock __; - Ptr t = FindMouseTopCtrl(); if(t != target) if(target) diff --git a/rainbow/Framebuffer/Event.cpp b/rainbow/Framebuffer/Event.cpp index 75b37ca9b..64ad722ef 100644 --- a/rainbow/Framebuffer/Event.cpp +++ b/rainbow/Framebuffer/Event.cpp @@ -1,5 +1,7 @@ #include "Fb.h" +#ifdef GUI_FB + NAMESPACE_UPP #define LLOG(x) //DLOG(x) @@ -183,3 +185,5 @@ void Ctrl::SetMouseCursor(const Image& image) } END_UPP_NAMESPACE + +#endif \ No newline at end of file diff --git a/rainbow/Framebuffer/Fb.h b/rainbow/Framebuffer/Fb.h index b4201a35c..fbcba1d77 100644 --- a/rainbow/Framebuffer/Fb.h +++ b/rainbow/Framebuffer/Fb.h @@ -11,8 +11,11 @@ public: virtual void Paint(Draw& w); virtual Image CursorImage(Point p, dword keyflags); virtual void LeftDown(Point p, dword keyflags); + virtual void LeftHold(Point p, dword keyflags); virtual void LeftDouble(Point p, dword keyflags); virtual void MouseMove(Point p, dword keyflags); + virtual void CancelMode(); + virtual void LeftUp(Point p, dword keyflags); private: Point dir; @@ -22,11 +25,15 @@ private: bool maximized; Rect overlapped; + bool holding; + TimeCallback hold; + Point GetDragMode(Point p); Image GetDragImage(Point dragmode); void StartDrag(); Rect Margins() const; Rect ComputeClient(Rect r); + void Hold(); typedef TopWindowFrame CLASSNAME; diff --git a/rainbow/Framebuffer/TopFrame.cpp b/rainbow/Framebuffer/TopFrame.cpp index 7863e5a77..e9b2d0103 100644 --- a/rainbow/Framebuffer/TopFrame.cpp +++ b/rainbow/Framebuffer/TopFrame.cpp @@ -18,6 +18,7 @@ TopWindowFrame::TopWindowFrame() maximize <<= THISBACK(ToggleMaximize); maximized = false; sizeable = false; + holding = false; } void TopWindowFrame::SyncRect() @@ -169,7 +170,42 @@ void TopWindowFrame::GripResize() void TopWindowFrame::LeftDown(Point p, dword keyflags) { dir = GetDragMode(p); - StartDrag(); + if(dir.x || dir.y || FullWindowDrag) + StartDrag(); + else { + SetCapture(); + holding = true; + hold.Set(GetKbdDelay() / 3, THISBACK(Hold)); + } +} + +void TopWindowFrame::CancelMode() +{ + holding = false; +} + +void TopWindowFrame::LeftUp(Point p, dword keyflags) +{ + holding = false; +} + +void TopWindowFrame::Hold() +{ + if(HasCapture()) { + if(HasMouse() && GetMouseLeft() && holding) + StartDrag(); + ReleaseCapture(); + holding = false; + } +} + +void TopWindowFrame::LeftHold(Point p, dword keyflags) +{ + if(HasCapture() || FullWindowDrag) + return; + dir = GetDragMode(p); + if(!dir.x && !dir.y) + StartDrag(); } void TopWindowFrame::LeftDouble(Point p, dword keyflags) @@ -182,7 +218,7 @@ void TopWindowFrame::MouseMove(Point, dword) { LDUMP(HasWndCapture()); LDUMP(HasCapture()); - if(!HasCapture()) + if(!HasCapture() || holding) return; Size msz = ComputeClient(minsize).GetSize(); Point p = GetMousePos() - startpos; diff --git a/rainbow/Framebuffer/Wnd.cpp b/rainbow/Framebuffer/Wnd.cpp index 677ee73be..04d8a3525 100644 --- a/rainbow/Framebuffer/Wnd.cpp +++ b/rainbow/Framebuffer/Wnd.cpp @@ -24,8 +24,6 @@ Image Ctrl::fbCaretBak; int Ctrl::fbCaretTm; int Ctrl::renderingMode = MODE_ANTIALIASED; bool Ctrl::fbEndSession; -int64 Ctrl::fbEventLoop; -int64 Ctrl::fbEndSessionLoop; bool Ctrl::FullWindowDrag; int Ctrl::PaintLock; @@ -65,8 +63,7 @@ void Ctrl::EndSession() GuiLock __; LLOG("Ctrl::EndSession"); fbEndSession = true; - fbEndSessionLoop = fbEventLoop; - LDUMP(fbEndSessionLoop); + EndSessionLoopNo = EventLoopNo; } void Ctrl::ExitFB() @@ -428,11 +425,9 @@ void Ctrl::EventLoop0(Ctrl *ctrl) } bool quit = false; + int64 loopno = ++EventLoopNo; ProcessEvents(&quit); - int64 loopno = ++fbEventLoop; - LDUMP(loopno); - LDUMP(fbEndSessionLoop); - while(loopno > fbEndSessionLoop && !quit && (ctrl ? ctrl->IsOpen() && ctrl->InLoop() : GetTopCtrls().GetCount())) + while(loopno > EndSessionLoopNo && !quit && (ctrl ? ctrl->IsOpen() && ctrl->InLoop() : GetTopCtrls().GetCount())) { // LLOG(GetSysTime() << " % " << (unsigned)msecs() % 10000 << ": EventLoop / GuiSleep"); SyncCaret(); @@ -556,6 +551,8 @@ void Ctrl::WndDestroy0() TopWindow *win = dynamic_cast(this); if(win) win->DestroyFrame(); + if(topctrl.GetCount()) + topctrl.Top()->SetWndForeground0(); } void Ctrl::PutForeground() @@ -581,9 +578,10 @@ void Ctrl::SetWndForeground0() ASSERT(IsOpen()); if(IsWndForeground()) return; - if(top && top->owner_window) - top->owner_window->PutForeground(); - PutForeground(); + Ctrl *to = this; + while(to->top && to->top->owner_window) + to = to->top->owner_window; + to->PutForeground(); if(this != focusCtrl) ActivateWnd(); } diff --git a/rainbow/SysShutdown/SysShutdown.upp b/rainbow/SysShutdown/SysShutdown.upp new file mode 100644 index 000000000..b8c48efe3 --- /dev/null +++ b/rainbow/SysShutdown/SysShutdown.upp @@ -0,0 +1,11 @@ +uses + CtrlLib, + WinFb; + +file + main.cpp; + +mainconfig + "" = "GUI SSE2 WINFB", + "" = "GUI SSE2"; + diff --git a/rainbow/SysShutdown/init b/rainbow/SysShutdown/init new file mode 100644 index 000000000..df64259db --- /dev/null +++ b/rainbow/SysShutdown/init @@ -0,0 +1,5 @@ +#ifndef _SysShutdown_icpp_init_stub +#define _SysShutdown_icpp_init_stub +#include "CtrlLib/init" +#include "WinFb/init" +#endif diff --git a/rainbow/SysShutdown/main.cpp b/rainbow/SysShutdown/main.cpp new file mode 100644 index 000000000..acd13bd0c --- /dev/null +++ b/rainbow/SysShutdown/main.cpp @@ -0,0 +1,10 @@ +#include + +using namespace Upp; + +GUI_APP_MAIN +{ + int q = PromptYesNo("Just a test"); + DDUMP(q); + PromptOK(AsString(q)); +} diff --git a/rainbow/UWord/UWord.cpp b/rainbow/UWord/UWord.cpp index 92537b94a..d32882e5c 100644 --- a/rainbow/UWord/UWord.cpp +++ b/rainbow/UWord/UWord.cpp @@ -261,7 +261,6 @@ void UWord::SerializeApp(Stream& s) GUI_APP_MAIN { - SetLanguage(LNG_ENGLISH); SetDefaultCharset(CHARSET_UTF8); diff --git a/rainbow/WinFb/Proc.cpp b/rainbow/WinFb/Proc.cpp index 77b0d26c9..163f43217 100644 --- a/rainbow/WinFb/Proc.cpp +++ b/rainbow/WinFb/Proc.cpp @@ -1,5 +1,7 @@ #include "WinFb.h" +#ifdef flagWINFB + NAMESPACE_UPP #define LLOG(x) //DLOG(x) @@ -176,3 +178,5 @@ LRESULT CALLBACK fbWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa } END_UPP_NAMESPACE + +#endif diff --git a/rainbow/WinFb/Win.cpp b/rainbow/WinFb/Win.cpp index 5534c9b61..5c2e157fe 100644 --- a/rainbow/WinFb/Win.cpp +++ b/rainbow/WinFb/Win.cpp @@ -1,5 +1,7 @@ #include "WinFb.h" +#ifdef flagWINFB + NAMESPACE_UPP #define LLOG(x) //DLOG(x) @@ -114,3 +116,5 @@ void FBFlush() } END_UPP_NAMESPACE + +#endif