diff options
Diffstat (limited to 'source/blender/windowmanager/intern')
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 25 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_files.c | 5 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_init_exit.c | 10 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_jobs.c | 33 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_subwindow.c | 4 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_window.c | 17 |
6 files changed, 64 insertions, 30 deletions
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 846309f1265..80878cf6884 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -298,6 +298,8 @@ static int wm_operator_exec(bContext *C, wmOperator *op, int repeat) uiPupMenuReports(C, op->reports); if(retval & OPERATOR_FINISHED) { + op->customdata= NULL; + if(op->type->flag & OPTYPE_UNDO) ED_undo_push_op(C, op); @@ -427,6 +429,8 @@ static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, P } if(retval & OPERATOR_FINISHED) { + op->customdata= NULL; + if(ot->flag & OPTYPE_UNDO) ED_undo_push_op(C, op); @@ -813,6 +817,8 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand } if(retval & OPERATOR_FINISHED) { + op->customdata= NULL; + if(ot->flag & OPTYPE_UNDO) ED_undo_push_op(C, op); @@ -936,14 +942,14 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa /* remlink now, for load file case */ BLI_remlink(handlers, handler); + wm_handler_op_context(C, handler); + if(event->val==EVT_FILESELECT_EXEC) { - wm_handler_op_context(C, handler); - /* a bit weak, might become arg for WM_event_fileselect? */ /* XXX also extension code in image-save doesnt work for this yet */ if(strncmp(handler->op->type->name, "Save", 4)==0) { /* this gives ownership to pupmenu */ - uiPupMenuSaveOver(C, handler->op, path); + uiPupMenuSaveOver(C, handler->op, (path)? path: ""); } else { int retval= handler->op->type->exec(C, handler->op); @@ -954,14 +960,19 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa WM_operator_free(handler->op); } - - CTX_wm_area_set(C, NULL); } - else + else { + if(handler->op->type->cancel) + handler->op->type->cancel(C, handler->op); + WM_operator_free(handler->op); + } + + CTX_wm_area_set(C, NULL); wm_event_free_handler(handler); - MEM_freeN(path); + if(path) + MEM_freeN(path); action= WM_HANDLER_BREAK; } diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index 9694a8fa1c6..1aca9a66e57 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -195,6 +195,7 @@ static void wm_window_match_do(bContext *C, ListBase *oldwmlist) /* ensure making new keymaps and set space types */ wm->initialized= 0; + wm->winactive= NULL; /* only first wm in list has ghostwins */ for(win= wm->windows.first; win; win= win->next) { @@ -202,6 +203,10 @@ static void wm_window_match_do(bContext *C, ListBase *oldwmlist) if(oldwin->winid == win->winid ) { win->ghostwin= oldwin->ghostwin; + win->active= oldwin->active; + if(win->active) + wm->winactive= win; + GHOST_SetWindowUserData(win->ghostwin, win); /* pointer back */ oldwin->ghostwin= NULL; diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c index bf8568d7480..490ef12a523 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.c +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -78,7 +78,7 @@ #include "ED_armature.h" #include "ED_keyframing.h" #include "ED_node.h" -#include "ED_previewrender.h" +#include "ED_render.h" #include "ED_space_api.h" #include "ED_screen.h" #include "ED_util.h" @@ -86,9 +86,11 @@ #include "UI_interface.h" #include "BLF_api.h" +#include "gpu_buffers.h" #include "GPU_extensions.h" #include "GPU_draw.h" +#include "BKE_depsgraph.h" #include "BKE_sound.h" static void wm_init_reports(bContext *C) @@ -112,6 +114,7 @@ void WM_init(bContext *C) set_free_windowmanager_cb(wm_close_and_free); /* library.c */ set_blender_test_break_cb(wm_window_testbreak); /* blender.c */ + DAG_editors_update_cb(ED_render_id_flush_update); /* depsgraph.c */ ED_spacetypes_init(); /* editors/space_api/spacetype.c */ @@ -128,6 +131,8 @@ void WM_init(bContext *C) wm_init_reports(C); /* reports cant be initialized before the wm */ + GPU_extensions_init(); + UI_init(); // clear_matcopybuf(); /* XXX */ @@ -138,8 +143,6 @@ void WM_init(bContext *C) ED_preview_init_dbase(); - GPU_extensions_init(); - G.ndofdevice = -1; /* XXX bad initializer, needs set otherwise buttons show! */ read_Blog(); @@ -253,6 +256,7 @@ void WM_exit(bContext *C) // XXX UI_filelist_free_icons(); } + GPU_buffer_pool_free(0); GPU_extensions_exit(); // if (copybuf) MEM_freeN(copybuf); diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c index bef3268920d..9e16ce4082f 100644 --- a/source/blender/windowmanager/intern/wm_jobs.c +++ b/source/blender/windowmanager/intern/wm_jobs.c @@ -107,6 +107,7 @@ struct wmJob { /* internal */ void *owner; + int flag; short suspended, running, ready, do_update, stop; /* once running, we store this separately */ @@ -123,7 +124,7 @@ struct wmJob { /* returns current or adds new job, but doesnt run it */ /* every owner only gets a single job, adding a new one will stop running stop and when stopped it starts the new one */ -wmJob *WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner) +wmJob *WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner, int flag) { wmJob *steve; @@ -137,6 +138,7 @@ wmJob *WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner) BLI_addtail(&wm->jobs, steve); steve->win= win; steve->owner= owner; + steve->flag= flag; } return steve; @@ -198,20 +200,25 @@ static void *do_job_thread(void *job_v) } /* dont allow same startjob to be executed twice */ -static void wm_jobs_test_suspend(wmWindowManager *wm, wmJob *test) +static void wm_jobs_test_suspend_stop(wmWindowManager *wm, wmJob *test) { wmJob *steve; + int suspend= 0; - for(steve= wm->jobs.first; steve; steve= steve->next) - if(steve!=test) - if(steve->running) - if(steve->startjob==test->startjob) - break; - - if(steve) - test->suspended= 1; - else - test->suspended= 0; + for(steve= wm->jobs.first; steve; steve= steve->next) { + if(steve==test || !steve->running) continue; + if(steve->startjob!=test->startjob && !(test->flag & WM_JOB_EXCL_RENDER)) continue; + if((test->flag & WM_JOB_EXCL_RENDER) && !(steve->flag & WM_JOB_EXCL_RENDER)) continue; + + suspend= 1; + + /* if this job has higher priority, stop others */ + if(test->flag & WM_JOB_PRIORITY) + steve->stop= 1; + } + + /* possible suspend ourselfs, waiting for other jobs, or de-suspend */ + test->suspended= suspend; } /* if job running, the same owner gave it a new job */ @@ -225,7 +232,7 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *steve) else { if(steve->customdata && steve->startjob) { - wm_jobs_test_suspend(wm, steve); + wm_jobs_test_suspend_stop(wm, steve); if(steve->suspended==0) { /* copy to ensure proper free in end */ diff --git a/source/blender/windowmanager/intern/wm_subwindow.c b/source/blender/windowmanager/intern/wm_subwindow.c index dc2aca7b15b..081125bf7f6 100644 --- a/source/blender/windowmanager/intern/wm_subwindow.c +++ b/source/blender/windowmanager/intern/wm_subwindow.c @@ -434,7 +434,7 @@ static int wm_get_colordepth(void) /* apple seems to round colors to below and up on some configs */ -static unsigned int index_to_framebuffer(int index) +unsigned int index_to_framebuffer(int index) { unsigned int i= index; @@ -464,7 +464,7 @@ static unsigned int index_to_framebuffer(int index) /* this is the old method as being in use for ages.... seems to work? colors are rounded to lower values */ -static unsigned int index_to_framebuffer(int index) +unsigned int index_to_framebuffer(int index) { unsigned int i= index; diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index c853afe4507..466e5868723 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -71,7 +71,8 @@ static int prefsizx= 0, prefsizy= 0, prefstax= 0, prefstay= 0; /* ******** win open & close ************ */ -/* XXX this one should correctly check for apple top header... */ +/* XXX this one should correctly check for apple top header... + done for Cocoa : returns window contents (and not frame) max size*/ static void wm_get_screensize(int *width_r, int *height_r) { unsigned int uiwidth; @@ -90,7 +91,7 @@ static void wm_window_check_position(rcti *rect) wm_get_screensize(&width, &height); -#ifdef __APPLE__ +#if defined(__APPLE__) && !defined(GHOST_COCOA) height -= 70; #endif @@ -269,7 +270,12 @@ void wm_window_title(wmWindowManager *wm, wmWindow *win) else GHOST_SetTitle(win->ghostwin, "Blender"); -#ifdef __APPLE__ + /* Informs GHOST of unsaved changes, to set window modified visual indicator (MAC OS X) + and to give hint of unsaved changes for a user warning mechanism + in case of OS application terminate request (e.g. OS Shortcut Alt+F4, Cmd+Q, (...), or session end) */ + GHOST_SetWindowModifiedState(win->ghostwin, (GHOST_TUns8)!wm->file_saved); + +#if defined(__APPLE__) && !defined(GHOST_COCOA) if(wm->file_saved) GHOST_SetWindowState(win->ghostwin, GHOST_kWindowStateUnModified); else @@ -292,7 +298,7 @@ static void wm_window_add_ghostwindow(wmWindowManager *wm, char *title, wmWindow // inital_state = GHOST_kWindowStateMaximized; inital_state = GHOST_kWindowStateNormal; -#ifdef __APPLE__ +#if defined(__APPLE__) && !defined(GHOST_COCOA) { extern int macPrefState; /* creator.c */ inital_state += macPrefState; @@ -339,7 +345,8 @@ void wm_window_add_ghostwindows(wmWindowManager *wm) if (!prefsizx) { wm_get_screensize(&prefsizx, &prefsizy); -#ifdef __APPLE__ +#if defined(__APPLE__) && !defined(GHOST_COCOA) +//Cocoa provides functions to get correct max window size { extern void wm_set_apple_prefsize(int, int); /* wm_apple.c */ |