Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(968)

Unified Diff: remoting/android/java/src/org/chromium/chromoting/DesktopView.java

Issue 23532072: Draw the mouse cursor in Chromoting Android client (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add synchronization Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: remoting/android/java/src/org/chromium/chromoting/DesktopView.java
diff --git a/remoting/android/java/src/org/chromium/chromoting/DesktopView.java b/remoting/android/java/src/org/chromium/chromoting/DesktopView.java
index b1eac42633a5f3d16d6dc682c98d45519852a106..2a4a994424588d789217ecef8a25f03b24fed4db 100644
--- a/remoting/android/java/src/org/chromium/chromoting/DesktopView.java
+++ b/remoting/android/java/src/org/chromium/chromoting/DesktopView.java
@@ -11,6 +11,7 @@ import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
+import android.graphics.Point;
import android.os.Bundle;
import android.os.Looper;
import android.text.InputType;
@@ -67,6 +68,12 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder.
private int mScreenWidth;
private int mScreenHeight;
+ /**
+ * Specifies the position, in image coordinates, at which the cursor image will be drawn.
+ * This will normally be at the location of the most recently injected motion event.
+ */
+ private Point mCursorPosition;
+
/** Specifies the dimension by which the zoom level is being lower-bounded. */
private Constraint mConstraint;
@@ -98,6 +105,7 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder.
mTransform = new Matrix();
mScreenWidth = 0;
mScreenHeight = 0;
+ mCursorPosition = new Point();
mConstraint = Constraint.UNDEFINED;
mRecheckConstraint = false;
@@ -216,6 +224,16 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder.
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(image, 0, 0, new Paint());
+ Bitmap cursorBitmap = JniInterface.getCursorBitmap();
+ if (cursorBitmap != null) {
+ Point hotspot = JniInterface.getCursorHotspot();
+ int bitmapX, bitmapY;
+ synchronized (mCursorPosition) {
+ bitmapX = mCursorPosition.x - hotspot.x;
+ bitmapY = mCursorPosition.y - hotspot.y;
+ }
+ canvas.drawBitmap(cursorBitmap, bitmapX, bitmapY, new Paint());
+ }
getHolder().unlockCanvasAndPost(canvas);
}
@@ -249,6 +267,11 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder.
}
}
+ synchronized (mCursorPosition) {
+ mCursorPosition.x = width / 2;
+ mCursorPosition.y = height / 2;
+ }
+
if (!JniInterface.redrawGraphics()) {
JniInterface.provideRedrawCallback(this);
}
@@ -296,11 +319,25 @@ public class DesktopView extends SurfaceView implements Runnable, SurfaceHolder.
// Coordinates are relative to the canvas, but we need image coordinates.
Matrix canvasToImage = new Matrix();
- mTransform.invert(canvasToImage);
+ synchronized (mTransform) {
+ mTransform.invert(canvasToImage);
solb 2013/09/14 01:48:22 You were good to notice this. Your change ensures
+ }
canvasToImage.mapPoints(coordinates);
+ int imageX = (int)coordinates[0];
+ int imageY = (int)coordinates[1];
+
+ synchronized (mCursorPosition) {
+ mCursorPosition.x = imageX;
+ mCursorPosition.y = imageY;
+ }
+
// Coordinates are now relative to the image, so transmit them to the host.
- JniInterface.mouseAction((int)coordinates[0], (int)coordinates[1], button, pressed);
+ JniInterface.mouseAction(imageX, imageY, button, pressed);
+
+ // TODO(lambroslambrou): Optimize this to repaint only the areas covered by the old and new
+ // cursor positions.
+ JniInterface.redrawGraphics();
}
/**

Powered by Google App Engine
This is Rietveld 408576698