From 5d0f272a8771058c15fd0edb5b476b87c02edf01 Mon Sep 17 00:00:00 2001 From: cxl Date: Sat, 2 Jul 2011 09:17:46 +0000 Subject: [PATCH] .developing rainbow git-svn-id: svn://ultimatepp.org/upp/trunk@3586 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- rainbow/Framebuffer/After.h | 78 ++++++++--------------------------- rainbow/Framebuffer/Ctrl.h | 2 + rainbow/Framebuffer/Event.cpp | 39 +++++++++++++++--- rainbow/Framebuffer/FB.iml | 37 ++++++++++------- rainbow/LinuxFb/LinuxFb.upp | 11 ++--- rainbow/WinFb/Proc.cpp | 9 +++- rainbow/WinFb/Win.cpp | 2 + rainbow/WinFb/WinFb.upp | 1 + rainbow/guiplatform.h | 6 ++- 9 files changed, 96 insertions(+), 89 deletions(-) diff --git a/rainbow/Framebuffer/After.h b/rainbow/Framebuffer/After.h index b32f4d86e..e218978ff 100644 --- a/rainbow/Framebuffer/After.h +++ b/rainbow/Framebuffer/After.h @@ -1,60 +1,18 @@ -class ViewDraw : public SystemDraw { - ImageBuffer ib; - - Vector dummy_invalid; - -public: - ViewDraw(Ctrl *ctrl) : SystemDraw(ib, dummy_invalid) { _DBG_ } - ~ViewDraw() {} -}; - -class DHCtrl : Ctrl {}; - -void InitFB(); - - -#ifdef PLATFORM_WIN32 -Vector& coreCmdLine__(); -Vector SplitCmdLine__(const char *cmd); - -void FBInit(HINSTANCE hInstance); - -#define GUI_APP_MAIN \ -void GuiMainFn_();\ -\ -int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow) \ -{ \ - UPP::coreCmdLine__() = UPP::SplitCmdLine__(UPP::FromSystemCharset(lpCmdLine)); \ - UPP::AppInitEnvironment__(); \ - UPP::FBInit(hInstance); \ - GuiMainFn_(); \ - UPP::Ctrl::CloseTopCtrls(); \ - UPP::UsrLog("---------- About to delete this log of WinFB..."); \ - UPP::DeleteUsrLog(); \ - return UPP::GetExitCode(); \ -} \ -\ -void GuiMainFn_() -#endif - -#ifdef PLATFORM_POSIX -void FBInit(const String& fbdevice); - -#define GUI_APP_MAIN \ -void GuiMainFn_();\ -\ -int main(int argc, const char **argv, const char **envptr) { \ - UPP::AppInit__(argc, argv, envptr); \ - FBInit("/dev/fb0"); \ - GuiMainFn_(); \ - UPP::Ctrl::CloseTopCtrls(); \ - UPP::UsrLog("---------- About to delete this log of LinuxFB..."); \ - UPP::DeleteUsrLog(); \ - return UPP::GetExitCode(); \ -} \ -\ -void GuiMainFn_() -#endif - -void SetDesktop(Ctrl& desktop); -Ctrl *GetDesktop(); +class ViewDraw : public SystemDraw { + ImageBuffer ib; + + Vector dummy_invalid; + +public: + ViewDraw(Ctrl *ctrl) : SystemDraw(ib, dummy_invalid) { _DBG_ } + ~ViewDraw() {} +}; + +class DHCtrl : Ctrl {}; + +void InitFB(); + +#include FRAMEBUFFER_INCLUDE + +void SetDesktop(Ctrl& desktop); +Ctrl *GetDesktop(); diff --git a/rainbow/Framebuffer/Ctrl.h b/rainbow/Framebuffer/Ctrl.h index 76b089a80..ed59df62d 100644 --- a/rainbow/Framebuffer/Ctrl.h +++ b/rainbow/Framebuffer/Ctrl.h @@ -3,6 +3,8 @@ public: static void InitFB(); static void DoMouseFB(int event, Point p, int zdelta = 0); static bool DoKeyFB(dword key, int cnt); + static void RemoveCursor(Rect& update); + static void RemoveCaret(Rect& update); static void RemoveCursor(); static void RemoveCaret(); static void CursorSync(); diff --git a/rainbow/Framebuffer/Event.cpp b/rainbow/Framebuffer/Event.cpp index c8eec16b8..5dd0b6780 100644 --- a/rainbow/Framebuffer/Event.cpp +++ b/rainbow/Framebuffer/Event.cpp @@ -66,26 +66,44 @@ Image Ctrl::GetBak(Rect& tr) return bak; } -void Ctrl::RemoveCursor() +void Ctrl::RemoveCursor(Rect& update) { + update = Null; if(!IsNull(fbCursorBakPos)) { Copy(framebuffer, fbCursorBakPos, fbCursorBak, fbCursorBak.GetSize()); - FBUpdate(Rect(fbCursorBakPos, fbCursorBak.GetSize())); + update = Rect(fbCursorBakPos, fbCursorBak.GetSize()); } fbCursorPos = fbCursorBakPos = Null; fbCursorBak = Null; } -void Ctrl::RemoveCaret() +void Ctrl::RemoveCursor() { + Rect update; + RemoveCursor(update); + if(!IsNull(update)) + FBUpdate(update); +} + +void Ctrl::RemoveCaret(Rect& update) +{ + update = Null; if(!IsNull(fbCaretRect)) { Copy(framebuffer, fbCaretRect.TopLeft(), fbCaretBak, fbCaretBak.GetSize()); - FBUpdate(fbCaretRect); + update = fbCaretRect; } fbCaretRect = Null; fbCaretBak = Null; } +void Ctrl::RemoveCaret() +{ + Rect update; + RemoveCaret(update); + if(!IsNull(update)) + FBUpdate(update); +} + void Ctrl::SetCaret(int x, int y, int cx, int cy) { GuiLock __; @@ -109,7 +127,8 @@ void Ctrl::CursorSync() cr = RectC(focusCtrl->caretx, focusCtrl->carety, focusCtrl->caretcx, focusCtrl->caretcy) + focusCtrl->GetScreenView().TopLeft(); if(fbCursorPos != p || cr != fbCaretRect) { - RemoveCursor(); + Rect oc; + RemoveCursor(oc); RemoveCaret(); fbCursorPos = p; @@ -135,6 +154,16 @@ void Ctrl::CursorSync() } Over(framebuffer, p, fbCursorImage, sz); + DLOG("Cursor " << p << " " << sz); + DDUMP(oc); + // DDUMP(tr); + + _DBG_ // Only do this if they overlap! + if(!IsNull(oc)) + tr = tr | oc; + // tr.left -= 50; + // tr.right += 50; + DDUMP(tr); FBUpdate(tr); FBSync(); } diff --git a/rainbow/Framebuffer/FB.iml b/rainbow/Framebuffer/FB.iml index e163b663a..b40f4d447 100644 --- a/rainbow/Framebuffer/FB.iml +++ b/rainbow/Framebuffer/FB.iml @@ -16,18 +16,25 @@ IMAGE_ID(sizebottom) IMAGE_ID(sizebottomright) IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,237,87,219,106,195,48,12,53,131,208,193,10,101,15,123,219,119,239,15,242,178,159,76,77,156,152,212,214,229,72) -IMAGE_DATA(110,221,22,124,140,33,117,207,145,100,201,114,155,112,14,63,225,128,101,155,40,150,121,158,45,154,149,111,208,100,62,168) -IMAGE_DATA(185,225,3,154,138,175,104,72,190,160,97,249,140,70,228,19,26,149,95,104,52,206,113,86,252,160,215,175,178,135,240,143) -IMAGE_DATA(254,20,141,152,51,134,95,249,4,226,210,246,165,242,59,248,200,126,64,110,141,41,92,194,71,56,173,179,48,182,62,239) -IMAGE_DATA(40,158,179,243,226,243,219,175,49,251,173,242,18,206,49,113,83,76,218,116,155,56,116,174,154,223,255,63,113,30,184,61) -IMAGE_DATA(248,162,134,224,178,26,129,91,105,0,110,214,88,184,158,88,60,123,245,228,242,9,245,181,157,207,239,56,62,183,33,37) -IMAGE_DATA(142,152,40,208,38,65,244,45,223,91,226,108,213,87,5,4,108,208,183,143,95,207,197,101,213,163,54,44,223,107,62,144) -IMAGE_DATA(24,165,125,74,208,114,108,209,83,49,89,206,10,181,230,213,163,118,60,125,231,233,91,205,22,141,75,28,167,109,0,70) -IMAGE_DATA(61,240,108,160,212,121,244,187,13,47,80,45,215,92,218,154,212,152,212,26,213,56,214,217,226,87,227,33,107,20,122,212) -IMAGE_DATA(168,212,180,156,171,150,243,184,235,121,164,63,191,233,205,1,22,241,60,75,160,61,14,153,230,151,219,135,164,77,24,137) -IMAGE_DATA(35,247,33,105,19,70,226,200,125,72,218,132,226,21,159,51,196,5,74,221,35,45,119,107,239,53,173,16,124,130,191,226) -IMAGE_DATA(152,182,193,24,225,96,185,124,173,92,234,25,193,43,243,31,145,39,107,157,150,209,41,119,234,20,9,150,46,146,156,183) -IMAGE_DATA(112,209,147,231,253,109,241,240,44,221,208,35,127,50,127,20,188,153,247,94,5,31,87,227,125,174,70,75,55,60,178,234) -IMAGE_DATA(212,51,130,87,230,63,243,118,201,243,10,123,119,252,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) -IMAGE_END_DATA(448, 15) +IMAGE_DATA(120,156,237,87,189,75,28,65,20,159,4,46,6,34,72,10,187,20,105,242,79,164,73,155,210,194,46,165,69,42,59,83) +IMAGE_DATA(4,99,180,8,33,16,228,20,98,144,96,226,233,69,208,132,164,216,70,68,197,179,240,3,193,15,252,0,17,69,16,65) +IMAGE_DATA(68,4,173,180,251,57,222,158,27,179,59,243,246,189,89,93,21,246,55,12,183,55,247,251,189,55,243,62,230,238,84,181) +IMAGE_DATA(170,85,231,120,160,238,157,191,64,201,0,161,6,128,72,131,211,211,167,56,57,121,198,213,224,248,248,57,142,142,94,224) +IMAGE_DATA(240,240,37,71,131,131,131,58,236,239,215,99,111,239,21,118,118,26,226,52,216,221,109,208,188,215,216,222,110,196,214,86) +IMAGE_DATA(19,214,215,155,41,13,54,55,223,96,99,227,173,230,181,98,117,245,35,150,151,219,177,184,216,97,211,96,109,237,3,86) +IMAGE_DATA(86,62,97,105,41,143,133,133,110,204,205,21,49,59,251,19,51,51,189,38,141,230,116,96,126,254,139,230,245,96,122,122) +IMAGE_DATA(8,165,82,169,50,255,96,98,162,24,214,104,91,221,154,215,131,169,169,34,38,39,255,6,124,245,47,151,151,53,154,243) +IMAGE_DATA(93,207,2,198,199,7,48,54,246,27,35,35,30,121,222,209,209,94,12,15,247,5,118,60,111,136,228,123,222,143,200,30) +IMAGE_DATA(7,7,251,173,241,49,197,160,80,248,70,241,141,126,187,186,58,69,117,152,207,127,22,215,122,91,219,123,145,143,150,150) +IMAGE_DATA(119,98,31,2,110,20,57,85,163,238,171,170,242,84,161,196,171,114,179,250,8,61,7,206,67,239,239,252,154,229,188,145) +IMAGE_DATA(184,168,106,29,184,156,14,90,238,255,192,113,103,89,243,228,215,87,114,94,226,166,193,39,53,6,174,85,67,112,35,26) +IMAGE_DATA(6,55,208,72,184,46,123,113,57,171,75,44,111,32,191,178,250,124,172,199,195,202,160,2,103,152,92,112,155,132,163,79) +IMAGE_DATA(242,185,100,159,73,245,145,4,50,108,152,111,31,119,189,109,95,82,61,215,134,228,243,56,31,156,61,82,231,164,16,23) +IMAGE_DATA(99,137,222,180,39,73,173,152,214,92,245,92,59,46,125,231,210,183,113,182,204,168,209,163,170,50,24,70,93,224,114,128) +IMAGE_DATA(176,206,69,127,97,195,21,92,173,173,185,226,214,168,198,52,173,153,26,71,58,147,248,141,227,113,214,76,72,35,71,97) +IMAGE_DATA(77,146,186,74,82,143,23,122,59,252,31,191,254,63,7,182,200,206,147,108,52,141,34,139,243,107,59,7,165,245,145,5) +IMAGE_DATA(206,120,14,74,235,35,11,156,241,28,148,214,71,232,47,190,205,144,109,163,166,123,36,201,221,154,246,90,92,34,236,1) +IMAGE_DATA(126,164,71,174,50,44,70,108,144,92,190,82,174,233,153,131,219,204,191,142,56,73,243,132,172,83,174,168,83,40,72,186) +IMAGE_DATA(136,114,158,132,203,173,60,215,239,22,23,158,164,27,210,136,31,205,207,18,158,152,119,183,18,158,93,141,87,115,53,74) +IMAGE_DATA(186,225,58,179,110,122,230,224,54,243,111,242,118,9,230,25,68,109,209,184,0,0,0,0,0,0,0,0,0,0,0,0) +IMAGE_END_DATA(672, 15) diff --git a/rainbow/LinuxFb/LinuxFb.upp b/rainbow/LinuxFb/LinuxFb.upp index 0ce031e23..0ca8ca130 100644 --- a/rainbow/LinuxFb/LinuxFb.upp +++ b/rainbow/LinuxFb/LinuxFb.upp @@ -1,5 +1,6 @@ -file - LinuxFb.h, - Keys.h, - Proc.cpp; - +file + LinuxFb.h, + Local.h, + Keys.h, + Proc.cpp; + diff --git a/rainbow/WinFb/Proc.cpp b/rainbow/WinFb/Proc.cpp index e7cdbc58f..105371c22 100644 --- a/rainbow/WinFb/Proc.cpp +++ b/rainbow/WinFb/Proc.cpp @@ -57,6 +57,7 @@ LRESULT CALLBACK fbWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa if(hwnd) { PAINTSTRUCT ps; HDC dc = BeginPaint(hwnd, &ps); + DDUMP(Rect(ps.rcPaint)); Size sz = framebuffer.GetSize(); Buffer data; data.Alloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256); @@ -71,8 +72,12 @@ LRESULT CALLBACK fbWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa hi->biClrImportant = 0; hi->biWidth = sz.cx; hi->biHeight = -sz.cy; - ::SetDIBitsToDevice(dc, 0, 0, sz.cx, sz.cy, 0, 0, - 0, sz.cy, ~framebuffer, (BITMAPINFO *)~data, DIB_RGB_COLORS); + Rect r = ps.rcPaint; + ::SetDIBitsToDevice(dc, r.left, r.top, r.GetWidth(), r.GetHeight(), + r.left, -r.top - r.GetHeight() + sz.cy, 0, sz.cy, + ~framebuffer, (BITMAPINFO *)~data, DIB_RGB_COLORS); +// ::SetDIBitsToDevice(dc, r.left, r.top, r.GetWidth(), r.GetHeight(), r.left, , +// 0, sz.cy, ~framebuffer, (BITMAPINFO *)~data, DIB_RGB_COLORS); EndPaint(hwnd, &ps); } return 0L; diff --git a/rainbow/WinFb/Win.cpp b/rainbow/WinFb/Win.cpp index 5dd736bff..818c8c86f 100644 --- a/rainbow/WinFb/Win.cpp +++ b/rainbow/WinFb/Win.cpp @@ -59,7 +59,9 @@ void FBInit(HINSTANCE hInstance) void FBUpdate(const Rect& inv) { + DLOG("FBUpdate " << inv); if(fbHWND) +// ::InvalidateRect(fbHWND, Rect(0, 0, 10000, 10000), false); ::InvalidateRect(fbHWND, inv, false); } diff --git a/rainbow/WinFb/WinFb.upp b/rainbow/WinFb/WinFb.upp index 5cf2451f7..a268efc4b 100644 --- a/rainbow/WinFb/WinFb.upp +++ b/rainbow/WinFb/WinFb.upp @@ -1,5 +1,6 @@ file WinFb.h, + Local.h, Keys.h, Win.cpp, Proc.cpp; diff --git a/rainbow/guiplatform.h b/rainbow/guiplatform.h index 3a272cb32..8f7fedcc4 100644 --- a/rainbow/guiplatform.h +++ b/rainbow/guiplatform.h @@ -8,12 +8,14 @@ #ifdef flagWINFB #define GUIPLATFORM_KEYCODES_INCLUDE -#define GUIPLATFORM_INCLUDE +#define GUIPLATFORM_INCLUDE +#define FRAMEBUFFER_INCLUDE #endif #ifdef flagLINUXFB #define GUIPLATFORM_KEYCODES_INCLUDE -#define GUIPLATFORM_INCLUDE +#define GUIPLATFORM_INCLUDE +#define FRAMEBUFFER_INCLUDE #endif #ifdef flagWINGL