[Bf-blender-cvs] [eae2942474f] master: WM: move UI handler to it's own type
Campbell Barton
noreply at git.blender.org
Tue Feb 19 06:26:18 CET 2019
Commit: eae2942474fa06b369b3fc6ebdeddad90ca38d43
Author: Campbell Barton
Date: Tue Feb 19 13:57:11 2019 +1100
Branches: master
https://developer.blender.org/rBeae2942474fa06b369b3fc6ebdeddad90ca38d43
WM: move UI handler to it's own type
===================================================================
M source/blender/editors/interface/interface_handlers.c
M source/blender/windowmanager/intern/wm_event_system.c
M source/blender/windowmanager/wm_event_system.h
===================================================================
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 938801570af..db170ec2a9f 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -10022,22 +10022,26 @@ void UI_popup_handlers_add(bContext *C, ListBase *handlers, uiPopupBlockHandle *
void UI_popup_handlers_remove(ListBase *handlers, uiPopupBlockHandle *popup)
{
- wmEventHandler *handler;
+ LISTBASE_FOREACH (wmEventHandler *, handler_base, handlers) {
+ if (handler_base->type == WM_HANDLER_TYPE_UI) {
+ wmEventHandler_UI *handler = (wmEventHandler_UI *)handler_base;
- for (handler = handlers->first; handler; handler = handler->next) {
- if (handler->ui_handle == ui_popup_handler &&
- handler->ui_remove == ui_popup_handler_remove &&
- handler->ui_userdata == popup)
- {
- /* tag refresh parent popup */
- if (handler->next &&
- handler->next->ui_handle == ui_popup_handler &&
- handler->next->ui_remove == ui_popup_handler_remove)
+ if (handler->handle_fn == ui_popup_handler &&
+ handler->remove_fn == ui_popup_handler_remove &&
+ handler->user_data == popup)
{
- uiPopupBlockHandle *parent_popup = handler->next->ui_userdata;
- ED_region_tag_refresh_ui(parent_popup->region);
+ /* tag refresh parent popup */
+ wmEventHandler_UI *handler_next = (wmEventHandler_UI *)handler->base.next;
+ if (handler_next &&
+ handler_next->base.type == WM_HANDLER_TYPE_UI &&
+ handler_next->handle_fn == ui_popup_handler &&
+ handler_next->remove_fn == ui_popup_handler_remove)
+ {
+ uiPopupBlockHandle *parent_popup = handler_next->user_data;
+ ED_region_tag_refresh_ui(parent_popup->region);
+ }
+ break;
}
- break;
}
}
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index d40a9be9e9e..c47247b794d 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -543,7 +543,7 @@ static int wm_event_always_pass(const wmEvent *event)
/* ********************* ui handler ******************* */
-static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, const wmEvent *event, int always_pass)
+static int wm_handler_ui_call(bContext *C, wmEventHandler_UI *handler, const wmEvent *event, int always_pass)
{
ScrArea *area = CTX_wm_area(C);
ARegion *region = CTX_wm_region(C);
@@ -554,7 +554,7 @@ static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, const wmEven
/* UI code doesn't handle return values - it just always returns break.
* to make the DBL_CLICK conversion work, we just don't send this to UI, except mouse clicks */
- if (((handler->flag & WM_HANDLER_ACCEPT_DBL_CLICK) == 0) &&
+ if (((handler->base.flag & WM_HANDLER_ACCEPT_DBL_CLICK) == 0) &&
!ISMOUSE_BUTTON(event->type) &&
(event->val == KM_DBL_CLICK))
{
@@ -571,11 +571,17 @@ static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, const wmEven
}
/* we set context to where ui handler came from */
- if (handler->ui_area) CTX_wm_area_set(C, handler->ui_area);
- if (handler->ui_region) CTX_wm_region_set(C, handler->ui_region);
- if (handler->ui_menu) CTX_wm_menu_set(C, handler->ui_menu);
+ if (handler->context.area) {
+ CTX_wm_area_set(C, handler->context.area);
+ }
+ if (handler->context.region) {
+ CTX_wm_region_set(C, handler->context.region);
+ }
+ if (handler->context.menu) {
+ CTX_wm_menu_set(C, handler->context.menu);
+ }
- retval = handler->ui_handle(C, event, handler->ui_userdata);
+ retval = handler->handle_fn(C, event, handler->user_data);
/* putting back screen context */
if ((retval != WM_UI_HANDLER_BREAK) || always_pass) {
@@ -604,20 +610,22 @@ static void wm_handler_ui_cancel(bContext *C)
{
wmWindow *win = CTX_wm_window(C);
ARegion *ar = CTX_wm_region(C);
- wmEventHandler *handler, *nexthandler;
if (!ar)
return;
- for (handler = ar->handlers.first; handler; handler = nexthandler) {
- nexthandler = handler->next;
-
- if (handler->ui_handle) {
+ for (wmEventHandler *handler_base = ar->handlers.first, *handler_base_next;
+ handler_base;
+ handler_base = handler_base_next)
+ {
+ handler_base_next = handler_base->next;
+ if (handler_base->type == WM_HANDLER_TYPE_UI) {
+ wmEventHandler_UI *handler = (wmEventHandler_UI *)handler_base;
+ BLI_assert(handler->handle_fn != NULL);
wmEvent event;
-
wm_event_init_from_window(win, &event);
event.type = EVT_BUT_CANCEL;
- handler->ui_handle(C, &event, handler->ui_userdata);
+ handler->handle_fn(C, &event, handler->user_data);
}
}
}
@@ -1732,25 +1740,25 @@ static void wm_handler_op_context(bContext *C, wmEventHandler *handler, const wm
/* called on exit or remove area, only here call cancel callback */
void WM_event_remove_handlers(bContext *C, ListBase *handlers)
{
- wmEventHandler *handler;
+ wmEventHandler *handler_base;
wmWindowManager *wm = CTX_wm_manager(C);
/* C is zero on freeing database, modal handlers then already were freed */
- while ((handler = BLI_pophead(handlers))) {
- if (handler->op) {
+ while ((handler_base = BLI_pophead(handlers))) {
+ if (handler_base->op) {
wmWindow *win = CTX_wm_window(C);
- if (handler->op->type->cancel) {
+ if (handler_base->op->type->cancel) {
ScrArea *area = CTX_wm_area(C);
ARegion *region = CTX_wm_region(C);
- wm_handler_op_context(C, handler, win->eventstate);
+ wm_handler_op_context(C, handler_base, win->eventstate);
- if (handler->op->type->flag & OPTYPE_UNDO)
+ if (handler_base->op->type->flag & OPTYPE_UNDO)
wm->op_undo_depth++;
- handler->op->type->cancel(C, handler->op);
+ handler_base->op->type->cancel(C, handler_base->op);
- if (handler->op->type->flag & OPTYPE_UNDO)
+ if (handler_base->op->type->flag & OPTYPE_UNDO)
wm->op_undo_depth--;
CTX_wm_area_set(C, area);
@@ -1758,25 +1766,35 @@ void WM_event_remove_handlers(bContext *C, ListBase *handlers)
}
WM_cursor_grab_disable(win, NULL);
- WM_operator_free(handler->op);
+ WM_operator_free(handler_base->op);
}
- else if (handler->ui_remove) {
- ScrArea *area = CTX_wm_area(C);
- ARegion *region = CTX_wm_region(C);
- ARegion *menu = CTX_wm_menu(C);
+ else if (handler_base->type == WM_HANDLER_TYPE_UI) {
+ wmEventHandler_UI *handler = (wmEventHandler_UI *)handler_base;
- if (handler->ui_area) CTX_wm_area_set(C, handler->ui_area);
- if (handler->ui_region) CTX_wm_region_set(C, handler->ui_region);
- if (handler->ui_menu) CTX_wm_menu_set(C, handler->ui_menu);
+ if (handler->remove_fn) {
+ ScrArea *area = CTX_wm_area(C);
+ ARegion *region = CTX_wm_region(C);
+ ARegion *menu = CTX_wm_menu(C);
- handler->ui_remove(C, handler->ui_userdata);
+ if (handler->context.area) {
+ CTX_wm_area_set(C, handler->context.area);
+ }
+ if (handler->context.region) {
+ CTX_wm_region_set(C, handler->context.region);
+ }
+ if (handler->context.menu) {
+ CTX_wm_menu_set(C, handler->context.menu);
+ }
+
+ handler->remove_fn(C, handler->user_data);
- CTX_wm_area_set(C, area);
- CTX_wm_region_set(C, region);
- CTX_wm_menu_set(C, menu);
+ CTX_wm_area_set(C, area);
+ CTX_wm_region_set(C, region);
+ CTX_wm_menu_set(C, menu);
+ }
}
- wm_event_free_handler(handler);
+ wm_event_free_handler(handler_base);
}
}
@@ -2388,9 +2406,11 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
PRINT("fail\n");
}
}
- else if (handler->ui_handle) {
+ else if (handler->type == WM_HANDLER_TYPE_UI) {
+ wmEventHandler_UI *handler_ui = (wmEventHandler_UI *)handler;
+ BLI_assert(handler_ui->handle_fn != NULL);
if (!wm->is_interface_locked) {
- action |= wm_handler_ui_call(C, handler, event, always_pass);
+ action |= wm_handler_ui_call(C, handler_ui, event, always_pass);
}
}
else if (handler->op_is_fileselect) {
@@ -3399,72 +3419,80 @@ void WM_event_set_keymap_handler_callback(
wmEventHandler *WM_event_add_ui_handler(
const bContext *C, ListBase *handlers,
- wmUIHandlerFunc ui_handle, wmUIHandlerRemoveFunc ui_remove,
- void *userdata, const char flag)
+ wmUIHandlerFunc handle_fn, wmUIHandlerRemoveFunc remove_fn,
+ void *user_data, const char flag)
{
- wmEventHandler *handler = MEM_callocN(sizeof(wmEventHandler), "event ui handler");
- handler->ui_handle = ui_handle;
- handler->ui_remove = ui_remove;
- handler->ui_userdata = userdata;
+ wmEventHandler_UI *handler = MEM_callocN(sizeof(*handler), __func__);
+ handler->base.type = WM_HANDLER_TYPE_UI;
+ handler->handle_fn = handle_fn;
+ handler->remove_fn = remove_fn;
+ handler->user_data = user_data;
if (C) {
- handler->ui_area = CTX_wm_area(C);
- handler->ui_region = CTX_wm_region(C);
- handler->ui_menu = CTX_wm_menu(C);
+ handler->context.area = CTX_wm_area(C);
+ handler->context.region = CTX_wm_region(C);
+ handler->context.menu = CTX_wm_menu(C);
}
else {
- handler->ui_area = NULL;
- handler->ui_region = NULL;
- handler->ui_menu = NULL;
+ handler->context.area = NULL;
+ handler->context.region = NULL;
+ handler->context.menu = NULL;
}
BLI_assert((flag & WM_HANDLER_DO_FREE) == 0);
- handler->flag = flag;
+ handler->base.flag = flag;
BLI_addhead(handlers, handler);
- return handler;
+ return &handler->base;
}
/* set "postpone" for win->modalhandlers, this is in a running for () loop in wm_handlers_do() */
void WM_event_remove_ui_handler(
ListBase *handlers,
- wmUIHandlerFunc ui_handle, wmUIHandlerRemoveFunc ui_remove,
- void *userdata, const bool postpone)
+ wmUIHandlerFunc handle_fn, wmUIHandlerRemoveFunc remove_fn,
+ void *user_data, const bool postpone)
{
- wmEventHandler *handler;
-
- for (handler = handlers->first; handler; handler = handler->next) {
- if ((handler->ui_handle == ui_handle) &&
- (handler->ui_remove == ui_remove) &&
- (handler->ui_userdata == userdata))
- {
- /* han
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list