Changeset View
Changeset View
Standalone View
Standalone View
source/blender/windowmanager/intern/wm_draw.c
| Context not available. | |||||
| /********************** draw all **************************/ | /********************** draw all **************************/ | ||||
| /* - reference method, draw all each time */ | /* - reference method, draw all each time */ | ||||
| typedef struct WindowDrawCB { | |||||
| struct WindowDrawCB *next, *prev; | |||||
| void(*draw)(const struct wmWindow *, void *); | |||||
| void *customdata; | |||||
| } WindowDrawCB; | |||||
| void *WM_draw_cb_activate( | |||||
| wmWindow *win, | |||||
| void(*draw)(const struct wmWindow *, void *), | |||||
| void *customdata) | |||||
| { | |||||
| WindowDrawCB *wdc = MEM_callocN(sizeof(*wdc), "WindowDrawCB"); | |||||
| BLI_addtail(&win->drawcalls, wdc); | |||||
| wdc->draw = draw; | |||||
| wdc->customdata = customdata; | |||||
| return wdc; | |||||
| } | |||||
| void WM_draw_cb_exit(wmWindow *win, void *handle) | |||||
| { | |||||
| for (WindowDrawCB *wdc = win->drawcalls.first; wdc; wdc = wdc->next) { | |||||
| if (wdc == (WindowDrawCB *)handle) { | |||||
| BLI_remlink(&win->drawcalls, wdc); | |||||
| MEM_freeN(wdc); | |||||
| return; | |||||
| } | |||||
| } | |||||
| } | |||||
| static void wm_draw_callbacks(wmWindow *win) | |||||
| { | |||||
| for (WindowDrawCB *wdc = win->drawcalls.first; wdc; wdc = wdc->next) { | |||||
| wdc->draw(win, wdc->customdata); | |||||
| } | |||||
| } | |||||
| static void wm_method_draw_full(bContext *C, wmWindow *win) | static void wm_method_draw_full(bContext *C, wmWindow *win) | ||||
| { | { | ||||
| bScreen *screen = WM_window_get_active_screen(win); | bScreen *screen = WM_window_get_active_screen(win); | ||||
| Context not available. | |||||
| CTX_wm_area_set(C, NULL); | CTX_wm_area_set(C, NULL); | ||||
| } | } | ||||
| ED_screen_draw(win); | ED_screen_draw_edges(win); | ||||
| screen->do_draw = false; | screen->do_draw = false; | ||||
| wm_draw_callbacks(win); | |||||
| /* draw overlapping regions */ | /* draw overlapping regions */ | ||||
| for (ar = screen->regionbase.first; ar; ar = ar->next) { | for (ar = screen->regionbase.first; ar; ar = ar->next) { | ||||
| Context not available. | |||||
| /* after area regions so we can do area 'overlay' drawing */ | /* after area regions so we can do area 'overlay' drawing */ | ||||
| if (screen->do_draw) { | if (screen->do_draw) { | ||||
| ED_screen_draw(win); | ED_screen_draw_edges(win); | ||||
| screen->do_draw = false; | screen->do_draw = false; | ||||
| wm_draw_callbacks(win); | |||||
| if (exchange) | if (exchange) | ||||
| screen->swap = WIN_FRONT_OK; | screen->swap = WIN_FRONT_OK; | ||||
| } | } | ||||
| else if (exchange) { | else if (exchange) { | ||||
| if (screen->swap == WIN_FRONT_OK) { | if (screen->swap == WIN_FRONT_OK) { | ||||
| ED_screen_draw(win); | ED_screen_draw_edges(win); | ||||
| screen->do_draw = false; | screen->do_draw = false; | ||||
| screen->swap = WIN_BOTH_OK; | screen->swap = WIN_BOTH_OK; | ||||
| wm_draw_callbacks(win); | |||||
| } | } | ||||
| else if (screen->swap == WIN_BACK_OK) | else if (screen->swap == WIN_BACK_OK) | ||||
| screen->swap = WIN_FRONT_OK; | screen->swap = WIN_FRONT_OK; | ||||
| Context not available. | |||||
| } | } | ||||
| /* after area regions so we can do area 'overlay' drawing */ | /* after area regions so we can do area 'overlay' drawing */ | ||||
| ED_screen_draw(win); | ED_screen_draw_edges(win); | ||||
| WM_window_get_active_screen(win)->do_draw = false; | WM_window_get_active_screen(win)->do_draw = false; | ||||
| wm_draw_callbacks(win); | |||||
| /* draw floating regions (menus) */ | /* draw floating regions (menus) */ | ||||
| for (ar = screen->regionbase.first; ar; ar = ar->next) { | for (ar = screen->regionbase.first; ar; ar = ar->next) { | ||||
| Context not available. | |||||
| } | } | ||||
| /* after area regions so we can do area 'overlay' drawing */ | /* after area regions so we can do area 'overlay' drawing */ | ||||
| ED_screen_draw(win); | ED_screen_draw_edges(win); | ||||
| if (sview == STEREO_RIGHT_ID) | if (sview == STEREO_RIGHT_ID) | ||||
| screen->do_draw = false; | screen->do_draw = false; | ||||
| wm_draw_callbacks(win); | |||||
| /* draw floating regions (menus) */ | /* draw floating regions (menus) */ | ||||
| for (ar = screen->regionbase.first; ar; ar = ar->next) { | for (ar = screen->regionbase.first; ar; ar = ar->next) { | ||||
| if (ar->swinid) { | if (ar->swinid) { | ||||
| Context not available. | |||||