Fix #22553: dragging number buttons would run update functions more often than
necessary due to the more accurate mouse move events that are useful for sculpting and painting (at least on Linux/X11, not sure about other platforms). If the update function takes a while to run, this in turn causes more mouse move events to be accumulated, making things even slower, .. going into a spiral of slower and slower redraws. As a solution I've added a INBETWEEN_MOUSEMOVE event next to MOUSEMOVE. A MOUSEMOVE event is automatically changed to INBETWEEN_MOUSEMOVE when a MOUSEMOVE event is added after it. This new event type is only handled by painting/sculpting operators, everything else can happily ignore it.
This commit is contained in:
@@ -1481,6 +1481,7 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
|
||||
|
||||
/* moving mouse - assumed that mouse button is down if in painting status */
|
||||
case MOUSEMOVE:
|
||||
case INBETWEEN_MOUSEMOVE:
|
||||
/* check if we're currently painting */
|
||||
if (p->status == GP_STATUS_PAINTING) {
|
||||
/* handle drawing event */
|
||||
|
||||
@@ -4872,6 +4872,7 @@ static int paint_modal(bContext *C, wmOperator *op, wmEvent *event)
|
||||
paint_exit(C, op);
|
||||
return OPERATOR_FINISHED;
|
||||
case MOUSEMOVE:
|
||||
case INBETWEEN_MOUSEMOVE:
|
||||
paint_apply_event(C, op, event);
|
||||
break;
|
||||
case TIMER:
|
||||
|
||||
@@ -275,7 +275,7 @@ int paint_stroke_modal(bContext *C, wmOperator *op, wmEvent *event)
|
||||
MEM_freeN(stroke);
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
else if(first || event->type == MOUSEMOVE || (event->type == TIMER && (event->customdata == stroke->timer))) {
|
||||
else if(first || ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE) || (event->type == TIMER && (event->customdata == stroke->timer))) {
|
||||
if(stroke->stroke_started) {
|
||||
if(paint_smooth_stroke(stroke, mouse, event)) {
|
||||
if(paint_space_stroke_enabled(stroke->brush)) {
|
||||
|
||||
@@ -114,6 +114,7 @@ EnumPropertyItem event_type_items[] = {
|
||||
{SELECTMOUSE, "SELECTMOUSE", 0, "Select Mouse", ""},
|
||||
{0, "", 0, NULL, NULL},
|
||||
{MOUSEMOVE, "MOUSEMOVE", 0, "Mouse Move", ""},
|
||||
{INBETWEEN_MOUSEMOVE, "INBETWEEN_MOUSEMOVE", 0, "Inbetween Move", ""},
|
||||
{MOUSEPAN, "TRACKPADPAN", 0, "Mouse/Trackpad Pan", ""},
|
||||
{MOUSEZOOM, "TRACKPADZOOM", 0, "Mouse/Trackpad Zoom", ""},
|
||||
{MOUSEROTATE, "MOUSEROTATE", 0, "Mouse/Trackpad Rotate", ""},
|
||||
|
||||
@@ -1614,7 +1614,7 @@ void wm_event_do_handlers(bContext *C)
|
||||
while( (event= win->queue.first) ) {
|
||||
int action = WM_HANDLER_CONTINUE;
|
||||
|
||||
if((G.f & G_DEBUG) && event && event->type!=MOUSEMOVE)
|
||||
if((G.f & G_DEBUG) && event && !ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE))
|
||||
printf("pass on evt %d val %d\n", event->type, event->val);
|
||||
|
||||
wm_eventemulation(event);
|
||||
@@ -2138,6 +2138,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int t
|
||||
case GHOST_kEventCursorMove: {
|
||||
if(win->active) {
|
||||
GHOST_TEventCursorData *cd= customdata;
|
||||
wmEvent *lastevent= win->queue.last;
|
||||
|
||||
#if defined(__APPLE__) && defined(GHOST_COCOA)
|
||||
//Cocoa already uses coordinates with y=0 at bottom, and returns inwindow coordinates on mouse moved event
|
||||
@@ -2156,6 +2157,12 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int t
|
||||
|
||||
event.type= MOUSEMOVE;
|
||||
|
||||
/* some painting operators want accurate mouse events, they can
|
||||
handle inbetween mouse move moves, others can happily ignore
|
||||
them for better performance */
|
||||
if(lastevent && lastevent->type == MOUSEMOVE)
|
||||
lastevent->type = INBETWEEN_MOUSEMOVE;
|
||||
|
||||
update_tablet_data(win, &event);
|
||||
wm_event_add(win, &event);
|
||||
|
||||
|
||||
@@ -70,6 +70,7 @@
|
||||
/* mapped with userdef */
|
||||
#define WHEELINMOUSE 0x00c
|
||||
#define WHEELOUTMOUSE 0x00d
|
||||
#define INBETWEEN_MOUSEMOVE 0x011
|
||||
|
||||
|
||||
/* SYSTEM : 0x01xx */
|
||||
|
||||
Reference in New Issue
Block a user