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:
authormano-wii <germano.costa@ig.com.br>2018-01-19 09:14:27 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-01-19 09:15:45 +0300
commitebf01d44ee0e034da169efc0aca81f99966ebde6 (patch)
treeb9b93e24af4c60ec8d296bc0c1590a20e5c08020 /source/blender/windowmanager
parent7a24e0d175827824d139f7627de2a5af34d687fb (diff)
WM: window draw callbacks and split preview snap
This moves window overlay from hard coded flags into drawing callbacks. It also supports snapping (holding Ctrl).
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r--source/blender/windowmanager/WM_api.h5
-rw-r--r--source/blender/windowmanager/intern/wm_draw.c61
2 files changed, 58 insertions, 8 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 9dc4b35abb4..e84239f1c67 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -506,6 +506,11 @@ void WM_progress_set(struct wmWindow *win, float progress);
void WM_progress_clear(struct wmWindow *win);
/* Draw (for screenshot) */
+void *WM_draw_cb_activate(
+ struct wmWindow *win,
+ void(*draw)(const struct wmWindow *, void *),
+ void *customdata);
+void WM_draw_cb_exit(struct wmWindow *win, void *handle);
void WM_redraw_windows(struct bContext *C);
void WM_main_playanim(int argc, const char **argv);
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c
index f802e873555..fdbe1345acc 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -157,6 +157,46 @@ static void wm_region_test_render_do_draw(bScreen *screen, ScrArea *sa, ARegion
/********************** draw all **************************/
/* - 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)
{
bScreen *screen = win->screen;
@@ -181,8 +221,9 @@ static void wm_method_draw_full(bContext *C, wmWindow *win)
CTX_wm_area_set(C, NULL);
}
- ED_screen_draw(win);
- win->screen->do_draw = false;
+ ED_screen_draw_edges(win);
+ screen->do_draw = false;
+ wm_draw_callbacks(win);
/* draw overlapping regions */
for (ar = screen->regionbase.first; ar; ar = ar->next) {
@@ -318,17 +359,19 @@ static void wm_method_draw_overlap_all(bContext *C, wmWindow *win, int exchange)
/* after area regions so we can do area 'overlay' drawing */
if (screen->do_draw) {
- ED_screen_draw(win);
- win->screen->do_draw = false;
+ ED_screen_draw_edges(win);
+ screen->do_draw = false;
+ wm_draw_callbacks(win);
if (exchange)
screen->swap = WIN_FRONT_OK;
}
else if (exchange) {
if (screen->swap == WIN_FRONT_OK) {
- ED_screen_draw(win);
- win->screen->do_draw = false;
+ ED_screen_draw_edges(win);
+ screen->do_draw = false;
screen->swap = WIN_BOTH_OK;
+ wm_draw_callbacks(win);
}
else if (screen->swap == WIN_BACK_OK)
screen->swap = WIN_FRONT_OK;
@@ -622,8 +665,9 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win)
}
/* after area regions so we can do area 'overlay' drawing */
- ED_screen_draw(win);
+ ED_screen_draw_edges(win);
win->screen->do_draw = false;
+ wm_draw_callbacks(win);
/* draw floating regions (menus) */
for (ar = screen->regionbase.first; ar; ar = ar->next) {
@@ -792,9 +836,10 @@ static void wm_method_draw_triple_multiview(bContext *C, wmWindow *win, eStereoV
}
/* after area regions so we can do area 'overlay' drawing */
- ED_screen_draw(win);
+ ED_screen_draw_edges(win);
if (sview == STEREO_RIGHT_ID)
win->screen->do_draw = false;
+ wm_draw_callbacks(win);
/* draw floating regions (menus) */
for (ar = screen->regionbase.first; ar; ar = ar->next) {