Fix own error using handler after freeing
Was introduced in e7895bac07
Only certain actions caused this, reported as T55155
This commit is contained in:
@@ -1979,7 +1979,9 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
|
|||||||
if (ot && wm_operator_check_locked_interface(C, ot)) {
|
if (ot && wm_operator_check_locked_interface(C, ot)) {
|
||||||
bool use_last_properties = true;
|
bool use_last_properties = true;
|
||||||
PointerRNA tool_properties = {0};
|
PointerRNA tool_properties = {0};
|
||||||
if (handler->keymap_tool) {
|
bool use_tool_properties = (handler->keymap_tool != NULL);
|
||||||
|
|
||||||
|
if (use_tool_properties) {
|
||||||
WM_toolsystem_ref_properties_init_for_keymap(handler->keymap_tool, &tool_properties, properties, ot);
|
WM_toolsystem_ref_properties_init_for_keymap(handler->keymap_tool, &tool_properties, properties, ot);
|
||||||
properties = &tool_properties;
|
properties = &tool_properties;
|
||||||
use_last_properties = false;
|
use_last_properties = false;
|
||||||
@@ -1987,7 +1989,7 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
|
|||||||
|
|
||||||
retval = wm_operator_invoke(C, ot, event, properties, NULL, false, use_last_properties);
|
retval = wm_operator_invoke(C, ot, event, properties, NULL, false, use_last_properties);
|
||||||
|
|
||||||
if (handler->keymap_tool) {
|
if (use_tool_properties) {
|
||||||
WM_operator_properties_free(&tool_properties);
|
WM_operator_properties_free(&tool_properties);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2263,6 +2265,7 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
|
|||||||
|
|
||||||
for (kmi = keymap->items.first; kmi; kmi = kmi->next) {
|
for (kmi = keymap->items.first; kmi; kmi = kmi->next) {
|
||||||
if (wm_eventmatch(event, kmi)) {
|
if (wm_eventmatch(event, kmi)) {
|
||||||
|
struct wmEventHandler_KeymapFn keymap_callback = handler->keymap_callback;
|
||||||
|
|
||||||
PRINT("%s: item matched '%s'\n", __func__, kmi->idname);
|
PRINT("%s: item matched '%s'\n", __func__, kmi->idname);
|
||||||
|
|
||||||
@@ -2270,11 +2273,12 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
|
|||||||
event->keymap_idname = kmi->idname;
|
event->keymap_idname = kmi->idname;
|
||||||
|
|
||||||
action |= wm_handler_operator_call(C, handlers, handler, event, kmi->ptr);
|
action |= wm_handler_operator_call(C, handlers, handler, event, kmi->ptr);
|
||||||
|
|
||||||
if (action & WM_HANDLER_BREAK) {
|
if (action & WM_HANDLER_BREAK) {
|
||||||
/* not always_pass here, it denotes removed handler */
|
/* not always_pass here, it denotes removed handler */
|
||||||
CLOG_INFO(WM_LOG_HANDLERS, 2, "handled! '%s'", kmi->idname);
|
CLOG_INFO(WM_LOG_HANDLERS, 2, "handled! '%s'", kmi->idname);
|
||||||
if (handler->keymap_callback != NULL) {
|
if (keymap_callback.handle_post_fn != NULL) {
|
||||||
handler->keymap_callback(keymap, kmi, handler->keymap_callback_user_data);
|
keymap_callback.handle_post_fn(keymap, kmi, keymap_callback.user_data);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2411,6 +2415,7 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
|
|||||||
PRINT("pass\n");
|
PRINT("pass\n");
|
||||||
for (kmi = keymap->items.first; kmi; kmi = kmi->next) {
|
for (kmi = keymap->items.first; kmi; kmi = kmi->next) {
|
||||||
if (wm_eventmatch(event, kmi)) {
|
if (wm_eventmatch(event, kmi)) {
|
||||||
|
struct wmEventHandler_KeymapFn keymap_callback = handler->keymap_callback;
|
||||||
wmOperator *op = handler->op;
|
wmOperator *op = handler->op;
|
||||||
|
|
||||||
PRINT("%s: item matched '%s'\n", __func__, kmi->idname);
|
PRINT("%s: item matched '%s'\n", __func__, kmi->idname);
|
||||||
@@ -2428,8 +2433,8 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
|
|||||||
CTX_wm_manipulator_group_set(C, NULL);
|
CTX_wm_manipulator_group_set(C, NULL);
|
||||||
|
|
||||||
if (action & WM_HANDLER_BREAK) {
|
if (action & WM_HANDLER_BREAK) {
|
||||||
if (handler->keymap_callback != NULL) {
|
if (keymap_callback.handle_post_fn != NULL) {
|
||||||
handler->keymap_callback(keymap, kmi, handler->keymap_callback_user_data);
|
keymap_callback.handle_post_fn(keymap, kmi, keymap_callback.user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (G.debug & (G_DEBUG_EVENTS | G_DEBUG_HANDLERS)) {
|
if (G.debug & (G_DEBUG_EVENTS | G_DEBUG_HANDLERS)) {
|
||||||
@@ -3191,8 +3196,8 @@ void WM_event_set_keymap_handler_callback(
|
|||||||
void (keymap_tag)(wmKeyMap *keymap, wmKeyMapItem *kmi, void *user_data),
|
void (keymap_tag)(wmKeyMap *keymap, wmKeyMapItem *kmi, void *user_data),
|
||||||
void *user_data)
|
void *user_data)
|
||||||
{
|
{
|
||||||
handler->keymap_callback = keymap_tag;
|
handler->keymap_callback.handle_post_fn = keymap_tag;
|
||||||
handler->keymap_callback_user_data = user_data;
|
handler->keymap_callback.user_data = user_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
wmEventHandler *WM_event_add_ui_handler(
|
wmEventHandler *WM_event_add_ui_handler(
|
||||||
|
|||||||
@@ -42,6 +42,11 @@ struct ARegion;
|
|||||||
|
|
||||||
/* wmKeyMap is in DNA_windowmanager.h, it's savable */
|
/* wmKeyMap is in DNA_windowmanager.h, it's savable */
|
||||||
|
|
||||||
|
struct wmEventHandler_KeymapFn {
|
||||||
|
void (*handle_post_fn)(wmKeyMap *keymap, wmKeyMapItem *kmi, void *user_data);
|
||||||
|
void *user_data;
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct wmEventHandler {
|
typedef struct wmEventHandler {
|
||||||
struct wmEventHandler *next, *prev;
|
struct wmEventHandler *next, *prev;
|
||||||
|
|
||||||
@@ -52,8 +57,8 @@ typedef struct wmEventHandler {
|
|||||||
wmKeyMap *keymap; /* pointer to builtin/custom keymaps */
|
wmKeyMap *keymap; /* pointer to builtin/custom keymaps */
|
||||||
const rcti *bblocal, *bbwin; /* optional local and windowspace bb */
|
const rcti *bblocal, *bbwin; /* optional local and windowspace bb */
|
||||||
/* Run after the keymap item runs. */
|
/* Run after the keymap item runs. */
|
||||||
void (*keymap_callback)(wmKeyMap *keymap, wmKeyMapItem *kmi, void *user_data);
|
struct wmEventHandler_KeymapFn keymap_callback;
|
||||||
void *keymap_callback_user_data;
|
|
||||||
struct bToolRef *keymap_tool;
|
struct bToolRef *keymap_tool;
|
||||||
|
|
||||||
/* modal operator handler */
|
/* modal operator handler */
|
||||||
|
|||||||
Reference in New Issue
Block a user