[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24001] trunk/blender: Auto Save

Brecht Van Lommel brecht at blender.org
Tue Oct 20 15:58:54 CEST 2009


Revision: 24001
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24001
Author:   blendix
Date:     2009-10-20 15:58:53 +0200 (Tue, 20 Oct 2009)

Log Message:
-----------
Auto Save

Auto save is now working again in 2.5. It will also remember now what
the location of the original file was when recovering it, so that
library links still work and saving the restored file does not save to
the temp directory. There is also a new Recover Auto Save operator
which will open the filebrowser in the temp directory and show the
auto saved .blends.

Implemenation Notes:

* Timer storage was moved from window to windowmanager, so we can have
  windowmanager level timers too now, doesn't make sense to have
  autosave timer attached to a particular window.
* FileGlobal now has a filename field storing where the file was saved.
  Note that this is only used when loading a file through the recover
  operators, regular file read doesn't use it, so copying the quit.blend
  manually over the original file will still work as expected.
* Jobs timer no longer uses operator now, this seems more like an
  internal thing, changing keymaps should not make it possible to break
  the jobs manager.
* Autosave is postponed by 10 seconds when a modal operator is running,
  e.g. transform or file browsing.
* Moved setting G.sce in setup_app_data before depsgraph updates, these
  can use the filename for pointcaches.

Modified Paths:
--------------
    trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp
    trunk/blender/release/scripts/ui/space_info.py
    trunk/blender/source/blender/blenkernel/BKE_global.h
    trunk/blender/source/blender/blenkernel/intern/blender.c
    trunk/blender/source/blender/blenloader/BLO_readfile.h
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/editors/interface/interface_handlers.c
    trunk/blender/source/blender/editors/interface/interface_panel.c
    trunk/blender/source/blender/editors/screen/screen_edit.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_image.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_stroke.c
    trunk/blender/source/blender/editors/space_file/file_draw.c
    trunk/blender/source/blender/editors/space_image/image_ops.c
    trunk/blender/source/blender/editors/space_view3d/view3d_view.c
    trunk/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c
    trunk/blender/source/blender/makesdna/DNA_fileglobal_types.h
    trunk/blender/source/blender/makesdna/DNA_windowmanager_types.h
    trunk/blender/source/blender/makesrna/intern/rna_userdef.c
    trunk/blender/source/blender/makesrna/intern/rna_wm.c
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/WM_types.h
    trunk/blender/source/blender/windowmanager/intern/wm.c
    trunk/blender/source/blender/windowmanager/intern/wm_draw.c
    trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
    trunk/blender/source/blender/windowmanager/intern/wm_files.c
    trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c
    trunk/blender/source/blender/windowmanager/intern/wm_jobs.c
    trunk/blender/source/blender/windowmanager/intern/wm_operators.c
    trunk/blender/source/blender/windowmanager/intern/wm_window.c
    trunk/blender/source/blender/windowmanager/wm.h
    trunk/blender/source/blender/windowmanager/wm_event_types.h
    trunk/blender/source/blender/windowmanager/wm_window.h

Modified: trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp	2009-10-20 13:56:53 UTC (rev 24000)
+++ trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp	2009-10-20 13:58:53 UTC (rev 24001)
@@ -1412,7 +1412,7 @@
 				setWindowCursorVisibility(false);
 
 		}
