forked from bartvdbraak/blender
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:
parent
18c0a15e1e
commit
8b84c5f9de
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1314,6 +1314,7 @@ 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);
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user