Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacques Lucke <mail@jlucke.com>2019-04-24 18:34:48 +0300
committerJacques Lucke <mail@jlucke.com>2019-04-24 18:34:48 +0300
commitea8026438104f7be178fcb06562932e4e3d2f094 (patch)
treea980a39731cce5ac8cb1ba0cb94db467c4567c10 /source/blender/windowmanager
parent7a92b8820b9661af39165f048d716559e513ddab (diff)
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
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r--source/blender/windowmanager/WM_api.h11
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c76
-rw-r--r--source/blender/windowmanager/wm_event_system.h5
3 files changed, 43 insertions, 49 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 5cc70aecd8d..f1037dadf85 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -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,
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 76a59944832..2e94d22bc84 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -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)
{
- wmEventHandler_Keymap *handler = WM_event_add_keymap_handler(handlers, keymap);
+ 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;
+ }
+}
- if (handler) {
- handler->head.bblocal = bblocal;
- handler->head.bbwin = bbwin;
+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 == 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);
diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h
index 9a2f8bda041..049e4d44994 100644
--- a/source/blender/windowmanager/wm_event_system.h
+++ b/source/blender/windowmanager/wm_event_system.h
@@ -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. */