[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32966] trunk/blender/source/blender: Bugfix #20812 (and probably others)

Ton Roosendaal ton at blender.org
Tue Nov 9 15:54:59 CET 2010


Revision: 32966
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32966
Author:   ton
Date:     2010-11-09 15:54:59 +0100 (Tue, 09 Nov 2010)

Log Message:
-----------
Bugfix #20812 (and probably others)

Issue: in user preferences window, using file selecting caused the
the userpref window to be saved, and not closing.

Reason: design error (by me) in using screen->full tag for denoting
a temporarily screen (like file window). Fixed by using a new 
screen->temp variable for it.

System remained unstable though, noticed another issue with freeing
temp screens in wrong places. Seems nice stable now! Will check on
the wiki for relarted issues now.

Modified Paths:
--------------
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/render/render_internal.c
    trunk/blender/source/blender/editors/screen/screen_edit.c
    trunk/blender/source/blender/editors/screen/screen_ops.c
    trunk/blender/source/blender/makesdna/DNA_screen_types.h
    trunk/blender/source/blender/windowmanager/intern/wm_files.c
    trunk/blender/source/blender/windowmanager/intern/wm_window.c

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2010-11-09 11:26:00 UTC (rev 32965)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2010-11-09 14:54:59 UTC (rev 32966)
@@ -10344,31 +10344,6 @@
 				}
 			}
 		}
-		/* clear hanging 'temp' screens from older 2.5 files*/
-		if (main->versionfile == 250) {
-			bScreen *screen, *nextscreen;
-			wmWindowManager *wm;
-			wmWindow *win, *nextwin;
-
-			for(screen= main->screen.first; screen; screen= nextscreen) {
-				nextscreen= screen->id.next;
-
-				if (screen->full == SCREENTEMP) {
-					/* remove corresponding windows */
-					for(wm= main->wm.first; wm; wm=wm->id.next) {
-						for(win= wm->windows.first; win; win=nextwin) {
-							nextwin= win->next;
-
-							if(newlibadr(fd, wm->id.lib, win->screen) == screen)
-								BLI_freelinkN(&wm->windows, win);
-						}
-					}
-
-					/* remove screen itself */
-					free_libblock(&main->screen, screen);
-				}
-			}
-		}
 	}
 	
 	if (main->versionfile < 250 || (main->versionfile == 250 && main->subversionfile < 9))

Modified: trunk/blender/source/blender/editors/render/render_internal.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_internal.c	2010-11-09 11:26:00 UTC (rev 32965)
+++ trunk/blender/source/blender/editors/render/render_internal.c	2010-11-09 14:54:59 UTC (rev 32966)
@@ -781,7 +781,7 @@
 	SpaceImage *sima= sa->spacedata.first;
 
 	/* test if we have a temp screen in front */
