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:
Campbell Barton 2019-02-19 16:09:14 +11:00
parent d718338828
commit bb6692be8a
5 changed files with 85 additions and 64 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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;
}
}
}

View File

@ -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 {