Browse Source

Merge branch 'smooth-edge-scrolling' of https://github.com/ToyKeeper/tigervnc

tags/v1.11.90
Pierre Ossman 2 years ago
parent
commit
9ec1f360de
1 changed files with 34 additions and 20 deletions
  1. 34
    20
      vncviewer/DesktopWindow.cxx

+ 34
- 20
vncviewer/DesktopWindow.cxx View File

#include <Carbon/Carbon.h> #include <Carbon/Carbon.h>
#endif #endif


#define EDGE_SCROLL_SIZE 32
#define EDGE_SCROLL_SPEED 20
// width of each "edge" region where scrolling happens,
// as a ratio compared to the viewport size
// default: 1/16th of the viewport size
#define EDGE_SCROLL_SIZE 16
// edge width is calculated at runtime; these values are just examples
static int edge_scroll_size_x = 128;
static int edge_scroll_size_y = 96;
// maximum pixels to scroll per frame
#define EDGE_SCROLL_SPEED 16
// how long to wait between viewport scroll position changes
// default: roughly 60 fps for smooth motion
#define EDGE_SCROLL_SECONDS_PER_FRAME 0.016666


using namespace rfb; using namespace rfb;


} }
} }
if (fullscreen_active()) { if (fullscreen_active()) {
if (((viewport->x() < 0) && (Fl::event_x() < EDGE_SCROLL_SIZE)) ||
((viewport->x() + viewport->w() > w()) && (Fl::event_x() > w() - EDGE_SCROLL_SIZE)) ||
((viewport->y() < 0) && (Fl::event_y() < EDGE_SCROLL_SIZE)) ||
((viewport->y() + viewport->h() > h()) && (Fl::event_y() > h() - EDGE_SCROLL_SIZE))) {
// calculate width of "edge" regions
edge_scroll_size_x = viewport->w() / EDGE_SCROLL_SIZE;
edge_scroll_size_y = viewport->h() / EDGE_SCROLL_SIZE;
// if cursor is near the edge of the viewport, scroll
if (((viewport->x() < 0) && (Fl::event_x() < edge_scroll_size_x)) ||
((viewport->x() + viewport->w() >= w()) && (Fl::event_x() >= w() - edge_scroll_size_x)) ||
((viewport->y() < 0) && (Fl::event_y() < edge_scroll_size_y)) ||
((viewport->y() + viewport->h() >= h()) && (Fl::event_y() >= h() - edge_scroll_size_y))) {
if (!Fl::has_timeout(handleEdgeScroll, this)) if (!Fl::has_timeout(handleEdgeScroll, this))
Fl::add_timeout(0.1, handleEdgeScroll, this);
Fl::add_timeout(EDGE_SCROLL_SECONDS_PER_FRAME, handleEdgeScroll, this);
} }
} }
// Continue processing so that the viewport also gets mouse events // Continue processing so that the viewport also gets mouse events
if (my > self->h()) if (my > self->h())
my = self->h(); my = self->h();


if ((self->viewport->x() < 0) && (mx < EDGE_SCROLL_SIZE))
if ((self->viewport->x() < 0) && (mx < edge_scroll_size_x))
dx = EDGE_SCROLL_SPEED - dx = EDGE_SCROLL_SPEED -
EDGE_SCROLL_SPEED * mx / EDGE_SCROLL_SIZE;
if ((self->viewport->x() + self->viewport->w() > self->w()) &&
(mx > self->w() - EDGE_SCROLL_SIZE))
dx = EDGE_SCROLL_SPEED * (self->w() - mx) / EDGE_SCROLL_SIZE -
EDGE_SCROLL_SPEED;
if ((self->viewport->y() < 0) && (my < EDGE_SCROLL_SIZE))
EDGE_SCROLL_SPEED * mx / edge_scroll_size_x;
if ((self->viewport->x() + self->viewport->w() >= self->w()) &&
(mx >= self->w() - edge_scroll_size_x))
dx = EDGE_SCROLL_SPEED * (self->w() - mx) / edge_scroll_size_x -
EDGE_SCROLL_SPEED - 1;
if ((self->viewport->y() < 0) && (my < edge_scroll_size_y))
dy = EDGE_SCROLL_SPEED - dy = EDGE_SCROLL_SPEED -
EDGE_SCROLL_SPEED * my / EDGE_SCROLL_SIZE;
if ((self->viewport->y() + self->viewport->h() > self->h()) &&
(my > self->h() - EDGE_SCROLL_SIZE))
dy = EDGE_SCROLL_SPEED * (self->h() - my) / EDGE_SCROLL_SIZE -
EDGE_SCROLL_SPEED;
EDGE_SCROLL_SPEED * my / edge_scroll_size_y;
if ((self->viewport->y() + self->viewport->h() >= self->h()) &&
(my >= self->h() - edge_scroll_size_y))
dy = EDGE_SCROLL_SPEED * (self->h() - my) / edge_scroll_size_y -
EDGE_SCROLL_SPEED - 1;


if ((dx == 0) && (dy == 0)) if ((dx == 0) && (dy == 0))
return; return;


self->scrollTo(self->hscroll->value() - dx, self->vscroll->value() - dy); self->scrollTo(self->hscroll->value() - dx, self->vscroll->value() - dy);


Fl::repeat_timeout(0.1, handleEdgeScroll, data);
Fl::repeat_timeout(EDGE_SCROLL_SECONDS_PER_FRAME, handleEdgeScroll, data);
} }


void DesktopWindow::handleStatsTimeout(void *data) void DesktopWindow::handleStatsTimeout(void *data)

Loading…
Cancel
Save