Exemple #1
0
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);
}
Exemple #2
0
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);
}
Exemple #3
0
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;
}