-		XGrabPointer(m_display, m_window, True, ButtonPressMask| ButtonReleaseMask|PointerMotionMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
+		//XGrabPointer(m_display, m_window, True, ButtonPressMask| ButtonReleaseMask|PointerMotionMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
 	}
 	else {
 		if (m_cursorGrab==GHOST_kGrabHide) {
@@ -1430,7 +1430,7 @@
 		/* Almost works without but important otherwise the mouse GHOST location can be incorrect on exit */
 		setCursorGrabAccum(0, 0);
 		m_cursorGrabBounds.m_l= m_cursorGrabBounds.m_r= -1; /* disable */
-		XUngrabPointer(m_display, CurrentTime);
+		//XUngrabPointer(m_display, CurrentTime);
 	}
 
 	XFlush(m_display);

Modified: trunk/blender/release/scripts/ui/space_info.py
===================================================================
--- trunk/blender/release/scripts/ui/space_info.py	2009-10-20 13:56:53 UTC (rev 24000)
+++ trunk/blender/release/scripts/ui/space_info.py	2009-10-20 13:58:53 UTC (rev 24001)
@@ -54,6 +54,7 @@
 		layout.itemO("wm.open_mainfile", text="Open...", icon='ICON_FILE_FOLDER')
 		layout.item_menu_enumO("wm.open_recentfile", "file", text="Open Recent")
 		layout.itemO("wm.recover_last_session")
+		layout.itemO("wm.recover_auto_save", text="Recover Auto Save...")
 
 		layout.itemS()
 

Modified: trunk/blender/source/blender/blenkernel/BKE_global.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_global.h	2009-10-20 13:56:53 UTC (rev 24000)
+++ trunk/blender/source/blender/blenkernel/BKE_global.h	2009-10-20 13:58:53 UTC (rev 24001)
@@ -145,6 +145,7 @@
 #define G_FILE_GLSL_NO_NODES	 (1 << 20)				/* deprecated */
 #define G_FILE_GLSL_NO_EXTRA_TEX (1 << 21)				/* deprecated */
 #define G_FILE_IGNORE_DEPRECATION_WARNINGS	(1 << 22)	/* deprecated */
+#define G_FILE_RECOVER			 (1 << 23)
 
 /* G.windowstate */
 #define G_WINDOWSTATE_USERDEF		0

Modified: trunk/blender/source/blender/blenkernel/intern/blender.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/blender.c	2009-10-20 13:56:53 UTC (rev 24000)
+++ trunk/blender/source/blender/blenkernel/intern/blender.c	2009-10-20 13:58:53 UTC (rev 24001)
@@ -281,12 +281,15 @@
 	Object *ob;
 	bScreen *curscreen= NULL;
 	Scene *curscene= NULL;
+	int recover;
 	char mode;
-	
+
 	/* 'u' = undo save, 'n' = no UI load */
 	if(bfd->main->screen.first==NULL) mode= 'u';
 	else if(G.fileflags & G_FILE_NO_UI) mode= 'n';
 	else mode= 0;
+
+	recover= (G.fileflags & G_FILE_RECOVER);
 	
 	clean_paths(bfd->main);
 	
@@ -371,6 +374,16 @@
 	if(G.main->versionfile < 250)
 		do_versions_ipos_to_animato(G.main); // XXX fixme... complicated versionpatching
 	
+	/* in case of autosave or quit.blend, use original filename instead */
+	if(recover && bfd->filename[0])
+		filename= bfd->filename;
+	
+	/* these are the same at times, should never copy to the same location */
+	if(G.sce != filename)
+		BLI_strncpy(G.sce, filename, FILE_MAX);
+	
+	BLI_strncpy(G.main->name, filename, FILE_MAX); /* is guaranteed current file */
+
 	/* baseflags, groups, make depsgraph, etc */
 	set_scene_bg(CTX_data_scene(C));
 
@@ -383,11 +396,6 @@
 	/* now tag update flags, to ensure deformers get calculated on redraw */
 	DAG_scene_update_flags(CTX_data_scene(C), CTX_data_scene(C)->lay);
 	
-	if (G.sce != filename) /* these are the same at times, should never copy to the same location */
-		strcpy(G.sce, filename);
-	
-	BLI_strncpy(G.main->name, filename, FILE_MAX); /* is guaranteed current file */
-	
 	MEM_freeN(bfd);
 }
 

Modified: trunk/blender/source/blender/blenloader/BLO_readfile.h
===================================================================
--- trunk/blender/source/blender/blenloader/BLO_readfile.h	2009-10-20 13:56:53 UTC (rev 24000)
+++ trunk/blender/source/blender/blenloader/BLO_readfile.h	2009-10-20 13:58:53 UTC (rev 24001)
@@ -62,6 +62,7 @@
 	int fileflags;
 	int displaymode;
 	int globalf;
+	char filename[240];	/* 240 = FILE_MAX */
 	
 	struct bScreen*	curscreen;
 	struct Scene*	curscene;

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2009-10-20 13:56:53 UTC (rev 24000)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2009-10-20 13:58:53 UTC (rev 24001)
@@ -4432,7 +4432,6 @@
 		win->curswin= NULL;
 		win->tweak= NULL;
 
-		win->timers.first= win->timers.last= NULL;
 		win->queue.first= win->queue.last= NULL;
 		win->handlers.first= win->handlers.last= NULL;
 		win->modalhandlers.first= win->modalhandlers.last= NULL;
@@ -4444,6 +4443,7 @@
 		win->drawfail= 0;
 	}
 	
+	wm->timers.first= wm->timers.last= NULL;
 	wm->operators.first= wm->operators.last= NULL;
 	wm->paintcursors.first= wm->paintcursors.last= NULL;
 	wm->queue.first= wm->queue.last= NULL;
@@ -5468,6 +5468,7 @@
 	bfd->fileflags= fg->fileflags;
 	bfd->displaymode= fg->displaymode;
 	bfd->globalf= fg->globalf;
+	BLI_strncpy(bfd->filename, fg->filename, sizeof(bfd->filename));
 	
 	bfd->curscreen= fg->curscreen;
 	bfd->curscene= fg->curscene;

Modified: trunk/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/writefile.c	2009-10-20 13:56:53 UTC (rev 24000)
+++ trunk/blender/source/blender/blenloader/intern/writefile.c	2009-10-20 13:58:53 UTC (rev 24001)
@@ -2308,7 +2308,7 @@
 /* context is usually defined by WM, two cases where no WM is available:
  * - for forward compatibility, curscreen has to be saved
  * - for undofile, curscene needs to be saved */
