Port optimization from gooseberry branch:

Treat scrubbing as animation.

This is checked during various updates to avoid
some costly calculations.
This commit is contained in:
Antonis Ryakiotakis 2015-07-29 12:52:03 +02:00
parent 18c0a15e1e
commit 8b84c5f9de
6 changed files with 23 additions and 4 deletions

View File

@ -5948,6 +5948,7 @@ static void lib_link_screen(FileData *fd, Main *main)
sc->scene = main->scene.first;
sc->animtimer = NULL; /* saved in rare cases */
sc->scrubbing = false;
for (sa = sc->areabase.first; sa; sa = sa->next) {
SpaceLink *sl;

View File

@ -148,18 +148,24 @@ static void change_frame_seq_preview_begin(bContext *C, const wmEvent *event)
{
ScrArea *sa = CTX_wm_area(C);
if (sa && sa->spacetype == SPACE_SEQ) {
wmWindow *win = CTX_wm_window(C);
SpaceSeq *sseq = sa->spacedata.first;
if (ED_space_sequencer_check_show_strip(sseq)) {
ED_sequencer_special_preview_set(C, event->mval);
}
if (win->screen)
win->screen->scrubbing = true;
}
}
static void change_frame_seq_preview_end(bContext *C)
{
if (ED_sequencer_special_preview_get() != NULL) {
wmWindow *win = CTX_wm_window(C);
Scene *scene = CTX_data_scene(C);
ED_sequencer_special_preview_clear();
WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene);
if (win->screen)
win->screen->scrubbing = false;
}
}

View File

@ -1314,7 +1314,8 @@ void ED_screen_exit(bContext *C, wmWindow *window, bScreen *screen)
if (screen->animtimer)
WM_event_remove_timer(wm, window, screen->animtimer);
screen->animtimer = NULL;
screen->scrubbing = false;
if (screen->mainwin)
wm_subwindow_close(window, screen->mainwin);
screen->mainwin = 0;

View File

@ -3626,7 +3626,7 @@ bScreen *ED_screen_animation_playing(const wmWindowManager *wm)
wmWindow *win;
for (win = wm->windows.first; win; win = win->next) {
if (win->screen->animtimer) {
if (win->screen->animtimer || win->screen->scrubbing) {
return win->screen;
}
}

View File

@ -139,6 +139,7 @@ static void graphview_cursor_setprops(bContext *C, wmOperator *op, const wmEvent
/* Modal Operator init */
static int graphview_cursor_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
wmWindow *win = CTX_wm_window(C);
/* Change to frame that mouse is over before adding modal handler,
* as user could click on a single frame (jump to frame) as well as
* click-dragging over a range (modal scrubbing).
@ -148,6 +149,9 @@ static int graphview_cursor_invoke(bContext *C, wmOperator *op, const wmEvent *e
/* apply these changes first */
graphview_cursor_apply(C, op);
if (win->screen)
win->screen->scrubbing = true;
/* add temp handler */
WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
@ -156,9 +160,12 @@ static int graphview_cursor_invoke(bContext *C, wmOperator *op, const wmEvent *e
/* Modal event handling of cursor changing */
static int graphview_cursor_modal(bContext *C, wmOperator *op, const wmEvent *event)
{
wmWindow *win = CTX_wm_window(C);
/* execute the events */
switch (event->type) {
case ESCKEY:
if (win->screen)
win->screen->scrubbing = false;
return OPERATOR_FINISHED;
case MOUSEMOVE:
@ -173,8 +180,11 @@ static int graphview_cursor_modal(bContext *C, wmOperator *op, const wmEvent *ev
/* we check for either mouse-button to end, as checking for ACTIONMOUSE (which is used to init
* the modal op) doesn't work for some reason
*/
if (event->val == KM_RELEASE)
if (event->val == KM_RELEASE) {
if (win->screen)
win->screen->scrubbing = false;
return OPERATOR_FINISHED;
}
break;
}

View File

@ -68,7 +68,8 @@ typedef struct bScreen {
char do_draw_drag; /* notifier for dragging draw. */
char swap; /* indicator to survive swap-exchange systems */
char skip_handling; /* set to delay screen handling after switching back from maximized area */
char pad[7];
char scrubbing; /* set when scrubbing to avoid some costly updates */
char pad[6];
short mainwin; /* screensize subwindow, for screenedges and global menus */
short subwinactive; /* active subwindow */