Swap position/point names

A point is a 2D vector. A position represent a point relative to the
screen size.
This commit is contained in:
Romain Vimont 2018-01-29 14:52:22 +01:00
parent f70359f14f
commit 879941355d
15 changed files with 109 additions and 109 deletions

View file

@ -11,16 +11,16 @@ struct size {
Uint16 height; Uint16 height;
}; };
struct position { struct point {
Uint16 x; Uint16 x;
Uint16 y; Uint16 y;
}; };
struct point { struct position {
// The video screen size may be different from the real device screen size, // The video screen size may be different from the real device screen size,
// so store to which size the absolute position apply, to scale it accordingly. // so store to which size the absolute position apply, to scale it accordingly.
struct size screen_size; struct size screen_size;
struct position position; struct point point;
}; };
#endif #endif

View file

@ -17,11 +17,11 @@ static inline void write32(Uint8 *buf, Uint32 value) {
buf[3] = value; buf[3] = value;
} }
static void write_point(Uint8 *buf, const struct point *point) { static void write_position(Uint8 *buf, const struct position *position) {
write16(&buf[0], point->position.x); write16(&buf[0], position->point.x);
write16(&buf[2], point->position.y); write16(&buf[2], position->point.y);
write16(&buf[4], point->screen_size.width); write16(&buf[4], position->screen_size.width);
write16(&buf[6], point->screen_size.height); write16(&buf[6], position->screen_size.height);
} }
int control_event_serialize(const struct control_event *event, unsigned char *buf) { int control_event_serialize(const struct control_event *event, unsigned char *buf) {
@ -45,10 +45,10 @@ int control_event_serialize(const struct control_event *event, unsigned char *bu
case CONTROL_EVENT_TYPE_MOUSE: case CONTROL_EVENT_TYPE_MOUSE:
buf[1] = event->mouse_event.action; buf[1] = event->mouse_event.action;
write32(&buf[2], event->mouse_event.buttons); write32(&buf[2], event->mouse_event.buttons);
write_point(&buf[6], &event->mouse_event.point); write_position(&buf[6], &event->mouse_event.position);
return 14; return 14;
case CONTROL_EVENT_TYPE_SCROLL: case CONTROL_EVENT_TYPE_SCROLL:
write_point(&buf[1], &event->scroll_event.point); write_position(&buf[1], &event->scroll_event.position);
write32(&buf[9], (Uint32) event->scroll_event.hscroll); write32(&buf[9], (Uint32) event->scroll_event.hscroll);
write32(&buf[13], (Uint32) event->scroll_event.vscroll); write32(&buf[13], (Uint32) event->scroll_event.vscroll);
return 17; return 17;

View file

@ -33,10 +33,10 @@ struct control_event {
struct { struct {
enum android_motionevent_action action; enum android_motionevent_action action;
enum android_motionevent_buttons buttons; enum android_motionevent_buttons buttons;
struct point point; struct position position;
} mouse_event; } mouse_event;
struct { struct {
struct point point; struct position position;
Sint32 hscroll; Sint32 hscroll;
Sint32 vscroll; Sint32 vscroll;
} scroll_event; } scroll_event;

View file

@ -144,32 +144,32 @@ SDL_bool mouse_button_from_sdl_to_android(const SDL_MouseButtonEvent *from,
} }
to->mouse_event.buttons = convert_mouse_buttons(SDL_BUTTON(from->button)); to->mouse_event.buttons = convert_mouse_buttons(SDL_BUTTON(from->button));
to->mouse_event.point.screen_size = screen_size; to->mouse_event.position.screen_size = screen_size;
to->mouse_event.point.position.x = (Uint16) from->x; to->mouse_event.position.point.x = (Uint16) from->x;
to->mouse_event.point.position.y = (Uint16) from->y; to->mouse_event.position.point.y = (Uint16) from->y;
return SDL_TRUE; return SDL_TRUE;
} }
SDL_bool mouse_motion_from_sdl_to_android(const SDL_MouseMotionEvent *from, SDL_bool mouse_motion_from_sdl_to_android(const SDL_MouseMotionEvent *from,
const struct size screen_size, struct size screen_size,
struct control_event *to) { struct control_event *to) {
to->type = CONTROL_EVENT_TYPE_MOUSE; to->type = CONTROL_EVENT_TYPE_MOUSE;
to->mouse_event.action = AMOTION_EVENT_ACTION_MOVE; to->mouse_event.action = AMOTION_EVENT_ACTION_MOVE;
to->mouse_event.buttons = convert_mouse_buttons(from->state); to->mouse_event.buttons = convert_mouse_buttons(from->state);
to->mouse_event.point.screen_size = screen_size; to->mouse_event.position.screen_size = screen_size;
to->mouse_event.point.position.x = from->x; to->mouse_event.position.point.x = from->x;
to->mouse_event.point.position.y = from->y; to->mouse_event.position.point.y = from->y;
return SDL_TRUE; return SDL_TRUE;
} }
SDL_bool mouse_wheel_from_sdl_to_android(const SDL_MouseWheelEvent *from, SDL_bool mouse_wheel_from_sdl_to_android(const SDL_MouseWheelEvent *from,
const struct point point, struct position position,
struct control_event *to) { struct control_event *to) {
to->type = CONTROL_EVENT_TYPE_SCROLL; to->type = CONTROL_EVENT_TYPE_SCROLL;
to->scroll_event.point = point; to->scroll_event.position = position;
int mul = from->direction == SDL_MOUSEWHEEL_NORMAL ? 1 : -1; int mul = from->direction == SDL_MOUSEWHEEL_NORMAL ? 1 : -1;
to->scroll_event.hscroll = mul * from->x; to->scroll_event.hscroll = mul * from->x;

View file

@ -29,7 +29,7 @@ SDL_bool mouse_motion_from_sdl_to_android(const SDL_MouseMotionEvent *from,
// on Android, a scroll event requires the current mouse position // on Android, a scroll event requires the current mouse position
SDL_bool mouse_wheel_from_sdl_to_android(const SDL_MouseWheelEvent *from, SDL_bool mouse_wheel_from_sdl_to_android(const SDL_MouseWheelEvent *from,
struct point point, struct position position,
struct control_event *to); struct control_event *to);
#endif #endif

View file

@ -104,12 +104,12 @@ static inline struct size get_window_size(SDL_Window *window) {
return size; return size;
} }
static inline struct position get_mouse_position() { static inline struct point get_mouse_point() {
int x; int x;
int y; int y;
SDL_GetMouseState(&x, &y); SDL_GetMouseState(&x, &y);
SDL_assert_release(x >= 0 && x < 0x10000 && y >= 0 && y < 0x10000); SDL_assert_release(x >= 0 && x < 0x10000 && y >= 0 && y < 0x10000);
return (struct position) { return (struct point) {
.x = (Uint16) x, .x = (Uint16) x,
.y = (Uint16) y, .y = (Uint16) y,
}; };
@ -322,9 +322,9 @@ static void handle_mouse_button(const SDL_MouseButtonEvent *event, struct size s
} }
} }
static void handle_mouse_wheel(const SDL_MouseWheelEvent *event, struct point point) { static void handle_mouse_wheel(const SDL_MouseWheelEvent *event, struct position position) {
struct control_event control_event; struct control_event control_event;
if (mouse_wheel_from_sdl_to_android(event, point, &control_event)) { if (mouse_wheel_from_sdl_to_android(event, position, &control_event)) {
if (!controller_push_event(&controller, &control_event)) { if (!controller_push_event(&controller, &control_event)) {
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, "Cannot send wheel button event"); SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, "Cannot send wheel button event");
} }
@ -366,11 +366,11 @@ void event_loop(void) {
handle_mouse_motion(&event.motion, frame_size); handle_mouse_motion(&event.motion, frame_size);
break; break;
case SDL_MOUSEWHEEL: { case SDL_MOUSEWHEEL: {
struct point point = { struct position position = {
.screen_size = frame_size, .screen_size = frame_size,
.position = get_mouse_position(), .point = get_mouse_point(),
}; };
handle_mouse_wheel(&event.wheel, point); handle_mouse_wheel(&event.wheel, position);
break; break;
} }
case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONDOWN:

View file

@ -51,8 +51,8 @@ static void test_serialize_mouse_event() {
.mouse_event = { .mouse_event = {
.action = AMOTION_EVENT_ACTION_DOWN, .action = AMOTION_EVENT_ACTION_DOWN,
.buttons = AMOTION_EVENT_BUTTON_PRIMARY, .buttons = AMOTION_EVENT_BUTTON_PRIMARY,
.point = { .position = {
.position = { .point = {
.x = 260, .x = 260,
.y = 1026, .y = 1026,
}, },
@ -82,8 +82,8 @@ static void test_serialize_scroll_event() {
struct control_event event = { struct control_event event = {
.type = CONTROL_EVENT_TYPE_SCROLL, .type = CONTROL_EVENT_TYPE_SCROLL,
.scroll_event = { .scroll_event = {
.point = { .position = {
.position = { .point = {
.x = 260, .x = 260,
.y = 1026, .y = 1026,
}, },

View file

@ -27,7 +27,7 @@ SRC := com/genymobile/scrcpy/ScrCpyServer.java \
com/genymobile/scrcpy/EventController.java \ com/genymobile/scrcpy/EventController.java \
com/genymobile/scrcpy/Ln.java \ com/genymobile/scrcpy/Ln.java \
com/genymobile/scrcpy/Point.java \ com/genymobile/scrcpy/Point.java \
com/genymobile/scrcpy/RawPoint.java \ com/genymobile/scrcpy/Position.java \
com/genymobile/scrcpy/ScreenInfo.java \ com/genymobile/scrcpy/ScreenInfo.java \
com/genymobile/scrcpy/ScreenStreamer.java \ com/genymobile/scrcpy/ScreenStreamer.java \
com/genymobile/scrcpy/ScreenStreamerSession.java \ com/genymobile/scrcpy/ScreenStreamerSession.java \

View file

@ -16,7 +16,7 @@ public class ControlEvent {
private int action; // KeyEvent.ACTION_* or MotionEvent.ACTION_* private int action; // KeyEvent.ACTION_* or MotionEvent.ACTION_*
private int keycode; // KeyEvent.KEYCODE_* private int keycode; // KeyEvent.KEYCODE_*
private int buttons; // MotionEvent.BUTTON_* private int buttons; // MotionEvent.BUTTON_*
private Point point; private Position position;
private int hScroll; private int hScroll;
private int vScroll; private int vScroll;
@ -39,19 +39,19 @@ public class ControlEvent {
return event; return event;
} }
public static ControlEvent createMotionControlEvent(int action, int buttons, Point point) { public static ControlEvent createMotionControlEvent(int action, int buttons, Position position) {
ControlEvent event = new ControlEvent(); ControlEvent event = new ControlEvent();
event.type = TYPE_MOUSE; event.type = TYPE_MOUSE;
event.action = action; event.action = action;
event.buttons = buttons; event.buttons = buttons;
event.point = point; event.position = position;
return event; return event;
} }
public static ControlEvent createScrollControlEvent(Point point, int hScroll, int vScroll) { public static ControlEvent createScrollControlEvent(Position position, int hScroll, int vScroll) {
ControlEvent event = new ControlEvent(); ControlEvent event = new ControlEvent();
event.type = TYPE_SCROLL; event.type = TYPE_SCROLL;
event.point = point; event.position = position;
event.hScroll = hScroll; event.hScroll = hScroll;
event.vScroll = vScroll; event.vScroll = vScroll;
return event; return event;
@ -81,8 +81,8 @@ public class ControlEvent {
return buttons; return buttons;
} }
public Point getPoint() { public Position getPosition() {
return point; return position;
} }
public int getHScroll() { public int getHScroll() {

View file

@ -74,17 +74,17 @@ public class ControlEventReader {
} }
int action = toUnsigned(buffer.get()); int action = toUnsigned(buffer.get());
int buttons = buffer.getInt(); int buttons = buffer.getInt();
Point point = readPoint(buffer); Position position = readPosition(buffer);
return ControlEvent.createMotionControlEvent(action, buttons, point); return ControlEvent.createMotionControlEvent(action, buttons, position);
} }
case ControlEvent.TYPE_SCROLL: { case ControlEvent.TYPE_SCROLL: {
if (buffer.remaining() < SCROLL_PAYLOAD_LENGTH) { if (buffer.remaining() < SCROLL_PAYLOAD_LENGTH) {
break; break;
} }
Point point = readPoint(buffer); Position position = readPosition(buffer);
int hscroll = buffer.getInt(); int hScroll = buffer.getInt();
int vscroll = buffer.getInt(); int vScroll = buffer.getInt();
return ControlEvent.createScrollControlEvent(point, hscroll, vscroll); return ControlEvent.createScrollControlEvent(position, hScroll, vScroll);
} }
default: default:
Ln.w("Unknown event type: " + type); Ln.w("Unknown event type: " + type);
@ -95,12 +95,12 @@ public class ControlEventReader {
return null; return null;
} }
private static Point readPoint(ByteBuffer buffer) { private static Position readPosition(ByteBuffer buffer) {
int x = toUnsigned(buffer.getShort()); int x = toUnsigned(buffer.getShort());
int y = toUnsigned(buffer.getShort()); int y = toUnsigned(buffer.getShort());
int screenWidth = toUnsigned(buffer.getShort()); int screenWidth = toUnsigned(buffer.getShort());
int screenHeight = toUnsigned(buffer.getShort()); int screenHeight = toUnsigned(buffer.getShort());
return new Point(x, y, screenWidth, screenHeight); return new Position(x, y, screenWidth, screenHeight);
} }
private static int toUnsigned(short value) { private static int toUnsigned(short value) {

View file

@ -48,13 +48,13 @@ public class Device {
return screenInfo; return screenInfo;
} }
public RawPoint getPhysicalPoint(Point point) { public Point getPhysicalPoint(Position position) {
ScreenInfo screenInfo = getScreenInfo(); ScreenInfo screenInfo = getScreenInfo();
int deviceWidth = screenInfo.getLogicalWidth(); int deviceWidth = screenInfo.getLogicalWidth();
int deviceHeight = screenInfo.getLogicalHeight(); int deviceHeight = screenInfo.getLogicalHeight();
int scaledX = point.getX() * deviceWidth / point.getScreenWidth(); int scaledX = position.getX() * deviceWidth / position.getScreenWidth();
int scaledY = point.getY() * deviceHeight / point.getScreenHeight(); int scaledY = position.getY() * deviceHeight / position.getScreenHeight();
return new RawPoint(scaledX, scaledY); return new Point(scaledX, scaledY);
} }
private ScreenInfo readScreenInfo() { private ScreenInfo readScreenInfo() {

View file

@ -43,10 +43,10 @@ public class EventController {
coords.touchMinor = 1; coords.touchMinor = 1;
} }
private void setPointerCoords(RawPoint rawPoint) { private void setPointerCoords(Point point) {
MotionEvent.PointerCoords coords = pointerCoords[0]; MotionEvent.PointerCoords coords = pointerCoords[0];
coords.x = rawPoint.getX(); coords.x = point.getX();
coords.y = rawPoint.getY(); coords.y = point.getY();
} }
private void setScroll(int hScroll, int vScroll) { private void setScroll(int hScroll, int vScroll) {
@ -72,10 +72,10 @@ public class EventController {
injectText(controlEvent.getText()); injectText(controlEvent.getText());
break; break;
case ControlEvent.TYPE_MOUSE: case ControlEvent.TYPE_MOUSE:
injectMouse(controlEvent.getAction(), controlEvent.getButtons(), controlEvent.getPoint()); injectMouse(controlEvent.getAction(), controlEvent.getButtons(), controlEvent.getPosition());
break; break;
case ControlEvent.TYPE_SCROLL: case ControlEvent.TYPE_SCROLL:
injectScroll(controlEvent.getPoint(), controlEvent.getHScroll(), controlEvent.getVScroll()); injectScroll(controlEvent.getPosition(), controlEvent.getHScroll(), controlEvent.getVScroll());
} }
return true; return true;
} }
@ -97,29 +97,29 @@ public class EventController {
return true; return true;
} }
private boolean injectMouse(int action, int buttons, Point point) { private boolean injectMouse(int action, int buttons, Position position) {
long now = SystemClock.uptimeMillis(); long now = SystemClock.uptimeMillis();
if (action == MotionEvent.ACTION_DOWN) { if (action == MotionEvent.ACTION_DOWN) {
lastMouseDown = now; lastMouseDown = now;
} }
RawPoint rawPoint = Device.getInstance().getPhysicalPoint(point); Point point = Device.getInstance().getPhysicalPoint(position);
if (rawPoint == null) { if (point == null) {
// ignore event // ignore event
return false; return false;
} }
setPointerCoords(rawPoint); setPointerCoords(point);
MotionEvent event = MotionEvent.obtain(lastMouseDown, now, action, 1, pointerProperties, pointerCoords, 0, buttons, 1f, 1f, 0, 0, InputDevice.SOURCE_TOUCHSCREEN, 0); MotionEvent event = MotionEvent.obtain(lastMouseDown, now, action, 1, pointerProperties, pointerCoords, 0, buttons, 1f, 1f, 0, 0, InputDevice.SOURCE_TOUCHSCREEN, 0);
return injectEvent(event); return injectEvent(event);
} }
private boolean injectScroll(Point point, int hScroll, int vScroll) { private boolean injectScroll(Position position, int hScroll, int vScroll) {
long now = SystemClock.uptimeMillis(); long now = SystemClock.uptimeMillis();
RawPoint rawPoint = Device.getInstance().getPhysicalPoint(point); Point point = Device.getInstance().getPhysicalPoint(position);
if (rawPoint == null) { if (point == null) {
// ignore event // ignore event
return false; return false;
} }
setPointerCoords(rawPoint); setPointerCoords(point);
setScroll(hScroll, vScroll); setScroll(hScroll, vScroll);
MotionEvent event = MotionEvent.obtain(lastMouseDown, now, MotionEvent.ACTION_SCROLL, 1, pointerProperties, pointerCoords, 0, 0, 1f, 1f, 0, 0, InputDevice.SOURCE_MOUSE, 0); MotionEvent event = MotionEvent.obtain(lastMouseDown, now, MotionEvent.ACTION_SCROLL, 1, pointerProperties, pointerCoords, 0, 0, 1f, 1f, 0, 0, InputDevice.SOURCE_MOUSE, 0);
return injectEvent(event); return injectEvent(event);

View file

@ -1,17 +1,12 @@
package com.genymobile.scrcpy; package com.genymobile.scrcpy;
public class Point { public class Point {
private int x; private int x;
private int y; private int y;
private int screenWidth;
private int screenHeight;
public Point(int x, int y, int screenWidth, int screenHeight) { public Point(int x, int y) {
this.x = x; this.x = x;
this.y = y; this.y = y;
this.screenWidth = screenWidth;
this.screenHeight = screenHeight;
} }
public int getX() { public int getX() {
@ -22,21 +17,11 @@ public class Point {
return y; return y;
} }
public int getScreenWidth() {
return screenWidth;
}
public int getScreenHeight() {
return screenHeight;
}
@Override @Override
public String toString() { public String toString() {
return "Point{" + return "Point{" +
"x=" + x + "x=" + x +
", y=" + y + ", y=" + y +
", screenWidth=" + screenWidth +
", screenHeight=" + screenHeight +
'}'; '}';
} }
} }

View file

@ -0,0 +1,42 @@
package com.genymobile.scrcpy;
public class Position {
private int x;
private int y;
private int screenWidth;
private int screenHeight;
public Position(int x, int y, int screenWidth, int screenHeight) {
this.x = x;
this.y = y;
this.screenWidth = screenWidth;
this.screenHeight = screenHeight;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getScreenWidth() {
return screenWidth;
}
public int getScreenHeight() {
return screenHeight;
}
@Override
public String toString() {
return "Point{" +
"x=" + x +
", y=" + y +
", screenWidth=" + screenWidth +
", screenHeight=" + screenHeight +
'}';
}
}

View file

@ -1,27 +0,0 @@
package com.genymobile.scrcpy;
public class RawPoint {
private int x;
private int y;
public RawPoint(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
@Override
public String toString() {
return "RawPoint{" +
"x=" + x +
", y=" + y +
'}';
}
}