From 41aa6ec37860d67dd2c851bc4232d080e032fcb6 Mon Sep 17 00:00:00 2001 From: kohait Date: Thu, 21 Jul 2011 10:14:31 +0000 Subject: [PATCH] rainbow: SDLFb: support for doubleclick, repeat not yet supported, Events from reference added git-svn-id: svn://ultimatepp.org/upp/trunk@3684 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- rainbow/Events/Events.cpp | 228 ++++++++++++++++++++++++++++++++++++++ rainbow/Events/Events.upp | 29 +++++ rainbow/SDLFb/Keys.h | 79 ++++++------- rainbow/SDLFb/Proc.cpp | 63 ++++++++--- rainbow/SDLFb/Win.cpp | 3 +- 5 files changed, 344 insertions(+), 58 deletions(-) create mode 100644 rainbow/Events/Events.cpp create mode 100644 rainbow/Events/Events.upp diff --git a/rainbow/Events/Events.cpp b/rainbow/Events/Events.cpp new file mode 100644 index 000000000..174a9d10d --- /dev/null +++ b/rainbow/Events/Events.cpp @@ -0,0 +1,228 @@ +#include + +using namespace Upp; + +struct App : TopWindow { + ArrayCtrl log; + + void Log(const String& s) + { + log.Add(s); + log.GoEnd(); + } + + virtual void Activate() + { + Log("Activate"); + } + + virtual void Deactivate() + { + Log("Deactivate"); + } + + virtual Image FrameMouseEvent(int event, Point p, int zdelta, dword keyflags) + { + if(event != CURSORIMAGE) + Log(Format("FrameMouseEvent(%d, Point(%d, %d), %d, %x)", + event, p.x, p.y, zdelta, (int)keyflags)); + return TopWindow::FrameMouseEvent(event, p, zdelta, keyflags); + } + + virtual Image MouseEvent(int event, Point p, int zdelta, dword keyflags) + { + if(event != CURSORIMAGE) + Log(Format("MouseEvent(%d, Point(%d, %d), %d, %x)", + event, p.x, p.y, zdelta, (int)keyflags)); + return TopWindow::MouseEvent(event, p, zdelta, keyflags); + } + + virtual void MouseEnter(Point p, dword keyflags) + { + Log(Format("MouseEnter(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void MouseMove(Point p, dword keyflags) + { + Log(Format("MouseMove(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void LeftDown(Point p, dword keyflags) + { + Log(Format("LeftDown(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + SetFocus(); + } + + virtual void LeftDouble(Point p, dword keyflags) + { + Log(Format("LeftDouble(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void LeftTriple(Point p, dword keyflags) + { + Log(Format("LeftTriple(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void LeftDrag(Point p, dword keyflags) { + Log(Format("LeftDrag(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void LeftHold(Point p, dword keyflags) { + Log(Format("LeftHold(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void LeftRepeat(Point p, dword keyflags) + { + Log(Format("LeftRepeat(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void LeftUp(Point p, dword keyflags) + { + Log(Format("LeftUp(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void RightDown(Point p, dword keyflags) + { + Log(Format("RightDown(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void RightDouble(Point p, dword keyflags) + { + Log(Format("RightDouble(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void RightTriple(Point p, dword keyflags) + { + Log(Format("RightTriple(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void RightDrag(Point p, dword keyflags) { + Log(Format("RightDrag(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void RightHold(Point p, dword keyflags) { + Log(Format("RightHold(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void RightRepeat(Point p, dword keyflags) + { + Log(Format("RightRepeat(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void RightUp(Point p, dword keyflags) + { + Log(Format("RightUp(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void MiddleDown(Point p, dword keyflags) + { + Log(Format("MiddleDown(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void MiddleDouble(Point p, dword keyflags) + { + Log(Format("MiddleDouble(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void MiddleTriple(Point p, dword keyflags) + { + Log(Format("MiddleTriple(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void MiddleDrag(Point p, dword keyflags) { + Log(Format("MiddleDrag(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void MiddleHold(Point p, dword keyflags) { + Log(Format("MiddleHold(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void MiddleRepeat(Point p, dword keyflags) + { + Log(Format("MiddleRepeat(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void MiddleUp(Point p, dword keyflags) + { + Log(Format("MiddleUp(Point(%d, %d), %x)", p.x, p.y, (int)keyflags)); + } + + virtual void MouseWheel(Point p, int zdelta, dword keyflags) + { + Log(Format("MouseWheel(Point(%d, %d), %d, %x)", p.x, p.y, zdelta, (int)keyflags)); + } + + virtual void MouseLeave() + { + Log("MouseLeave"); + } + + virtual Image CursorImage(Point p, dword keyflags) + { + return keyflags & K_CTRL ? CtrlImg::swap_color_cursor() : Image::Arrow(); + } + + virtual bool Key(dword key, int count) + { + Log(Format("Key(%x, %d) ", (int)key, count) + GetKeyDesc(key)); + return false; + } + + virtual bool WKey(dword key, int count) + { + Log(Format("WKey(%x, %d) ", (int)key, count) + GetKeyDesc(key)); + return false; + } + + virtual void GotFocus() + { + Log("GotFocus"); + } + + virtual void LostFocus() + { + Log("LostFocus"); + } + + virtual bool HotKey(dword key) + { + Log(Format("HotKey(%x) ", (int)key) + GetKeyDesc(key)); + return false; + } + + virtual void ChildGotFocus() + { + Log("ChildGotFocus"); + } + + virtual void ChildLostFocus() + { + Log("ChildLostFocus"); + } + + virtual void Layout() + { + Log("Layout"); + } + + App() + { + SetFrame(InsetFrame()); + AddFrame(InsetFrame()); + AddFrame(InsetFrame()); + AddFrame(InsetFrame()); + log.AddColumn(""); + log.NoHeader(); + Add(log.HSizePos().BottomPos(0, 200)); + } + + ~App() + { + Shutdown(); + } +}; + +GUI_APP_MAIN +{ + App().Run(); +} diff --git a/rainbow/Events/Events.upp b/rainbow/Events/Events.upp new file mode 100644 index 000000000..61936e6f4 --- /dev/null +++ b/rainbow/Events/Events.upp @@ -0,0 +1,29 @@ +description "Demonstration of basic input events"; + +uses + CtrlLib; + +uses(SKELETON) Skeleton; + +uses(WINALT) WinAlt; + +uses(WINFB) WinFb; + +uses(LINUXFB) LinuxFb; + +uses(SDLFB) SDLFb; + +uses(WINGL) WinGl; + +file + Events.cpp; + +mainconfig + "" = "GUI SKELETON", + "" = "GUI WINALT", + "" = "GUI WINFB", + "" = "GUI LINUXFB", + "" = "GUI SDLFB", + "" = "GUI WINGL", + "" = "GUI"; + diff --git a/rainbow/SDLFb/Keys.h b/rainbow/SDLFb/Keys.h index 3c0c6e8b1..1a8c09847 100644 --- a/rainbow/SDLFb/Keys.h +++ b/rainbow/SDLFb/Keys.h @@ -3,11 +3,12 @@ K_BACK = SDLK_BACKSPACE + K_DELTA, K_BACKSPACE = SDLK_BACKSPACE + K_DELTA, -K_TAB = SDLK_TAB, +//handled extra in fbKEYtoK +K_TAB = 9, //SDLK_TAB, -K_SPACE = SDLK_SPACE, +K_SPACE = 32, //SDLK_SPACE, -K_RETURN = SDLK_RETURN, +K_RETURN = 13, //SDLK_RETURN, K_ENTER = K_RETURN, K_SHIFT_KEY = SDLK_LSHIFT + K_DELTA, @@ -59,42 +60,42 @@ K_F10 = SDLK_F10 + K_DELTA, K_F11 = SDLK_F11 + K_DELTA, K_F12 = SDLK_F12 + K_DELTA, -K_A = 'A' + K_DELTA, -K_B = 'B' + K_DELTA, -K_C = 'C' + K_DELTA, -K_D = 'D' + K_DELTA, -K_E = 'E' + K_DELTA, -K_F = 'F' + K_DELTA, -K_G = 'G' + K_DELTA, -K_H = 'H' + K_DELTA, -K_I = 'I' + K_DELTA, -K_J = 'J' + K_DELTA, -K_K = 'K' + K_DELTA, -K_L = 'L' + K_DELTA, -K_M = 'M' + K_DELTA, -K_N = 'N' + K_DELTA, -K_O = 'O' + K_DELTA, -K_P = 'P' + K_DELTA, -K_Q = 'Q' + K_DELTA, -K_R = 'R' + K_DELTA, -K_S = 'S' + K_DELTA, -K_T = 'T' + K_DELTA, -K_U = 'U' + K_DELTA, -K_V = 'V' + K_DELTA, -K_W = 'W' + K_DELTA, -K_X = 'X' + K_DELTA, -K_Y = 'Y' + K_DELTA, -K_Z = 'Z' + K_DELTA, -K_0 = '0' + K_DELTA, -K_1 = '1' + K_DELTA, -K_2 = '2' + K_DELTA, -K_3 = '3' + K_DELTA, -K_4 = '4' + K_DELTA, -K_5 = '5' + K_DELTA, -K_6 = '6' + K_DELTA, -K_7 = '7' + K_DELTA, -K_8 = '8' + K_DELTA, -K_9 = '9' + K_DELTA, +K_A = SDLK_a + K_DELTA, +K_B = SDLK_b + K_DELTA, +K_C = SDLK_c + K_DELTA, +K_D = SDLK_d + K_DELTA, +K_E = SDLK_e + K_DELTA, +K_F = SDLK_f + K_DELTA, +K_G = SDLK_g + K_DELTA, +K_H = SDLK_h + K_DELTA, +K_I = SDLK_i + K_DELTA, +K_J = SDLK_j + K_DELTA, +K_K = SDLK_k + K_DELTA, +K_L = SDLK_l + K_DELTA, +K_M = SDLK_m + K_DELTA, +K_N = SDLK_n + K_DELTA, +K_O = SDLK_o + K_DELTA, +K_P = SDLK_p + K_DELTA, +K_Q = SDLK_q + K_DELTA, +K_R = SDLK_r + K_DELTA, +K_S = SDLK_s + K_DELTA, +K_T = SDLK_t + K_DELTA, +K_U = SDLK_u + K_DELTA, +K_V = SDLK_v + K_DELTA, +K_W = SDLK_w + K_DELTA, +K_X = SDLK_x + K_DELTA, +K_Y = SDLK_y + K_DELTA, +K_Z = SDLK_z + K_DELTA, +K_0 = SDLK_0 + K_DELTA, +K_1 = SDLK_1 + K_DELTA, +K_2 = SDLK_2 + K_DELTA, +K_3 = SDLK_3 + K_DELTA, +K_4 = SDLK_4 + K_DELTA, +K_5 = SDLK_5 + K_DELTA, +K_6 = SDLK_6 + K_DELTA, +K_7 = SDLK_7 + K_DELTA, +K_8 = SDLK_8 + K_DELTA, +K_9 = SDLK_9 + K_DELTA, K_CTRL_LBRACKET = K_CTRL|219|K_DELTA, K_CTRL_RBRACKET = K_CTRL|221|K_DELTA, diff --git a/rainbow/SDLFb/Proc.cpp b/rainbow/SDLFb/Proc.cpp index 87b3dad4c..0ea7640be 100644 --- a/rainbow/SDLFb/Proc.cpp +++ b/rainbow/SDLFb/Proc.cpp @@ -44,6 +44,8 @@ dword fbKEYtoK(dword chr) { return chr; } +dword lastbdowntime[8] = {0}; +dword isdblclick[8] = {0}; void HandleSDLEvent(SDL_Event* event) { switch(event->type) { @@ -52,15 +54,6 @@ void HandleSDLEvent(SDL_Event* event) case SDL_KEYDOWN: case SDL_KEYUP: //SDL_KeyboardEvent { - String msgdump; - switch(event->type) - { - case SDL_KEYDOWN: msgdump << "SDL_KEYDOWN"; break; - case SDL_KEYUP: msgdump << "SDL_KEYUP"; break; - } - msgdump << (int)event->key.keysym.sym; - LLOG(msgdump); - bool b = false; dword keycode = 0; if(event->type == SDL_KEYDOWN) { @@ -70,8 +63,7 @@ void HandleSDLEvent(SDL_Event* event) //send respective keyup things as char events as well keycode = (dword)event->key.keysym.unicode; - if((keycode != 127 && keycode > 32 && keycode < 255) - || (keycode == 32 && fbKEYtoK(SDLK_SPACE) == K_SPACE)) + if((keycode != 127 && keycode >= 32 && keycode < 255)) b = Ctrl::DoKeyFB(keycode, 1); } else @@ -88,20 +80,55 @@ void HandleSDLEvent(SDL_Event* event) case SDL_MOUSEBUTTONDOWN: //SDL_MouseButtonEvent, FIXME DoubleClick { Point p(event->button.x, event->button.y); - switch(event->button.button) + int bi = event->button.button; + dword ct = SDL_GetTicks(); + if(isdblclick[bi] && (abs(int(ct) - int(lastbdowntime[bi])) < 400)) { - case SDL_BUTTON_LEFT: Ctrl::DoMouseFB(Ctrl::LEFTDOWN, p); break; - case SDL_BUTTON_RIGHT: Ctrl::DoMouseFB(Ctrl::RIGHTDOWN, p); break; - case SDL_BUTTON_MIDDLE: Ctrl::DoMouseFB(Ctrl::MIDDLEDOWN, p); break; - case SDL_BUTTON_WHEELUP: Ctrl::DoMouseFB(Ctrl::MOUSEWHEEL, p, +120); break; - case SDL_BUTTON_WHEELDOWN: Ctrl::DoMouseFB(Ctrl::MOUSEWHEEL, p, -120); break; + 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; + //case SDL_BUTTON_WHEELUP: Ctrl::DoMouseFB(Ctrl::MOUSEWHEELDOUBLE, p, +120); break; + //case SDL_BUTTON_WHEELDOWN: Ctrl::DoMouseFB(Ctrl::MOUSEWHEELDOUBLE, p, -120); break; + } + isdblclick[bi] = 0; //reset, to go ahead sending repeats + //but sdl doesnt send repeated mouse down + //FIXME fake repeated mousedown + } + else if(!isdblclick[bi]) //events might not be right + { + switch(bi) + { + case SDL_BUTTON_LEFT: Ctrl::DoMouseFB(Ctrl::LEFTREPEAT, p); break; + case SDL_BUTTON_RIGHT: Ctrl::DoMouseFB(Ctrl::RIGHTREPEAT, p); break; + case SDL_BUTTON_MIDDLE: Ctrl::DoMouseFB(Ctrl::MIDDLEREPEAT, p); break; + //case SDL_BUTTON_WHEELUP: Ctrl::DoMouseFB(Ctrl::MOUSEWHEELDOUBLE, p, +120); break; + //case SDL_BUTTON_WHEELDOWN: Ctrl::DoMouseFB(Ctrl::MOUSEWHEELDOUBLE, p, -120); break; + } + } + else + { + lastbdowntime[bi] = ct; + isdblclick[bi] = 0; //prepare for repeat + switch(bi) + { + case SDL_BUTTON_LEFT: Ctrl::DoMouseFB(Ctrl::LEFTDOWN, p); break; + case SDL_BUTTON_RIGHT: Ctrl::DoMouseFB(Ctrl::RIGHTDOWN, p); break; + case SDL_BUTTON_MIDDLE: Ctrl::DoMouseFB(Ctrl::MIDDLEDOWN, p); break; + case SDL_BUTTON_WHEELUP: Ctrl::DoMouseFB(Ctrl::MOUSEWHEEL, p, +120); break; + case SDL_BUTTON_WHEELDOWN: Ctrl::DoMouseFB(Ctrl::MOUSEWHEEL, p, -120); 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(event->button.button) + switch(bi) { case SDL_BUTTON_LEFT: Ctrl::DoMouseFB(Ctrl::LEFTUP, p); break; case SDL_BUTTON_RIGHT: Ctrl::DoMouseFB(Ctrl::RIGHTUP, p); break; diff --git a/rainbow/SDLFb/Win.cpp b/rainbow/SDLFb/Win.cpp index 32bc3e432..3a45bdb94 100644 --- a/rainbow/SDLFb/Win.cpp +++ b/rainbow/SDLFb/Win.cpp @@ -33,7 +33,7 @@ bool FBProcessEvent(bool *quit) *quit = true; HandleSDLEvent(&event); return true; - } // End while + } return false; } @@ -90,6 +90,7 @@ void FBInit() SDL_EnableUNICODE(1); //for unicode keycode availability SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL/2); + SDL_ShowCursor(0); const SDL_VideoInfo* vi = SDL_GetVideoInfo(); //ASSERT(vi->hw_available);