Cleanup: make modal event double click handling more straightforward
This commit is contained in:
@@ -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
|
||||
|
Reference in New Issue
Block a user