Implemented speed and acceleration for relative mode

This commit is contained in:
pelya
2011-02-08 12:58:12 +00:00
parent 96ac2819ed
commit 5e4b450e74
4 changed files with 58 additions and 16 deletions

View File

@@ -85,8 +85,8 @@ class Globals {
public static int MoveMouseWithJoystickAccel = 0; public static int MoveMouseWithJoystickAccel = 0;
public static boolean ClickMouseWithDpad = false; public static boolean ClickMouseWithDpad = false;
public static boolean RelativeMouseMovement = AppNeedsTwoButtonMouse; // Laptop touchpad mode public static boolean RelativeMouseMovement = AppNeedsTwoButtonMouse; // Laptop touchpad mode
public static int RelativeMouseMovementSpeed = 0; public static int RelativeMouseMovementSpeed = 2;
public static int RelativeMouseMovementAccel = 1; public static int RelativeMouseMovementAccel = 0;
public static boolean ShowScreenUnderFinger = false; public static boolean ShowScreenUnderFinger = false;
public static boolean KeepAspectRatio = false; public static boolean KeepAspectRatio = false;
public static int ClickScreenPressure = 0; public static int ClickScreenPressure = 0;

View File

@@ -414,7 +414,8 @@ class Settings
{ {
public void onCancel(DialogInterface dialog) public void onCancel(DialogInterface dialog)
{ {
showConfigMainMenu(p); Save(p);
p.startDownloader();
} }
}); });
AlertDialog alert = builder.create(); AlertDialog alert = builder.create();
@@ -1210,9 +1211,11 @@ class Settings
static void showRelativeMouseMovementConfig(final MainActivity p) static void showRelativeMouseMovementConfig(final MainActivity p)
{ {
final CharSequence[] items = { p.getResources().getString(R.string.accel_fast), final CharSequence[] items = { p.getResources().getString(R.string.accel_veryslow),
p.getResources().getString(R.string.accel_slow),
p.getResources().getString(R.string.accel_medium), p.getResources().getString(R.string.accel_medium),
p.getResources().getString(R.string.accel_slow) }; p.getResources().getString(R.string.accel_fast),
p.getResources().getString(R.string.accel_veryfast) };
AlertDialog.Builder builder = new AlertDialog.Builder(p); AlertDialog.Builder builder = new AlertDialog.Builder(p);
builder.setTitle(R.string.pointandclick_relative_speed); builder.setTitle(R.string.pointandclick_relative_speed);
@@ -1240,9 +1243,10 @@ class Settings
static void showRelativeMouseMovementConfig1(final MainActivity p) static void showRelativeMouseMovementConfig1(final MainActivity p)
{ {
final CharSequence[] items = { p.getResources().getString(R.string.accel_fast), final CharSequence[] items = { p.getResources().getString(R.string.none),
p.getResources().getString(R.string.accel_slow),
p.getResources().getString(R.string.accel_medium), p.getResources().getString(R.string.accel_medium),
p.getResources().getString(R.string.accel_slow) }; p.getResources().getString(R.string.accel_fast) };
AlertDialog.Builder builder = new AlertDialog.Builder(p); AlertDialog.Builder builder = new AlertDialog.Builder(p);
builder.setTitle(R.string.pointandclick_relative_accel); builder.setTitle(R.string.pointandclick_relative_accel);

View File

@@ -61,6 +61,7 @@
<string name="accel_fast">Fast</string> <string name="accel_fast">Fast</string>
<string name="accel_medium">Medium</string> <string name="accel_medium">Medium</string>
<string name="accel_slow">Slow</string> <string name="accel_slow">Slow</string>
<string name="accel_veryslow">Very slow</string>
<string name="accel_question">Accelerometer sensitivity</string> <string name="accel_question">Accelerometer sensitivity</string>
<string name="accel_floating">Floating</string> <string name="accel_floating">Floating</string>

View File

@@ -108,10 +108,13 @@ int mouseInitialY = -1;
unsigned int mouseInitialTime = 0; unsigned int mouseInitialTime = 0;
int deferredMouseTap = 0; int deferredMouseTap = 0;
int relativeMovement = 0; int relativeMovement = 0;
int relativeMovementSpeed = 0; int relativeMovementSpeed = 2;
int relativeMovementAccel = 0; int relativeMovementAccel = 0;
int relativeMovementX = 0; int relativeMovementX = 0;
int relativeMovementY = 0; int relativeMovementY = 0;
unsigned int relativeMovementTime = 0;
int oldMouseX = 0;
int oldMouseY = 0;
static inline int InsideRect(const SDL_Rect * r, int x, int y) static inline int InsideRect(const SDL_Rect * r, int x, int y)
{ {
@@ -363,17 +366,43 @@ JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeMouse) ( JNIEnv* env, jobject thiz, j
if( pointerId == firstMousePointerId ) if( pointerId == firstMousePointerId )
{ {
int oldX, oldY;
SDL_GetMouseState( &oldX, &oldY );
if( relativeMovement ) if( relativeMovement )
{ {
if( action == MOUSE_DOWN ) if( action == MOUSE_DOWN )
{ {
relativeMovementX = oldX - x; relativeMovementX = oldMouseX - x;
relativeMovementY = oldY - y; relativeMovementY = oldMouseY - y;
} }
x += relativeMovementX; x += relativeMovementX;
y += relativeMovementY; y += relativeMovementY;
int diffX = x - oldMouseX;
int diffY = y - oldMouseY;
int coeff = relativeMovementSpeed + 2;
if( relativeMovementSpeed > 2 )
coeff += relativeMovementSpeed - 2;
diffX = diffX * coeff / 4;
diffY = diffY * coeff / 4;
if( relativeMovementAccel > 0 )
{
unsigned int newTime = SDL_GetTicks();
if( newTime - relativeMovementTime > 0 )
{
diffX += diffX * ( relativeMovementAccel * 30 ) / (int)(newTime - relativeMovementTime);
diffY += diffY * ( relativeMovementAccel * 30 ) / (int)(newTime - relativeMovementTime);
}
relativeMovementTime = newTime;
}
diffX -= x - oldMouseX;
diffY -= y - oldMouseY;
x += diffX;
y += diffY;
relativeMovementX += diffX;
relativeMovementY += diffY;
__android_log_print(ANDROID_LOG_INFO, "libSDL", "x %d y %d relX %d relY %d diffX %d diffY %d", x, y, relativeMovementX, relativeMovementY, diffX, diffY);
diffX = x;
diffY = y;
if( x < 0 ) if( x < 0 )
x = 0; x = 0;
if( x > SDL_ANDROID_sFakeWindowWidth ) if( x > SDL_ANDROID_sFakeWindowWidth )
@@ -382,6 +411,8 @@ JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeMouse) ( JNIEnv* env, jobject thiz, j
y = 0; y = 0;
if( y > SDL_ANDROID_sFakeWindowHeight ) if( y > SDL_ANDROID_sFakeWindowHeight )
y = SDL_ANDROID_sFakeWindowHeight; y = SDL_ANDROID_sFakeWindowHeight;
relativeMovementX += x - diffX;
relativeMovementY += y - diffY;
} }
if( action == MOUSE_UP ) if( action == MOUSE_UP )
{ {
@@ -423,11 +454,11 @@ JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeMouse) ( JNIEnv* env, jobject thiz, j
if( action == MOUSE_DOWN ) if( action == MOUSE_DOWN )
{ {
if( (moveMouseWithKbX >= 0 || leftClickMethod == LEFT_CLICK_NEAR_CURSOR) && if( (moveMouseWithKbX >= 0 || leftClickMethod == LEFT_CLICK_NEAR_CURSOR) &&
abs(oldX - x) < SDL_ANDROID_sFakeWindowWidth / 4 && abs(oldY - y) < SDL_ANDROID_sFakeWindowHeight / 4 ) abs(oldMouseX - x) < SDL_ANDROID_sFakeWindowWidth / 4 && abs(oldMouseY - y) < SDL_ANDROID_sFakeWindowHeight / 4 )
{ {
SDL_ANDROID_MainThreadPushMouseButton( SDL_PRESSED, SDL_BUTTON_LEFT ); SDL_ANDROID_MainThreadPushMouseButton( SDL_PRESSED, SDL_BUTTON_LEFT );
moveMouseWithKbX = oldX; moveMouseWithKbX = oldMouseX;
moveMouseWithKbY = oldY; moveMouseWithKbY = oldMouseX;
action == MOUSE_MOVE; action == MOUSE_MOVE;
} }
else else
@@ -688,6 +719,7 @@ JAVA_EXPORT_NAME(Settings_nativeSetMouseUsed) ( JNIEnv* env, jobject thiz,
relativeMovement = RelativeMovement; relativeMovement = RelativeMovement;
relativeMovementSpeed = RelativeMovementSpeed; relativeMovementSpeed = RelativeMovementSpeed;
relativeMovementAccel = RelativeMovementAccel; relativeMovementAccel = RelativeMovementAccel;
//__android_log_print(ANDROID_LOG_INFO, "libSDL", "relativeMovementSpeed %d relativeMovementAccel %d", relativeMovementSpeed, relativeMovementAccel);
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
@@ -1191,6 +1223,8 @@ extern void SDL_ANDROID_MainThreadPushMouseMotion(int x, int y)
ev->type = SDL_MOUSEMOTION; ev->type = SDL_MOUSEMOTION;
ev->motion.x = x; ev->motion.x = x;
ev->motion.y = y; ev->motion.y = y;
oldMouseX = x;
oldMouseY = y;
BufferedEventsEnd = nextEvent; BufferedEventsEnd = nextEvent;
SDL_mutexV(BufferedEventsMutex); SDL_mutexV(BufferedEventsMutex);
@@ -1225,7 +1259,10 @@ extern void SDL_ANDROID_MainThreadPushKeyboardKey(int pressed, SDL_scancode key)
key == SDL_KEY(LEFT) || key == SDL_KEY(RIGHT) ) ) key == SDL_KEY(LEFT) || key == SDL_KEY(RIGHT) ) )
{ {
if( moveMouseWithKbX < 0 ) if( moveMouseWithKbX < 0 )
SDL_GetMouseState( &moveMouseWithKbX, &moveMouseWithKbY ); {
moveMouseWithKbX = oldMouseX;
moveMouseWithKbY = oldMouseY;
}
if( pressed ) if( pressed )
{ {