diff --git a/rainbow/SDL20GL/Ctrl.h b/rainbow/SDL20GL/Ctrl.h index c9b7fdf94..457a0fa50 100644 --- a/rainbow/SDL20GL/Ctrl.h +++ b/rainbow/SDL20GL/Ctrl.h @@ -6,6 +6,7 @@ private: static Point fbCursorPos; static Image fbCursorImage; + static bool sdlMouseIsIn; static Rect fbCaretRect; static int fbCaretTm; @@ -13,7 +14,7 @@ private: static bool fbEndSession; static int64 fbEventLoop; static int64 fbEndSessionLoop; - + static void CursorSync(); int FindTopCtrl() const; @@ -45,6 +46,8 @@ protected: static int PaintLock; public: + static void HandleSDLEvent(SDL_Event* event); + static void DoMouseFB(int event, Point p, int zdelta = 0); static bool DoKeyFB(dword key, int cnt); diff --git a/rainbow/SDL20GL/Event.cpp b/rainbow/SDL20GL/Event.cpp index 4b49289fb..db8499be8 100644 --- a/rainbow/SDL20GL/Event.cpp +++ b/rainbow/SDL20GL/Event.cpp @@ -13,6 +13,213 @@ Point GetMousePos() { return fbmousepos; } +dword mouseb = 0; +dword modkeys = 0; + +enum KM { + KM_NONE = 0x00, + + KM_LSHIFT= 0x01, + KM_RSHIFT= 0x02, + KM_LCTRL = 0x04, + KM_RCTRL = 0x08, + KM_LALT = 0x10, + KM_RALT = 0x20, + + KM_CAPS = 0x40, + KM_NUM = 0x80, + + KM_CTRL = KM_LCTRL | KM_RCTRL, + KM_SHIFT = KM_LSHIFT | KM_RSHIFT, + KM_ALT = KM_LALT | KM_RALT, +}; + +bool GetMouseLeft() { return mouseb & (1<<0); } +bool GetMouseRight() { return mouseb & (1<<1); } +bool GetMouseMiddle() { return mouseb & (1<<2); } +bool GetShift() { return modkeys & KM_SHIFT; } +bool GetCtrl() { return modkeys & KM_CTRL; } +bool GetAlt() { return modkeys & KM_ALT; } +bool GetCapsLock() { return modkeys & KM_CAPS; } + +dword fbKEYtoK(dword chr) { + if(chr == SDLK_TAB) + chr = K_TAB; + else + if(chr == SDLK_SPACE) + chr = K_SPACE; + else + if(chr == SDLK_RETURN) + chr = K_RETURN; + else + chr = chr + K_DELTA; + if(chr == K_ALT_KEY || chr == K_CTRL_KEY || chr == K_SHIFT_KEY) + return chr; + if(GetCtrl()) chr |= K_CTRL; + if(GetAlt()) chr |= K_ALT; + if(GetShift()) chr |= K_SHIFT; + return chr; +} + +dword lastbdowntime[8] = {0}; +dword isdblclick[8] = {0}; + +void Ctrl::HandleSDLEvent(SDL_Event* event) +{ + LLOG("HandleSDLEvent " << event->type); + SDL_Event next_event; + dword keycode; + switch(event->type) { +// case SDL_ACTIVEEVENT: //SDL_ActiveEvent +// break; + case SDL_TEXTINPUT: { + //send respective keyup things as char events as well + WString text = FromUtf8(event->text.text); + for(int i = 0; i < text.GetCount(); i++) { + int c = text[i]; + if(c != 127) + Ctrl::DoKeyFB(c, 1); + } + break; + } + case SDL_KEYDOWN: + switch(event->key.keysym.sym) { + case SDLK_LSHIFT: modkeys |= KM_LSHIFT; break; + case SDLK_RSHIFT: modkeys |= KM_RSHIFT; break; + case SDLK_LCTRL: modkeys |= KM_LCTRL; break; + case SDLK_RCTRL: modkeys |= KM_RCTRL; break; + case SDLK_LALT: modkeys |= KM_LALT; break; + case SDLK_RALT: modkeys |= KM_RALT; break; + } + + keycode = fbKEYtoK((dword)event->key.keysym.sym); + + if(keycode != K_SPACE) { //dont send space on keydown + static int repeat_count; + SDL_PumpEvents(); + if(SDL_PeepEvents(&next_event, 1, SDL_PEEKEVENT, SDL_KEYDOWN, SDL_KEYDOWN) && + next_event.key.keysym.sym == event->key.keysym.sym) { + repeat_count++; // Keyboard repeat compression + break; + } + Ctrl::DoKeyFB(keycode, 1 + repeat_count); + repeat_count = 0; + } + break; + case SDL_KEYUP: //SDL_KeyboardEvent + switch(event->key.keysym.sym) { + case SDLK_LSHIFT: modkeys &= ~KM_LSHIFT; break; + case SDLK_RSHIFT: modkeys &= ~KM_RSHIFT; break; + case SDLK_LCTRL: modkeys &= ~KM_LCTRL; break; + case SDLK_RCTRL: modkeys &= ~KM_RCTRL; break; + case SDLK_LALT: modkeys &= ~KM_LALT; break; + case SDLK_RALT: modkeys &= ~KM_RALT; break; + } + + Ctrl::DoKeyFB(fbKEYtoK((dword)event->key.keysym.sym) | K_KEYUP, 1); + break; + case SDL_MOUSEMOTION: + SDL_PumpEvents(); + if(SDL_PeepEvents(&next_event, 1, SDL_PEEKEVENT, SDL_MOUSEMOTION, SDL_MOUSEMOTION) > 0) + break; // MouseMove compression + Ctrl::DoMouseFB(Ctrl::MOUSEMOVE, Point(event->motion.x, event->motion.y)); + break; + case SDL_MOUSEWHEEL: + Ctrl::DoMouseFB(Ctrl::MOUSEWHEEL, GetMousePos(), sgn(event->wheel.y) * 120); + break; + case SDL_MOUSEBUTTONDOWN: { + Point p(event->button.x, event->button.y); + int bi = event->button.button; + dword ct = SDL_GetTicks(); + if(isdblclick[bi] && (abs(int(ct) - int(lastbdowntime[bi])) < 400)) + { + switch(bi) + { + case SDL_BUTTON_LEFT: Ctrl::DoMouseFB(Ctrl::LEFTDOUBLE, p); break; + case SDL_BUTTON_RIGHT: Ctrl::DoMouseFB(Ctrl::RIGHTDOUBLE, p); break; + case SDL_BUTTON_MIDDLE: Ctrl::DoMouseFB(Ctrl::MIDDLEDOUBLE, p); break; + } + isdblclick[bi] = 0; //reset, to go ahead sending repeats + } + else + { + lastbdowntime[bi] = ct; + isdblclick[bi] = 0; //prepare for repeat + switch(bi) + { + case SDL_BUTTON_LEFT: mouseb |= (1<<0); Ctrl::DoMouseFB(Ctrl::LEFTDOWN, p); break; + case SDL_BUTTON_RIGHT: mouseb |= (1<<1); Ctrl::DoMouseFB(Ctrl::RIGHTDOWN, p); break; + case SDL_BUTTON_MIDDLE: mouseb |= (1<<2); Ctrl::DoMouseFB(Ctrl::MIDDLEDOWN, p); break; + } + } + } + break; + case SDL_MOUSEBUTTONUP: { + int bi = event->button.button; + isdblclick[bi] = 1; //indicate maybe a dblclick + + Point p(event->button.x, event->button.y); + switch(bi) + { + case SDL_BUTTON_LEFT: mouseb &= ~(1<<0); Ctrl::DoMouseFB(Ctrl::LEFTUP, p); break; + case SDL_BUTTON_RIGHT: mouseb &= ~(1<<1); Ctrl::DoMouseFB(Ctrl::RIGHTUP, p); break; + case SDL_BUTTON_MIDDLE: mouseb &= ~(1<<2); Ctrl::DoMouseFB(Ctrl::MIDDLEUP, p); break; + } + } + break; +/* case SDL_VIDEORESIZE: //SDL_ResizeEvent + { + width = event->resize.w; + height = event->resize.h; + + SDL_FreeSurface(screen); + screen = CreateScreen(width, height, bpp, videoflags); + ASSERT(screen); + Ctrl::SetFramebufferSize(Size(width, height)); + } + break; + case SDL_VIDEOEXPOSE: //SDL_ExposeEvent + break;*/ + case SDL_WINDOWEVENT: + switch (event->window.event) { + case SDL_WINDOWEVENT_SHOWN: + break; + case SDL_WINDOWEVENT_HIDDEN: + break; + case SDL_WINDOWEVENT_EXPOSED: + break; + case SDL_WINDOWEVENT_MOVED: + break; + case SDL_WINDOWEVENT_RESIZED: + break; + case SDL_WINDOWEVENT_MINIMIZED: + break; + case SDL_WINDOWEVENT_MAXIMIZED: + break; + case SDL_WINDOWEVENT_RESTORED: + break; + case SDL_WINDOWEVENT_ENTER: + sdlMouseIsIn = true; + Invalidate(); + break; + case SDL_WINDOWEVENT_LEAVE: + sdlMouseIsIn = false; + Invalidate(); + break; + case SDL_WINDOWEVENT_FOCUS_GAINED: + break; + case SDL_WINDOWEVENT_FOCUS_LOST: + break; + case SDL_WINDOWEVENT_CLOSE: + break; + } + break; + case SDL_QUIT: //SDL_QuitEvent + Ctrl::EndSession(); + break; + } +} + void Ctrl::MouseEventFB(Ptr t, int event, Point p, int zdelta) { if(!t->IsEnabled()) @@ -132,27 +339,25 @@ bool Ctrl::ProcessEvent(bool *quit) ASSERT(IsMainThread()); if(!GetMouseLeft() && !GetMouseRight() && !GetMouseMiddle()) ReleaseCtrlCapture(); - + bool ret = false; SDL_Event event; if(SDL_PollEvent(&event)) { if(event.type == SDL_QUIT && quit) *quit = true; HandleSDLEvent(&event); - SyncTopWindows(); - DefferedFocusSync(); - SyncCaret(); - SyncTopWindows(); - return true; + ret = true; } - return false; + DefferedFocusSync(); + SyncCaret(); + SyncTopWindows(); + return ret; } bool Ctrl::ProcessEvents(bool *quit) { //LOGBLOCK("@ ProcessEvents"); // MemoryCheckDebug(); - if(!ProcessEvent(quit)) - return false; + bool ret = ProcessEvent(quit); while(ProcessEvent(quit) && (!LoopCtrl || LoopCtrl->InLoop())); TimeStop tm; LLOG("TimerProc invoked at " << msecs()); @@ -160,7 +365,7 @@ bool Ctrl::ProcessEvents(bool *quit) LLOG("TimerProc elapsed: " << tm); SweepMkImageCache(); DoPaint(); - return true; + return ret; } void Ctrl::EventLoop(Ctrl *ctrl) diff --git a/rainbow/SDL20GL/Local.h b/rainbow/SDL20GL/Local.h index bf9960b8f..64afd1aad 100644 --- a/rainbow/SDL20GL/Local.h +++ b/rainbow/SDL20GL/Local.h @@ -58,12 +58,11 @@ public: TopWindowFrame(); }; -void HandleSDLEvent(SDL_Event* event); -void HandleUserEvent(SDL_Event* event); - extern Size screen_size; extern SDLWindow screen; +extern dword SDLsettings; + END_UPP_NAMESPACE #endif \ No newline at end of file diff --git a/rainbow/SDL20GL/SDL.cpp b/rainbow/SDL20GL/SDL.cpp index 92412470f..1271c65ec 100644 --- a/rainbow/SDL20GL/SDL.cpp +++ b/rainbow/SDL20GL/SDL.cpp @@ -6,6 +6,13 @@ NAMESPACE_UPP #define LLOG(x) //LOG(x) +dword SDLsettings; + +void USDLSetup(dword flags) +{ + SDLsettings = flags; +} + Size screen_size; SDLWindow screen; @@ -58,7 +65,7 @@ void FBInit() SDL_ShowCursor(0); - screen_size = Size(1024, 768); + screen_size = Size(1500, 900); screen.Create(screen_size, "First test"); Ctrl::SetDesktopSize(screen_size); diff --git a/rainbow/SDL20GL/SDL20GL.h b/rainbow/SDL20GL/SDL20GL.h index 3e9f75ece..9ad93d413 100644 --- a/rainbow/SDL20GL/SDL20GL.h +++ b/rainbow/SDL20GL/SDL20GL.h @@ -105,6 +105,8 @@ public: ~PrinterJob() {} }; +void USDLSetup(dword flags); + END_UPP_NAMESPACE #define GUIPLATFORM_INCLUDE_AFTER diff --git a/rainbow/SDL20GL/SDL20GL.upp b/rainbow/SDL20GL/SDL20GL.upp index 3d62fe3a3..cb178be25 100644 --- a/rainbow/SDL20GL/SDL20GL.upp +++ b/rainbow/SDL20GL/SDL20GL.upp @@ -14,7 +14,6 @@ file Local.h, Window.cpp, Image.cpp, - Util.cpp, FB.iml, Ctrl.h, DrawDragRect.cpp, @@ -27,6 +26,5 @@ file Clip.cpp, DnD.cpp, ChSysInit.cpp, - SDL.cpp, - SDLProc.cpp; + SDL.cpp; diff --git a/rainbow/SDL20GL/SDLProc.cpp b/rainbow/SDL20GL/SDLProc.cpp deleted file mode 100644 index 5d12bb33f..000000000 --- a/rainbow/SDL20GL/SDLProc.cpp +++ /dev/null @@ -1,220 +0,0 @@ -#include "Local.h" - -#ifdef GUI_SDL20GL - -NAMESPACE_UPP - -#define LLOG(x) LOG(x) - -dword mouseb = 0; -dword modkeys = 0; - -enum KM { - KM_NONE = 0x00, - - KM_LSHIFT= 0x01, - KM_RSHIFT= 0x02, - KM_LCTRL = 0x04, - KM_RCTRL = 0x08, - KM_LALT = 0x10, - KM_RALT = 0x20, - - KM_CAPS = 0x40, - KM_NUM = 0x80, - - KM_CTRL = KM_LCTRL | KM_RCTRL, - KM_SHIFT = KM_LSHIFT | KM_RSHIFT, - KM_ALT = KM_LALT | KM_RALT, -}; - -bool GetMouseLeft() { return mouseb & (1<<0); } -bool GetMouseRight() { return mouseb & (1<<1); } -bool GetMouseMiddle() { return mouseb & (1<<2); } -bool GetShift() { return modkeys & KM_SHIFT; } -bool GetCtrl() { return modkeys & KM_CTRL; } -bool GetAlt() { return modkeys & KM_ALT; } -bool GetCapsLock() { return modkeys & KM_CAPS; } - -dword fbKEYtoK(dword chr) { - if(chr == SDLK_TAB) - chr = K_TAB; - else - if(chr == SDLK_SPACE) - chr = K_SPACE; - else - if(chr == SDLK_RETURN) - chr = K_RETURN; - else - chr = chr + K_DELTA; - if(chr == K_ALT_KEY || chr == K_CTRL_KEY || chr == K_SHIFT_KEY) - return chr; - if(GetCtrl()) chr |= K_CTRL; - if(GetAlt()) chr |= K_ALT; - if(GetShift()) chr |= K_SHIFT; - return chr; -} - -dword lastbdowntime[8] = {0}; -dword isdblclick[8] = {0}; -void HandleSDLEvent(SDL_Event* event) -{ - LLOG("HandleSDLEvent " << event->type); - switch(event->type) { -// case SDL_ACTIVEEVENT: //SDL_ActiveEvent -// break; - case SDL_TEXTINPUT: { - //send respective keyup things as char events as well - WString text = FromUtf8(event->text.text); - for(int i = 0; i < text.GetCount(); i++) { - int c = text[i]; - if(c != 127) - Ctrl::DoKeyFB(c, 1); - } - } - case SDL_KEYDOWN: - case SDL_KEYUP: //SDL_KeyboardEvent - { -// bool b = false; - dword keycode = 0; - if(event->type == SDL_KEYDOWN) { - switch(event->key.keysym.sym) - { - case SDLK_LSHIFT: modkeys |= KM_LSHIFT; break; - case SDLK_RSHIFT: modkeys |= KM_RSHIFT; break; - case SDLK_LCTRL: modkeys |= KM_LCTRL; break; - case SDLK_RCTRL: modkeys |= KM_RCTRL; break; - case SDLK_LALT: modkeys |= KM_LALT; break; - case SDLK_RALT: modkeys |= KM_RALT; break; - default:; - } - - keycode = fbKEYtoK((dword)event->key.keysym.sym); - - if(keycode != K_SPACE) //dont send space on keydown - /*b = */Ctrl::DoKeyFB(keycode, 1); - } - else - if(event->type == SDL_KEYUP) - { - switch(event->key.keysym.sym) - { - case SDLK_LSHIFT: modkeys &= ~KM_LSHIFT; break; - case SDLK_RSHIFT: modkeys &= ~KM_RSHIFT; break; - case SDLK_LCTRL: modkeys &= ~KM_LCTRL; break; - case SDLK_RCTRL: modkeys &= ~KM_RCTRL; break; - case SDLK_LALT: modkeys &= ~KM_LALT; break; - case SDLK_RALT: modkeys &= ~KM_RALT; break; - default:; - } - - keycode = fbKEYtoK((dword)event->key.keysym.sym) | K_KEYUP; - /*b = */Ctrl::DoKeyFB(keycode, 1); - } - } - break; - case SDL_MOUSEMOTION: - { - SDL_PumpEvents(); - SDL_Event next_event; - if(SDL_PeepEvents(&next_event, 1, SDL_PEEKEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT) > 0 && - next_event.type == SDL_MOUSEMOTION) - break; // MouseMove compression - Ctrl::DoMouseFB(Ctrl::MOUSEMOVE, Point(event->motion.x, event->motion.y)); - break; - } - case SDL_MOUSEWHEEL: Ctrl::DoMouseFB(Ctrl::MOUSEWHEEL, GetMousePos(), sgn(event->wheel.y) * 120); break; - case SDL_MOUSEBUTTONDOWN: //SDL_MouseButtonEvent, FIXME DoubleClick - { - Point p(event->button.x, event->button.y); - int bi = event->button.button; - dword ct = SDL_GetTicks(); - if(isdblclick[bi] && (abs(int(ct) - int(lastbdowntime[bi])) < 400)) - { - switch(bi) - { - case SDL_BUTTON_LEFT: Ctrl::DoMouseFB(Ctrl::LEFTDOUBLE, p); break; - case SDL_BUTTON_RIGHT: Ctrl::DoMouseFB(Ctrl::RIGHTDOUBLE, p); break; - case SDL_BUTTON_MIDDLE: Ctrl::DoMouseFB(Ctrl::MIDDLEDOUBLE, p); break; - } - isdblclick[bi] = 0; //reset, to go ahead sending repeats - } - else - { - lastbdowntime[bi] = ct; - isdblclick[bi] = 0; //prepare for repeat - switch(bi) - { - case SDL_BUTTON_LEFT: mouseb |= (1<<0); Ctrl::DoMouseFB(Ctrl::LEFTDOWN, p); break; - case SDL_BUTTON_RIGHT: mouseb |= (1<<1); Ctrl::DoMouseFB(Ctrl::RIGHTDOWN, p); break; - case SDL_BUTTON_MIDDLE: mouseb |= (1<<2); Ctrl::DoMouseFB(Ctrl::MIDDLEDOWN, p); break; - } - } - } - break; - case SDL_MOUSEBUTTONUP: - { - int bi = event->button.button; - isdblclick[bi] = 1; //indicate maybe a dblclick - - Point p(event->button.x, event->button.y); - switch(bi) - { - case SDL_BUTTON_LEFT: mouseb &= ~(1<<0); Ctrl::DoMouseFB(Ctrl::LEFTUP, p); break; - case SDL_BUTTON_RIGHT: mouseb &= ~(1<<1); Ctrl::DoMouseFB(Ctrl::RIGHTUP, p); break; - case SDL_BUTTON_MIDDLE: mouseb &= ~(1<<2); Ctrl::DoMouseFB(Ctrl::MIDDLEUP, p); break; - } - } - break; - case SDL_JOYAXISMOTION: //SDL_JoyAxisEvent - break; - case SDL_JOYBALLMOTION: //SDL_JoyBallEvent - break; - case SDL_JOYHATMOTION: //SDL_JoyHatEvent - break; - case SDL_JOYBUTTONDOWN: - case SDL_JOYBUTTONUP: //SDL_JoyButtonEvent - break; -/* case SDL_VIDEORESIZE: //SDL_ResizeEvent - { - width = event->resize.w; - height = event->resize.h; - - SDL_FreeSurface(screen); - screen = CreateScreen(width, height, bpp, videoflags); - ASSERT(screen); - Ctrl::SetFramebufferSize(Size(width, height)); - } - break; - case SDL_VIDEOEXPOSE: //SDL_ExposeEvent - break; -*/ case SDL_QUIT: //SDL_QuitEvent - Ctrl::EndSession(); - break; - case SDL_USEREVENT: //SDL_UserEvent - HandleUserEvent(event); - break; - case SDL_SYSWMEVENT: //SDL_SysWMEvent - break; - - default: - break; - } // End switch -} - -void HandleUserEvent(SDL_Event* event) -{ -/* - switch (event->user.code) { - case RUN_GAME_LOOP: - GameLoop(); - break; - - default: - break; - } -*/ -} - -END_UPP_NAMESPACE - -#endif diff --git a/rainbow/SDL20GL/Top.cpp b/rainbow/SDL20GL/Top.cpp index 9ae04db5d..f2d207e6d 100644 --- a/rainbow/SDL20GL/Top.cpp +++ b/rainbow/SDL20GL/Top.cpp @@ -56,9 +56,8 @@ void TopWindow::SyncRect() { frame->SyncRect(); Rect r = frame->GetClient(); - if(r != GetRect()) { + if(r != GetRect()) SetRect(r); - } } void TopWindow::Open(Ctrl *owner) diff --git a/rainbow/SDL20GL/Util.cpp b/rainbow/SDL20GL/Util.cpp deleted file mode 100644 index 6f67c602d..000000000 --- a/rainbow/SDL20GL/Util.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include - -#ifdef GUI_SDL20GL - -NAMESPACE_UPP - -/* -static void sRenderLine(SystemDraw& w, int x, int y, int dx, int dy, int cx, int cy, int len, byte pattern) -{ - DLOG(len); - for(int i = 0; i < len; i++) - if((128 >> (i & 7)) & pattern) - w.DrawRect(x + dx * i, y + dy * i, cx, cy, Black); - DDUMP("~sRenderLine"); -} - -static void sRenderRect(SystemDraw& w, const Rect& r, int n, byte pattern) -{ - sRenderLine(w, r.left, r.top, 1, 0, 1, n, r.GetWidth(), pattern); - sRenderLine(w, r.left, r.bottom - 1, 1, 0, 1, n, r.GetWidth(), pattern); - sRenderLine(w, r.left, r.top, 0, 1, n, 1, r.GetHeight(), pattern); - sRenderLine(w, r.right - 1, r.top, 0, 1, n, 1, r.GetHeight(), pattern); -} - -void DrawDragRect(SystemDraw& w, const Rect& rect1, const Rect& rect2, - const Rect& clip, int n, Color color, uint64 pattern) -{ - DLOG("@ DrawDragRect " << rect1 << " " << rect2 << ", clip: " << clip << ", pattern: " << pattern); - TIMING("DrawDrawRect"); - w.Clip(clip); - w.Invert(); - sRenderRect(w, rect1, n, (byte)pattern); - sRenderRect(w, rect2, n, (byte)pattern); - Ctrl::AddUpdate((rect1 | rect2).Offseted(w.GetOffset())); -// MemoryProfile mem; -// DDUMP(mem); - w.End(); -} - - - - -static uint64 sGetAniPat(uint64 src, int pos) -{ - uint64 out = 0; - pos &= 7; - for(int i = 8; --i >= 0;) { - byte sr = (byte)(src >> (8 * ((7 - i - pos) & 7))); - out = (out << 8) | (byte)((sr | (sr << 8)) >> pos); - } - return out; -} -*/ - - -/* -Size GetScreenSize() -{ - return ScreenInfo().GetPageSize(); -} -*/ - -END_UPP_NAMESPACE - -#endif diff --git a/rainbow/SDL20GL/Wnd.cpp b/rainbow/SDL20GL/Wnd.cpp index b94c65214..4d3e93521 100644 --- a/rainbow/SDL20GL/Wnd.cpp +++ b/rainbow/SDL20GL/Wnd.cpp @@ -14,6 +14,8 @@ Vector Ctrl::topctrl; bool Ctrl::invalid; +bool Ctrl::sdlMouseIsIn; + Point Ctrl::fbCursorPos = Null; Image Ctrl::fbCursorImage; Rect Ctrl::fbCaretRect; @@ -233,7 +235,8 @@ void Ctrl::PaintCaretCursor(SystemDraw& draw) { if(!IsNull(fbCaretRect)) draw.DrawRect(fbCaretRect, InvertColor); - draw.DrawImage(fbCursorPos.x, fbCursorPos.y, fbCursorImage); + if(sdlMouseIsIn) + draw.DrawImage(fbCursorPos.x, fbCursorPos.y, fbCursorImage); } void Ctrl::DoPaint() diff --git a/rainbow/SDL20Uword/SDL20Uword.upp b/rainbow/SDL20Uword/SDL20Uword.upp index 94ae34324..728556f22 100644 --- a/rainbow/SDL20Uword/SDL20Uword.upp +++ b/rainbow/SDL20Uword/SDL20Uword.upp @@ -1,7 +1,8 @@ uses CtrlLib, RichEdit, - SDL20GL; + SDL20GL, + plugin/DroidFonts; file main.cpp, diff --git a/rainbow/SDL20Uword/init b/rainbow/SDL20Uword/init index 2325fefba..7bb4594a0 100644 --- a/rainbow/SDL20Uword/init +++ b/rainbow/SDL20Uword/init @@ -3,4 +3,5 @@ #include "CtrlLib/init" #include "RichEdit/init" #include "SDL20GL/init" +#include "plugin/DroidFonts/init" #endif diff --git a/rainbow/SDL20Uword/main.cpp b/rainbow/SDL20Uword/main.cpp index b446e698c..5ec310263 100644 --- a/rainbow/SDL20Uword/main.cpp +++ b/rainbow/SDL20Uword/main.cpp @@ -251,7 +251,6 @@ GUI_APP_MAIN LoadFromFile(callback(UWord::SerializeApp)); UWord uword; - new UWord; Ctrl::EventLoop(); StoreToFile(callback(UWord::SerializeApp)); }