From 02608d257a9358e3bd756f1db8c8f53484c34c37 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 29 Jul 2013 08:29:04 +0000 Subject: add api call for initializing events from the windows eventstate. --- source/blender/editors/interface/interface.c | 3 ++- source/blender/editors/interface/interface_handlers.c | 2 +- source/blender/editors/screen/screen_ops.c | 3 ++- source/blender/editors/space_node/node_select.c | 2 +- source/blender/editors/space_outliner/outliner_draw.c | 2 +- source/blender/editors/space_view3d/view3d_toolbar.c | 2 +- source/blender/windowmanager/WM_api.h | 2 ++ source/blender/windowmanager/intern/wm_event_system.c | 12 +++++++++++- source/blender/windowmanager/intern/wm_operators.c | 6 +++--- source/blender/windowmanager/intern/wm_window.c | 7 ++++--- 10 files changed, 28 insertions(+), 13 deletions(-) diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 6504c198b21..21a63183c1a 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -3964,7 +3964,8 @@ void uiButSetFocusOnEnter(wmWindow *win, uiBut *but) { wmEvent event; - event = *(win->eventstate); + wm_event_init_from_window(win, &event); + event.type = EVT_BUT_OPEN; event.val = KM_PRESS; event.customdata = but; diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 8efad17133f..b3df719d95a 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -6193,7 +6193,7 @@ void ui_button_activate_do(bContext *C, ARegion *ar, uiBut *but) button_activate_init(C, ar, but, BUTTON_ACTIVATE_OVER); - event = *(win->eventstate); /* XXX huh huh? make api call */ + wm_event_init_from_window(win, &event); event.type = EVT_BUT_OPEN; event.val = KM_PRESS; event.customdata = but; diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 4670d659886..3066b733fc5 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -649,7 +649,8 @@ static void actionzone_apply(bContext *C, wmOperator *op, int type) sad->modifier = RNA_int_get(op->ptr, "modifier"); - event = *(win->eventstate); /* XXX huh huh? make api call */ + wm_event_init_from_window(win, &event); + if (type == AZONE_AREA) event.type = EVT_ACTIONZONE_AREA; else diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c index bd0c9848b23..e17699309ef 100644 --- a/source/blender/editors/space_node/node_select.c +++ b/source/blender/editors/space_node/node_select.c @@ -926,7 +926,7 @@ static uiBlock *node_find_menu(bContext *C, ARegion *ar, void *arg_op) uiEndBlock(C, block); // uiButActiveOnly(C, ar, block, but); XXX using this here makes Blender hang - investigate - event = *(win->eventstate); /* XXX huh huh? make api call */ + wm_event_init_from_window(win, &event); event.type = EVT_BUT_OPEN; event.val = KM_PRESS; event.customdata = but; diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c index 81207deea01..666cf00280d 100644 --- a/source/blender/editors/space_outliner/outliner_draw.c +++ b/source/blender/editors/space_outliner/outliner_draw.c @@ -811,7 +811,7 @@ static uiBlock *operator_search_menu(bContext *C, ARegion *ar, void *arg_kmi) uiBlockSetDirection(block, UI_DOWN); uiEndBlock(C, block); - event = *(win->eventstate); /* XXX huh huh? make api call */ + wm_event_init_from_window(win, &event); event.type = EVT_BUT_OPEN; event.val = KM_PRESS; event.customdata = but; diff --git a/source/blender/editors/space_view3d/view3d_toolbar.c b/source/blender/editors/space_view3d/view3d_toolbar.c index f5f59c935df..bdb203ab003 100644 --- a/source/blender/editors/space_view3d/view3d_toolbar.c +++ b/source/blender/editors/space_view3d/view3d_toolbar.c @@ -195,7 +195,7 @@ static uiBlock *tool_search_menu(bContext *C, ARegion *ar, void *arg_listbase) uiBlockSetDirection(block, UI_DOWN); uiEndBlock(C, block); - event = *(win->eventstate); /* XXX huh huh? make api call */ + wm_event_init_from_window(win, &event); event.type = EVT_BUT_OPEN; event.val = KM_PRESS; event.customdata = but; diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 7cb24daaaef..76fb88c8d25 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -187,6 +187,8 @@ __attribute__ ((format(printf, 3, 4))) ; void wm_event_add(struct wmWindow *win, const struct wmEvent *event_to_add); +void wm_event_init_from_window(struct wmWindow *win, struct wmEvent *event); + /* at maximum, every timestep seconds it triggers event_type events */ struct wmTimer *WM_event_add_timer(struct wmWindowManager *wm, struct wmWindow *win, int event_type, double timestep); diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index c33e67e00bd..862e4a41cf0 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -132,6 +132,14 @@ void wm_event_free_all(wmWindow *win) } } +void wm_event_init_from_window(wmWindow *win, wmEvent *event) +{ + /* make sure we don't copy any owned pointers */ + BLI_assert(win->eventstate->tablet_data == NULL); + + *event = *(win->eventstate); +} + /* ********************* notifiers, listeners *************** */ static int wm_test_duplicate_notifier(wmWindowManager *wm, unsigned int type, void *reference) @@ -445,7 +453,9 @@ static void wm_handler_ui_cancel(bContext *C) nexthandler = handler->next; if (handler->ui_handle) { - wmEvent event = *(win->eventstate); + wmEvent event; + + wm_event_init_from_window(win, &event); event.type = EVT_BUT_CANCEL; handler->ui_handle(C, &event, handler->ui_userdata); } diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 39584882d0e..f1a9f6dc007 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -978,7 +978,7 @@ static uiBlock *wm_enum_search_menu(bContext *C, ARegion *ar, void *arg_op) uiPopupBoundsBlock(block, 6, 0, -UI_UNIT_Y); /* move it downwards, mouse over button */ uiEndBlock(C, block); - event = *(win->eventstate); /* XXX huh huh? make api call */ + wm_event_init_from_window(win, &event); event.type = EVT_BUT_OPEN; event.val = KM_PRESS; event.customdata = but; @@ -1751,7 +1751,7 @@ static uiBlock *wm_block_search_menu(bContext *C, ARegion *ar, void *UNUSED(arg_ uiPopupBoundsBlock(block, 6, 0, -UI_UNIT_Y); /* move it downwards, mouse over button */ uiEndBlock(C, block); - event = *(win->eventstate); /* XXX huh huh? make api call */ + wm_event_init_from_window(win, &event); event.type = EVT_BUT_OPEN; event.val = KM_PRESS; event.customdata = but; @@ -2988,7 +2988,7 @@ static void tweak_gesture_modal(bContext *C, const wmEvent *event) if ((val = wm_gesture_evaluate(gesture))) { wmEvent tevent; - tevent = *(window->eventstate); + wm_event_init_from_window(window, &tevent); if (gesture->event_type == LEFTMOUSE) tevent.type = EVT_TWEAK_L; else if (gesture->event_type == RIGHTMOUSE) diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index e0595e3c8ab..70541f7cec5 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -808,7 +808,7 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr * currently it seems to be common practice to generate new event for, but probably * we'll need utility function for this? (sergey) */ - event = *(win->eventstate); + wm_event_init_from_window(win, &event); event.type = MOUSEMOVE; event.prevx = event.x; event.prevy = event.y; @@ -957,7 +957,7 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr win->eventstate->x = wx; win->eventstate->y = wy; - event = *(win->eventstate); /* copy last state, like mouse coords */ + wm_event_init_from_window(win, &event); /* copy last state, like mouse coords */ /* activate region */ event.type = MOUSEMOVE; @@ -1065,7 +1065,8 @@ static int wm_window_timer(const bContext *C) else if (wt->event_type == TIMERAUTOSAVE) wm_autosave_timer(C, wm, wt); else if (win) { - wmEvent event = *(win->eventstate); + wmEvent event; + wm_event_init_from_window(win, &event); event.type = wt->event_type; event.val = 0; -- cgit v1.2.3