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

Ton Roosendaal ton at blender.org
Mon Dec 22 13:57:53 CET 2008


Revision: 18013
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18013
Author:   ton
Date:     2008-12-22 13:57:53 +0100 (Mon, 22 Dec 2008)

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

Better implementation of own window timers, not using ghost.
That makes blender's WM nice in control, and gives callers
of timers the opportunitie to evaluate time passed since
previous step. This system also only generates one timer 
event per main loop (events - handlers - notifiers - draw)

Small fix: allow keymap modifier to give KM_ANY to ignore
modifier keys, this to have TIMER keymap work.

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/interface/interface_handlers.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
    branches/blender2.5/blender/source/blender/editors/space_time/time_header.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h
    branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h
    branches/blender2.5/blender/source/blender/windowmanager/WM_api.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_keymap.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_window.c
    branches/blender2.5/blender/source/blender/windowmanager/wm_window.h

Modified: branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2008-12-22 11:28:02 UTC (rev 18012)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2008-12-22 12:57:53 UTC (rev 18013)
@@ -3772,6 +3772,7 @@
 		win->eventstate= NULL;
 		win->curswin= NULL;
 		
+		win->timers.first= win->timers.last= NULL;
 		win->queue.first= win->queue.last= NULL;
 		win->handlers.first= win->handlers.last= NULL;
 		win->subwindows.first= win->subwindows.last= NULL;

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2008-12-22 11:28:02 UTC (rev 18012)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2008-12-22 12:57:53 UTC (rev 18013)
@@ -74,7 +74,7 @@
 bScreen *ED_screen_duplicate(struct wmWindow *win, 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_animation_timer(struct wmWindow *win, int enable);
+void	ED_screen_animation_timer(struct bContext *C, int enable);
 
 void	ED_operatortypes_screen(void);
 void	ED_keymap_screen(struct wmWindowManager *wm);

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c	2008-12-22 11:28:02 UTC (rev 18012)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c	2008-12-22 12:57:53 UTC (rev 18013)
@@ -58,8 +58,8 @@
 
 /***************** structs and defines ****************/
 
-#define BUTTON_TOOLTIP_DELAY		500
-#define BUTTON_FLASH_DELAY			20
+#define BUTTON_TOOLTIP_DELAY		0.500
+#define BUTTON_FLASH_DELAY			0.020
 #define BUTTON_AUTO_OPEN_THRESH		0.3
 #define BUTTON_MOUSE_TOWARDS_THRESH	1.0
 
@@ -94,7 +94,7 @@
 	uiHandleButtonState state;
 	int cancel, retval;
 	int applied, appliedinteractive;
-	wmTimerHandle *flashtimer;
+	wmTimer *flashtimer;
 
 	/* edited value */
 	char *str, *origstr;
@@ -106,8 +106,8 @@
 
 	/* tooltip */
 	ARegion *tooltip;
-	wmTimerHandle *tooltiptimer;
-	wmTimerHandle *autoopentimer;
+	wmTimer *tooltiptimer;
+	wmTimer *autoopentimer;
 
 	/* text selection/editing */
 	int maxlen, selextend, selstartx;
@@ -2761,7 +2761,7 @@
 
 	if(U.flag & USER_TOOLTIPS)
 		if(!but->block->tooltipdisabled)
-			data->tooltiptimer= WM_event_add_window_timer(data->window, BUTTON_TOOLTIP_DELAY, ~0);
+			data->tooltiptimer= WM_event_add_window_timer(data->window, BUTTON_TOOLTIP_DELAY);
 }
 
 static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState state)
@@ -2789,7 +2789,7 @@
 				else time= -1;
 
 				if(time >= 0)
-					data->autoopentimer= WM_event_add_window_timer(data->window, time*20, ~0);
+					data->autoopentimer= WM_event_add_window_timer(data->window, 0.02*(double)time);
 			}
 		}
 	}