-static void write_global(WriteData *wd, Main *mainvar)
+static void write_global(WriteData *wd, int fileflags, Main *mainvar)
 {
 	FileGlobal fg;
 	bScreen *screen;
@@ -2321,8 +2321,9 @@
 	fg.curscene= screen->scene;
 	fg.displaymode= G.displaymode;
 	fg.winpos= G.winpos;
-	fg.fileflags= (G.fileflags & ~G_FILE_NO_UI);	// prevent to save this, is not good convention, and feature with concerns...
+	fg.fileflags= (fileflags & ~G_FILE_NO_UI);	// prevent to save this, is not good convention, and feature with concerns...
 	fg.globalf= G.f;
+	BLI_strncpy(fg.filename, mainvar->name, sizeof(fg.filename));
 
 	sprintf(subvstr, "%4d", BLENDER_SUBVERSION);
 	memcpy(fg.subvstr, subvstr, 4);
@@ -2351,7 +2352,7 @@
 	mywrite(wd, buf, 12);
 
 	write_renderinfo(wd, mainvar);
-	write_global(wd, mainvar);
+	write_global(wd, write_flags, mainvar);
 
 	/* no UI save in undo */
 	if(current==NULL) {

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c	2009-10-20 13:56:53 UTC (rev 24000)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c	2009-10-20 13:58:53 UTC (rev 24001)
@@ -92,6 +92,7 @@
 } uiHandleButtonState;
 
 typedef struct uiHandleButtonData {
+	wmWindowManager *wm;
 	wmWindow *window;
 	ARegion *region;
 
@@ -3677,7 +3678,7 @@
 	data= but->active;
 
 	if(data->tooltiptimer) {
-		WM_event_remove_window_timer(data->window, data->tooltiptimer);
+		WM_event_remove_timer(data->wm, data->window, data->tooltiptimer);
 		data->tooltiptimer= NULL;
 	}
 	if(data->tooltip) {
@@ -3686,7 +3687,7 @@
 	}
 
 	if(data->autoopentimer) {
-		WM_event_remove_window_timer(data->window, data->autoopentimer);
+		WM_event_remove_timer(data->wm, data->window, data->autoopentimer);
 		data->autoopentimer= NULL;
 	}
 }
@@ -3698,13 +3699,13 @@
 	data= but->active;
 
 	if(data->tooltiptimer) {
-		WM_event_remove_window_timer(data->window, data->tooltiptimer);
+		WM_event_remove_timer(data->wm, data->window, data->tooltiptimer);
 		data->tooltiptimer= NULL;
 	}
 
 	if(U.flag & USER_TOOLTIPS)
 		if(!but->block->tooltipdisabled)
-			data->tooltiptimer= WM_event_add_window_timer(data->window, TIMER, BUTTON_TOOLTIP_DELAY);
+			data->tooltiptimer= WM_event_add_timer(data->wm, data->window, TIMER, BUTTON_TOOLTIP_DELAY);
 }
 
 static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState state)
@@ -3732,7 +3733,7 @@
 				else time= -1;
 
 				if(time >= 0)
-					data->autoopentimer= WM_event_add_window_timer(data->window, TIMER, 0.02*(double)time);
+					data->autoopentimer= WM_event_add_timer(data->wm, data->window, TIMER, 0.02*(double)time);
 			}
 		}
 	}
@@ -3765,10 +3766,10 @@
 
 	/* add a short delay before exiting, to ensure there is some feedback */
 	if(state == BUTTON_STATE_WAIT_FLASH) {
-		data->flashtimer= WM_event_add_window_timer(data->window, TIMER, BUTTON_FLASH_DELAY);
+		data->flashtimer= WM_event_add_timer(data->wm, data->window, TIMER, BUTTON_FLASH_DELAY);
 	}
 	else if(data->flashtimer) {
-		WM_event_remove_window_timer(data->window, data->flashtimer);
+		WM_event_remove_timer(data->wm, data->window, data->flashtimer);
 		data->flashtimer= NULL;
 	}
 
@@ -3799,6 +3800,7 @@
 
 	/* setup struct */
 	data= MEM_callocN(sizeof(uiHandleButtonData), "uiHandleButtonData");
+	data->wm= CTX_wm_manager(C);
 	data->window= CTX_wm_window(C);
 	data->region= ar;
 	if( ELEM(but->type, BUT_CURVE, SEARCH_MENU) );  // XXX curve is temp
@@ -4036,7 +4038,7 @@
 			case TIMER: {
 				/* handle tooltip timer */
 				if(event->customdata == data->tooltiptimer) {
-					WM_event_remove_window_timer(data->window, data->tooltiptimer);
+					WM_event_remove_timer(data->wm, data->window, data->tooltiptimer);
 					data->tooltiptimer= NULL;
 
 					if(!data->tooltip)
@@ -4044,7 +4046,7 @@
 				}
 				/* handle menu auto open timer */
 				else if(event->customdata == data->autoopentimer) {
-					WM_event_remove_window_timer(data->window, data->autoopentimer);
+					WM_event_remove_timer(data->wm, data->window, data->autoopentimer);
 					data->autoopentimer= NULL;
 
 					if(ui_mouse_inside_button(ar, but, event->x, event->y))
@@ -4058,7 +4060,7 @@
 			case MIDDLEMOUSE:

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list