diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-03-15 23:56:29 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-03-15 23:56:29 +0400 |
commit | 88cf1a2bc73bbd2f2fbf2ba3d5b1e7d4a1db7a93 (patch) | |
tree | 0ff0b71ff27279f622be9ff872d100a64abc3aa4 /source | |
parent | 433c82649e0eb7380dd8c6092e6b49cd1b84df26 (diff) |
Screen: add exit callback for area and region types, this gets called when
hiding or removing an area or region.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_screen.h | 4 | ||||
-rw-r--r-- | source/blender/editors/include/ED_fileselect.h | 7 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_edit.c | 16 | ||||
-rw-r--r-- | source/blender/editors/space_file/file_draw.c | 4 | ||||
-rw-r--r-- | source/blender/editors/space_file/file_ops.c | 18 | ||||
-rw-r--r-- | source/blender/editors/space_file/filelist.c | 12 | ||||
-rw-r--r-- | source/blender/editors/space_file/filelist.h | 15 | ||||
-rw-r--r-- | source/blender/editors/space_file/filesel.c | 15 | ||||
-rw-r--r-- | source/blender/editors/space_file/space_file.c | 18 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/space_view3d.c | 14 | ||||
-rw-r--r-- | source/blender/windowmanager/WM_api.h | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 7 |
12 files changed, 83 insertions, 49 deletions
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h index f1a169c4fac..5407e22e49e 100644 --- a/source/blender/blenkernel/BKE_screen.h +++ b/source/blender/blenkernel/BKE_screen.h @@ -75,6 +75,8 @@ typedef struct SpaceType { /* init is to cope with file load, screen (size) changes, check handlers */ void (*init)(struct wmWindowManager *, struct ScrArea *); + /* exit is called when the area is hidden or removed */ + void (*exit)(struct wmWindowManager *, struct ScrArea *); /* Listeners can react to bContext changes */ void (*listener)(struct ScrArea *, struct wmNotifier *); @@ -116,6 +118,8 @@ typedef struct ARegionType { /* add handlers, stuff you only do once or on area/region type/size changes */ void (*init)(struct wmWindowManager *, struct ARegion *); + /* exit is called when the region is hidden or removed */ + void (*exit)(struct wmWindowManager *, struct ARegion *); /* draw entirely, view changes should be handled here */ void (*draw)(const struct bContext *, struct ARegion *); /* contextual changes should be handled here */ diff --git a/source/blender/editors/include/ED_fileselect.h b/source/blender/editors/include/ED_fileselect.h index d45504b3325..b7d9f811349 100644 --- a/source/blender/editors/include/ED_fileselect.h +++ b/source/blender/editors/include/ED_fileselect.h @@ -31,10 +31,11 @@ #ifndef __ED_FILESELECT_H__ #define __ED_FILESELECT_H__ -struct SpaceFile; struct ARegion; struct FileSelectParams; +struct SpaceFile; struct bContext; +struct wmWindowManager; #define FILE_LAYOUT_HOR 1 #define FILE_LAYOUT_VER 2 @@ -99,9 +100,9 @@ void ED_fileselect_layout_tilepos(FileLayout *layout, int tile, int *x, int *y); void ED_operatormacros_file(void); -void ED_fileselect_clear(struct bContext *C, struct SpaceFile *sfile); +void ED_fileselect_clear(struct wmWindowManager *wm, struct SpaceFile *sfile); -void ED_fileselect_exit(struct bContext *C, struct SpaceFile *sfile); +void ED_fileselect_exit(struct wmWindowManager *wm, struct SpaceFile *sfile); int ED_file_extension_icon(const char *relname); diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index 9551b1c4926..6045bdfebfe 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -1137,8 +1137,12 @@ void ED_screens_initialize(wmWindowManager *wm) void ED_region_exit(bContext *C, ARegion *ar) { + wmWindowManager *wm = CTX_wm_manager(C); ARegion *prevar = CTX_wm_region(C); + if (ar->type && ar->type->exit) + ar->type->exit(wm, ar); + CTX_wm_region_set(C, ar); WM_event_remove_handlers(C, &ar->handlers); if (ar->swinid) @@ -1157,18 +1161,12 @@ void ED_region_exit(bContext *C, ARegion *ar) void ED_area_exit(bContext *C, ScrArea *sa) { + wmWindowManager *wm = CTX_wm_manager(C); ScrArea *prevsa = CTX_wm_area(C); ARegion *ar; - if (sa->spacetype == SPACE_FILE) { - SpaceLink *sl = sa->spacedata.first; - if (sl && sl->spacetype == SPACE_FILE) { - ED_fileselect_exit(C, (SpaceFile *)sl); - } - } - else if (sa->spacetype == SPACE_VIEW3D) { - ED_render_engine_area_exit(sa); - } + if (sa->type && sa->type->exit) + sa->type->exit(wm, sa); CTX_wm_area_set(C, sa); for (ar = sa->regionbase.first; ar; ar = ar->next) diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c index 45acdc7ef66..269ec74c555 100644 --- a/source/blender/editors/space_file/file_draw.c +++ b/source/blender/editors/space_file/file_draw.c @@ -56,6 +56,7 @@ #include "MEM_guardedalloc.h" #include "DNA_userdef_types.h" +#include "DNA_windowmanager_types.h" #include "RNA_access.h" @@ -397,6 +398,7 @@ static void renamebutton_cb(bContext *C, void *UNUSED(arg1), char *oldname) char newname[FILE_MAX + 12]; char orgname[FILE_MAX + 12]; char filename[FILE_MAX + 12]; + wmWindowManager *wm = CTX_wm_manager(C); SpaceFile *sfile = (SpaceFile *)CTX_wm_space_data(C); ARegion *ar = CTX_wm_region(C); @@ -408,7 +410,7 @@ static void renamebutton_cb(bContext *C, void *UNUSED(arg1), char *oldname) if (!BLI_exists(newname)) { BLI_rename(orgname, newname); /* to make sure we show what is on disk */ - ED_fileselect_clear(C, sfile); + ED_fileselect_clear(wm, sfile); } ED_region_tag_redraw(ar); diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c index 2cbafa2f3a9..f705831c715 100644 --- a/source/blender/editors/space_file/file_ops.c +++ b/source/blender/editors/space_file/file_ops.c @@ -612,12 +612,13 @@ void FILE_OT_highlight(struct wmOperatorType *ot) int file_cancel_exec(bContext *C, wmOperator *UNUSED(unused)) { + wmWindowManager *wm = CTX_wm_manager(C); SpaceFile *sfile = CTX_wm_space_file(C); wmOperator *op = sfile->op; sfile->op = NULL; - WM_event_fileselect_event(C, op, EVT_FILESELECT_CANCEL); + WM_event_fileselect_event(wm, op, EVT_FILESELECT_CANCEL); return OPERATOR_FINISHED; } @@ -780,6 +781,7 @@ int file_draw_check_exists(SpaceFile *sfile) /* sends events now, so things get handled on windowqueue level */ int file_exec(bContext *C, wmOperator *exec_op) { + wmWindowManager *wm = CTX_wm_manager(C); SpaceFile *sfile = CTX_wm_space_file(C); char filepath[FILE_MAX]; @@ -811,7 +813,7 @@ int file_exec(bContext *C, wmOperator *exec_op) BLI_make_file_string(G.main->name, filepath, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE); fsmenu_write_file(fsmenu_get(), filepath); - WM_event_fileselect_event(C, op, EVT_FILESELECT_EXEC); + WM_event_fileselect_event(wm, op, EVT_FILESELECT_EXEC); } @@ -871,10 +873,11 @@ void FILE_OT_parent(struct wmOperatorType *ot) static int file_refresh_exec(bContext *C, wmOperator *UNUSED(unused)) { + wmWindowManager *wm = CTX_wm_manager(C); SpaceFile *sfile = CTX_wm_space_file(C); struct FSMenu *fsmenu = fsmenu_get(); - ED_fileselect_clear(C, sfile); + ED_fileselect_clear(wm, sfile); /* refresh system directory menu */ fsmenu_refresh_system_category(fsmenu); @@ -1088,6 +1091,7 @@ int file_directory_new_exec(bContext *C, wmOperator *op) char path[FILE_MAX]; int generate_name = 1; + wmWindowManager *wm = CTX_wm_manager(C); SpaceFile *sfile = CTX_wm_space_file(C); if (!sfile->params) { @@ -1126,7 +1130,7 @@ int file_directory_new_exec(bContext *C, wmOperator *op) sfile->scroll_offset = 0; /* reload dir to make sure we're seeing what's in the directory */ - ED_fileselect_clear(C, sfile); + ED_fileselect_clear(wm, sfile); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL); return OPERATOR_FINISHED; @@ -1291,11 +1295,12 @@ void FILE_OT_refresh(struct wmOperatorType *ot) static int file_hidedot_exec(bContext *C, wmOperator *UNUSED(unused)) { + wmWindowManager *wm = CTX_wm_manager(C); SpaceFile *sfile = CTX_wm_space_file(C); if (sfile->params) { sfile->params->flag ^= FILE_HIDE_DOT; - ED_fileselect_clear(C, sfile); + ED_fileselect_clear(wm, sfile); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL); } @@ -1477,6 +1482,7 @@ static int file_delete_poll(bContext *C) int file_delete_exec(bContext *C, wmOperator *UNUSED(op)) { char str[FILE_MAX]; + wmWindowManager *wm = CTX_wm_manager(C); SpaceFile *sfile = CTX_wm_space_file(C); struct direntry *file; @@ -1484,7 +1490,7 @@ int file_delete_exec(bContext *C, wmOperator *UNUSED(op)) file = filelist_file(sfile->files, sfile->params->active_file); BLI_make_file_string(G.main->name, str, sfile->params->dir, file->relname); BLI_delete(str, false, false); - ED_fileselect_clear(C, sfile); + ED_fileselect_clear(wm, sfile); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL); return OPERATOR_FINISHED; diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c index d3366383e60..99fe2036b2d 100644 --- a/source/blender/editors/space_file/filelist.c +++ b/source/blender/editors/space_file/filelist.c @@ -1337,7 +1337,7 @@ static void thumbnails_free(void *tjv) } -void thumbnails_start(struct FileList *filelist, const struct bContext *C) +void thumbnails_start(FileList *filelist, const bContext *C) { wmJob *wm_job; ThumbnailJob *tj; @@ -1349,7 +1349,7 @@ void thumbnails_start(struct FileList *filelist, const struct bContext *C) for (idx = 0; idx < filelist->numfiles; idx++) { if (!filelist->filelist[idx].image) { if ( (filelist->filelist[idx].flags & (IMAGEFILE | MOVIEFILE | BLENDERFILE | BLENDERFILE_BACKUP)) ) { - FileImage *limg = MEM_callocN(sizeof(struct FileImage), "loadimage"); + FileImage *limg = MEM_callocN(sizeof(FileImage), "loadimage"); BLI_strncpy(limg->path, filelist->filelist[idx].path, FILE_MAX); limg->index = idx; limg->flags = filelist->filelist[idx].flags; @@ -1371,12 +1371,12 @@ void thumbnails_start(struct FileList *filelist, const struct bContext *C) WM_jobs_start(CTX_wm_manager(C), wm_job); } -void thumbnails_stop(struct FileList *filelist, const struct bContext *C) +void thumbnails_stop(wmWindowManager *wm, FileList *filelist) { - WM_jobs_kill(CTX_wm_manager(C), filelist, NULL); + WM_jobs_kill(wm, filelist, NULL); } -int thumbnails_running(struct FileList *filelist, const struct bContext *C) +int thumbnails_running(wmWindowManager *wm, FileList *filelist) { - return WM_jobs_test(CTX_wm_manager(C), filelist, WM_JOB_TYPE_FILESEL_THUMBNAIL); + return WM_jobs_test(wm, filelist, WM_JOB_TYPE_FILESEL_THUMBNAIL); } diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h index 32a31c51229..d093d427eae 100644 --- a/source/blender/editors/space_file/filelist.h +++ b/source/blender/editors/space_file/filelist.h @@ -37,15 +37,16 @@ extern "C" { #endif +struct BlendHandle; struct FileList; +struct FileSelection; struct FolderList; -struct direntry; -struct BlendHandle; -struct Scene; struct Main; -struct rcti; struct ReportList; -struct FileSelection; +struct Scene; +struct direntry; +struct rcti; +struct wmWindowManager; typedef enum FileSelType { FILE_SEL_REMOVE = 0, @@ -99,9 +100,9 @@ void folderlist_popdir(struct ListBase *folderlist, char *dir); void folderlist_pushdir(struct ListBase *folderlist, const char *dir); int folderlist_clear_next(struct SpaceFile *sfile); -void thumbnails_stop(struct FileList *filelist, const struct bContext *C); void thumbnails_start(struct FileList *filelist, const struct bContext *C); -int thumbnails_running(struct FileList *filelist, const struct bContext *C); +void thumbnails_stop(struct wmWindowManager *wm, struct FileList *filelist); +int thumbnails_running(struct wmWindowManager *wm, struct FileList *filelist); #ifdef __cplusplus } diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c index a1929f962ce..b8db7dc97b7 100644 --- a/source/blender/editors/space_file/filesel.c +++ b/source/blender/editors/space_file/filesel.c @@ -578,11 +578,12 @@ FileLayout *ED_fileselect_get_layout(struct SpaceFile *sfile, ARegion *ar) void file_change_dir(bContext *C, int checkdir) { + wmWindowManager *wm = CTX_wm_manager(C); SpaceFile *sfile = CTX_wm_space_file(C); if (sfile->params) { - ED_fileselect_clear(C, sfile); + ED_fileselect_clear(wm, sfile); if (checkdir && !BLI_is_dir(sfile->params->dir)) { BLI_strncpy(sfile->params->dir, filelist_dir(sfile->files), sizeof(sfile->params->dir)); @@ -691,24 +692,24 @@ void autocomplete_file(struct bContext *C, char *str, void *UNUSED(arg_v)) } } -void ED_fileselect_clear(struct bContext *C, struct SpaceFile *sfile) +void ED_fileselect_clear(struct wmWindowManager *wm, struct SpaceFile *sfile) { /* only NULL in rare cases - [#29734] */ if (sfile->files) { - thumbnails_stop(sfile->files, C); + thumbnails_stop(wm, sfile->files); filelist_freelib(sfile->files); filelist_free(sfile->files); } sfile->params->active_file = -1; - WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL); + WM_main_add_notifier(NC_SPACE | ND_SPACE_FILE_LIST, NULL); } -void ED_fileselect_exit(struct bContext *C, struct SpaceFile *sfile) +void ED_fileselect_exit(struct wmWindowManager *wm, struct SpaceFile *sfile) { if (!sfile) return; if (sfile->op) { - WM_event_fileselect_event(C, sfile->op, EVT_FILESELECT_EXTERNAL_CANCEL); + WM_event_fileselect_event(wm, sfile->op, EVT_FILESELECT_EXTERNAL_CANCEL); sfile->op = NULL; } @@ -716,7 +717,7 @@ void ED_fileselect_exit(struct bContext *C, struct SpaceFile *sfile) folderlist_free(sfile->folders_next); if (sfile->files) { - ED_fileselect_clear(C, sfile); + ED_fileselect_clear(wm, sfile); MEM_freeN(sfile->files); sfile->files = NULL; } diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c index 325487fb30c..698c355fad3 100644 --- a/source/blender/editors/space_file/space_file.c +++ b/source/blender/editors/space_file/space_file.c @@ -146,7 +146,7 @@ static void file_free(SpaceLink *sl) /* spacetype; init callback, area size changes, screen set, etc */ -static void file_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa) +static void file_init(wmWindowManager *UNUSED(wm), ScrArea *sa) { SpaceFile *sfile = (SpaceFile *)sa->spacedata.first; //printf("file_init\n"); @@ -157,6 +157,12 @@ static void file_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa) if (sfile->layout) sfile->layout->dirty = TRUE; } +static void file_exit(wmWindowManager *wm, ScrArea *sa) +{ + SpaceFile *sfile = (SpaceFile *)sa->spacedata.first; + + ED_fileselect_exit(wm, sfile); +} static SpaceLink *file_duplicate(SpaceLink *sl) { @@ -186,6 +192,7 @@ static SpaceLink *file_duplicate(SpaceLink *sl) static void file_refresh(const bContext *C, ScrArea *UNUSED(sa)) { + wmWindowManager *wm = CTX_wm_manager(C); SpaceFile *sfile = CTX_wm_space_file(C); FileSelectParams *params = ED_fileselect_get_params(sfile); @@ -201,7 +208,7 @@ static void file_refresh(const bContext *C, ScrArea *UNUSED(sa)) filelist_setfilter_types(sfile->files, params->filter_glob); if (filelist_empty(sfile->files)) { - thumbnails_stop(sfile->files, C); + thumbnails_stop(wm, sfile->files); filelist_readdir(sfile->files); if (params->sort != FILE_SORT_NONE) { filelist_sort(sfile->files, params->sort); @@ -213,7 +220,7 @@ static void file_refresh(const bContext *C, ScrArea *UNUSED(sa)) } else { if (params->sort != FILE_SORT_NONE) { - thumbnails_stop(sfile->files, C); + thumbnails_stop(wm, sfile->files); filelist_sort(sfile->files, params->sort); if (params->display == FILE_IMGDISPLAY) { thumbnails_start(sfile->files, C); @@ -221,14 +228,14 @@ static void file_refresh(const bContext *C, ScrArea *UNUSED(sa)) } else { if (params->display == FILE_IMGDISPLAY) { - if (!thumbnails_running(sfile->files, C)) { + if (!thumbnails_running(wm, sfile->files)) { thumbnails_start(sfile->files, C); } } else { /* stop any running thumbnail jobs if we're not * displaying them - speedup for NFS */ - thumbnails_stop(sfile->files, C); + thumbnails_stop(wm, sfile->files); } filelist_filter(sfile->files); } @@ -576,6 +583,7 @@ void ED_spacetype_file(void) st->new = file_new; st->free = file_free; st->init = file_init; + st->exit = file_exit; st->duplicate = file_duplicate; st->refresh = file_refresh; st->listener = file_listener; diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index 0958e53df16..a3f5055c284 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -48,6 +48,7 @@ #include "BKE_object.h" #include "BKE_screen.h" +#include "ED_render.h" #include "ED_space_api.h" #include "ED_screen.h" #include "ED_object.h" @@ -350,7 +351,7 @@ static void view3d_free(SpaceLink *sl) /* spacetype; init callback */ -static void view3d_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa)) +static void view3d_init(wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa)) { } @@ -469,6 +470,16 @@ static void view3d_main_area_init(wmWindowManager *wm, ARegion *ar) } +static void view3d_main_area_exit(wmWindowManager *wm, ARegion *ar) +{ + RegionView3D *rv3d = ar->regiondata; + + if (rv3d->render_engine) { + RE_engine_free(rv3d->render_engine); + rv3d->render_engine = NULL; + } +} + static int view3d_ob_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *UNUSED(event)) { if (drag->type == WM_DRAG_ID) { @@ -1216,6 +1227,7 @@ void ED_spacetype_view3d(void) art->keymapflag = ED_KEYMAP_GPENCIL; art->draw = view3d_main_area_draw; art->init = view3d_main_area_init; + art->exit = view3d_main_area_exit; art->free = view3d_main_area_free; art->duplicate = view3d_main_area_duplicate; art->listener = view3d_main_area_listener; diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 6db310e44d1..4cac73b4cf6 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -306,7 +306,7 @@ void WM_gestures_remove(struct bContext *C); /* fileselecting support */ void WM_event_add_fileselect(struct bContext *C, struct wmOperator *op); -void WM_event_fileselect_event(struct bContext *C, void *ophandle, int eventval); +void WM_event_fileselect_event(struct wmWindowManager *wm, void *ophandle, int eventval); #ifndef NDEBUG void WM_event_print(const struct wmEvent *event); #endif diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 5a24b371a98..b2647626f3a 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -2244,12 +2244,12 @@ void wm_event_do_handlers(bContext *C) /* ********** filesector handling ************ */ -void WM_event_fileselect_event(bContext *C, void *ophandle, int eventval) +void WM_event_fileselect_event(wmWindowManager *wm, void *ophandle, int eventval) { /* add to all windows! */ wmWindow *win; - for (win = CTX_wm_manager(C)->windows.first; win; win = win->next) { + for (win = wm->windows.first; win; win = win->next) { wmEvent event = *win->eventstate; event.type = EVT_FILESELECT; @@ -2271,6 +2271,7 @@ void WM_event_fileselect_event(bContext *C, void *ophandle, int eventval) void WM_event_add_fileselect(bContext *C, wmOperator *op) { wmEventHandler *handler, *handlernext; + wmWindowManager *wm = CTX_wm_manager(C); wmWindow *win = CTX_wm_window(C); int full = 1; // XXX preset? @@ -2302,7 +2303,7 @@ void WM_event_add_fileselect(bContext *C, wmOperator *op) op->type->check(C, op); /* ignore return value */ } - WM_event_fileselect_event(C, op, full ? EVT_FILESELECT_FULL_OPEN : EVT_FILESELECT_OPEN); + WM_event_fileselect_event(wm, op, full ? EVT_FILESELECT_FULL_OPEN : EVT_FILESELECT_OPEN); } #if 0 |