summaryrefslogtreecommitdiffstats
path: root/x11vnc/userinput.c
diff options
context:
space:
mode:
Diffstat (limited to 'x11vnc/userinput.c')
-rw-r--r--x11vnc/userinput.c45
1 files changed, 43 insertions, 2 deletions
diff --git a/x11vnc/userinput.c b/x11vnc/userinput.c
index 5405432..a0edb9a 100644
--- a/x11vnc/userinput.c
+++ b/x11vnc/userinput.c
@@ -1760,7 +1760,7 @@ static void do_copyregion(sraRegionPtr region, int dx, int dy) {
last_copyrect = dnow();
- if (rfb_fb == main_fb) {
+ if (rfb_fb == main_fb && ! rotating) {
/* normal case, no -scale or -8to24 */
get_client_regions(&req, &mod, &cpy, &ncli);
if (debug_scroll > 1) fprintf(stderr, "<<<-rfbDoCopyRect req: %d mod: %d cpy: %d\n", req, mod, cpy);
@@ -1777,7 +1777,7 @@ if (debug_scroll > 1) fprintf(stderr, ">>>-rfbDoCopyRect req: %d mod: %d cpy: %d
iter = sraRgnGetReverseIterator(region, dx < 0, dy < 0);
while(sraRgnIteratorNext(iter, &rect)) {
- int j, c;
+ int j, c, t;
x1 = rect.x1;
y1 = rect.y1;
@@ -1825,6 +1825,7 @@ if (debug_scroll > 1) fprintf(stderr, ">>>-rfbDoCopyRect req: %d mod: %d cpy: %d
}
}
+
if (scaling) {
sx1 = ((double) x1 / dpy_x) * scaled_x;
sy1 = ((double) y1 / dpy_y) * scaled_y;
@@ -1840,6 +1841,46 @@ if (debug_scroll > 1) fprintf(stderr, ">>>-rfbDoCopyRect req: %d mod: %d cpy: %d
sdx = dx;
sdy = dy;
}
+if (0) fprintf(stderr, "s... %d %d %d %d %d %d\n", sx1, sy1, sx2, sy2, sdx, sdy);
+ if (rotating) {
+ rotate_coords(sx1, sy1, &sx1, &sy1, -1, -1);
+ rotate_coords(sx2, sy2, &sx2, &sy2, -1, -1);
+ if (rotating == ROTATE_X) {
+ sdx = -sdx;
+ } else if (rotating == ROTATE_Y) {
+ sdy = -sdy;
+ } else if (rotating == ROTATE_XY) {
+ sdx = -sdx;
+ sdy = -sdy;
+ } else if (rotating == ROTATE_90) {
+ t = sdx;
+ sdx = -sdy;
+ sdy = t;
+ } else if (rotating == ROTATE_90X) {
+ t = sdx;
+ sdx = sdy;
+ sdy = t;
+ } else if (rotating == ROTATE_90Y) {
+ t = sdx;
+ sdx = -sdy;
+ sdy = -t;
+ } else if (rotating == ROTATE_270) {
+ t = sdx;
+ sdx = sdy;
+ sdy = -t;
+ }
+ }
+ if (sx2 < sx1) {
+ t = sx1;
+ sx1 = sx2;
+ sx2 = t;
+ }
+ if (sy2 < sy1) {
+ t = sy1;
+ sy1 = sy2;
+ sy2 = t;
+ }
+if (0) fprintf(stderr, "s... %d %d %d %d %d %d\n", sx1, sy1, sx2, sy2, sdx, sdy);
rfbDoCopyRect(screen, sx1, sy1, sx2, sy2, sdx, sdy);
}