diff options
Diffstat (limited to 'source/blender/windowmanager/intern/wm_event_system.c')
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 128 |
1 files changed, 71 insertions, 57 deletions
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index bc24b7698e2..0581d41ea04 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -98,7 +98,7 @@ static void wm_notifier_clear(wmNotifier *note); static void update_tablet_data(wmWindow *win, wmEvent *event); static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, PointerRNA *properties, ReportList *reports, - const short context, const bool poll_only); + const short context, const bool poll_only, wmEvent *event); /* ************ event management ************** */ @@ -638,7 +638,7 @@ bool WM_operator_poll(bContext *C, wmOperatorType *ot) /* sets up the new context and calls 'wm_operator_invoke()' with poll_only */ bool WM_operator_poll_context(bContext *C, wmOperatorType *ot, short context) { - return wm_operator_call_internal(C, ot, NULL, NULL, context, true); + return wm_operator_call_internal(C, ot, NULL, NULL, context, true, NULL); } bool WM_operator_check_ui_empty(wmOperatorType *ot) @@ -1431,10 +1431,8 @@ static int wm_operator_invoke( */ static int wm_operator_call_internal( bContext *C, wmOperatorType *ot, PointerRNA *properties, ReportList *reports, - const short context, const bool poll_only) + const short context, const bool poll_only, wmEvent *event) { - wmEvent *event; - int retval; CTX_wm_operator_poll_msg_set(C, NULL); @@ -1443,27 +1441,29 @@ static int wm_operator_call_internal( if (ot) { wmWindow *window = CTX_wm_window(C); - switch (context) { - case WM_OP_INVOKE_DEFAULT: - case WM_OP_INVOKE_REGION_WIN: - case WM_OP_INVOKE_REGION_PREVIEW: - case WM_OP_INVOKE_REGION_CHANNELS: - case WM_OP_INVOKE_AREA: - case WM_OP_INVOKE_SCREEN: - /* window is needed for invoke, cancel operator */ - if (window == NULL) { - if (poll_only) { - CTX_wm_operator_poll_msg_set(C, "Missing 'window' in context"); + if (event == NULL) { + switch (context) { + case WM_OP_INVOKE_DEFAULT: + case WM_OP_INVOKE_REGION_WIN: + case WM_OP_INVOKE_REGION_PREVIEW: + case WM_OP_INVOKE_REGION_CHANNELS: + case WM_OP_INVOKE_AREA: + case WM_OP_INVOKE_SCREEN: + /* window is needed for invoke, cancel operator */ + if (window == NULL) { + if (poll_only) { + CTX_wm_operator_poll_msg_set(C, "Missing 'window' in context"); + } + return 0; } - return 0; - } - else { - event = window->eventstate; - } - break; - default: - event = NULL; - break; + else { + event = window->eventstate; + } + break; + default: + event = NULL; + break; + } } switch (context) { @@ -1561,7 +1561,7 @@ static int wm_operator_call_internal( int WM_operator_name_call_ptr(bContext *C, wmOperatorType *ot, short context, PointerRNA *properties) { BLI_assert(ot == WM_operatortype_find(ot->idname, true)); - return wm_operator_call_internal(C, ot, properties, NULL, context, false); + return wm_operator_call_internal(C, ot, properties, NULL, context, false, NULL); } int WM_operator_name_call(bContext *C, const char *opstring, short context, PointerRNA *properties) { @@ -1627,7 +1627,7 @@ int WM_operator_call_py( wmWindowManager *wm = CTX_wm_manager(C); if (!is_undo && wm) wm->op_undo_depth++; - retval = wm_operator_call_internal(C, ot, properties, reports, context, false); + retval = wm_operator_call_internal(C, ot, properties, reports, context, false, NULL); if (!is_undo && wm && (wm == CTX_wm_manager(C))) wm->op_undo_depth--; @@ -2368,18 +2368,28 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers wmDrag *drag; for (drag = lb->first; drag; drag = drag->next) { - if (drop->poll(C, drag, event)) { - drop->copy(drag, drop); + const char *tooltip = NULL; + if (drop->poll(C, drag, event, &tooltip)) { + /* Optionally copy drag information to operator properties. */ + if (drop->copy) { + drop->copy(drag, drop); + } - /* free the drags before calling operator */ + /* Pass single matched wmDrag onto the operator. */ + BLI_remlink(lb, drag); + ListBase single_lb = {drag, drag}; + event->customdata = &single_lb; + + wm_operator_call_internal(C, drop->ot, drop->ptr, NULL, drop->opcontext, false, event); + action |= WM_HANDLER_BREAK; + + /* free the drags */ WM_drag_free_list(lb); + WM_drag_free_list(&single_lb); event->customdata = NULL; event->custom = 0; - WM_operator_name_call_ptr(C, drop->ot, drop->opcontext, drop->ptr); - action |= WM_HANDLER_BREAK; - /* XXX fileread case */ if (CTX_wm_window(C) == NULL) return action; @@ -2395,8 +2405,8 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers else if (handler->gizmo_map) { ScrArea *area = CTX_wm_area(C); ARegion *region = CTX_wm_region(C); - wmGizmoMap *mmap = handler->gizmo_map; - wmGizmo *mpr = wm_gizmomap_highlight_get(mmap); + wmGizmoMap *gzmap = handler->gizmo_map; + wmGizmo *gz = wm_gizmomap_highlight_get(gzmap); if (region->gizmo_map != handler->gizmo_map) { WM_gizmomap_tag_refresh(handler->gizmo_map); @@ -2406,10 +2416,10 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers wm_region_mouse_co(C, event); /* handle gizmo highlighting */ - if (event->type == MOUSEMOVE && !wm_gizmomap_modal_get(mmap)) { + if (event->type == MOUSEMOVE && !wm_gizmomap_modal_get(gzmap)) { int part; - mpr = wm_gizmomap_highlight_find(mmap, C, event, &part); - if (wm_gizmomap_highlight_set(mmap, C, mpr, part) && mpr != NULL) { + gz = wm_gizmomap_highlight_find(gzmap, C, event, &part); + if (wm_gizmomap_highlight_set(gzmap, C, gz, part) && gz != NULL) { WM_tooltip_timer_init(C, CTX_wm_window(C), region, WM_gizmomap_tooltip_init); } } @@ -2417,45 +2427,45 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers /* Either we operate on a single highlighted item * or groups attached to the selected gizmos. * To simplify things both cases loop over an array of items. */ - wmGizmoGroup *mgroup_first; - bool is_mgroup_single; + wmGizmoGroup *gzgroup_first; + bool is_gzgroup_single; if (ISMOUSE(event->type)) { - /* Keep mpr set as-is, just fake single selection. */ - if (mpr) { - mgroup_first = mpr->parent_mgroup; + /* Keep gz set as-is, just fake single selection. */ + if (gz) { + gzgroup_first = gz->parent_gzgroup; } else { - mgroup_first = NULL; + gzgroup_first = NULL; } - is_mgroup_single = true; + is_gzgroup_single = true; } else { - if (WM_gizmomap_is_any_selected(mmap)) { - const ListBase *groups = WM_gizmomap_group_list(mmap); - mgroup_first = groups->first; + if (WM_gizmomap_is_any_selected(gzmap)) { + const ListBase *groups = WM_gizmomap_group_list(gzmap); + gzgroup_first = groups->first; } else { - mgroup_first = NULL; + gzgroup_first = NULL; } - is_mgroup_single = false; + is_gzgroup_single = false; } /* Don't use from now on. */ - mpr = NULL; + gz = NULL; - for (wmGizmoGroup *mgroup = mgroup_first; mgroup; mgroup = mgroup->next) { + for (wmGizmoGroup *gzgroup = gzgroup_first; gzgroup; gzgroup = gzgroup->next) { /* get user customized keymap from default one */ - if ((is_mgroup_single == false) && + if ((is_gzgroup_single == false) && /* We might want to change the logic here and use some kind of gizmo edit-mode. * For now just use keymap when a selection exists. */ - wm_gizmogroup_is_any_selected(mgroup) == false) + wm_gizmogroup_is_any_selected(gzgroup) == false) { continue; } - wmKeyMap *keymap = WM_keymap_active(wm, mgroup->type->keymap); + wmKeyMap *keymap = WM_keymap_active(wm, gzgroup->type->keymap); wmKeyMapItem *kmi; PRINT("%s: checking '%s' ...", __func__, keymap->idname); @@ -2472,7 +2482,7 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers /* weak, but allows interactive callback to not use rawkey */ event->keymap_idname = kmi->idname; - CTX_wm_gizmo_group_set(C, mgroup); + CTX_wm_gizmo_group_set(C, gzgroup); /* handler->op is called later, we want keymap op to be triggered here */ handler->op = NULL; @@ -2515,7 +2525,7 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers break; } - if (is_mgroup_single) { + if (is_gzgroup_single) { break; } } @@ -4569,7 +4579,11 @@ bool WM_window_modal_keymap_status_draw( continue; } int icon_mod[4]; +#ifdef WITH_HEADLESS + int icon = 0; +#else int icon = UI_icon_from_keymap_item(kmi, icon_mod); +#endif if (icon != 0) { for (int j = 0; j < ARRAY_SIZE(icon_mod) && icon_mod[j]; j++) { uiItemL(row, "", icon_mod[j]); |