-	if(CTX_wm_window(C)->screen->full==SCREENTEMP) {
+	if(CTX_wm_window(C)->screen->temp) {
 		wm_window_lower(CTX_wm_window(C));
 		return OPERATOR_FINISHED;
 	}
@@ -826,7 +826,7 @@
 	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) {
+	if(CTX_wm_window(C)->screen->temp) {
 		wm_window_lower(CTX_wm_window(C));
 	}
 	/* determine if render already shows */

Modified: trunk/blender/source/blender/editors/screen/screen_edit.c
===================================================================
--- trunk/blender/source/blender/editors/screen/screen_edit.c	2010-11-09 11:26:00 UTC (rev 32965)
+++ trunk/blender/source/blender/editors/screen/screen_edit.c	2010-11-09 14:54:59 UTC (rev 32966)
@@ -1140,8 +1140,7 @@
 	/* mark it available for use for other windows */
 	screen->winid= 0;
 	
-	/* before deleting the temp screen or we get invalid access */
-	if (prevwin->screen->full != SCREENTEMP) {
+	if (prevwin->screen->temp == 0) {
 		/* use previous window if possible */
 		CTX_wm_window_set(C, prevwin);
 	} else {
@@ -1149,11 +1148,6 @@
 		CTX_wm_window_set(C, NULL);
 	}
 	
-	/* if temp screen, delete it */
-	if(screen->full == SCREENTEMP) {
-		Main *bmain= CTX_data_main(C);
-		free_libblock(&bmain->screen, screen);
-	}
 }
 
 /* *********************************** */
@@ -1560,46 +1554,39 @@
 	}
 
 	if(sa && sa->full) {
+		ScrArea *old;
 		short fulltype;
 
 		sc= sa->full;		/* the old screen to restore */
 		oldscreen= win->screen;	/* the one disappearing */
 
 		fulltype = sc->full;
+		sc->full= 0;
 
-		/* refuse to go out of SCREENAUTOPLAY as long as G_FLAGS_AUTOPLAY
-		   is set */
+		/* removed: SCREENAUTOPLAY exception here */
+	
+		/* find old area */
+		for(old= sc->areabase.first; old; old= old->next)
+			if(old->full) break;
+		if(old==NULL) {
+			if (G.f & G_DEBUG)
+				printf("something wrong in areafullscreen\n");
+			return NULL;
+		}
 
-		if (fulltype != SCREENAUTOPLAY || (G.flags & G_FILE_AUTOPLAY) == 0) {
-			ScrArea *old;
+		area_copy_data(old, sa, 1);	/*  1 = swap spacelist */
+		if (sa->flag & AREA_TEMP_INFO) sa->flag &= ~AREA_TEMP_INFO;
+		old->full= NULL;
 
-			sc->full= 0;
+		/* animtimer back */
+		sc->animtimer= oldscreen->animtimer;
+		oldscreen->animtimer= NULL;
 
-			/* find old area */
-			for(old= sc->areabase.first; old; old= old->next)
-				if(old->full) break;
-			if(old==NULL) {
-				if (G.f & G_DEBUG)
-					printf("something wrong in areafullscreen\n");
-				return NULL;
-			}
-				// old feature described below (ton)
-				// in autoplay screens the headers are disabled by
-				// default. So use the old headertype instead
+		ED_screen_set(C, sc);
 
-			area_copy_data(old, sa, 1);	/*  1 = swap spacelist */
-			if (sa->flag & AREA_TEMP_INFO) sa->flag &= ~AREA_TEMP_INFO;
-			old->full= NULL;
+		free_screen(oldscreen);
+		free_libblock(&CTX_data_main(C)->screen, oldscreen);
 
-			/* animtimer back */
-			sc->animtimer= oldscreen->animtimer;
-			oldscreen->animtimer= NULL;
-
-			ED_screen_set(C, sc);
-
-			free_screen(oldscreen);
-			free_libblock(&CTX_data_main(C)->screen, oldscreen);
-		}
 	}
 	else {
 		ScrArea *newa;
@@ -1614,7 +1601,7 @@
 		*/
 
 		oldscreen->full = SCREENFULL;
-		BLI_snprintf(newname, sizeof(newname), "%s-%s", oldscreen->id.name+2, "temp");
+		BLI_snprintf(newname, sizeof(newname), "%s-%s", oldscreen->id.name+2, "full");
 		sc= ED_screen_add(win, oldscreen->scene, newname);
 		sc->full = SCREENFULL; // XXX
 

Modified: trunk/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- trunk/blender/source/blender/editors/screen/screen_ops.c	2010-11-09 11:26:00 UTC (rev 32965)
+++ trunk/blender/source/blender/editors/screen/screen_ops.c	2010-11-09 14:54:59 UTC (rev 32966)
@@ -1708,6 +1708,10 @@
 	int tot= BLI_countlist(&CTX_data_main(C)->screen);
 	int delta= RNA_int_get(op->ptr, "delta");
 	
+	/* temp screens are for userpref or render display */
+	if(screen->temp)
+		return OPERATOR_CANCELLED;
+	
 	/* return to previous state before switching screens */
 	if(sa && sa->full)
 		ED_screen_full_restore(C, sa);
@@ -2817,7 +2821,6 @@
 
 static int userpref_show_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
 {
-	ScrArea *sa;
 	rcti rect;
 	int sizex, sizey;
 	
@@ -2833,9 +2836,6 @@
 	/* changes context! */
 	WM_window_open_temp(C, &rect, WM_WINDOW_USERPREFS);
 	
-	sa= CTX_wm_area(C);
-	
-	
 	return OPERATOR_FINISHED;
 }
 

Modified: trunk/blender/source/blender/makesdna/DNA_screen_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_screen_types.h	2010-11-09 11:26:00 UTC (rev 32965)
+++ trunk/blender/source/blender/makesdna/DNA_screen_types.h	2010-11-09 14:54:59 UTC (rev 32966)
@@ -54,7 +54,8 @@
 	struct Scene *scene;
 	struct Scene *newscene;				/* temporary when switching */
 	
-	short full;							/* fade out? */
+	short full;							/* temp screen for image render display or fileselect */
+	short temp;							/* temp screen in a temp window, don't save (like user prefs) */
 	short winid;						/* winid from WM, starts with 1 */
 	short do_draw;						/* notifier for drawing edges */
 	short do_refresh;					/* notifier for scale screen, changed screen, etc */
@@ -66,7 +67,7 @@
 	short mainwin;						/* screensize subwindow, for screenedges and global menus */
 	short subwinactive;					/* active subwindow */
 	
-	int pad2;
+	short pad;
 	
 	struct wmTimer *animtimer;			/* if set, screen has timer handler added in window */
 	void *context;						/* context callback */
@@ -187,10 +188,9 @@
 #define HEADERDOWN	1
 #define HEADERTOP	2
 
+/* screen->full */
 #define SCREENNORMAL    0
 #define SCREENFULL      1
-#define SCREENAUTOPLAY  2
-#define SCREENTEMP		3
 
 
 /* Panel->snap - for snapping to screen edges */

Modified: trunk/blender/source/blender/windowmanager/intern/wm_files.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_files.c	2010-11-09 11:26:00 UTC (rev 32965)
+++ trunk/blender/source/blender/windowmanager/intern/wm_files.c	2010-11-09 14:54:59 UTC (rev 32966)
@@ -673,7 +673,7 @@
 	int fileflags;
 	
 	/* check current window and close it if temp */
-	if(win->screen->full == SCREENTEMP)
+	if(win->screen->temp)
 		wm_window_close(C, wm, win);
 	
 	BLI_make_file_string("/", tstr, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_STARTUP_FILE);

Modified: trunk/blender/source/blender/windowmanager/intern/wm_window.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_window.c	2010-11-09 11:26:00 UTC (rev 32965)
+++ trunk/blender/source/blender/windowmanager/intern/wm_window.c	2010-11-09 14:54:59 UTC (rev 32966)
@@ -44,6 +44,7 @@
 
 #include "BKE_blender.h"
 #include "BKE_context.h"
+#include "BKE_library.h"
 #include "BKE_global.h"
 #include "BKE_main.h"
 #include "BKE_utildefines.h"
@@ -237,13 +238,20 @@
 	CTX_wm_window_set(C, win);	/* needed by handlers */
 	WM_event_remove_handlers(C, &win->handlers);
 	WM_event_remove_handlers(C, &win->modalhandlers);
-	ED_screen_exit(C, win, win->screen); /* will free the current screen if it is a temp layout */
+	ED_screen_exit(C, win, win->screen); 
+	
+	/* if temp screen, delete it */
+	if(win->screen->temp) {
+		Main *bmain= CTX_data_main(C);
+		free_libblock(&bmain->screen, win->screen);
+	}
+	
 	wm_window_free(C, wm, win);
 	
 	/* check remaining windows */
 	if(wm->windows.first) {
 		for(win= wm->windows.first; win; win= win->next)
-			if(win->screen->full!=SCREENTEMP)
+			if(win->screen->temp == 0)
 				break;
 		/* in this case we close all */
 		if(win==NULL)
@@ -256,7 +264,7 @@
 void wm_window_title(wmWindowManager *wm, wmWindow *win)
 {
 	/* handle the 'temp' window */
-	if(win->screen && win->screen->full==SCREENTEMP) {
+	if(win->screen && win->screen->temp) {
 		GHOST_SetTitle(win->ghostwin, "Blender");
 	}
 	else {
@@ -430,7 +438,7 @@
 	return win;
 }
 
-/* uses screen->full tag to define what to do, currently it limits
+/* uses screen->temp 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 */
 
@@ -444,7 +452,7 @@
 	
 	/* 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)
+		if(win->screen->temp)
 			break;
 	
 	/* add new window? */
@@ -466,7 +474,7 @@
 	/* add new screen? */
 	if(win->screen==NULL)
 		win->screen= ED_screen_add(win, CTX_data_scene(C), "temp");
-	win->screen->full = SCREENTEMP; 
+	win->screen->temp = 1; 
 	
 	/* make window active, and validate/resize */
 	CTX_wm_window_set(C, win);





More information about the Bf-blender-cvs mailing list