Fix mouse emulation with X11 and Win32

see http://pulkomandy.tk/projects/GrafX2/ticket/147
This commit is contained in:
Thomas Bernard 2019-09-26 21:40:06 +02:00
parent 21f111eef7
commit 1b0060caff

View File

@ -1407,6 +1407,95 @@ static word X11_to_GFX2_Modifiers(unsigned int state)
int user_feedback_required = 0; // Flag qui indique si on doit arrêter de traiter les évènements ou si on peut enchainer
#endif
/**
* Emulate mouse move with Joystick or specific keys
*/
static void Mouse_Emulation()
{
// Directional and analog controller
if (!(Digital_joystick_state || Directional_emulated)
#if defined(USE_JOYSTICK)
&& !(Joystick_vertical != 0 || Joystick_horizontal != 0)
#endif
)
{
Directional_first_move = 0;
}
else
{
long time_now;
int step = 0;
#if defined(USE_JOYSTICK)
int joy_step = 0;
#endif
time_now = GFX2_GetTicks();
if (Directional_first_move == 0)
{
Directional_first_move = time_now;
step = 1;
}
else
{
// Compute how much the cursor has moved since last call.
// This tries to make smooth cursor movement
// no matter the frequency of calls to Get_input()
step =
Directional_acceleration(time_now - Directional_first_move) -
Directional_acceleration(Directional_last_move - Directional_first_move);
// Clip speed at 3 pixel per visible frame.
if (step > PAD_MAX_SPEED)
step = PAD_MAX_SPEED;
#if defined(USE_JOYSTICK)
joy_step =
Directional_acceleration(time_now) -
Directional_acceleration(Directional_last_move);
if (joy_step > STICK_MAX_SPEED)
joy_step = STICK_MAX_SPEED;
#endif
}
Directional_last_move = time_now;
#if defined(USE_JOYSTICK)
// Analog joystick
if (Joystick_vertical != 0 || Joystick_horizontal != 0)
{
Cursor_displace(joy_step, Joystick_horizontal, Joystick_vertical);
}
#endif
if (step)
{
long delta_x = 0;
long delta_y = 0;
// Directional controller UP
if ((Digital_joystick_state & (D_JOYSTICK_UP | D_JOYSTICK_UP_RIGHT | D_JOYSTICK_UP_LEFT))
|| (Directional_emulated & D_JOYSTICK_UP))
delta_y -= 1 << 16;
// Directional controller DOWN
if ((Digital_joystick_state & (D_JOYSTICK_DOWN | D_JOYSTICK_DOWN_RIGHT | D_JOYSTICK_DOWN_LEFT))
|| (Directional_emulated & D_JOYSTICK_DOWN))
delta_y += 1 << 16;
// Directional controller RIGHT
if ((Digital_joystick_state & (D_JOYSTICK_RIGHT | D_JOYSTICK_UP_RIGHT | D_JOYSTICK_DOWN_RIGHT))
|| (Directional_emulated & D_JOYSTICK_RIGHT))
delta_x += 1 << 16;
// Directional controller LEFT
if ((Digital_joystick_state & (D_JOYSTICK_LEFT | D_JOYSTICK_UP_LEFT | D_JOYSTICK_DOWN_LEFT))
|| (Directional_emulated & D_JOYSTICK_LEFT))
delta_x -= 1 << 16;
if (delta_x != 0 || delta_y != 0)
{
Cursor_displace(step, delta_x, delta_y);
}
}
}
}
// Main input handling function
int Get_input(int sleep_time)
@ -1785,88 +1874,9 @@ int Get_input(int sleep_time)
break;
}
}
// Directional and analog controller
if (!(Digital_joystick_state||Directional_emulated)
#if defined(USE_JOYSTICK)
&& !(Joystick_vertical != 0 || Joystick_horizontal != 0)
#endif
)
{
Directional_first_move=0;
}
else
{
long time_now;
int step=0;
#if defined(USE_JOYSTICK)
int joy_step = 0;
#endif
time_now=GFX2_GetTicks();
if (Directional_first_move==0)
{
Directional_first_move=time_now;
step=1;
}
else
{
// Compute how much the cursor has moved since last call.
// This tries to make smooth cursor movement
// no matter the frequency of calls to Get_input()
step =
Directional_acceleration(time_now - Directional_first_move) -
Directional_acceleration(Directional_last_move - Directional_first_move);
Mouse_Emulation();
// Clip speed at 3 pixel per visible frame.
if (step > PAD_MAX_SPEED)
step = PAD_MAX_SPEED;
#if defined(USE_JOYSTICK)
joy_step =
Directional_acceleration(time_now) -
Directional_acceleration(Directional_last_move);
if (joy_step > STICK_MAX_SPEED)
joy_step = STICK_MAX_SPEED;
#endif
}
Directional_last_move = time_now;
#if defined(USE_JOYSTICK)
// Analog joystick
if (Joystick_vertical != 0 || Joystick_horizontal != 0)
{
Cursor_displace(joy_step, Joystick_horizontal, Joystick_vertical);
}
#endif
if (step)
{
long delta_x = 0;
long delta_y = 0;
// Directional controller UP
if ((Digital_joystick_state & (D_JOYSTICK_UP | D_JOYSTICK_UP_RIGHT | D_JOYSTICK_UP_LEFT))
|| (Directional_emulated & D_JOYSTICK_UP))
delta_y -= 1 << 16;
// Directional controller DOWN
if ((Digital_joystick_state & (D_JOYSTICK_DOWN | D_JOYSTICK_DOWN_RIGHT | D_JOYSTICK_DOWN_LEFT))
|| (Directional_emulated & D_JOYSTICK_DOWN))
delta_y += 1 << 16;
// Directional controller RIGHT
if ((Digital_joystick_state & (D_JOYSTICK_RIGHT | D_JOYSTICK_UP_RIGHT | D_JOYSTICK_DOWN_RIGHT))
|| (Directional_emulated & D_JOYSTICK_RIGHT))
delta_x += 1 << 16;
// Directional controller LEFT
if ((Digital_joystick_state & (D_JOYSTICK_LEFT | D_JOYSTICK_UP_LEFT | D_JOYSTICK_DOWN_LEFT))
|| (Directional_emulated & D_JOYSTICK_LEFT))
delta_x -= 1 << 16;
if (delta_x != 0 || delta_y != 0)
{
Cursor_displace(step, delta_x, delta_y);
}
}
}
// If the cursor was moved since last update,
// it was erased, so we need to redraw it (with the preview brush)
if (Mouse_moved)
@ -1917,6 +1927,8 @@ int Get_input(int sleep_time)
DispatchMessage(&msg);
}
Mouse_Emulation();
// If the cursor was moved since last update,
// it was erased, so we need to redraw it (with the preview brush)
if (Mouse_moved)
@ -2143,6 +2155,9 @@ int Get_input(int sleep_time)
GFX2_Log(GFX2_INFO, "X11 event.type = %d not handled\n", event.type);
}
}
Mouse_Emulation();
// If the cursor was moved since last update,
// it was erased, so we need to redraw it (with the preview brush)
if (Mouse_moved)