[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18852] branches/blender2.5/blender/source /blender: 2.5

Ton Roosendaal ton at blender.org
Sat Feb 7 20:37:29 CET 2009


Revision: 18852
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18852
Author:   ton
Date:     2009-02-07 20:37:29 +0100 (Sat, 07 Feb 2009)

Log Message:
-----------
2.5

- Screen browse button back

- Several fixes in using screens in more windows.
  Still has loose ends, but things are definitely more stable!

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
    branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
    branches/blender2.5/blender/source/blender/editors/screen/area.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_intern.h
    branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
    branches/blender2.5/blender/source/blender/editors/space_info/info_header.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_space_types.h
    branches/blender2.5/blender/source/blender/windowmanager/WM_types.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_files.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_window.c

Modified: branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2009-02-07 16:43:55 UTC (rev 18851)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2009-02-07 19:37:29 UTC (rev 18852)
@@ -4516,7 +4516,7 @@
 		/* 2.50: we now always add spacedata for info */
 		if(sa->spacedata.first==NULL) {
 			SpaceInfo *sinfo= MEM_callocN(sizeof(SpaceInfo), "spaceinfo");
-			sa->spacetype= SPACE_INFO;
+			sa->spacetype= sinfo->spacetype= SPACE_INFO;
 			BLI_addtail(&sa->spacedata, sinfo);
 		}
 		/* add local view3d too */

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2009-02-07 16:43:55 UTC (rev 18851)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2009-02-07 19:37:29 UTC (rev 18852)
@@ -78,6 +78,7 @@
 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);
+void	ED_screen_set(struct bContext *C, struct bScreen *sc);
 void	ED_screen_set_subwinactive(struct wmWindow *win, struct wmEvent *event);
 void	ED_screen_exit(struct bContext *C, struct wmWindow *window, struct bScreen *screen);
 void	ED_screen_animation_timer(struct bContext *C, int enable);

Modified: branches/blender2.5/blender/source/blender/editors/screen/area.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/area.c	2009-02-07 16:43:55 UTC (rev 18851)
+++ branches/blender2.5/blender/source/blender/editors/screen/area.c	2009-02-07 19:37:29 UTC (rev 18852)
@@ -642,6 +642,10 @@
 	else {
 		BKE_spacedata_freelist(&sa1->spacedata);
 		BKE_spacedata_copylist(&sa1->spacedata, &sa2->spacedata);
+		
+		if(sa1->spacedata.first==NULL) {
+			printf("copy data error\n");
+		}
 	}
 	
 	/* regions */

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2009-02-07 16:43:55 UTC (rev 18851)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2009-02-07 19:37:29 UTC (rev 18852)
@@ -411,6 +411,7 @@
 	sc= alloc_libblock(&G.main->screen, ID_SCR, name);
 	sc->scene= scene;
 	sc->do_refresh= 1;
+	sc->winid= win->winid;
 	
 	sv1= screen_addvert(sc, 0, 0);
 	sv2= screen_addvert(sc, 0, win->sizey-1);
@@ -907,6 +908,10 @@
 	/* set in window */
 	win->screen= newsc;
 	
+	/* store identifier */
+	win->screen->winid= win->winid;
+	BLI_strncpy(win->screenname, win->screen->id.name+2, 21);
+
 	return newsc;
 }
 
@@ -1088,12 +1093,20 @@
 		WM_event_remove_window_timer(window, screen->animtimer);
 	screen->animtimer= NULL;
 	
+	if(screen->mainwin)
+		wm_subwindow_close(window, screen->mainwin);
+	screen->mainwin= 0;
+	screen->subwinactive= 0;
+	
 	for(ar= screen->regionbase.first; ar; ar= ar->next)
 		ED_region_exit(C, ar);
 
 	for(sa= screen->areabase.first; sa; sa= sa->next)
 		ED_area_exit(C, sa);
 
+	/* mark it available for use for other windows */
+	screen->winid= 0;
+	
 	CTX_wm_window_set(C, prevwin);
 }
 
@@ -1195,13 +1208,26 @@
 
 /* operator call, WM + Window + screen already existed before */
 /* Do NOT call in area/region queues! */