@@ -2831,7 +2831,7 @@
 
 	/* 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, BUTTON_FLASH_DELAY, ~0);
+		data->flashtimer= WM_event_add_window_timer(data->window, BUTTON_FLASH_DELAY);
 	}
 	else if(data->flashtimer) {
 		WM_event_remove_window_timer(data->window, data->flashtimer);

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2008-12-22 11:28:02 UTC (rev 18012)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2008-12-22 12:57:53 UTC (rev 18013)
@@ -30,6 +30,7 @@
 
 #include "DNA_vec_types.h"
 #include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
 
 #include "BLI_blenlib.h"
 
@@ -994,6 +995,10 @@
 		ED_area_initialize(wm, win, sa);
 	}
 
+	/* wake up animtimer */
+	if(win->screen->animtimer)
+		WM_event_window_timer_sleep(win, win->screen->animtimer, 0);
+	
 	if(G.f & G_DEBUG) printf("set screen\n");
 	win->screen->do_refresh= 0;
 }
@@ -1053,6 +1058,10 @@
 
 	CTX_wm_window_set(C, window);
 	
+	if(screen->animtimer)
+		WM_event_remove_window_timer(window, screen->animtimer);
+	screen->animtimer= NULL;
+	
 	for(ar= screen->regionbase.first; ar; ar= ar->next)
 		ED_region_exit(C, ar);
 
