diff '--context=5' -r vecx-SDL2/src/main.c vecx-SDL2-mouse/src/main.c *** vecx-SDL2/src/main.c 2020-05-04 16:10:52.351389842 -0500 --- vecx-SDL2-mouse/src/main.c 2021-01-30 22:44:31.189156765 -0600 *************** *** 174,183 **** --- 174,189 ---- case SDLK_ESCAPE: return 1; case SDLK_a: vecx_input(&vectrex, VECTREX_PAD1_BUTTON1, 1); break; case SDLK_s: vecx_input(&vectrex, VECTREX_PAD1_BUTTON2, 1); break; case SDLK_d: vecx_input(&vectrex, VECTREX_PAD1_BUTTON3, 1); break; case SDLK_f: vecx_input(&vectrex, VECTREX_PAD1_BUTTON4, 1); break; + + case SDLK_z: vecx_input(&vectrex, VECTREX_PAD2_BUTTON1, 1); break; + case SDLK_x: vecx_input(&vectrex, VECTREX_PAD2_BUTTON2, 1); break; + case SDLK_c: vecx_input(&vectrex, VECTREX_PAD2_BUTTON3, 1); break; + case SDLK_v: vecx_input(&vectrex, VECTREX_PAD2_BUTTON4, 1); break; + case SDLK_LEFT: vecx_input(&vectrex, VECTREX_PAD1_X, 0x00); break; case SDLK_RIGHT: vecx_input(&vectrex, VECTREX_PAD1_X, 0xff); break; case SDLK_UP: vecx_input(&vectrex, VECTREX_PAD1_Y, 0xff); break; case SDLK_DOWN: vecx_input(&vectrex, VECTREX_PAD1_Y, 0x00); break; } *************** *** 191,213 **** --- 197,245 ---- case SDLK_a: vecx_input(&vectrex, VECTREX_PAD1_BUTTON1, 0); break; case SDLK_s: vecx_input(&vectrex, VECTREX_PAD1_BUTTON2, 0); break; case SDLK_d: vecx_input(&vectrex, VECTREX_PAD1_BUTTON3, 0); break; case SDLK_f: vecx_input(&vectrex, VECTREX_PAD1_BUTTON4, 0); break; + + case SDLK_z: vecx_input(&vectrex, VECTREX_PAD2_BUTTON1, 0); break; + case SDLK_x: vecx_input(&vectrex, VECTREX_PAD2_BUTTON2, 0); break; + case SDLK_c: vecx_input(&vectrex, VECTREX_PAD2_BUTTON3, 0); break; + case SDLK_v: vecx_input(&vectrex, VECTREX_PAD2_BUTTON4, 0); break; + case SDLK_LEFT: vecx_input(&vectrex, VECTREX_PAD1_X, 0x80); break; case SDLK_RIGHT: vecx_input(&vectrex, VECTREX_PAD1_X, 0x80); break; case SDLK_UP: vecx_input(&vectrex, VECTREX_PAD1_Y, 0x80); break; case SDLK_DOWN: vecx_input(&vectrex, VECTREX_PAD1_Y, 0x80); break; } break; + case SDL_MOUSEBUTTONDOWN: + if (SDL_GetMouseState(NULL,NULL)&SDL_BUTTON(1)) { + vecx_input(&vectrex, VECTREX_PAD1_BUTTON4, 1); + } + if (SDL_GetMouseState(NULL,NULL)&SDL_BUTTON(3)) { + vecx_input(&vectrex, VECTREX_PAD1_BUTTON3, 1); + } + break; + case SDL_MOUSEBUTTONUP: + if ((SDL_GetMouseState(NULL,NULL)&SDL_BUTTON(1)) == 0) { + vecx_input(&vectrex, VECTREX_PAD1_BUTTON4, 0); + } + if ((SDL_GetMouseState(NULL,NULL)&SDL_BUTTON(3)) == 0) { + vecx_input(&vectrex, VECTREX_PAD1_BUTTON3, 0); + } + break; } } return 0; } static void emuloop(void) { + //static char coords[32]; + static int width, height, XL, YB; + static int VecAnalogX, VecAnalogY; + static int xMouse, yMouse; Uint32 next_time = SDL_GetTicks() + EMU_TIMER; vecx_reset(&vectrex); for (;;) { vecx_emu(&vectrex, (VECTREX_MHZ / 1000) * EMU_TIMER); *************** *** 219,228 **** --- 251,286 ---- SDL_Delay(next_time - now); else next_time = now; next_time += EMU_TIMER; } + SDL_GetWindowPosition(window, &XL, &YB); + SDL_GetWindowSize(window, &width, &height); + SDL_GetGlobalMouseState(&xMouse,&yMouse); + if (xMouse < XL || + xMouse >= XL+width || + yMouse < YB || + yMouse >= YB+height) { + // Not in our window + SDL_ShowCursor(SDL_ENABLE); + } else { + // hide cursor when in our window. + // return XY in terms of -128:127 + SDL_ShowCursor(SDL_DISABLE); + xMouse -= XL; yMouse -= YB; // now in range 0:width-1, 0:height-1 + VecAnalogX = (xMouse*255)/(width); // range 0:255 + if (VecAnalogX < 0) VecAnalogX = 0; + if (VecAnalogX > 255) VecAnalogX = 255; + VecAnalogY = (yMouse*255)/(height); // range 0:255 + if (VecAnalogY < 0) VecAnalogY = 0; + if (VecAnalogY > 255) VecAnalogY = 255; + VecAnalogY = 255-VecAnalogY; // invert y + //sprintf(coords, "%d %d", VecAnalogX, VecAnalogY); + vecx_input(&vectrex, VECTREX_PAD1_X, (uint8_t)VecAnalogX); + vecx_input(&vectrex, VECTREX_PAD1_Y, (uint8_t)VecAnalogY); + } + //SDL_SetWindowTitle(window, coords); } } static void load_overlay() {