-void ed_screen_set(bContext *C, bScreen *sc)
+void ED_screen_set(bContext *C, bScreen *sc)
 {
+	wmWindow *win= CTX_wm_window(C);
 	bScreen *oldscreen= CTX_wm_screen(C);
+	ID *id;
 	
+	/* validate screen, it's called with notifier reference */
+	for(id= CTX_data_main(C)->screen.first; id; id= id->next)
+		if(sc == (bScreen *)id)
+			break;
+	if(id==NULL) 
+		return;
+	
+	/* check for valid winid */
+	if(sc->winid!=0 && sc->winid!=win->winid)
+		return;
+	
 	if(sc->full) {				/* find associated full */
 		bScreen *sc1;
-		for(sc1= G.main->screen.first; sc1; sc1= sc1->id.next) {
+		for(sc1= CTX_data_main(C)->screen.first; sc1; sc1= sc1->id.next) {
 			ScrArea *sa= sc1->areabase.first;
 			if(sa->full==sc) {
 				sc= sc1;
@@ -1212,7 +1238,6 @@
 	}
 	
 	if (oldscreen != sc) {
-		wmWindow *win= CTX_wm_window(C);
 		wmTimer *wt= oldscreen->animtimer;
 		
 		/* we put timer to sleep, so screen_exit has to think there's no timer */
@@ -1226,6 +1251,9 @@
 		win->screen= sc;
 		CTX_wm_window_set(C, win);	// stores C->wm.screen... hrmf
 		
+		/* prevent multiwin errors */
+		sc->winid= win->winid;
+		
 		ED_screen_refresh(CTX_wm_manager(C), CTX_wm_window(C));
 		WM_event_add_notifier(C, NC_WINDOW, NULL);
 	}
@@ -1274,7 +1302,7 @@
 			sc->animtimer= oldscreen->animtimer;
 			oldscreen->animtimer= NULL;
 			
-			ed_screen_set(C, sc);
+			ED_screen_set(C, sc);
 			
 			free_screen(oldscreen);
 			free_libblock(&G.main->screen, oldscreen);
@@ -1292,6 +1320,7 @@
 		oldscreen->full = SCREENFULL;
 		
 		sc= screen_add(CTX_wm_window(C), CTX_data_scene(C), "temp");
+		sc->full = SCREENFULL; // XXX
 		
 		/* timer */
 		sc->animtimer= oldscreen->animtimer;
@@ -1307,9 +1336,9 @@
 
 		sa->full= oldscreen;
 		newa->full= oldscreen;
-		newa->next->full= oldscreen;
+		newa->next->full= oldscreen; // XXX
 
-		ed_screen_set(C, sc);
+		ED_screen_set(C, sc);
 	}
 
 	/* XXX bad code: setscreen() ends with first area active. fullscreen render assumes this too */

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_intern.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_intern.h	2009-02-07 16:43:55 UTC (rev 18851)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_intern.h	2009-02-07 19:37:29 UTC (rev 18852)
@@ -52,7 +52,6 @@
 
 AZone		*is_in_area_actionzone(ScrArea *sa, int x, int y);
 
-void		ed_screen_set(bContext *C, bScreen *sc);
 void		ed_screen_fullarea(bContext *C, ScrArea *sa);
 
 /* screen_context.c */

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2009-02-07 16:43:55 UTC (rev 18851)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2009-02-07 19:37:29 UTC (rev 18852)
@@ -1025,6 +1025,7 @@
 static int screen_set_exec(bContext *C, wmOperator *op)
 {
 	bScreen *screen= CTX_wm_screen(C);
+	int tot= BLI_countlist(&CTX_data_main(C)->screen);
 	int delta= RNA_int_get(op->ptr, "delta");
 	
 	/* this screen is 'fake', solve later XXX */
@@ -1032,19 +1033,27 @@
 		return OPERATOR_CANCELLED;
 	
 	if(delta==1) {
-		screen= screen->id.next;
-		if(screen==NULL) screen= CTX_data_main(C)->screen.first;
+		while(tot--) {
+			screen= screen->id.next;
+			if(screen==NULL) screen= CTX_data_main(C)->screen.first;
+			if(screen->winid==0 && screen->full==0)
+				break;
+		}
 	}
 	else if(delta== -1) {
-		screen= screen->id.prev;
-		if(screen==NULL) screen= CTX_data_main(C)->screen.last;
+		while(tot--) {
+			screen= screen->id.prev;
+			if(screen==NULL) screen= CTX_data_main(C)->screen.last;
+			if(screen->winid==0 && screen->full==0)
+				break;
+		}
 	}
 	else {
 		screen= NULL;
 	}
 	
 	if(screen) {
-		ed_screen_set(C, screen);
+		ED_screen_set(C, screen);
 		return OPERATOR_FINISHED;
 	}
 	return OPERATOR_CANCELLED;

Modified: branches/blender2.5/blender/source/blender/editors/space_info/info_header.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_info/info_header.c	2009-02-07 16:43:55 UTC (rev 18851)
+++ branches/blender2.5/blender/source/blender/editors/space_info/info_header.c	2009-02-07 19:37:29 UTC (rev 18852)
@@ -103,10 +103,66 @@
 	}
 }
 
+static void screen_idpoin_handle(bContext *C, ID *id, int event)
+{
+	
+	switch(event) {
+		case UI_ID_BROWSE:
+			/* exception: can't set screens inside of area/region handers */
+			WM_event_add_notifier(C, NC_SCREEN|ND_SCREENBROWSE, id);
+			break;
+		case UI_ID_DELETE:
+			ED_undo_push(C, "");
+			break;
+		case UI_ID_RENAME:
+			break;
+		case UI_ID_ADD_NEW:
+			/* XXX not implemented */
+			break;
+		case UI_ID_OPEN:
+			/* XXX not implemented */
+			break;
+		case UI_ID_ALONE:
+			/* XXX not implemented */
+			break;
+		case UI_ID_PIN:
+			break;
+	}
+}
 
+static void scene_idpoin_handle(bContext *C, ID *id, int event)
+{
+	
+	switch(event) {
+		case UI_ID_BROWSE:
+			WM_event_add_notifier(C, NC_SCREEN|ND_SCENEBROWSE, CTX_wm_screen(C));
+			break;
+		case UI_ID_DELETE:
+			ED_undo_push(C, "");
+			break;
+		case UI_ID_RENAME:
+			break;
+		case UI_ID_ADD_NEW:
+			/* XXX not implemented */
+			break;
+		case UI_ID_OPEN:
+			/* XXX not implemented */
+			break;
+		case UI_ID_ALONE:
+			/* XXX not implemented */
+			break;
+		case UI_ID_PIN:
+			break;
+	}
+}
+
+
 void info_header_buttons(const bContext *C, ARegion *ar)
 {
+	wmWindow *win= CTX_wm_window(C);
+	bScreen *screen= CTX_wm_screen(C);
 	ScrArea *sa= CTX_wm_area(C);
+	SpaceInfo *si= sa->spacedata.first;
 	uiBlock *block;
 	int xco, yco= 3;
 	
@@ -147,6 +203,17 @@
 	}
 	
 	uiBlockSetEmboss(block, UI_EMBOSS);
+	
+	if(screen->full==NULL) {
+		si->screen= win->screen;
+		xco= uiDefIDPoinButs(block, CTX_data_main(C), NULL, (ID**)&si->screen, ID_SCR, NULL, xco, yco,
+						 screen_idpoin_handle, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_ADD_NEW|UI_ID_DELETE);
+		xco += 8;
+		si->scene= screen->scene;
+		xco= uiDefIDPoinButs(block, CTX_data_main(C), NULL, (ID**)&si->scene, ID_SCE, NULL, xco, yco,
+							 scene_idpoin_handle, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_ADD_NEW|UI_ID_DELETE);
+		xco += 8;
+	}	
 
 	if(WM_jobs_test(CTX_wm_manager(C), CTX_data_scene(C))) {
 		uiDefIconTextBut(block, BUT, B_STOPRENDER, ICON_REC, "Render", xco+5,yco,75,19, NULL, 0.0f, 0.0f, 0, 0, "Stop rendering");

Modified: branches/blender2.5/blender/source/blender/makesdna/DNA_space_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesdna/DNA_space_types.h	2009-02-07 16:43:55 UTC (rev 18851)
+++ branches/blender2.5/blender/source/blender/makesdna/DNA_space_types.h	2009-02-07 19:37:29 UTC (rev 18852)
@@ -52,6 +52,8 @@
 struct bGPdata;
 struct bDopeSheet;
 struct FileSelectParams;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list