@@ -1170,6 +1179,8 @@
 /* Do NOT call in area/region queues! */
 void ed_screen_set(bContext *C, bScreen *sc)
 {
+	bScreen *oldscreen= CTX_wm_screen(C);
+	
 	if(sc->full) {				/* find associated full */
 		bScreen *sc1;
 		for(sc1= G.main->screen.first; sc1; sc1= sc1->id.next) {
@@ -1182,8 +1193,17 @@
 		if(sc1==NULL) printf("set screen error\n");
 	}
 	
-	if (CTX_wm_screen(C) != sc) {
-		ED_screen_exit(C, CTX_wm_window(C), CTX_wm_screen(C));
+	if (oldscreen != sc) {
+		wmTimer *wt= oldscreen->animtimer;
+		
+		/* we put timer to sleep, so screen_exit has to think there's no timer */
+		oldscreen->animtimer= NULL;
+		if(wt)
+			WM_event_window_timer_sleep(CTX_wm_window(C), wt, 1);
+		
+		ED_screen_exit(C, CTX_wm_window(C), oldscreen);
+		oldscreen->animtimer= wt;
+		
 		CTX_wm_window(C)->screen= sc;
 		
 		ED_screen_refresh(CTX_wm_manager(C), CTX_wm_window(C));
@@ -1225,6 +1245,10 @@
 			
 			old->full= NULL;
 			
+			/* animtimer back */
+			sc->animtimer= oldscreen->animtimer;
+			oldscreen->animtimer= NULL;
+			
 			ed_screen_set(C, sc);
 			
 			free_screen(oldscreen);
@@ -1242,6 +1266,10 @@
 		
 		sc= screen_add(CTX_wm_window(C), "temp");
 		
+		/* timer */
+		sc->animtimer= oldscreen->animtimer;
+		oldscreen->animtimer= NULL;
+		
 		/* returns the top small area */
 		newa= area_split(CTX_wm_window(C), sc, (ScrArea *)sc->areabase.first, 'h', 0.99f);
 		area_newspace(C, newa, SPACE_INFO);
@@ -1264,14 +1292,17 @@
 
 }
 
-void ED_animation_timer(wmWindow *win, int enable)
+void ED_screen_animation_timer(bContext *C, int enable)
 {
+	bScreen *screen= CTX_wm_screen(C);
+	wmWindow *win= CTX_wm_window(C);
+	Scene *scene= CTX_data_scene(C);
 	
-//	if(win->animtimer)
-//		WM_event_remove_window_timer(win, win->animtimer);
-//	win->animtimer= NULL;
+	if(screen->animtimer)
+		WM_event_remove_window_timer(win, screen->animtimer);
+	screen->animtimer= NULL;
 	
-//	if(enable)
-//		win->animtimer= WM_event_add_window_timer(win, (int)(1000/FPS), (int)(1000/FPS));
+	if(enable)
+		screen->animtimer= WM_event_add_window_timer(win, (1.0/FPS));
 }
 

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2008-12-22 11:28:02 UTC (rev 18012)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2008-12-22 12:57:53 UTC (rev 18013)
@@ -1325,19 +1325,21 @@
 
 static int screen_animation_play(bContext *C, wmOperator *op, wmEvent *event)
 {
-	wmWindow *win= CTX_wm_window(C);
+	bScreen *screen= CTX_wm_screen(C);
 	
-	if(win->animtimer==event->customdata) {
+	if(screen->animtimer==event->customdata) {
 		Scene *scene= CTX_data_scene(C);
 		
 		scene->r.cfra++;
 		
-		/* XXX TODO: 
-		 * 'preview' range (psfra and pefra instead of sfra and efra)
-		 * should be used instead if set...  	
-		 */
-		if(scene->r.cfra > scene->r.efra)
-			scene->r.cfra= scene->r.sfra;
+		if (scene->r.psfra) {
+			if(scene->r.cfra > scene->r.pefra)
+				scene->r.cfra= scene->r.psfra;
+		}
+		else {
+			if(scene->r.cfra > scene->r.efra)
+				scene->r.cfra= scene->r.sfra;
+		}
 
 		WM_event_add_notifier(C, WM_NOTE_WINDOW_REDRAW, 0, NULL);
 		
@@ -1467,7 +1469,7 @@
 	RNA_enum_set(WM_keymap_add_item(keymap, "ED_SCR_OT_region_split", SKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "dir", 'v');
 						  
 	/*frame offsets*/
-	WM_keymap_add_item(keymap, "ED_SCR_OT_animation_play", TIMER, KM_ANY, 0, 0);
+	WM_keymap_add_item(keymap, "ED_SCR_OT_animation_play", TIMER, KM_ANY, KM_ANY, 0);
 	RNA_int_set(WM_keymap_add_item(keymap, "ED_SCR_OT_frame_offset", UPARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", 10);
 	RNA_int_set(WM_keymap_add_item(keymap, "ED_SCR_OT_frame_offset", DOWNARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", -10);
 	RNA_int_set(WM_keymap_add_item(keymap, "ED_SCR_OT_frame_offset", LEFTARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", -1);

Modified: branches/blender2.5/blender/source/blender/editors/space_time/time_header.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_time/time_header.c	2008-12-22 11:28:02 UTC (rev 18012)
+++ branches/blender2.5/blender/source/blender/editors/space_time/time_header.c	2008-12-22 12:57:53 UTC (rev 18013)
@@ -370,10 +370,10 @@
 			//update_for_newframe();
 			break;
 		case B_TL_PLAY:
-			ED_animation_timer(CTX_wm_window(C), 1);
+			ED_screen_animation_timer(C, 1);
 			break;
 		case B_TL_STOP:
-			ED_animation_timer(CTX_wm_window(C), 0);
+			ED_screen_animation_timer(C, 0);
 			WM_event_add_notifier(C, WM_NOTE_WINDOW_REDRAW, 0, NULL);
 			break;
 		case B_TL_FF:
@@ -508,7 +508,7 @@
 				 xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Skip to previous keyframe (Ctrl PageDown)");
 	xco+= XIC+4;
 	
-	if(CTX_wm_window(C)->animtimer)
+	if(CTX_wm_screen(C)->animtimer)
 		uiDefIconBut(block, BUT, B_TL_STOP, ICON_PAUSE,
 					 xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Stop Playing Timeline");
 	else 	   

Modified: branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h	2008-12-22 11:28:02 UTC (rev 18012)
+++ branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h	2008-12-22 12:57:53 UTC (rev 18013)
@@ -38,6 +38,7 @@
 struct SpaceLink;
 struct ARegionType;
 struct Scene;
+struct wmTimer;
 
 typedef struct bScreen {
 	ID id;
@@ -58,6 +59,8 @@
 	short mainwin;						/* screensize subwindow, for screenedges and global menus */
 	short subwinactive;					/* active subwindow */
 	
+	struct wmTimer *animtimer;			/* if set, screen has timer handler added in window */
+	
 	short handler[8];					/* similar to space handler */
 } bScreen;
 


@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list