Bueno, fallo, fallo no se puede considerar que sea. Mi conclusión es que debes hacerlo de otra forma, ya que el problema radica cuando el puntero del ratón queda fuera de la ventana y se pierde el foco. Entonces en ese momento para forzar la recuperación del foco usas
SDL_CaptureMouse() y ésto permite que los eventos del ratón se puedan seguir capturando fuera de la ventana. Esa parte es la responsable del comportamiento errático del arrastre. Yo conseguí reducirlo un poco, pero ocasionalmente me daba ese salto por ejemplo al pasar el cursor cuando salía del marco por encima del borde de la ventana de la terminal.
#include <SDL2/SDL.h>
#include <stdio.h>
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 200
static bool salida = false;
int main(int argc, char* args[]) {
SDL_Window* window = NULL;
SDL_Surface* screenSurface = NULL;
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
fprintf(stderr, "could not initialize sdl2: %s\n", SDL_GetError());
return 1;
}
window = SDL_CreateWindow(
"hello_sdl2",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
SCREEN_WIDTH, SCREEN_HEIGHT,
SDL_WINDOW_SHOWN);
if (window == NULL) {
fprintf(stderr, "could not create window: %s\n", SDL_GetError());
return 1;
}
screenSurface = SDL_GetWindowSurface(window);
SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 0xFF, 0xFF, 0xFF));
SDL_UpdateWindowSurface(window);
int xPos,yPos,xMPosN,yMPosN;
static bool bMouseClicked=false, bMouseMoving=false;
static int xMPos=0,yMPos=0;
char buffer [50];
while(!salida){
SDL_Event event;
while( SDL_PollEvent(&event) ) {
switch(event.type ){
case SDL_MOUSEBUTTONDOWN:
if(event.button.button == SDL_BUTTON_LEFT){
if (!bMouseClicked) {
bMouseClicked=true;
SDL_GetMouseState(&xMPos,&yMPos);
SDL_GetWindowPosition(window,&xPos,&yPos);
}
}
break;
case SDL_MOUSEBUTTONUP:
if (bMouseClicked) { // Impedimos que entre varias veces
if(event.button.button == SDL_BUTTON_LEFT){
bMouseClicked=false;
SDL_CaptureMouse(SDL_FALSE);
}
}
break;
case SDL_MOUSEMOTION:
if(bMouseClicked) bMouseMoving = true;
break;
case SDL_QUIT:
salida = true;
} // fin switch
} // fin loop de eventos
// renderizamos o dibujamos
if(bMouseClicked && bMouseMoving){
SDL_CaptureMouse(SDL_TRUE); // Se desabilita al perder el foco
SDL_GetMouseState(&xMPosN,&yMPosN);
xPos-=(xMPos-xMPosN);
yPos-=(yMPos-yMPosN);
SDL_SetWindowPosition(window,xPos,yPos);
}
sprintf (buffer, "xM=%d yM=%d / xW=%d yW=%d / xCM=%d yCM=%d", xMPosN, yMPosN, xPos, yPos, xMPos, yMPos);
SDL_SetWindowTitle(window,buffer);
bMouseMoving = false;
SDL_Delay(10);
}
//SDL_CaptureMouse(SDL_FALSE);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}