diff options
-rw-r--r-- | source/blender/editors/include/ED_screen.h | 4 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_edit.c | 9 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_intern.h | 1 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_ops.c | 132 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_draw.c | 4 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_screen_types.h | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/WM_api.h | 11 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 9 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_files.c | 8 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_jobs.c | 56 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_window.c | 168 | ||||
-rw-r--r-- | source/blender/windowmanager/wm.h | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/wm_window.h | 1 |
13 files changed, 323 insertions, 84 deletions
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index 204d2dcd59e..a2e8f3a4ec1 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -87,6 +87,7 @@ void ED_screen_draw(struct wmWindow *win); void ED_screen_refresh(struct wmWindowManager *wm, struct wmWindow *win); void ED_screen_do_listen(struct wmWindow *win, struct wmNotifier *note); bScreen *ED_screen_duplicate(struct wmWindow *win, struct bScreen *sc); +bScreen *ED_screen_add(struct wmWindow *win, struct Scene *scene, char *name); void ED_screen_set(struct bContext *C, struct bScreen *sc); void ED_screen_set_scene(struct bContext *C, struct Scene *scene); void ED_screen_set_subwinactive(struct wmWindow *win, struct wmEvent *event); @@ -95,6 +96,8 @@ void ED_screen_animation_timer(struct bContext *C, int redraws, int enable); int ED_screen_full_newspace(struct bContext *C, ScrArea *sa, int type); void ED_screen_full_prevspace(struct bContext *C); +void ED_screen_new_window(struct bContext *C, struct rcti *position, int type); + /* anim */ void ED_update_for_newframe(const struct bContext *C, int mute); unsigned int ED_screen_view3d_layers(struct bScreen *screen); @@ -143,5 +146,6 @@ int ED_operator_posemode(struct bContext *C); #define ED_KEYMAP_ANIMATION 8 #define ED_KEYMAP_FRAMES 16 + #endif /* ED_SCREEN_H */ diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index 8e667fe0438..dd6bb09c1e4 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -54,6 +54,7 @@ #include "ED_screen.h" #include "ED_screen_types.h" +/* XXX actually should be not here... solve later */ #include "wm_subwindow.h" #include "screen_intern.h" /* own module include */ @@ -404,7 +405,7 @@ ScrArea *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac /* empty screen, with 1 dummy area without spacedata */ /* uses window size */ -bScreen *screen_add(wmWindow *win, Scene *scene, char *name) +bScreen *ED_screen_add(wmWindow *win, Scene *scene, char *name) { bScreen *sc; ScrVert *sv1, *sv2, *sv3, *sv4; @@ -947,7 +948,7 @@ bScreen *ED_screen_duplicate(wmWindow *win, bScreen *sc) if(sc->full != SCREENNORMAL) return NULL; /* XXX handle this case! */ /* make new empty screen: */ - newsc= screen_add(win, sc->scene, sc->id.name+2); + newsc= ED_screen_add(win, sc->scene, sc->id.name+2); /* copy all data */ screen_copy(newsc, sc); /* set in window */ @@ -1368,8 +1369,6 @@ void ED_screen_set_scene(bContext *C, Scene *scene) ED_update_for_newframe(C, 1); -// set_radglobal(); - /* complete redraw */ WM_event_add_notifier(C, NC_WINDOW, NULL); @@ -1434,7 +1433,7 @@ void ed_screen_fullarea(bContext *C, ScrArea *sa) oldscreen->full = SCREENFULL; - sc= screen_add(CTX_wm_window(C), CTX_data_scene(C), "temp"); + sc= ED_screen_add(CTX_wm_window(C), CTX_data_scene(C), "temp"); sc->full = SCREENFULL; // XXX /* timer */ diff --git a/source/blender/editors/screen/screen_intern.h b/source/blender/editors/screen/screen_intern.h index a0804f3e633..2b3a816f8de 100644 --- a/source/blender/editors/screen/screen_intern.h +++ b/source/blender/editors/screen/screen_intern.h @@ -36,7 +36,6 @@ struct Scene; void area_copy_data (ScrArea *sa1, ScrArea *sa2, int swap_space); /* screen_edit.c */ -bScreen *screen_add(struct wmWindow *win, struct Scene *scene, char *name); ScrEdge *screen_findedge(bScreen *sc, ScrVert *v1, ScrVert *v2); ScrArea *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac); int screen_area_join(bContext *C, bScreen* scr, ScrArea *sa1, ScrArea *sa2); diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index dc46940a733..46023f278c6 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -74,6 +74,8 @@ #include "UI_interface.h" #include "UI_resources.h" +#include "wm_window.h" + #include "screen_intern.h" /* own module include */ #define KM_MODAL_CANCEL 1 @@ -502,7 +504,7 @@ static int actionzone_modal(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_RUNNING_MODAL; } -void SCREEN_OT_actionzone(wmOperatorType *ot) +static void SCREEN_OT_actionzone(wmOperatorType *ot) { /* identifiers */ ot->name= "Handle area action zones"; @@ -668,7 +670,7 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, wmEvent *event) newwin= WM_window_open(C, &rect); /* allocs new screen and adds to newly created window, using window size */ - newsc= screen_add(newwin, CTX_data_scene(C), sc->id.name+2); + newsc= ED_screen_add(newwin, CTX_data_scene(C), sc->id.name+2); newwin->screen= newsc; /* copy area to new screen */ @@ -921,7 +923,7 @@ static int area_move_modal(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_RUNNING_MODAL; } -void SCREEN_OT_area_move(wmOperatorType *ot) +static void SCREEN_OT_area_move(wmOperatorType *ot) { /* identifiers */ ot->name= "Move area edges"; @@ -1237,7 +1239,7 @@ static EnumPropertyItem prop_direction_items[] = { {'v', "VERTICAL", 0, "Vertical", ""}, {0, NULL, 0, NULL, NULL}}; -void SCREEN_OT_area_split(wmOperatorType *ot) +static void SCREEN_OT_area_split(wmOperatorType *ot) { ot->name = "Split area"; ot->idname = "SCREEN_OT_area_split"; @@ -1386,7 +1388,7 @@ static int frame_offset_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void SCREEN_OT_frame_offset(wmOperatorType *ot) +static void SCREEN_OT_frame_offset(wmOperatorType *ot) { ot->name = "Frame Offset"; ot->idname = "SCREEN_OT_frame_offset"; @@ -1442,7 +1444,7 @@ static int screen_set_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } -void SCREEN_OT_screen_set(wmOperatorType *ot) +static void SCREEN_OT_screen_set(wmOperatorType *ot) { ot->name = "Set Screen"; ot->idname = "SCREEN_OT_screen_set"; @@ -1465,7 +1467,7 @@ static int screen_full_area_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void SCREEN_OT_screen_full_area(wmOperatorType *ot) +static void SCREEN_OT_screen_full_area(wmOperatorType *ot) { ot->name = "Toggle Make Area Fullscreen"; ot->idname = "SCREEN_OT_screen_full_area"; @@ -1737,7 +1739,7 @@ static int area_join_modal(bContext *C, wmOperator *op, wmEvent *event) } /* Operator for joining two areas (space types) */ -void SCREEN_OT_area_join(wmOperatorType *ot) +static void SCREEN_OT_area_join(wmOperatorType *ot) { /* identifiers */ ot->name= "Join area"; @@ -1770,7 +1772,7 @@ static int repeat_last_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } -void SCREEN_OT_repeat_last(wmOperatorType *ot) +static void SCREEN_OT_repeat_last(wmOperatorType *ot) { /* identifiers */ ot->name= "Repeat Last"; @@ -1822,7 +1824,7 @@ static int repeat_history_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void SCREEN_OT_repeat_history(wmOperatorType *ot) +static void SCREEN_OT_repeat_history(wmOperatorType *ot) { /* identifiers */ ot->name= "Repeat History"; @@ -1855,7 +1857,7 @@ static int redo_last_invoke(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_CANCELLED; } -void SCREEN_OT_redo_last(wmOperatorType *ot) +static void SCREEN_OT_redo_last(wmOperatorType *ot) { /* identifiers */ ot->name= "Redo Last"; @@ -1898,7 +1900,7 @@ static int region_split_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void SCREEN_OT_region_split(wmOperatorType *ot) +static void SCREEN_OT_region_split(wmOperatorType *ot) { /* identifiers */ ot->name= "Split Region"; @@ -1987,7 +1989,7 @@ static int region_foursplit_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void SCREEN_OT_region_foursplit(wmOperatorType *ot) +static void SCREEN_OT_region_foursplit(wmOperatorType *ot) { /* identifiers */ ot->name= "Split Region in 4 Parts"; @@ -2025,7 +2027,7 @@ static int region_flip_exec(bContext *C, wmOperator *op) } -void SCREEN_OT_region_flip(wmOperatorType *ot) +static void SCREEN_OT_region_flip(wmOperatorType *ot) { /* identifiers */ ot->name= "Flip Region"; @@ -2195,7 +2197,7 @@ static int screen_animation_play(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_FINISHED; } -void SCREEN_OT_animation_play(wmOperatorType *ot) +static void SCREEN_OT_animation_play(wmOperatorType *ot) { /* identifiers */ ot->name= "Animation player"; @@ -2244,7 +2246,7 @@ static int border_select_do(bContext *C, wmOperator *op) return 1; } -void SCREEN_OT_border_select(wmOperatorType *ot) +static void SCREEN_OT_border_select(wmOperatorType *ot) { /* identifiers */ ot->name= "Border select"; @@ -2371,13 +2373,36 @@ static ScrArea *find_empty_image_area(bContext *C) } #endif // XXX not used -static void screen_set_image_output(bContext *C) +/* new window uses x,y to set position */ +static void screen_set_image_output(bContext *C, int mx, int my) { Scene *scene= CTX_data_scene(C); ScrArea *sa; SpaceImage *sima; - if(scene->r.displaymode==R_OUTPUT_SCREEN) { + if(scene->r.displaymode==R_OUTPUT_WINDOW) { + rcti rect; + int sizex, sizey; + + sizex= 10 + (scene->r.xsch*scene->r.size)/100; + sizey= 40 + (scene->r.ysch*scene->r.size)/100; + + /* arbitrary... miniature image window views don't make much sense */ + if(sizex < 320) sizex= 320; + if(sizey < 256) sizey= 256; + + /* XXX some magic to calculate postition */ + rect.xmin= mx + CTX_wm_window(C)->posx - sizex/2; + rect.ymin= my + CTX_wm_window(C)->posy - sizey/2; + rect.xmax= rect.xmin + sizex; + rect.ymax= rect.ymin + sizey; + + /* changes context! */ + WM_window_open_temp(C, &rect, WM_WINDOW_RENDER); + + sa= CTX_wm_area(C); + } + else if(scene->r.displaymode==R_OUTPUT_SCREEN) { /* this function returns with changed context */ ED_screen_full_newspace(C, CTX_wm_area(C), SPACE_IMAGE); sa= CTX_wm_area(C); @@ -2710,7 +2735,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) // store spare /* ensure at least 1 area shows result */ - screen_set_image_output(C); + screen_set_image_output(C, event->x, event->y); /* job custom data */ rj= MEM_callocN(sizeof(RenderJob), "render job"); @@ -2758,7 +2783,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) /* contextual render, using current scene, view3d? */ -void SCREEN_OT_render(wmOperatorType *ot) +static void SCREEN_OT_render(wmOperatorType *ot) { /* identifiers */ ot->name= "Render"; @@ -2782,7 +2807,12 @@ static int render_view_cancel_exec(bContext *C, wmOperator *unused) ScrArea *sa= CTX_wm_area(C); SpaceImage *sima= sa->spacedata.first; - if(sima->flag & SI_PREVSPACE) { + /* test if we have a temp screen in front */ + if(CTX_wm_window(C)->screen->full==SCREENTEMP) { + wm_window_lower(CTX_wm_window(C)); + } + /* determine if render already shows */ + else if(sima->flag & SI_PREVSPACE) { sima->flag &= ~SI_PREVSPACE; if(sima->flag & SI_FULLWINDOW) { @@ -2800,7 +2830,7 @@ static int render_view_cancel_exec(bContext *C, wmOperator *unused) return OPERATOR_FINISHED; } -void SCREEN_OT_render_view_cancel(struct wmOperatorType *ot) +static void SCREEN_OT_render_view_cancel(struct wmOperatorType *ot) { /* identifiers */ ot->name= "Cancel Render View"; @@ -2813,12 +2843,16 @@ void SCREEN_OT_render_view_cancel(struct wmOperatorType *ot) /* *********************** show render viewer *************** */ -static int render_view_show_exec(bContext *C, wmOperator *unused) +static int render_view_show_invoke(bContext *C, wmOperator *unused, wmEvent *event) { ScrArea *sa= find_area_showing_r_result(C); - + + /* test if we have a temp screen in front */ + if(CTX_wm_window(C)->screen->full==SCREENTEMP) { + wm_window_lower(CTX_wm_window(C)); + } /* determine if render already shows */ - if(sa) { + else if(sa) { SpaceImage *sima= sa->spacedata.first; if(sima->flag & SI_PREVSPACE) { @@ -2835,20 +2869,58 @@ static int render_view_show_exec(bContext *C, wmOperator *unused) } } else { - screen_set_image_output(C); + screen_set_image_output(C, event->x, event->y); } return OPERATOR_FINISHED; } -void SCREEN_OT_render_view_show(struct wmOperatorType *ot) +static void SCREEN_OT_render_view_show(struct wmOperatorType *ot) { /* identifiers */ ot->name= "Show/Hide Render View"; ot->idname= "SCREEN_OT_render_view_show"; /* api callbacks */ - ot->exec= render_view_show_exec; + ot->invoke= render_view_show_invoke; + ot->poll= ED_operator_screenactive; +} + +/* *********** show user pref window ****** */ + +static int userpref_show_invoke(bContext *C, wmOperator *unused, wmEvent *event) +{ + ScrArea *sa; + rcti rect; + int sizex, sizey; + + sizex= 640; + sizey= 480; + + /* some magic to calculate postition */ + rect.xmin= event->x + CTX_wm_window(C)->posx - sizex/2; + rect.ymin= event->y + CTX_wm_window(C)->posy - sizey/2; + rect.xmax= rect.xmin + sizex; + rect.ymax= rect.ymin + sizey; + + /* changes context! */ + WM_window_open_temp(C, &rect, WM_WINDOW_USERPREFS); + + sa= CTX_wm_area(C); + + + return OPERATOR_FINISHED; +} + + +static void SCREEN_OT_userpref_show(struct wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Show/Hide User Preferences"; + ot->idname= "SCREEN_OT_userpref_show"; + + /* api callbacks */ + ot->invoke= userpref_show_invoke; ot->poll= ED_operator_screenactive; } @@ -2879,6 +2951,7 @@ void ED_operatortypes_screen(void) WM_operatortype_append(SCREEN_OT_screen_full_area); WM_operatortype_append(SCREEN_OT_screenshot); WM_operatortype_append(SCREEN_OT_screencast); + WM_operatortype_append(SCREEN_OT_userpref_show); /*frame changes*/ WM_operatortype_append(SCREEN_OT_frame_offset); @@ -2981,6 +3054,9 @@ void ED_keymap_screen(wmWindowManager *wm) WM_keymap_add_item(keymap, "SCREEN_OT_render_view_cancel", ESCKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "SCREEN_OT_render_view_show", F11KEY, KM_PRESS, 0, 0); + /* user prefs */ + WM_keymap_add_item(keymap, "SCREEN_OT_userpref_show", UKEY, KM_PRESS, KM_ALT, 0); + /* Anim Playback ------------------------------------------------ */ keymap= WM_keymap_listbase(wm, "Frames", 0, 0); diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index da1f050cfd3..7050c7f6d7c 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -150,8 +150,10 @@ static void draw_render_info(Image *ima, ARegion *ar) /* clear header rect */ UI_GetThemeColor3fv(TH_BACK, colf); - glColor3f(colf[0]+0.1f, colf[1]+0.1f, colf[2]+0.1f); + glEnable(GL_BLEND); + glColor4f(colf[0]+0.1f, colf[1]+0.1f, colf[2]+0.1f, 0.5f); glRecti(rect.xmin, rect.ymin, rect.xmax, rect.ymax+1); + glDisable(GL_BLEND); UI_ThemeColor(TH_TEXT_HI); diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h index cf107230171..e51da0c0818 100644 --- a/source/blender/makesdna/DNA_screen_types.h +++ b/source/blender/makesdna/DNA_screen_types.h @@ -186,6 +186,8 @@ typedef struct ARegion { #define SCREENNORMAL 0 #define SCREENFULL 1 #define SCREENAUTOPLAY 2 +#define SCREENTEMP 3 + /* Panel->snap - for snapping to screen edges */ #define PNL_SNAP_NONE 0 diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 56ae220f7f0..0a68d2c9053 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -51,7 +51,16 @@ void WM_init (struct bContext *C); void WM_exit (struct bContext *C); void WM_main (struct bContext *C); -struct wmWindow *WM_window_open (struct bContext *C, struct rcti *rect); +struct wmWindow *WM_window_open (struct bContext *C, struct rcti *rect); + + /* defines for 'type' WM_window_open_temp */ +#define WM_WINDOW_RENDER 0 +#define WM_WINDOW_USERPREFS 1 +#define WM_WINDOW_FILESEL 2 + +void WM_window_open_temp (struct bContext *C, struct rcti *position, int type); + + /* files */ int WM_read_homefile (struct bContext *C, struct wmOperator *op); diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 11b8f7f8c6f..e9affbac87a 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -513,8 +513,12 @@ static void wm_handler_op_context(bContext *C, wmEventHandler *handler) for(sa= screen->areabase.first; sa; sa= sa->next) if(sa==handler->op_area) break; - if(sa==NULL) - printf("internal error: handler (%s) has invalid area\n", handler->op->type->idname); + if(sa==NULL) { + /* when changing screen layouts with running modal handlers (like render display), this + is not an error to print */ + if(handler->op==NULL) + printf("internal error: handler (%s) has invalid area\n", handler->op->type->idname); + } else { ARegion *ar; CTX_wm_area_set(C, sa); @@ -663,7 +667,6 @@ static void wm_event_modalkeymap(wmOperator *op, wmEvent *event) event->type= EVT_MODAL_MAP; event->val= kmi->propvalue; - printf("found modal event %s %d\n", kmi->idname, kmi->propvalue); } } } diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index 2019906bd5e..ffaa315f04e 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -605,11 +605,17 @@ void WM_write_file(bContext *C, char *target, int compress, ReportList *reports) /* operator entry */ int WM_write_homefile(bContext *C, wmOperator *op) { + wmWindow *win= CTX_wm_window(C); char tstr[FILE_MAXDIR+FILE_MAXFILE]; int write_flags; + /* check current window and close it if temp */ + if(win->screen->full == SCREENTEMP) { + wm_window_close(C, win); + } + BLI_make_file_string("/", tstr, BLI_gethome(), ".B25.blend"); - + /* force save as regular blend file */ write_flags = G.fileflags & ~(G_FILE_COMPRESS | G_FILE_LOCK | G_FILE_SIGN); diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c index 6dd150a3416..0fd658dbb64 100644 --- a/source/blender/windowmanager/intern/wm_jobs.c +++ b/source/blender/windowmanager/intern/wm_jobs.c @@ -252,29 +252,38 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *steve) } } +/* stop job, free data completely */ +static void wm_jobs_kill_job(wmWindowManager *wm, wmJob *steve) +{ + if(steve->running) { + /* signal job to end */ + steve->stop= 1; + BLI_end_threads(&steve->threads); + } + + if(steve->wt) + WM_event_remove_window_timer(steve->win, steve->wt); + if(steve->customdata) + steve->free(steve->customdata); + if(steve->run_customdata) + steve->run_free(steve->run_customdata); + + /* remove steve */ + BLI_remlink(&wm->jobs, steve); + MEM_freeN(steve); + +} + void WM_jobs_stop_all(wmWindowManager *wm) { - wmJob *steve= wm->jobs.first; + wmJob *steve; - for(; steve; steve= steve->next) { - if(steve->running) { - /* signal job to end */ - steve->stop= 1; - BLI_end_threads(&steve->threads); - } - - if(steve->wt) - WM_event_remove_window_timer(steve->win, steve->wt); - if(steve->customdata) - steve->free(steve->customdata); - if(steve->run_customdata) - steve->run_free(steve->run_customdata); - } + while((steve= wm->jobs.first)) + wm_jobs_kill_job(wm, steve); - BLI_freelistN(&wm->jobs); } -/* stops job(s) from this owner */ +/* signal job(s) from this owner to stop, timer is required to get handled */ void WM_jobs_stop(wmWindowManager *wm, void *owner) { wmJob *steve; @@ -285,6 +294,19 @@ void WM_jobs_stop(wmWindowManager *wm, void *owner) steve->stop= 1; } +/* kill job entirely, also removes timer itself */ +void wm_jobs_timer_ended(wmWindowManager *wm, wmTimer *wt) +{ + wmJob *steve; + + for(steve= wm->jobs.first; steve; steve= steve->next) { + if(steve->wt==wt) { + wm_jobs_kill_job(wm, steve); + return; + } + } +} + /* hardcoded to event TIMERJOBS */ static int wm_jobs_timer(bContext *C, wmOperator *op, wmEvent *evt) { diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 2d320458543..5816fbb0667 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -70,7 +70,7 @@ static int prefsizx= 0, prefsizy= 0, prefstax= 0, prefstay= 0; /* ******** win open & close ************ */ - +/* XXX this one should correctly check for apple top header... */ static void wm_get_screensize(int *width_r, int *height_r) { unsigned int uiwidth; @@ -81,6 +81,34 @@ static void wm_get_screensize(int *width_r, int *height_r) *height_r= uiheight; } +/* keeps offset and size within monitor bounds */ +/* XXX solve dual screen... */ +static void wm_window_check_position(rcti *rect) +{ + int width, height, d; + + wm_get_screensize(&width, &height); + +#ifdef __APPLE__ + height -= 22; +#endif + + if(rect->xmax > width) { + d= rect->xmax - width; + rect->xmax -= d; + rect->xmin -= d; + } + if(rect->ymax > height) { + d= rect->ymax - height; + rect->ymax -= d; + rect->ymin -= d; + } + + if(rect->xmin < 0) rect->xmin= 0; + if(rect->ymin < 0) rect->ymin= 0; +} + + static void wm_ghostwindow_destroy(wmWindow *win) { if(win->ghostwin) { @@ -93,7 +121,7 @@ static void wm_ghostwindow_destroy(wmWindow *win) ED_screen_exit should have been called */ void wm_window_free(bContext *C, wmWindow *win) { - wmTimer *wt; + wmTimer *wt, *wtnext; /* update context */ if(C) { @@ -107,14 +135,20 @@ void wm_window_free(bContext *C, wmWindow *win) CTX_wm_window_set(C, NULL); WM_event_remove_handlers(C, &win->handlers); + + /* end running jobs, a job end also removes its timer */ + for(wt= win->timers.first; wt; wt= wtnext) { + wtnext= wt->next; + if(wt->event_type==TIMERJOBS) + wm_jobs_timer_ended(wm, wt); + } } if(win->eventstate) MEM_freeN(win->eventstate); - for(wt= win->timers.first; wt; wt= wt->next) - if(wt->customdata) - MEM_freeN(wt->customdata); - BLI_freelistN(&win->timers); + /* timer removing, need to call this api function */ + while((wt= win->timers.first)) + WM_event_remove_window_timer(win, wt); wm_event_free_all(win); wm_subwindows_free(win); @@ -174,7 +208,7 @@ wmWindow *wm_window_copy(bContext *C, wmWindow *winorig) } /* this is event from ghost, or exit-blender op */ -static void wm_window_close(bContext *C, wmWindow *win) +void wm_window_close(bContext *C, wmWindow *win) { wmWindowManager *wm= CTX_wm_manager(C); BLI_remlink(&wm->windows, win); @@ -183,35 +217,50 @@ static void wm_window_close(bContext *C, wmWindow *win) ED_screen_exit(C, win, win->screen); wm_window_free(C, win); - if(wm->windows.first==NULL) + /* check remaining windows */ + if(wm->windows.first) { + for(win= wm->windows.first; win; win= win->next) + if(win->screen->full!=SCREENTEMP) + break; + /* in this case we close all */ + if(win==NULL) + WM_exit(C); + } + else WM_exit(C); } void wm_window_title(wmWindowManager *wm, wmWindow *win) { - /* this is set to 1 if you don't have .B.blend open */ - if(G.save_over) { - char *str= MEM_mallocN(strlen(G.sce) + 16, "title"); + /* handle the 'temp' window */ + if(win->screen && win->screen->full==SCREENTEMP) { + GHOST_SetTitle(win->ghostwin, "Blender"); + } + else { - if(wm->file_saved) - sprintf(str, "Blender [%s]", G.sce); + /* this is set to 1 if you don't have .B.blend open */ + if(G.save_over) { + char *str= MEM_mallocN(strlen(G.sce) + 16, "title"); + + if(wm->file_saved) + sprintf(str, "Blender [%s]", G.sce); + else + sprintf(str, "Blender* [%s]", G.sce); + + GHOST_SetTitle(win->ghostwin, str); + + MEM_freeN(str); + } else - sprintf(str, "Blender* [%s]", G.sce); - - GHOST_SetTitle(win->ghostwin, str); - - MEM_freeN(str); - } - else - GHOST_SetTitle(win->ghostwin, "Blender"); + GHOST_SetTitle(win->ghostwin, "Blender"); #ifdef __APPLE__ - if(wm->file_saved) - GHOST_SetWindowState(win->ghostwin, GHOST_kWindowStateUnModified); - else - GHOST_SetWindowState(win->ghostwin, GHOST_kWindowStateModified); + if(wm->file_saved) + GHOST_SetWindowState(win->ghostwin, GHOST_kWindowStateUnModified); + else + GHOST_SetWindowState(win->ghostwin, GHOST_kWindowStateModified); #endif - + } } /* belongs to below */ @@ -334,6 +383,71 @@ wmWindow *WM_window_open(bContext *C, rcti *rect) return win; } +/* uses screen->full tag to define what to do, currently it limits + to only one "temp" window for render out, preferences, filewindow, etc */ +/* type is #define in WM_api.h */ + +void WM_window_open_temp(bContext *C, rcti *position, int type) +{ + wmWindow *win; + ScrArea *sa; + + /* changes rect to fit within desktop */ + wm_window_check_position(position); + + /* test if we have a temp screen already */ + for(win= CTX_wm_manager(C)->windows.first; win; win= win->next) + if(win->screen->full == SCREENTEMP) + break; + + /* add new window? */ + if(win==NULL) { + win= wm_window_new(C); + + win->posx= position->xmin; + win->posy= position->ymin; + } + + win->sizex= position->xmax - position->xmin; + win->sizey= position->ymax - position->ymin; + + if(win->ghostwin) { + wm_window_set_size(win, win->sizex, win->sizey) ; + wm_window_raise(win); + } + + /* add new screen? */ + if(win->screen==NULL) + win->screen= ED_screen_add(win, CTX_data_scene(C), "temp"); + win->screen->full = SCREENTEMP; + + /* make window active, and validate/resize */ + CTX_wm_window_set(C, win); + wm_check(C); + + /* ensure it shows the right spacetype editor */ + sa= win->screen->areabase.first; + CTX_wm_area_set(C, sa); + + if(type==WM_WINDOW_RENDER) { + ED_area_newspace(C, sa, SPACE_IMAGE); + } + else { + ED_area_newspace(C, sa, SPACE_INFO); + } + + ED_screen_set(C, win->screen); + + if(sa->spacetype==SPACE_IMAGE) + GHOST_SetTitle(win->ghostwin, "Blender Render"); + else if(ELEM(sa->spacetype, SPACE_OUTLINER, SPACE_INFO)) + GHOST_SetTitle(win->ghostwin, "Blender User Preferences"); + else if(sa->spacetype==SPACE_FILE) + GHOST_SetTitle(win->ghostwin, "Blender File View"); + else + GHOST_SetTitle(win->ghostwin, "Blender"); +} + /* ****************** Operators ****************** */ @@ -664,10 +778,12 @@ void WM_event_remove_window_timer(wmWindow *win, wmTimer *timer) { wmTimer *wt; + /* extra security check */ for(wt= win->timers.first; wt; wt= wt->next) if(wt==timer) break; if(wt) { + BLI_remlink(&win->timers, wt); if(wt->customdata) MEM_freeN(wt->customdata); diff --git a/source/blender/windowmanager/wm.h b/source/blender/windowmanager/wm.h index 36219cf3743..a7529157072 100644 --- a/source/blender/windowmanager/wm.h +++ b/source/blender/windowmanager/wm.h @@ -66,7 +66,7 @@ void wm_gesture_tag_redraw(bContext *C); /* wm_jobs.h */ void WM_OT_jobs_timer(struct wmOperatorType *ot); - +void wm_jobs_timer_ended(wmWindowManager *wm, wmTimer *wt); #endif /* WM_H */ diff --git a/source/blender/windowmanager/wm_window.h b/source/blender/windowmanager/wm_window.h index 45fa9bf6cf7..c2a2b00b796 100644 --- a/source/blender/windowmanager/wm_window.h +++ b/source/blender/windowmanager/wm_window.h @@ -36,6 +36,7 @@ void wm_ghost_init (bContext *C); wmWindow *wm_window_new (bContext *C); void wm_window_free (bContext *C, wmWindow *win); +void wm_window_close (bContext *C, wmWindow *win); void wm_window_title (wmWindowManager *wm, wmWindow *win); void wm_window_add_ghostwindows (wmWindowManager *wm); |