diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-07-29 12:29:04 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-07-29 12:29:04 +0400 |
commit | 02608d257a9358e3bd756f1db8c8f53484c34c37 (patch) | |
tree | 46e155fde459e42761afc44c46e6f01ff087fa71 /source/blender/windowmanager | |
parent | c9eb93d9fd967b47a4a6f45db6472772bb9c9af8 (diff) |
add api call for initializing events from the windows eventstate.
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r-- | source/blender/windowmanager/WM_api.h | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 12 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_operators.c | 6 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_window.c | 7 |
4 files changed, 20 insertions, 7 deletions
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; |