void updatemousebutton(int button, int finger, bool on) { string name = "mouse"; name += '0' + (char)button; if (finger) name += '0' + (char)finger; updatebutton(name, on, finger); }
int update_widgets(short val) { gl_slider *sl = firstslider; gl_button *bt = firstbutton; Int16 x, y; int flag = FALSE, sliderchange = FALSE; #ifdef DEBUG printf("update_widgets called with val = %d\n", (int)val); if (qtest()) { int dev; dev = qread(&x); printf("update_widgets: qtest() for x is true. dev = %d, val = %d\n", dev, (int)x); } else { x = getvaluator(MOUSEX); printf("update_widgets: qtest() for x is FALSE!. x = %d\n", (int)x); } if (qtest()) { int dev; dev = qread(&y); printf("update_widgets: qtest() for y is true. dev = %d, val = %d\n", dev, (int)y); } else { y = getvaluator(MOUSEY); printf("update_widgets: qtest() for y is FALSE!. y = %d\n", (int)y); } #else if (qtest()) qread(&x); else x = getvaluator(MOUSEX); if (qtest()) qread(&y); else y = getvaluator(MOUSEY); #endif if (val == 0) return(FALSE); while (sl != NULL && !flag) { switch (updateslider(x, y, sl)) { case -1: sliderchange = TRUE; break; case FALSE: flag = FALSE; break; default: flag = TRUE; break; } sl = sl->nextp; } while (bt != NULL && !flag) { flag = updatebutton(x, y, bt); bt = bt->nextp; } return(flag||sliderchange); }
bool SDLFrame(int2 &screensize) { for (;;) { int millis = SDL_GetTicks(); frametime = millis-lastmillis; if (frametime < 10) { SDL_Delay(1); continue; } lastmillis = millis; frames++; break; } for (auto &it : keymap) it.second.FrameReset(); mousewheeldelta = 0; clearfingers(true); if (minimized) SDL_Delay(10); // save CPU/battery else SDL_GL_SwapWindow(_sdl_window); //SDL_Delay(1000); if (!cursor) clearfingers(false); bool closebutton = false; SDL_Event event; while(SDL_PollEvent(&event)) switch(event.type) { case SDL_QUIT: closebutton = true; break; case SDL_KEYDOWN: case SDL_KEYUP: { const char *kn = SDL_GetKeyName(event.key.keysym.sym); if (!*kn) break; string name = kn; std::transform(name.begin(), name.end(), name.begin(), ::tolower); updatebutton(name, event.key.state==SDL_PRESSED, 0); break; } // This #ifdef is needed, because on e.g. OS X we'd otherwise get SDL_FINGERDOWN in addition to SDL_MOUSEBUTTONDOWN on laptop touch pads. #ifdef PLATFORM_MOBILE // FIXME: if we're in cursor==0 mode, only update delta, not position case SDL_FINGERDOWN: { int i = updatedragpos(event.tfinger, event.type, screensize); updatemousebutton(1, i, true); break; } case SDL_FINGERUP: { int i = findfinger(event.tfinger.fingerId, true); updatemousebutton(1, i, false); break; } case SDL_FINGERMOTION: { updatedragpos(event.tfinger, event.type, screensize); break; } #else case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { updatemousebutton(event.button.button, 0, event.button.state != 0); if (cursor) { fingers[0].mousepos = int2(event.button.x, event.button.y) * screenscalefactor; } break; } case SDL_MOUSEMOTION: fingers[0].mousedelta += int2(event.motion.xrel, event.motion.yrel); if (cursor) { fingers[0].mousepos = int2(event.motion.x, event.motion.y) * screenscalefactor; } else { //if (skipmousemotion) { skipmousemotion--; break; } //if (event.motion.x == screensize.x / 2 && event.motion.y == screensize.y / 2) break; //auto delta = int3(event.motion.xrel, event.motion.yrel); //fingers[0].mousedelta += delta; //auto delta = int3(event.motion.x, event.motion.y) - screensize / 2; //fingers[0].mousepos -= delta; //SDL_WarpMouseInWindow(_sdl_window, screensize.x / 2, screensize.y / 2); } break; case SDL_MOUSEWHEEL: mousewheeldelta += event.wheel.y; break; #endif case SDL_JOYAXISMOTION: { const int deadzone = 800; // FIXME if (event.jaxis.axis < MAXAXES) { joyaxes[event.jaxis.axis] = abs(event.jaxis.value) > deadzone ? event.jaxis.value / (float)0x8000 : 0; }; break; } case SDL_JOYHATMOTION: break; case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: { string name = "joy"; name += '0' + (char)event.jbutton.button; updatebutton(name, event.jbutton.state == SDL_PRESSED, 0); break; } case SDL_WINDOWEVENT: switch (event.window.event) { case SDL_WINDOWEVENT_RESIZED: screensize = int2(event.window.data1, event.window.data2); // reload and bind shaders/textures here break; case SDL_WINDOWEVENT_LEAVE: // never gets hit? /* for (int i = 1; i <= 5; i++) updatemousebutton(i, false); */ break; } break; case SDL_WINDOWEVENT_MINIMIZED: //minimized = true; break; case SDL_WINDOWEVENT_MAXIMIZED: case SDL_WINDOWEVENT_RESTORED: /* #ifdef __IOS__ SDL_Delay(10); // IOS crashes in SDL_GL_SwapWindow if we start rendering straight away #endif minimized = false; */ break; } // simulate mouse up events, since SDL won't send any if the mouse leaves the window while down // doesn't work /* for (int i = 1; i <= 5; i++) if (!(SDL_GetMouseState(nullptr, nullptr) & SDL_BUTTON(i))) updatemousebutton(i, false); */ /* if (SDL_GetMouseFocus() != _sdl_window) { int A = 1; } */ return closebutton; }