Cleanup: make modal event double click handling more straightforward

This commit is contained in:
2019-03-08 14:16:32 +11:00
parent 96af595f63
commit 6db49261cc

View File

@@ -1929,45 +1929,52 @@ static bool wm_eventmatch(const wmEvent *winevent, const wmKeyMapItem *kmi)
return true;
}
static wmKeyMapItem *wm_eventmatch_modal_keymap_items(const wmKeyMap *keymap, wmOperator *op, const wmEvent *event)
{
for (wmKeyMapItem *kmi = keymap->items.first; kmi; kmi = kmi->next) {
if (wm_eventmatch(event, kmi)) {
if ((keymap->poll_modal_item == NULL) ||
(keymap->poll_modal_item(op, kmi->propvalue)))
{
return kmi;
}
}
}
return NULL;
}
/* operator exists */
static void wm_event_modalkeymap(const bContext *C, wmOperator *op, wmEvent *event, bool *dbl_click_disabled)
{
wmOperator *op_init = op;
/* support for modal keymap in macros */
if (op->opm)
op = op->opm;
if (op->type->modalkeymap) {
wmKeyMap *keymap = WM_keymap_active(CTX_wm_manager(C), op->type->modalkeymap);
wmKeyMapItem *kmi;
wmKeyMapItem *kmi = NULL;
for (kmi = keymap->items.first; kmi; kmi = kmi->next) {
if (wm_eventmatch(event, kmi)) {
if ((keymap->poll_modal_item == NULL) ||
(keymap->poll_modal_item(op, kmi->propvalue)))
{
event->prevtype = event->type;
event->prevval = event->val;
event->type = EVT_MODAL_MAP;
event->val = kmi->propvalue;
break;
}
const wmEvent *event_match = NULL;
wmEvent event_no_dbl_click;
if ((kmi = wm_eventmatch_modal_keymap_items(keymap, op, event))) {
event_match = event;
}
else if (event->val == KM_DBL_CLICK) {
event_no_dbl_click = *event;
event_no_dbl_click.val = KM_PRESS;
if ((kmi = wm_eventmatch_modal_keymap_items(keymap, op, &event_no_dbl_click))) {
event_match = &event_no_dbl_click;
}
}
/* If double click isn't handled, re-run this function with with press. */
if ((event->type != EVT_MODAL_MAP) &&
(event->val == KM_DBL_CLICK))
{
event->val = KM_PRESS;
wm_event_modalkeymap(C, op_init, event, NULL);
if (event->type != EVT_MODAL_MAP) {
event->val = KM_DBL_CLICK;
}
if (event_match != NULL) {
event->prevtype = event_match->type;
event->prevval = event_match->val;
event->type = EVT_MODAL_MAP;
event->val = kmi->propvalue;
}
}
else {
/* modal keymap checking returns handled events fine, but all hardcoded modal