[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