|
|
|
@ -1842,10 +1842,12 @@ static void get_client_regions(int *req, int *mod, int *cpy, int *num) {
|
|
|
|
|
|
|
|
|
|
i = rfbGetClientIterator(screen);
|
|
|
|
|
while( (cl = rfbClientIteratorNext(i)) ) {
|
|
|
|
|
if (use_threads) LOCK(cl->updateMutex);
|
|
|
|
|
*req += sraRgnCountRects(cl->requestedRegion);
|
|
|
|
|
*mod += sraRgnCountRects(cl->modifiedRegion);
|
|
|
|
|
*cpy += sraRgnCountRects(cl->copyRegion);
|
|
|
|
|
*num += 1;
|
|
|
|
|
if (use_threads) UNLOCK(cl->updateMutex);
|
|
|
|
|
}
|
|
|
|
|
rfbReleaseClientIterator(i);
|
|
|
|
|
}
|
|
|
|
@ -2024,7 +2026,9 @@ if (0) fprintf(stderr, "sb.. %d %d %d %d %d %d\n", sx1, sy1, sx2, sy2, sdx, sdy)
|
|
|
|
|
|
|
|
|
|
i = rfbGetClientIterator(screen);
|
|
|
|
|
while( (cl = rfbClientIteratorNext(i)) ) {
|
|
|
|
|
if (use_threads) LOCK(cl->updateMutex);
|
|
|
|
|
rfbSendCopyRegion(cl, r, sdx, sdy);
|
|
|
|
|
if (use_threads) UNLOCK(cl->updateMutex);
|
|
|
|
|
}
|
|
|
|
|
rfbReleaseClientIterator(i);
|
|
|
|
|
sraRgnDestroy(r);
|
|
|
|
@ -2073,34 +2077,47 @@ void batch_copyregion(sraRegionPtr* region, int *dx, int *dy, int ncr, double de
|
|
|
|
|
if (delay < 0.0) {
|
|
|
|
|
delay = 0.1;
|
|
|
|
|
}
|
|
|
|
|
fb_push_wait(delay, FB_COPY|FB_MOD);
|
|
|
|
|
if (!fb_push_wait(delay, FB_COPY|FB_MOD)) {
|
|
|
|
|
if (use_threads) usleep(100 * 1000);
|
|
|
|
|
fb_push_wait(0.75, FB_COPY|FB_MOD);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
t1 = dnow();
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
bad = 0;
|
|
|
|
|
i = rfbGetClientIterator(screen);
|
|
|
|
|
while( (cl = rfbClientIteratorNext(i)) ) {
|
|
|
|
|
|
|
|
|
|
if (use_threads) LOCK(cl->updateMutex);
|
|
|
|
|
|
|
|
|
|
if (cl->ublen != 0) {
|
|
|
|
|
fprintf(stderr, "batch_copyregion: *** BAD ublen != 0: %d\n", cl->ublen);
|
|
|
|
|
bad++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (use_threads) UNLOCK(cl->updateMutex);
|
|
|
|
|
}
|
|
|
|
|
rfbReleaseClientIterator(i);
|
|
|
|
|
|
|
|
|
|
if (bad) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
i = rfbGetClientIterator(screen);
|
|
|
|
|
while( (cl = rfbClientIteratorNext(i)) ) {
|
|
|
|
|
rfbFramebufferUpdateMsg *fu = (rfbFramebufferUpdateMsg *)cl->updateBuf;
|
|
|
|
|
rfbFramebufferUpdateMsg *fu;
|
|
|
|
|
|
|
|
|
|
if (use_threads) LOCK(cl->updateMutex);
|
|
|
|
|
|
|
|
|
|
fu = (rfbFramebufferUpdateMsg *)cl->updateBuf;
|
|
|
|
|
fu->nRects = Swap16IfLE((uint16_t)(nrects));
|
|
|
|
|
fu->type = rfbFramebufferUpdate;
|
|
|
|
|
|
|
|
|
|
if (cl->ublen != 0) fprintf(stderr, "batch_copyregion: *** BAD ublen != 0: %d\n", cl->ublen);
|
|
|
|
|
if (cl->ublen != 0) fprintf(stderr, "batch_copyregion: *** BAD-2 ublen != 0: %d\n", cl->ublen);
|
|
|
|
|
|
|
|
|
|
cl->ublen = sz_rfbFramebufferUpdateMsg;
|
|
|
|
|
|
|
|
|
|
if (use_threads) UNLOCK(cl->updateMutex);
|
|
|
|
|
}
|
|
|
|
|
rfbReleaseClientIterator(i);
|
|
|
|
|
|
|
|
|
@ -2119,12 +2136,17 @@ void batch_copyregion(sraRegionPtr* region, int *dx, int *dy, int ncr, double de
|
|
|
|
|
|
|
|
|
|
i = rfbGetClientIterator(screen);
|
|
|
|
|
while( (cl = rfbClientIteratorNext(i)) ) {
|
|
|
|
|
|
|
|
|
|
if (use_threads) LOCK(cl->updateMutex);
|
|
|
|
|
|
|
|
|
|
if (!direct) {
|
|
|
|
|
for (k=0; k < ncr; k++) {
|
|
|
|
|
rfbSendCopyRegion(cl, region[k], dx[k], dy[k]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
rfbSendUpdateBuf(cl);
|
|
|
|
|
|
|
|
|
|
if (use_threads) UNLOCK(cl->updateMutex);
|
|
|
|
|
}
|
|
|
|
|
rfbReleaseClientIterator(i);
|
|
|
|
|
|
|
|
|
@ -2145,49 +2167,32 @@ void batch_push(int nreg, double delay) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void fb_push0(void) {
|
|
|
|
|
char *httpdir = screen->httpDir;
|
|
|
|
|
int defer = screen->deferUpdateTime;
|
|
|
|
|
int req0, mod0, cpy0, req1, mod1, cpy1, ncli;
|
|
|
|
|
int db = (debug_scroll || debug_wireframe);
|
|
|
|
|
|
|
|
|
|
screen->httpDir = NULL;
|
|
|
|
|
screen->deferUpdateTime = 0;
|
|
|
|
|
|
|
|
|
|
if (db) get_client_regions(&req0, &mod0, &cpy0, &ncli);
|
|
|
|
|
|
|
|
|
|
rfbPE(0);
|
|
|
|
|
|
|
|
|
|
screen->httpDir = httpdir;
|
|
|
|
|
screen->deferUpdateTime = defer;
|
|
|
|
|
|
|
|
|
|
if (db) {
|
|
|
|
|
get_client_regions(&req1, &mod1, &cpy1, &ncli);
|
|
|
|
|
fprintf(stderr, "\nFB_push: req: %d/%d mod: %d/%d cpy: %d/%d %.4f\n",
|
|
|
|
|
req0, req1, mod0, mod1, cpy0, cpy1, dnowx());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void fb_push(void) {
|
|
|
|
|
int req0, mod0, cpy0, req1, mod1, cpy1, ncli;
|
|
|
|
|
int db = (debug_scroll || debug_wireframe);
|
|
|
|
|
rfbClientIteratorPtr i;
|
|
|
|
|
rfbClientPtr cl;
|
|
|
|
|
|
|
|
|
|
if (use_threads) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (db) get_client_regions(&req0, &mod0, &cpy0, &ncli);
|
|
|
|
|
|
|
|
|
|
i = rfbGetClientIterator(screen);
|
|
|
|
|
while( (cl = rfbClientIteratorNext(i)) ) {
|
|
|
|
|
if (use_threads) LOCK(cl->updateMutex);
|
|
|
|
|
if (cl->sock >= 0 && !cl->onHold && FB_UPDATE_PENDING(cl) &&
|
|
|
|
|
!sraRgnEmpty(cl->requestedRegion)) {
|
|
|
|
|
if (!rfbSendFramebufferUpdate(cl, cl->modifiedRegion)) {
|
|
|
|
|
fprintf(stderr, "*** rfbSendFramebufferUpdate *FAILED* #1\n");
|
|
|
|
|
if (cl->ublen) fprintf(stderr, "*** fb_push ublen not zero: %d\n", cl->ublen);
|
|
|
|
|
if (use_threads) UNLOCK(cl->updateMutex);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (cl->ublen) fprintf(stderr, "*** fb_push ublen NOT ZERO: %d\n", cl->ublen);
|
|
|
|
|
}
|
|
|
|
|
if (use_threads) UNLOCK(cl->updateMutex);
|
|
|
|
|
}
|
|
|
|
|
rfbReleaseClientIterator(i);
|
|
|
|
|
|
|
|
|
@ -2199,37 +2204,6 @@ if (db) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int fb_push_wait0(double max_wait, int flags) {
|
|
|
|
|
double tm, dt = 0.0;
|
|
|
|
|
int req, mod, cpy, ncli;
|
|
|
|
|
int ok = 0;
|
|
|
|
|
|
|
|
|
|
dtime0(&tm);
|
|
|
|
|
while (dt < max_wait) {
|
|
|
|
|
int done = 1;
|
|
|
|
|
rfbCFD(0);
|
|
|
|
|
get_client_regions(&req, &mod, &cpy, &ncli);
|
|
|
|
|
if (flags & FB_COPY && cpy) {
|
|
|
|
|
done = 0;
|
|
|
|
|
}
|
|
|
|
|
if (flags & FB_MOD && mod) {
|
|
|
|
|
done = 0;
|
|
|
|
|
}
|
|
|
|
|
if (flags & FB_REQ && req) {
|
|
|
|
|
done = 0;
|
|
|
|
|
}
|
|
|
|
|
if (done) {
|
|
|
|
|
ok = 1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
usleep(1000);
|
|
|
|
|
fb_push();
|
|
|
|
|
dt += dtime(&tm);
|
|
|
|
|
}
|
|
|
|
|
return ok;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int fb_push_wait(double max_wait, int flags) {
|
|
|
|
|
double tm, dt = 0.0;
|
|
|
|
|
int req, mod, cpy, ncli;
|
|
|
|
@ -3403,6 +3377,7 @@ if (db2 && saw_me) continue;
|
|
|
|
|
sraRgnSubtract(moved_win, tmp_win);
|
|
|
|
|
sraRgnDestroy(tmp_win);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
X_UNLOCK;
|
|
|
|
|
|
|
|
|
|
if (extra_clip && ! sraRgnEmpty(extra_clip)) {
|
|
|
|
@ -4597,6 +4572,9 @@ if (db) fprintf(stderr, "INTERIOR\n");
|
|
|
|
|
if (rotating) {
|
|
|
|
|
try_batch = 0;
|
|
|
|
|
}
|
|
|
|
|
if (use_threads && ncache > 0 && ncache_copyrect) {
|
|
|
|
|
try_batch = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g = got_pointer_input;
|
|
|
|
|
gd = got_local_pointer_input;
|
|
|
|
@ -4882,8 +4860,9 @@ if (0) fprintf(stderr, "*** NO GPI DRAW_BOX\n");
|
|
|
|
|
rfbPE(1000);
|
|
|
|
|
} else {
|
|
|
|
|
#ifndef NO_NCACHE
|
|
|
|
|
int tb = use_threads ? 0 : try_batch;
|
|
|
|
|
do_copyrect_drag_move(orig_frame, frame, &nidx,
|
|
|
|
|
try_batch, now_x, now_y, orig_w, orig_h, x, y, w, h,
|
|
|
|
|
tb, now_x, now_y, orig_w, orig_h, x, y, w, h,
|
|
|
|
|
copyrect_drag_delay);
|
|
|
|
|
now_x = x;
|
|
|
|
|
now_y = y;
|
|
|
|
@ -4940,8 +4919,9 @@ if (db || db2) fprintf(stderr, "NO button_mask\n");
|
|
|
|
|
draw_box(0, 0, 0, 0, 1);
|
|
|
|
|
fb_push(); /* XXX Y */
|
|
|
|
|
} else {
|
|
|
|
|
int tb = use_threads ? 0 : try_batch;
|
|
|
|
|
do_copyrect_drag_move(orig_frame, frame, &nidx,
|
|
|
|
|
try_batch, now_x, now_y, orig_w, orig_h, x, y, w, h, -1.0);
|
|
|
|
|
tb, now_x, now_y, orig_w, orig_h, x, y, w, h, -1.0);
|
|
|
|
|
fb_push_wait(0.15, FB_COPY|FB_MOD);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -4960,15 +4940,19 @@ if (db || db2) fprintf(stderr, "NO button_mask\n");
|
|
|
|
|
} else if (w != orig_w || h != orig_h) {
|
|
|
|
|
if (ncache > 0) {
|
|
|
|
|
try_to_fix_resize_su(orig_frame, orig_x, orig_y, orig_w, orig_h, x, y, w, h, try_batch);
|
|
|
|
|
X_LOCK;
|
|
|
|
|
clear_win_events(orig_frame, 1);
|
|
|
|
|
if (frame != orig_frame) {
|
|
|
|
|
clear_win_events(frame, 1);
|
|
|
|
|
}
|
|
|
|
|
X_UNLOCK;
|
|
|
|
|
}
|
|
|
|
|
} else if (dx == 0 && dy == 0) {
|
|
|
|
|
;
|
|
|
|
|
} else if (do_copyrect_drag > 0) {
|
|
|
|
|
X_LOCK;
|
|
|
|
|
clear_win_events(NPP_nwin, 0);
|
|
|
|
|
X_UNLOCK;
|
|
|
|
|
} else {
|
|
|
|
|
int spin_ms = (int) (spin * 1000 * 1000);
|
|
|
|
|
int obscured, sent_copyrect = 0;
|
|
|
|
@ -5030,7 +5014,9 @@ if ((ncache || db) && ncdb) fprintf(stderr, "sent_copyrect: %d - obs: %d frame:
|
|
|
|
|
}
|
|
|
|
|
ncache_post_portions(nidx, use_batch,
|
|
|
|
|
orig_x, orig_y, orig_w, orig_h, x, y, w, h, -1.0, ntim);
|
|
|
|
|
X_LOCK;
|
|
|
|
|
clear_win_events(NPP_nwin, 0);
|
|
|
|
|
X_UNLOCK;
|
|
|
|
|
|
|
|
|
|
if (scaling && !use_batch) {
|
|
|
|
|
static double last_time = 0.0;
|
|
|
|
@ -7598,6 +7584,7 @@ void block_stats(void) {
|
|
|
|
|
int h = cache_list[k].bs_h;
|
|
|
|
|
int rc = 0;
|
|
|
|
|
Window win = cache_list[k].win;
|
|
|
|
|
|
|
|
|
|
if (win == None) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
@ -8790,7 +8777,11 @@ if (ncdb) fprintf(stderr, "*SCHED LOOKUP FAIL: i=%d 0x%lx\n", i, win);
|
|
|
|
|
}
|
|
|
|
|
/* XXX Y resp */
|
|
|
|
|
if (saw_desktop_change || freq % 5 == 0) {
|
|
|
|
|
if (!valid_window(win, &attr, 1)) {
|
|
|
|
|
int vret = 0;
|
|
|
|
|
X_LOCK;
|
|
|
|
|
vret = valid_window(win, &attr, 1);
|
|
|
|
|
X_UNLOCK;
|
|
|
|
|
if (!vret) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
STORE(i, win, attr);
|
|
|
|
@ -8948,6 +8939,9 @@ int check_ncache(int reset, int mode) {
|
|
|
|
|
if (reset && (first || cache_list_len == 0)) {
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
if (use_threads) {
|
|
|
|
|
try_batch = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ncache0) {
|
|
|
|
|
if (reset) {
|
|
|
|
@ -9244,6 +9238,7 @@ if (ncdb) fprintf(stderr, "PRELOOP: RepartNotify: 0x%lx %d idx=%d\n", win2, n1,
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
X_UNLOCK;
|
|
|
|
|
|
|
|
|
|
if (got_NET_CURRENT_DESKTOP > 0.0) {
|
|
|
|
@ -9703,7 +9698,9 @@ if (ncdb) fprintf(stderr, "skip%02d: ** SpecialSkip 0x%lx/0x%lx type: %s\n", i
|
|
|
|
|
valid = 1;
|
|
|
|
|
su_save(idx, nbatch, &attr, 0, &valid, 1);
|
|
|
|
|
STORE(idx, win2, attr);
|
|
|
|
|
|
|
|
|
|
X_LOCK;
|
|
|
|
|
|
|
|
|
|
if (! desktop_change) {
|
|
|
|
|
SCHED(win2, 1)
|
|
|
|
|
}
|
|
|
|
|