Refactor: allow event handlers to have a poll function
Previously only a fixed bounding box could be used. This was not flexible enough. T63193 will benefit from this refactor. Reviewers: brecht, campbellbarton
This commit is contained in:
parent
7a92b8820b
commit
ea80264381
|
@ -1550,6 +1550,13 @@ static void region_subwindow(ARegion *ar)
|
|||
ar->visible = !hidden;
|
||||
}
|
||||
|
||||
static bool event_in_markers_region(const ARegion *ar, const wmEvent *event)
|
||||
{
|
||||
rcti rect = ar->winrct;
|
||||
rect.ymax = rect.ymin + UI_MARKER_MARGIN_Y;
|
||||
return BLI_rcti_isect_pt(&rect, event->x, event->y);
|
||||
}
|
||||
|
||||
/**
|
||||
* \param ar: Region, may be NULL when adding handlers for \a sa.
|
||||
*/
|
||||
|
@ -1591,13 +1598,7 @@ static void ed_default_handlers(
|
|||
if (flag & ED_KEYMAP_MARKERS) {
|
||||
/* time-markers */
|
||||
wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "Markers", 0, 0);
|
||||
|
||||
/* use a boundbox restricted map */
|
||||
/* same local check for all areas */
|
||||
static rcti rect = {0, 10000, 0, -1};
|
||||
rect.ymax = UI_MARKER_MARGIN_Y;
|
||||
BLI_assert(ar->type->regionid == RGN_TYPE_WINDOW);
|
||||
WM_event_add_keymap_handler_bb(handlers, keymap, &rect, &ar->winrct);
|
||||
WM_event_add_keymap_handler_poll(handlers, keymap, event_in_markers_region);
|
||||
}
|
||||
if (flag & ED_KEYMAP_ANIMATION) {
|
||||
/* frame changing and timeline operators (for time spaces) */
|
||||
|
|
|
@ -166,7 +166,7 @@ static void action_main_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
|
||||
/* own keymap */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Dopesheet", SPACE_ACTION, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Dopesheet Generic", SPACE_ACTION, 0);
|
||||
WM_event_add_keymap_handler(&ar->handlers, keymap);
|
||||
}
|
||||
|
@ -271,7 +271,7 @@ static void action_channel_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
|
||||
/* own keymap */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Animation Channels", 0, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Dopesheet Generic", SPACE_ACTION, 0);
|
||||
WM_event_add_keymap_handler(&ar->handlers, keymap);
|
||||
|
|
|
@ -859,14 +859,14 @@ static void clip_main_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
|
||||
/* mask polls mode */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Mask Editing", 0, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
/* own keymap */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Clip", SPACE_CLIP, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Clip Editor", SPACE_CLIP, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
}
|
||||
|
||||
static void clip_main_region_draw(const bContext *C, ARegion *ar)
|
||||
|
@ -1002,13 +1002,13 @@ static void clip_preview_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
|
||||
/* own keymap */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Clip", SPACE_CLIP, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Clip Graph Editor", SPACE_CLIP, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Clip Dopesheet Editor", SPACE_CLIP, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
}
|
||||
|
||||
static void graph_region_draw(const bContext *C, ARegion *ar)
|
||||
|
@ -1140,7 +1140,7 @@ static void clip_channels_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy);
|
||||
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Clip Dopesheet Editor", SPACE_CLIP, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
}
|
||||
|
||||
static void clip_channels_region_draw(const bContext *C, ARegion *ar)
|
||||
|
|
|
@ -136,7 +136,7 @@ static void console_main_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
|
||||
/* own keymap */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Console", SPACE_CONSOLE, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
/* add drop boxes */
|
||||
lb = WM_dropboxmap_find("Console", SPACE_CONSOLE, RGN_TYPE_WINDOW);
|
||||
|
|
|
@ -316,10 +316,10 @@ static void file_main_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
|
||||
/* own keymaps */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "File Browser", SPACE_FILE, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "File Browser Main", SPACE_FILE, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
}
|
||||
|
||||
static void file_main_region_listener(wmWindow *UNUSED(win),
|
||||
|
@ -498,7 +498,7 @@ static void file_tools_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
|
||||
/* own keymaps */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "File Browser", SPACE_FILE, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
}
|
||||
|
||||
static void file_tools_region_draw(const bContext *C, ARegion *ar)
|
||||
|
@ -528,7 +528,7 @@ static void file_header_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
ED_region_header_init(ar);
|
||||
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "File Browser", SPACE_FILE, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
}
|
||||
|
||||
static void file_header_region_draw(const bContext *C, ARegion *ar)
|
||||
|
@ -545,10 +545,10 @@ static void file_ui_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
|
||||
/* own keymap */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "File Browser", SPACE_FILE, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "File Browser Buttons", SPACE_FILE, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
}
|
||||
|
||||
static void file_ui_region_draw(const bContext *C, ARegion *ar)
|
||||
|
|
|
@ -186,7 +186,7 @@ static void graph_main_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
|
||||
/* own keymap */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Graph Editor", SPACE_GRAPH, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Graph Editor Generic", SPACE_GRAPH, 0);
|
||||
WM_event_add_keymap_handler(&ar->handlers, keymap);
|
||||
}
|
||||
|
@ -353,7 +353,7 @@ static void graph_channel_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
|
||||
/* own keymap */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Animation Channels", 0, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Graph Editor Generic", SPACE_GRAPH, 0);
|
||||
WM_event_add_keymap_handler(&ar->handlers, keymap);
|
||||
}
|
||||
|
@ -406,7 +406,7 @@ static void graph_buttons_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
ED_region_panels_init(wm, ar);
|
||||
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Graph Editor Generic", SPACE_GRAPH, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
}
|
||||
|
||||
static void graph_buttons_region_draw(const bContext *C, ARegion *ar)
|
||||
|
|
|
@ -536,17 +536,17 @@ static void image_main_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
|
||||
/* mask polls mode */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Mask Editing", 0, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
/* image paint polls for mode */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Curve", 0, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Paint Curve", 0, 0);
|
||||
WM_event_add_keymap_handler(&ar->handlers, keymap);
|
||||
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Image Paint", 0, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "UV Editor", 0, 0);
|
||||
WM_event_add_keymap_handler(&ar->handlers, keymap);
|
||||
|
@ -558,7 +558,7 @@ static void image_main_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
keymap = WM_keymap_ensure(wm->defaultconf, "Image Generic", SPACE_IMAGE, 0);
|
||||
WM_event_add_keymap_handler(&ar->handlers, keymap);
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Image", SPACE_IMAGE, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
}
|
||||
|
||||
static void image_main_region_draw(const bContext *C, ARegion *ar)
|
||||
|
|
|
@ -174,13 +174,13 @@ static void nla_channel_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
/* own keymap */
|
||||
/* own channels map first to override some channel keymaps */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "NLA Channels", SPACE_NLA, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
/* now generic channels map for everything else that can apply */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Animation Channels", 0, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "NLA Generic", SPACE_NLA, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
}
|
||||
|
||||
/* draw entirely, view changes should be handled here */
|
||||
|
@ -220,7 +220,7 @@ static void nla_main_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
|
||||
/* own keymap */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "NLA Editor", SPACE_NLA, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "NLA Generic", SPACE_NLA, 0);
|
||||
WM_event_add_keymap_handler(&ar->handlers, keymap);
|
||||
}
|
||||
|
@ -328,7 +328,7 @@ static void nla_buttons_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
ED_region_panels_init(wm, ar);
|
||||
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "NLA Generic", SPACE_NLA, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
}
|
||||
|
||||
static void nla_buttons_region_draw(const bContext *C, ARegion *ar)
|
||||
|
|
|
@ -617,7 +617,7 @@ static void node_main_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
WM_event_add_keymap_handler(&ar->handlers, keymap);
|
||||
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Node Editor", SPACE_NODE, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
/* add drop boxes */
|
||||
lb = WM_dropboxmap_find("Node Editor", SPACE_NODE, RGN_TYPE_WINDOW);
|
||||
|
|
|
@ -74,8 +74,7 @@ static void outliner_main_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
|
||||
/* own keymap */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Outliner", SPACE_OUTLINER, 0);
|
||||
/* don't pass on view2d mask, it's always set with scrollbar space, hide fails */
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, NULL, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
/* Add dropboxes */
|
||||
lb = WM_dropboxmap_find("Outliner", SPACE_OUTLINER, RGN_TYPE_WINDOW);
|
||||
|
|
|
@ -116,7 +116,7 @@ static void script_main_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
|
||||
/* own keymap */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Script", SPACE_SCRIPT, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
}
|
||||
|
||||
static void script_main_region_draw(const bContext *C, ARegion *ar)
|
||||
|
|
|
@ -468,15 +468,15 @@ static void sequencer_main_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
|
||||
#if 0
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Mask Editing", 0, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
#endif
|
||||
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "SequencerCommon", SPACE_SEQ, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
/* own keymap */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Sequencer", SPACE_SEQ, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
/* add drop boxes */
|
||||
lb = WM_dropboxmap_find("Sequencer", SPACE_SEQ, RGN_TYPE_WINDOW);
|
||||
|
@ -614,15 +614,15 @@ static void sequencer_preview_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
|
||||
#if 0
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Mask Editing", 0, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
#endif
|
||||
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "SequencerCommon", SPACE_SEQ, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
/* own keymap */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "SequencerPreview", SPACE_SEQ, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
}
|
||||
|
||||
static void sequencer_preview_region_draw(const bContext *C, ARegion *ar)
|
||||
|
@ -729,7 +729,7 @@ static void sequencer_buttons_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
wmKeyMap *keymap;
|
||||
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "SequencerCommon", SPACE_SEQ, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
ED_region_panels_init(wm, ar);
|
||||
}
|
||||
|
|
|
@ -273,9 +273,9 @@ static void text_main_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
|
||||
/* own keymap */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Text Generic", SPACE_TEXT, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Text", SPACE_TEXT, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
|
||||
/* add drop boxes */
|
||||
lb = WM_dropboxmap_find("Text", SPACE_TEXT, RGN_TYPE_WINDOW);
|
||||
|
@ -394,7 +394,7 @@ static void text_properties_region_init(wmWindowManager *wm, ARegion *ar)
|
|||
|
||||
/* own keymaps */
|
||||
keymap = WM_keymap_ensure(wm->defaultconf, "Text Generic", SPACE_TEXT, 0);
|
||||
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
||||
WM_event_add_keymap_handler_v2d_mask(&ar->handlers, keymap);
|
||||
}
|
||||
|
||||
static void text_properties_region_draw(const bContext *C, ARegion *ar)
|
||||
|
|
|
@ -208,12 +208,13 @@ int WM_userdef_event_type_from_keymap_type(int kmitype);
|
|||
|
||||
/* handlers */
|
||||
|
||||
typedef bool (*EventHandlerPoll)(const ARegion *ar, const struct wmEvent *event);
|
||||
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);
|
||||
struct wmEventHandler_Keymap *WM_event_add_keymap_handler_poll(ListBase *handlers,
|
||||
wmKeyMap *keymap,
|
||||
EventHandlerPoll poll);
|
||||
struct wmEventHandler_Keymap *WM_event_add_keymap_handler_v2d_mask(ListBase *handlers,
|
||||
wmKeyMap *keymap);
|
||||
/* priority not implemented, it adds in begin */
|
||||
struct wmEventHandler_Keymap *WM_event_add_keymap_handler_priority(ListBase *handlers,
|
||||
wmKeyMap *keymap,
|
||||
|
|
|
@ -2470,38 +2470,6 @@ static int wm_handler_fileselect_call(bContext *C,
|
|||
return wm_handler_fileselect_do(C, handlers, handler, event->val);
|
||||
}
|
||||
|
||||
static bool handler_boundbox_test(wmEventHandler *handler, const wmEvent *event)
|
||||
{
|
||||
if (handler->bbwin) {
|
||||
if (handler->bblocal) {
|
||||
rcti rect = *handler->bblocal;
|
||||
BLI_rcti_translate(&rect, handler->bbwin->xmin, handler->bbwin->ymin);
|
||||
|
||||
if (BLI_rcti_isect_pt_v(&rect, &event->x)) {
|
||||
return 1;
|
||||
}
|
||||
else if (event->type == MOUSEMOVE && BLI_rcti_isect_pt_v(&rect, &event->prevx)) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (BLI_rcti_isect_pt_v(handler->bbwin, &event->x)) {
|
||||
return 1;
|
||||
}
|
||||
else if (event->type == MOUSEMOVE && BLI_rcti_isect_pt_v(handler->bbwin, &event->prevx)) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int wm_action_not_handled(int action)
|
||||
{
|
||||
return action == WM_HANDLER_CONTINUE || action == (WM_HANDLER_BREAK | WM_HANDLER_MODAL);
|
||||
|
@ -2540,7 +2508,7 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
|
|||
if (handler_base->flag & WM_HANDLER_DO_FREE) {
|
||||
/* pass */
|
||||
}
|
||||
else if (handler_boundbox_test(handler_base, event)) { /* optional boundbox */
|
||||
else if (handler_base->poll == NULL || handler_base->poll(CTX_wm_region(C), event)) {
|
||||
/* in advance to avoid access to freed event on window close */
|
||||
always_pass = wm_event_always_pass(event);
|
||||
|
||||
|
@ -3608,20 +3576,44 @@ wmEventHandler_Keymap *WM_event_add_keymap_handler_priority(ListBase *handlers,
|
|||
return handler;
|
||||
}
|
||||
|
||||
wmEventHandler_Keymap *WM_event_add_keymap_handler_bb(ListBase *handlers,
|
||||
wmKeyMap *keymap,
|
||||
const rcti *bblocal,
|
||||
const rcti *bbwin)
|
||||
static bool event_or_prev_in_rect(const wmEvent *event, const rcti *rect)
|
||||
{
|
||||
if (BLI_rcti_isect_pt(rect, event->x, event->y)) {
|
||||
return true;
|
||||
}
|
||||
else if (event->type == MOUSEMOVE && BLI_rcti_isect_pt(rect, event->prevx, event->prevy)) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static bool handler_region_v2d_mask_test(const ARegion *ar, const wmEvent *event)
|
||||
{
|
||||
rcti rect = ar->v2d.mask;
|
||||
BLI_rcti_translate(&rect, ar->winrct.xmin, ar->winrct.ymin);
|
||||
return event_or_prev_in_rect(event, &rect);
|
||||
}
|
||||
|
||||
wmEventHandler_Keymap *WM_event_add_keymap_handler_poll(ListBase *handlers,
|
||||
wmKeyMap *keymap,
|
||||
EventHandlerPoll poll)
|
||||
{
|
||||
wmEventHandler_Keymap *handler = WM_event_add_keymap_handler(handlers, keymap);
|
||||
|
||||
if (handler) {
|
||||
handler->head.bblocal = bblocal;
|
||||
handler->head.bbwin = bbwin;
|
||||
if (handler == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
handler->head.poll = poll;
|
||||
return handler;
|
||||
}
|
||||
|
||||
wmEventHandler_Keymap *WM_event_add_keymap_handler_v2d_mask(ListBase *handlers, wmKeyMap *keymap)
|
||||
{
|
||||
return WM_event_add_keymap_handler_poll(handlers, keymap, handler_region_v2d_mask_test);
|
||||
}
|
||||
|
||||
void WM_event_remove_keymap_handler(ListBase *handlers, wmKeyMap *keymap)
|
||||
{
|
||||
LISTBASE_FOREACH (wmEventHandler *, handler_base, handlers) {
|
||||
|
@ -4802,7 +4794,7 @@ static wmKeyMapItem *wm_kmi_from_event(bContext *C,
|
|||
if (handler_base->flag & WM_HANDLER_DO_FREE) {
|
||||
/* pass */
|
||||
}
|
||||
else if (handler_boundbox_test(handler_base, event)) { /* optional boundbox */
|
||||
else if (handler_base->poll == NULL || handler_base->poll(CTX_wm_region(C), event)) {
|
||||
if (handler_base->type == WM_HANDLER_TYPE_KEYMAP) {
|
||||
wmEventHandler_Keymap *handler = (wmEventHandler_Keymap *)handler_base;
|
||||
wmKeyMap *keymap = WM_event_get_keymap_from_handler(wm, handler);
|
||||
|
|
|
@ -44,14 +44,15 @@ enum eWM_EventHandlerType {
|
|||
WM_HANDLER_TYPE_KEYMAP,
|
||||
};
|
||||
|
||||
typedef bool (*EventHandlerPoll)(const ARegion *ar, const wmEvent *event);
|
||||
|
||||
typedef struct wmEventHandler {
|
||||
struct wmEventHandler *next, *prev;
|
||||
|
||||
enum eWM_EventHandlerType type;
|
||||
char flag; /* WM_HANDLER_BLOCKING, ... */
|
||||
|
||||
/** Optional local and windowspace bb. */
|
||||
const rcti *bblocal, *bbwin;
|
||||
EventHandlerPoll poll;
|
||||
} wmEventHandler;
|
||||
|
||||
/** Run after the keymap item runs. */
|
||||
|
|
Loading…
Reference in New Issue