Skip to content

Commit 6ec4ffb

Browse files
authored
apple, mouse overlay: fix relative mouse deltas (#17602)
makes sure that relative mouse movement deltas are based on last poll, not last state check; checking state should not reset state
1 parent 6c08bf0 commit 6ec4ffb

File tree

2 files changed

+53
-62
lines changed

2 files changed

+53
-62
lines changed

input/drivers/cocoa_input.m

Lines changed: 51 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,32 @@ static void cocoa_input_poll(void *data)
401401
if (!apple)
402402
return;
403403

404+
#ifdef IOS
405+
#ifdef HAVE_IOS_TOUCHMOUSE
406+
if (apple->window_pos_x > 0 || apple->mouse_grabbed)
407+
{
408+
apple->mouse_rel_x = apple->window_pos_x - apple->mouse_x_last;
409+
apple->mouse_x_last = apple->window_pos_x;
410+
}
411+
#endif
412+
#else
413+
apple->mouse_rel_x = apple->window_pos_x - apple->mouse_x_last;
414+
apple->mouse_x_last = apple->window_pos_x;
415+
#endif
416+
417+
#ifdef IOS
418+
#ifdef HAVE_IOS_TOUCHMOUSE
419+
if (apple->window_pos_y > 0 || apple->mouse_grabbed)
420+
{
421+
apple->mouse_rel_y = apple->window_pos_y - apple->mouse_y_last;
422+
apple->mouse_y_last = apple->window_pos_y;
423+
}
424+
#endif
425+
#else
426+
apple->mouse_rel_y = apple->window_pos_y - apple->mouse_y_last;
427+
apple->mouse_y_last = apple->window_pos_y;
428+
#endif
429+
404430
for (i = 0; i < apple->touch_count || i == 0; i++)
405431
{
406432
struct video_viewport vp;
@@ -573,75 +599,40 @@ static int16_t cocoa_input_state(
573599
return (id && id < RETROK_LAST) && apple_key_state[rarch_keysym_lut[(enum retro_key)id]];
574600
case RETRO_DEVICE_MOUSE:
575601
case RARCH_DEVICE_MOUSE_SCREEN:
602+
switch (id)
576603
{
577-
int16_t val = 0;
578-
switch (id)
604+
case RETRO_DEVICE_ID_MOUSE_X:
605+
if (device == RARCH_DEVICE_MOUSE_SCREEN)
579606
{
580-
case RETRO_DEVICE_ID_MOUSE_X:
581-
if (device == RARCH_DEVICE_MOUSE_SCREEN)
582-
{
583607
#ifdef IOS
584-
return apple->window_pos_x;
608+
return apple->window_pos_x;
585609
#else
586-
return apple->window_pos_x * cocoa_screen_get_backing_scale_factor();
610+
return apple->window_pos_x * cocoa_screen_get_backing_scale_factor();
587611
#endif
588-
}
589-
#ifdef IOS
590-
#ifdef HAVE_IOS_TOUCHMOUSE
591-
if (apple->window_pos_x > 0 || apple->mouse_grabbed)
592-
{
593-
val = apple->window_pos_x - apple->mouse_x_last;
594-
apple->mouse_x_last = apple->window_pos_x;
595-
}
596-
else
597-
val = apple->mouse_rel_x;
598-
#else
599-
val = apple->mouse_rel_x;
600-
#endif
601-
#else
602-
val = apple->window_pos_x - apple->mouse_x_last;
603-
apple->mouse_x_last = apple->window_pos_x;
604-
#endif
605-
return val;
606-
case RETRO_DEVICE_ID_MOUSE_Y:
607-
if (device == RARCH_DEVICE_MOUSE_SCREEN)
608-
{
609-
#ifdef IOS
610-
return apple->window_pos_y;
611-
#else
612-
return apple->window_pos_y * cocoa_screen_get_backing_scale_factor();
613-
#endif
614-
}
612+
}
613+
return apple->mouse_rel_x;
614+
case RETRO_DEVICE_ID_MOUSE_Y:
615+
if (device == RARCH_DEVICE_MOUSE_SCREEN)
616+
{
615617
#ifdef IOS
616-
#ifdef HAVE_IOS_TOUCHMOUSE
617-
if (apple->window_pos_y > 0 || apple->mouse_grabbed)
618-
{
619-
val = apple->window_pos_y - apple->mouse_y_last;
620-
apple->mouse_y_last = apple->window_pos_y;
621-
}
622-
else
623-
val = apple->mouse_rel_y;
624-
#else
625-
val = apple->mouse_rel_y;
626-
#endif
618+
return apple->window_pos_y;
627619
#else
628-
val = apple->window_pos_y - apple->mouse_y_last;
629-
apple->mouse_y_last = apple->window_pos_y;
620+
return apple->window_pos_y * cocoa_screen_get_backing_scale_factor();
630621
#endif
631-
return val;
632-
case RETRO_DEVICE_ID_MOUSE_LEFT:
633-
return apple->mouse_buttons & 1;
634-
case RETRO_DEVICE_ID_MOUSE_RIGHT:
635-
return apple->mouse_buttons & 2;
636-
case RETRO_DEVICE_ID_MOUSE_WHEELUP:
637-
return apple->mouse_wu;
638-
case RETRO_DEVICE_ID_MOUSE_WHEELDOWN:
639-
return apple->mouse_wd;
640-
case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP:
641-
return apple->mouse_wl;
642-
case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN:
643-
return apple->mouse_wr;
644622
}
623+
return apple->mouse_rel_y;
624+
case RETRO_DEVICE_ID_MOUSE_LEFT:
625+
return apple->mouse_buttons & 1;
626+
case RETRO_DEVICE_ID_MOUSE_RIGHT:
627+
return apple->mouse_buttons & 2;
628+
case RETRO_DEVICE_ID_MOUSE_WHEELUP:
629+
return apple->mouse_wu;
630+
case RETRO_DEVICE_ID_MOUSE_WHEELDOWN:
631+
return apple->mouse_wd;
632+
case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP:
633+
return apple->mouse_wl;
634+
case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN:
635+
return apple->mouse_wr;
645636
}
646637
break;
647638
case RETRO_DEVICE_POINTER:

input/input_driver.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,12 +1199,10 @@ static int16_t input_overlay_device_mouse_state(
11991199
ptr_st->device_mask |= (1 << RETRO_DEVICE_MOUSE);
12001200
res = (ptr_st->mouse.scale_x)
12011201
* (ptr_st->screen_x - ptr_st->mouse.prev_screen_x);
1202-
ptr_st->mouse.prev_screen_x = ptr_st->screen_x;
12031202
return res;
12041203
case RETRO_DEVICE_ID_MOUSE_Y:
12051204
res = (ptr_st->mouse.scale_y)
12061205
* (ptr_st->screen_y - ptr_st->mouse.prev_screen_y);
1207-
ptr_st->mouse.prev_screen_y = ptr_st->screen_y;
12081206
return res;
12091207
case RETRO_DEVICE_ID_MOUSE_LEFT:
12101208
return (ptr_st->mouse.click & 0x1)
@@ -3468,11 +3466,13 @@ static void input_overlay_update_pointer_coords(
34683466
if ( !ptr_st->count
34693467
&& (ptr_st->device_mask & (1 << RETRO_DEVICE_MOUSE)))
34703468
{
3469+
ptr_st->mouse.prev_screen_x = ptr_st->screen_x;
34713470
ptr_st->screen_x = current_input->input_state(
34723471
input_data, NULL, NULL, NULL, NULL, true, 0,
34733472
RARCH_DEVICE_POINTER_SCREEN,
34743473
touch_idx,
34753474
RETRO_DEVICE_ID_POINTER_X);
3475+
ptr_st->mouse.prev_screen_y = ptr_st->screen_y;
34763476
ptr_st->screen_y = current_input->input_state(
34773477
input_data, NULL, NULL, NULL, NULL, true, 0,
34783478
RARCH_DEVICE_POINTER_SCREEN,

0 commit comments

Comments
 (0)