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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to