git-svn-id: svn://ultimatepp.org/upp/trunk@6393 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2013-10-05 09:38:58 +00:00
parent d3209f8de9
commit da5cfaf409
13 changed files with 240 additions and 308 deletions

View file

@ -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);

View file

@ -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<Ctrl> 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)

View file

@ -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

View file

@ -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);

View file

@ -105,6 +105,8 @@ public:
~PrinterJob() {}
};
void USDLSetup(dword flags);
END_UPP_NAMESPACE
#define GUIPLATFORM_INCLUDE_AFTER <SDL20/After.h>

View file

@ -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;

View file

@ -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

View file

@ -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)

View file

@ -1,65 +0,0 @@
#include <CtrlCore/CtrlCore.h>
#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

View file

@ -14,6 +14,8 @@ Vector<Ctrl *> 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()

View file

@ -1,7 +1,8 @@
uses
CtrlLib,
RichEdit,
SDL20GL;
SDL20GL,
plugin/DroidFonts;
file
main.cpp,

View file

@ -3,4 +3,5 @@
#include "CtrlLib/init"
#include "RichEdit/init"
#include "SDL20GL/init"
#include "plugin/DroidFonts/init"
#endif

View file

@ -251,7 +251,6 @@ GUI_APP_MAIN
LoadFromFile(callback(UWord::SerializeApp));
UWord uword;
new UWord;
Ctrl::EventLoop();
StoreToFile(callback(UWord::SerializeApp));
}