WM: move keymap handler to it's own type
Illuminate dead code, using wmEventHandler_KeymapFn from gizmo handler type where it was never set.
This commit is contained in:
parent
d718338828
commit
bb6692be8a
|
@ -76,7 +76,7 @@ struct uiPopover {
|
|||
/* Needed for keymap removal. */
|
||||
wmWindow *window;
|
||||
wmKeyMap *keymap;
|
||||
struct wmEventHandler *keymap_handler;
|
||||
struct wmEventHandler_Keymap *keymap_handler;
|
||||
|
||||
uiMenuCreateFunc menu_func;
|
||||
void *menu_arg;
|
||||
|
|
|
@ -58,6 +58,7 @@ struct wmDrag;
|
|||
struct wmDropBox;
|
||||
struct wmEvent;
|
||||
struct wmEventHandler;
|
||||
struct wmEventHandler_Keymap;
|
||||
struct wmGesture;
|
||||
struct wmJob;
|
||||
struct wmMsgSubscribeKey;
|
||||
|
@ -187,16 +188,19 @@ int WM_userdef_event_type_from_keymap_type(int kmitype);
|
|||
|
||||
/* handlers */
|
||||
|
||||
struct wmEventHandler *WM_event_add_keymap_handler(ListBase *handlers, wmKeyMap *keymap);
|
||||
/* boundbox, optional subwindow boundbox for offset */
|
||||
struct wmEventHandler *WM_event_add_keymap_handler_bb(ListBase *handlers, wmKeyMap *keymap, const rcti *bb, const rcti *swinbb);
|
||||
/* priority not implemented, it adds in begin */
|
||||
struct wmEventHandler *WM_event_add_keymap_handler_priority(ListBase *handlers, wmKeyMap *keymap, int priority);
|
||||
struct wmEventHandler_Keymap *WM_event_add_keymap_handler(
|
||||
ListBase *handlers, wmKeyMap *keymap);
|
||||
/* boundbox, optional subwindow boundbox for offset */
|
||||
struct wmEventHandler_Keymap *WM_event_add_keymap_handler_bb(
|
||||
ListBase *handlers, wmKeyMap *keymap, const rcti *bb, const rcti *swinbb);
|
||||
/* priority not implemented, it adds in begin */
|
||||
struct wmEventHandler_Keymap *WM_event_add_keymap_handler_priority(
|
||||
ListBase *handlers, wmKeyMap *keymap, int priority);
|
||||
|
||||
void WM_event_remove_keymap_handler(ListBase *handlers, wmKeyMap *keymap);
|
||||
|
||||
void WM_event_set_keymap_handler_callback(
|
||||
struct wmEventHandler *handler,
|
||||
struct wmEventHandler_Keymap *handler,
|
||||
void (keymap_tag)(wmKeyMap *keymap, wmKeyMapItem *kmi, void *user_data),
|
||||
void *user_data);
|
||||
|
||||
|
|
|
@ -2071,11 +2071,15 @@ static int wm_handler_operator_call(
|
|||
if (ot && wm_operator_check_locked_interface(C, ot)) {
|
||||
bool use_last_properties = true;
|
||||
PointerRNA tool_properties = {{0}};
|
||||
const bool is_tool = (handler_base->keymap_tool != NULL);
|
||||
|
||||
bToolRef *keymap_tool = (
|
||||
(handler_base->type == WM_HANDLER_TYPE_KEYMAP) ?
|
||||
((wmEventHandler_Keymap *)handler_base)->keymap_tool : NULL);
|
||||
const bool is_tool = (keymap_tool != NULL);
|
||||
const bool use_tool_properties = is_tool;
|
||||
|
||||
if (use_tool_properties) {
|
||||
WM_toolsystem_ref_properties_init_for_keymap(handler_base->keymap_tool, &tool_properties, properties, ot);
|
||||
WM_toolsystem_ref_properties_init_for_keymap(keymap_tool, &tool_properties, properties, ot);
|
||||
properties = &tool_properties;
|
||||
use_last_properties = false;
|
||||
}
|
||||
|
@ -2089,7 +2093,7 @@ static int wm_handler_operator_call(
|
|||
/* Link gizmo if 'WM_GIZMOGROUPTYPE_TOOL_INIT' is set. */
|
||||
if (retval & OPERATOR_FINISHED) {
|
||||
if (is_tool) {
|
||||
bToolRef_Runtime *tref_rt = handler_base->keymap_tool->runtime;
|
||||
bToolRef_Runtime *tref_rt = keymap_tool->runtime;
|
||||
if (tref_rt->gizmo_group[0]) {
|
||||
const char *idname = tref_rt->gizmo_group;
|
||||
wmGizmoGroupType *gzgt = WM_gizmogrouptype_find(idname, false);
|
||||
|
@ -2372,8 +2376,9 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
|
|||
if (handler->flag & WM_HANDLER_BLOCKING)
|
||||
action |= WM_HANDLER_BREAK;
|
||||
|
||||
if (handler->keymap) {
|
||||
wmKeyMap *keymap = WM_keymap_active(wm, handler->keymap);
|
||||
if (handler->type == WM_HANDLER_TYPE_KEYMAP) {
|
||||
wmEventHandler_Keymap *handler_km = (wmEventHandler_Keymap *)handler;
|
||||
wmKeyMap *keymap = WM_keymap_active(wm, handler_km->keymap);
|
||||
wmKeyMapItem *kmi;
|
||||
|
||||
PRINT("%s: checking '%s' ...", __func__, keymap->idname);
|
||||
|
@ -2384,7 +2389,7 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
|
|||
|
||||
for (kmi = keymap->items.first; kmi; kmi = kmi->next) {
|
||||
if (wm_eventmatch(event, kmi)) {
|
||||
struct wmEventHandler_KeymapFn keymap_callback = handler->keymap_callback;
|
||||
struct wmEventHandler_KeymapFn keymap_callback = handler_km->keymap_callback;
|
||||
|
||||
PRINT("%s: item matched '%s'\n", __func__, kmi->idname);
|
||||
|
||||
|
@ -2553,7 +2558,6 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
|
|||
PRINT("pass\n");
|
||||
for (kmi = keymap->items.first; kmi; kmi = kmi->next) {
|
||||
if (wm_eventmatch(event, kmi)) {
|
||||
struct wmEventHandler_KeymapFn keymap_callback = handler->keymap_callback;
|
||||
PRINT("%s: item matched '%s'\n", __func__, kmi->idname);
|
||||
|
||||
/* weak, but allows interactive callback to not use rawkey */
|
||||
|
@ -2567,10 +2571,6 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
|
|||
CTX_wm_gizmo_group_set(C, NULL);
|
||||
|
||||
if (action & WM_HANDLER_BREAK) {
|
||||
if (keymap_callback.handle_post_fn != NULL) {
|
||||
keymap_callback.handle_post_fn(keymap, kmi, keymap_callback.user_data);
|
||||
}
|
||||
|
||||
if (G.debug & (G_DEBUG_EVENTS | G_DEBUG_HANDLERS)) {
|
||||
printf("%s: handled - and pass on! '%s'\n",
|
||||
__func__, kmi->idname);
|
||||
|
@ -2902,7 +2902,7 @@ static bool wm_event_pie_filter(wmWindow *win, const wmEvent *event)
|
|||
|
||||
#ifdef USE_WORKSPACE_TOOL
|
||||
static void wm_event_temp_tool_handler_apply(
|
||||
bContext *C, ScrArea *sa, ARegion *ar, wmEventHandler *sneaky_handler)
|
||||
bContext *C, ScrArea *sa, ARegion *ar, wmEventHandler_Keymap *sneaky_handler)
|
||||
{
|
||||
if (ar->regiontype == RGN_TYPE_WINDOW) {
|
||||
bToolRef_Runtime *tref_rt = sa->runtime.tool ? sa->runtime.tool->runtime : NULL;
|
||||
|
@ -2912,6 +2912,7 @@ static void wm_event_temp_tool_handler_apply(
|
|||
/* We shouldn't use keymaps from unrelated spaces. */
|
||||
if (km != NULL) {
|
||||
// printf("Keymap: '%s' -> '%s'\n", tref_rt->keymap, sa->runtime.tool->idname);
|
||||
sneaky_handler->base.type = WM_HANDLER_TYPE_KEYMAP;
|
||||
sneaky_handler->keymap = km;
|
||||
sneaky_handler->keymap_tool = sa->runtime.tool;
|
||||
|
||||
|
@ -2931,7 +2932,7 @@ static void wm_event_temp_tool_handler_apply(
|
|||
}
|
||||
|
||||
static void wm_event_temp_tool_handler_clear(
|
||||
bContext *UNUSED(C), ScrArea *UNUSED(sa), ARegion *ar, wmEventHandler *sneaky_handler)
|
||||
bContext *UNUSED(C), ScrArea *UNUSED(sa), ARegion *ar, wmEventHandler_Keymap *sneaky_handler)
|
||||
{
|
||||
if (sneaky_handler->keymap) {
|
||||
BLI_remlink(&ar->handlers, sneaky_handler);
|
||||
|
@ -3122,7 +3123,7 @@ void wm_event_do_handlers(bContext *C)
|
|||
* We might need to add a more dynamic handler type that uses a callback
|
||||
* to fetch its current keymap.
|
||||
*/
|
||||
wmEventHandler sneaky_handler = {NULL};
|
||||
wmEventHandler_Keymap sneaky_handler = {NULL};
|
||||
wm_event_temp_tool_handler_apply(C, sa, ar, &sneaky_handler);
|
||||
#endif /* USE_WORKSPACE_TOOL */
|
||||
|
||||
|
@ -3369,21 +3370,25 @@ void WM_event_modal_handler_region_replace(wmWindow *win, const ARegion *old_reg
|
|||
}
|
||||
}
|
||||
|
||||
wmEventHandler *WM_event_add_keymap_handler(ListBase *handlers, wmKeyMap *keymap)
|
||||
wmEventHandler_Keymap *WM_event_add_keymap_handler(ListBase *handlers, wmKeyMap *keymap)
|
||||
{
|
||||
wmEventHandler *handler;
|
||||
|
||||
if (!keymap) {
|
||||
CLOG_WARN(WM_LOG_HANDLERS, "called with NULL keymap");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* only allow same keymap once */
|
||||
for (handler = handlers->first; handler; handler = handler->next)
|
||||
if (handler->keymap == keymap)
|
||||
return handler;
|
||||
for (wmEventHandler *handler_base = handlers->first; handler_base; handler_base = handler_base->next) {
|
||||
if (handler_base->type == WM_HANDLER_TYPE_KEYMAP) {
|
||||
wmEventHandler_Keymap *handler = (wmEventHandler_Keymap *)handler_base;
|
||||
if (handler->keymap == keymap) {
|
||||
return handler;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
handler = MEM_callocN(sizeof(wmEventHandler), "event keymap handler");
|
||||
wmEventHandler_Keymap *handler = MEM_callocN(sizeof(*handler), __func__);
|
||||
handler->base.type = WM_HANDLER_TYPE_KEYMAP;
|
||||
BLI_addtail(handlers, handler);
|
||||
handler->keymap = keymap;
|
||||
|
||||
|
@ -3391,45 +3396,46 @@ wmEventHandler *WM_event_add_keymap_handler(ListBase *handlers, wmKeyMap *keymap
|
|||
}
|
||||
|
||||
/* priorities not implemented yet, for time being just insert in begin of list */
|
||||
wmEventHandler *WM_event_add_keymap_handler_priority(ListBase *handlers, wmKeyMap *keymap, int UNUSED(priority))
|
||||
wmEventHandler_Keymap *WM_event_add_keymap_handler_priority(ListBase *handlers, wmKeyMap *keymap, int UNUSED(priority))
|
||||
{
|
||||
wmEventHandler *handler;
|
||||
|
||||
WM_event_remove_keymap_handler(handlers, keymap);
|
||||
|
||||
handler = MEM_callocN(sizeof(wmEventHandler), "event keymap handler");
|
||||
wmEventHandler_Keymap *handler = MEM_callocN(sizeof(*handler), "event keymap handler");
|
||||
handler->base.type = WM_HANDLER_TYPE_KEYMAP;
|
||||
|
||||
BLI_addhead(handlers, handler);
|
||||
handler->keymap = keymap;
|
||||
|
||||
return handler;
|
||||
}
|
||||
|
||||
wmEventHandler *WM_event_add_keymap_handler_bb(ListBase *handlers, wmKeyMap *keymap, const rcti *bblocal, const rcti *bbwin)
|
||||
wmEventHandler_Keymap *WM_event_add_keymap_handler_bb(ListBase *handlers, wmKeyMap *keymap, const rcti *bblocal, const rcti *bbwin)
|
||||
{
|
||||
wmEventHandler *handler = WM_event_add_keymap_handler(handlers, keymap);
|
||||
wmEventHandler_Keymap *handler = WM_event_add_keymap_handler(handlers, keymap);
|
||||
|
||||
if (handler) {
|
||||
handler->bblocal = bblocal;
|
||||
handler->bbwin = bbwin;
|
||||
handler->base.bblocal = bblocal;
|
||||
handler->base.bbwin = bbwin;
|
||||
}
|
||||
return handler;
|
||||
}
|
||||
|
||||
void WM_event_remove_keymap_handler(ListBase *handlers, wmKeyMap *keymap)
|
||||
{
|
||||
wmEventHandler *handler;
|
||||
|
||||
for (handler = handlers->first; handler; handler = handler->next) {
|
||||
if (handler->keymap == keymap) {
|
||||
BLI_remlink(handlers, handler);
|
||||
wm_event_free_handler(handler);
|
||||
break;
|
||||
for (wmEventHandler *handler_base = handlers->first; handler_base; handler_base = handler_base->next) {
|
||||
if (handler_base->type == WM_HANDLER_TYPE_KEYMAP) {
|
||||
wmEventHandler_Keymap *handler = (wmEventHandler_Keymap *)handler_base;
|
||||
if (handler->keymap == keymap) {
|
||||
BLI_remlink(handlers, handler);
|
||||
wm_event_free_handler(&handler->base);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WM_event_set_keymap_handler_callback(
|
||||
wmEventHandler *handler,
|
||||
wmEventHandler_Keymap *handler,
|
||||
void (keymap_tag)(wmKeyMap *keymap, wmKeyMapItem *kmi, void *user_data),
|
||||
void *user_data)
|
||||
{
|
||||
|
@ -4482,13 +4488,14 @@ static wmKeyMapItem *wm_kmi_from_event(
|
|||
bContext *C, wmWindowManager *wm,
|
||||
ListBase *handlers, const wmEvent *event)
|
||||
{
|
||||
for (wmEventHandler *handler = handlers->first; handler; handler = handler->next) {
|
||||
for (wmEventHandler *handler_base = handlers->first; handler_base; handler_base = handler_base->next) {
|
||||
/* during this loop, ui handlers for nested menus can tag multiple handlers free */
|
||||
if (handler->flag & WM_HANDLER_DO_FREE) {
|
||||
if (handler_base->flag & WM_HANDLER_DO_FREE) {
|
||||
/* pass */
|
||||
}
|
||||
else if (handler_boundbox_test(handler, event)) { /* optional boundbox */
|
||||
if (handler->keymap) {
|
||||
else if (handler_boundbox_test(handler_base, event)) { /* optional boundbox */
|
||||
if (handler_base->type == WM_HANDLER_TYPE_KEYMAP) {
|
||||
wmEventHandler_Keymap *handler = (wmEventHandler_Keymap *)handler_base;
|
||||
wmKeyMap *keymap = WM_keymap_active(wm, handler->keymap);
|
||||
if (WM_keymap_poll(C, keymap)) {
|
||||
for (wmKeyMapItem *kmi = keymap->items.first; kmi; kmi = kmi->next) {
|
||||
|
@ -4694,7 +4701,7 @@ void WM_window_cursor_keymap_status_refresh(bContext *C, wmWindow *win)
|
|||
CTX_wm_region_set(C, ar);
|
||||
|
||||
#ifdef USE_WORKSPACE_TOOL
|
||||
wmEventHandler sneaky_handler = {NULL};
|
||||
wmEventHandler_Keymap sneaky_handler = {NULL};
|
||||
wm_event_temp_tool_handler_apply(C, sa, ar, &sneaky_handler);
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1226,20 +1226,22 @@ static wmKeyMapItem *wm_keymap_item_find_handlers(
|
|||
wmKeyMap **r_keymap)
|
||||
{
|
||||
wmWindowManager *wm = CTX_wm_manager(C);
|
||||
wmEventHandler *handler;
|
||||
wmKeyMap *keymap;
|
||||
|
||||
/* find keymap item in handlers */
|
||||
for (handler = handlers->first; handler; handler = handler->next) {
|
||||
keymap = WM_keymap_active(wm, handler->keymap);
|
||||
if (keymap && WM_keymap_poll((bContext *)C, keymap)) {
|
||||
wmKeyMapItem *kmi = wm_keymap_item_find_in_keymap(
|
||||
keymap, opname, properties, is_strict, params);
|
||||
if (kmi != NULL) {
|
||||
if (r_keymap) {
|
||||
*r_keymap = keymap;
|
||||
for (wmEventHandler *handler_base = handlers->first; handler_base; handler_base = handler_base->next) {
|
||||
if (handler_base->type == WM_HANDLER_TYPE_KEYMAP) {
|
||||
wmEventHandler_Keymap *handler = (wmEventHandler_Keymap *)handler_base;
|
||||
keymap = WM_keymap_active(wm, handler->keymap);
|
||||
if (keymap && WM_keymap_poll((bContext *)C, keymap)) {
|
||||
wmKeyMapItem *kmi = wm_keymap_item_find_in_keymap(
|
||||
keymap, opname, properties, is_strict, params);
|
||||
if (kmi != NULL) {
|
||||
if (r_keymap) {
|
||||
*r_keymap = keymap;
|
||||
}
|
||||
return kmi;
|
||||
}
|
||||
return kmi;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,6 +47,7 @@ enum eWM_EventHandlerType {
|
|||
WM_HANDLER_TYPE_UI,
|
||||
WM_HANDLER_TYPE_OP,
|
||||
WM_HANDLER_TYPE_DROPBOX,
|
||||
WM_HANDLER_TYPE_KEYMAP,
|
||||
};
|
||||
|
||||
typedef struct wmEventHandler {
|
||||
|
@ -55,14 +56,21 @@ typedef struct wmEventHandler {
|
|||
enum eWM_EventHandlerType type;
|
||||
char flag; /* WM_HANDLER_BLOCKING, ... */
|
||||
|
||||
/* keymap handler */
|
||||
wmKeyMap *keymap; /* pointer to builtin/custom keymaps */
|
||||
const rcti *bblocal, *bbwin; /* optional local and windowspace bb */
|
||||
/* Run after the keymap item runs. */
|
||||
/** Optional local and windowspace bb. */
|
||||
const rcti *bblocal, *bbwin;
|
||||
} wmEventHandler;
|
||||
|
||||
/** #WM_HANDLER_TYPE_KEYMAP */
|
||||
typedef struct wmEventHandler_Keymap {
|
||||
wmEventHandler base;
|
||||
|
||||
/** Pointer to builtin/custom keymaps (never NULL). */
|
||||
wmKeyMap *keymap;
|
||||
/** Run after the keymap item runs. */
|
||||
struct wmEventHandler_KeymapFn keymap_callback;
|
||||
|
||||
struct bToolRef *keymap_tool;
|
||||
} wmEventHandler;
|
||||
} wmEventHandler_Keymap;
|
||||
|
||||
/** #WM_HANDLER_TYPE_GIZMO */
|
||||
typedef struct wmEventHandler_Gizmo {
|
||||
|
|
Loading…
Reference in New Issue