Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2008-12-22 15:57:53 +0300
committerTon Roosendaal <ton@blender.org>2008-12-22 15:57:53 +0300
commit9e38e6aeb03e29d053679141134875edbff23d4a (patch)
tree2b52f73663939e9ce2ed166536d416132024f6d0 /source
parent5e443fd45dcd753868e7578b08692c158e8ad657 (diff)
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.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenloader/intern/readfile.c1
-rw-r--r--source/blender/editors/include/ED_screen.h2
-rw-r--r--source/blender/editors/interface/interface_handlers.c16
-rw-r--r--source/blender/editors/screen/screen_edit.c47
-rw-r--r--source/blender/editors/screen/screen_ops.c20
-rw-r--r--source/blender/editors/space_time/time_header.c6
-rw-r--r--source/blender/makesdna/DNA_screen_types.h3
-rw-r--r--source/blender/makesdna/DNA_windowmanager_types.h4
-rw-r--r--source/blender/windowmanager/WM_api.h7
-rw-r--r--source/blender/windowmanager/WM_types.h13
-rw-r--r--source/blender/windowmanager/intern/wm.c3
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c13
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c38
-rw-r--r--source/blender/windowmanager/intern/wm_window.c95
-rw-r--r--source/blender/windowmanager/wm_window.h2
15 files changed, 186 insertions, 84 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 94d215b877b..e3dc7c70697 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -3772,6 +3772,7 @@ static void direct_link_windowmanager(FileData *fd, wmWindowManager *wm)
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;
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index c6e1764bb7b..414921950c3 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -74,7 +74,7 @@ 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_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);
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 9d3d489ef44..a368f488d1a 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -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 @@ typedef struct uiHandleButtonData {
uiHandleButtonState state;
int cancel, retval;
int applied, appliedinteractive;
- wmTimerHandle *flashtimer;
+ wmTimer *flashtimer;
/* edited value */
char *str, *origstr;
@@ -106,8 +106,8 @@ typedef struct uiHandleButtonData {
/* tooltip */
ARegion *tooltip;
- wmTimerHandle *tooltiptimer;
- wmTimerHandle *autoopentimer;
+ wmTimer *tooltiptimer;
+ wmTimer *autoopentimer;
/* text selection/editing */
int maxlen, selextend, selstartx;
@@ -2761,7 +2761,7 @@ static void button_tooltip_timer_reset(uiBut *but)
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 @@ static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState s
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 @@ static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState s
/* 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);
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 3c83792c5f9..b298799f239 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -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 @@ void ED_screen_refresh(wmWindowManager *wm, wmWindow *win)
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 @@ void ED_screen_exit(bContext *C, wmWindow *window, bScreen *screen)
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 @@ int ED_screen_area_active(const bContext *C)
/* 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 @@ void ed_screen_set(bContext *C, bScreen *sc)
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 @@ void ed_screen_fullarea(bContext *C)
old->full= NULL;
+ /* animtimer back */
+ sc->animtimer= oldscreen->animtimer;
+ oldscreen->animtimer= NULL;
+
ed_screen_set(C, sc);
free_screen(oldscreen);
@@ -1242,6 +1266,10 @@ void ed_screen_fullarea(bContext *C)
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_screen_fullarea(bContext *C)
}
-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));
}
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 3c729ec1ca4..0f94184bfaa 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -1325,19 +1325,21 @@ void ED_SCR_OT_region_flip(wmOperatorType *ot)
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 @@ void ED_keymap_screen(wmWindowManager *wm)
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);
diff --git a/source/blender/editors/space_time/time_header.c b/source/blender/editors/space_time/time_header.c
index 57705ebed6a..406ccf0b54c 100644
--- a/source/blender/editors/space_time/time_header.c
+++ b/source/blender/editors/space_time/time_header.c
@@ -370,10 +370,10 @@ void do_time_buttons(bContext *C, void *arg, int event)
//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 @@ void time_header_buttons(const bContext *C, ARegion *ar)
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
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index c932c0bd1b7..a15c57d6700 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -38,6 +38,7 @@ struct SpaceType;
struct SpaceLink;
struct ARegionType;
struct Scene;
+struct wmTimer;
typedef struct bScreen {
ID id;
@@ -58,6 +59,8 @@ typedef struct bScreen {
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 --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h
index 874dd86e419..41123361b16 100644
--- a/source/blender/makesdna/DNA_windowmanager_types.h
+++ b/source/blender/makesdna/DNA_windowmanager_types.h
@@ -47,7 +47,7 @@ struct wmLocal;
struct bScreen;
struct uiBlock;
struct wmSubWindow;
-struct wmTimerHandle;
+struct wmTimer;
struct StructRNA;
struct PointerRNA;
@@ -94,7 +94,7 @@ typedef struct wmWindow {
struct wmSubWindow *curswin; /* internal for wm_subwindow.c only */
- struct wmTimerHandle *animtimer;
+ ListBase timers;
ListBase queue; /* all events (ghost level events were handled) */
ListBase handlers; /* window+screen handlers, overriding all queues */
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index cca9794f79e..6a91e3c538b 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -99,9 +99,10 @@ void WM_event_add_notifier(struct bContext *C, int type, int value, void *data)
void wm_event_add (wmWindow *win, struct wmEvent *event_to_add); /* XXX only for warning */
- /* one-shot timer, returns wmTimerData.handle */
-struct wmTimerHandle *WM_event_add_window_timer(wmWindow *win, int delay_ms, int interval_ms);
-void WM_event_remove_window_timer(wmWindow *wm, struct wmTimerHandle *handle);
+ /* at maximum, every timestep seconds it triggers TIMER events */
+struct wmTimer *WM_event_add_window_timer(wmWindow *win, double timestep);
+void WM_event_remove_window_timer(wmWindow *win, struct wmTimer *timer);
+void WM_event_window_timer_sleep(wmWindow *win, struct wmTimer *timer, int dosleep);
/* operator api, default callbacks */
/* confirm menu + exec */
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index bccbcc178ba..8944429ecb2 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -163,8 +163,17 @@ typedef struct wmTabletData {
float Ytilt; /* as above */
} wmTabletData;
-struct wmTimerHandle;
-typedef struct wmTimerHandle wmTimerHandle;
+typedef struct wmTimer {
+ struct wmTimer *next, *prev;
+ double timestep; /* set by timer user */
+
+ double duration; /* total running time in seconds */
+ double delta; /* time since previous step in seconds */
+
+ double ltime; /* internal, last time timer was activated */
+ int sleep; /* internal, put timers to sleep when needed */
+} wmTimer;
+
/* ****************** Messages ********************* */
diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c
index 5e89ad11de2..32d55fe6273 100644
--- a/source/blender/windowmanager/intern/wm.c
+++ b/source/blender/windowmanager/intern/wm.c
@@ -184,8 +184,7 @@ void WM_main(bContext *C)
while(1) {
/* get events from ghost, handle window events, add to window queues */
- /* WM_init has assigned to ghost the bContext already */
- wm_window_process_events(1);
+ wm_window_process_events(C);
/* per window, all events to the window, screen, area and region handlers */
wm_event_do_handlers(C);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index abd562a73cd..d1047ca4e63 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -441,11 +441,14 @@ static int wm_eventmatch(wmEvent *winevent, wmKeymapItem *kmi)
if(kmi->val!=KM_ANY)
if(winevent->val!=kmi->val) return 0;
-
- if(winevent->shift!=kmi->shift) return 0;
- if(winevent->ctrl!=kmi->ctrl) return 0;
- if(winevent->alt!=kmi->alt) return 0;
- if(winevent->oskey!=kmi->oskey) return 0;
+ if(kmi->shift!=KM_ANY)
+ if(winevent->shift!=kmi->shift) return 0;
+ if(kmi->ctrl!=KM_ANY)
+ if(winevent->ctrl!=kmi->ctrl) return 0;
+ if(kmi->alt!=KM_ANY)
+ if(winevent->alt!=kmi->alt) return 0;
+ if(kmi->oskey!=KM_ANY)
+ if(winevent->oskey!=kmi->oskey) return 0;
if(kmi->keymodifier)
if(winevent->keymodifier!=kmi->keymodifier) return 0;
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index a7ce67aeeba..dc53bff290d 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -57,22 +57,28 @@ static void keymap_event_set(wmKeymapItem *kmi, short type, short val, int modif
kmi->val= val;
kmi->keymodifier= keymodifier;
- if(modifier & KM_SHIFT)
- kmi->shift= 1;
- else if(modifier & KM_SHIFT2)
- kmi->shift= 2;
- if(modifier & KM_CTRL)
- kmi->ctrl= 1;
- else if(modifier & KM_CTRL2)
- kmi->ctrl= 2;
- if(modifier & KM_ALT)
- kmi->alt= 1;
- else if(modifier & KM_ALT2)
- kmi->alt= 2;
- if(modifier & KM_OSKEY)
- kmi->oskey= 1;
- else if(modifier & KM_OSKEY2)
- kmi->oskey= 2;
+ if(modifier == KM_ANY) {
+ kmi->shift= kmi->ctrl= kmi->alt= kmi->oskey= KM_ANY;
+ }
+ else {
+
+ if(modifier & KM_SHIFT)
+ kmi->shift= 1;
+ else if(modifier & KM_SHIFT2)
+ kmi->shift= 2;
+ if(modifier & KM_CTRL)
+ kmi->ctrl= 1;
+ else if(modifier & KM_CTRL2)
+ kmi->ctrl= 2;
+ if(modifier & KM_ALT)
+ kmi->alt= 1;
+ else if(modifier & KM_ALT2)
+ kmi->alt= 2;
+ if(modifier & KM_OSKEY)
+ kmi->oskey= 1;
+ else if(modifier & KM_OSKEY2)
+ kmi->oskey= 2;
+ }
}
static void keymap_properties_set(wmKeymapItem *kmi)
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 7fba9a6115a..5773fd847c7 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -55,6 +55,8 @@
#include "ED_screen.h"
+#include "PIL_time.h"
+
#include "GPU_draw.h"
/* the global to talk to ghost */
@@ -102,7 +104,8 @@ void wm_window_free(bContext *C, wmWindow *win)
}
if(win->eventstate) MEM_freeN(win->eventstate);
-
+ BLI_freelistN(&win->timers);
+
wm_event_free_all(win);
wm_subwindows_free(win);
@@ -496,23 +499,49 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private)
return 1;
}
-void wm_window_process_events(int wait_for_event)
+
+/* This timer system only gives maximum 1 timer event per redraw cycle,
+ to prevent queues to get overloaded.
+ Timer handlers should check for delta to decide if they just
+ update, or follow real time
+*/
+static int wm_window_timer(const bContext *C)
{
- int handled= 0;
+ wmWindowManager *wm= CTX_wm_manager(C);
+ wmWindow *win;
+ double time= PIL_check_seconds_timer();
+ int retval= 0;
- /* ghost only processes 1 (timer?) event a time... we want to accumulate all */
- while(1) {
- if(GHOST_ProcessEvents(g_system, 0)) {
- GHOST_DispatchEvents(g_system);
- handled= 1;
+ for(win= wm->windows.first; win; win= win->next) {
+ wmTimer *wt;
+ for(wt= win->timers.first; wt; wt= wt->next) {
+ if(wt->sleep==0) {
+ if(wt->timestep < time - wt->ltime) {
+ wt->delta= time - wt->ltime;
+ wt->duration += wt->delta;
+ wt->ltime= time;
+
+ wm_event_add_ghostevent(win, GHOST_kEventTimer, wt);
+ retval= 1;
+ }
+ }
}
- else
- break;
}
- if(handled==0 && wait_for_event) {
- GHOST_ProcessEvents(g_system, wait_for_event);
+ return retval;
+}
+
+void wm_window_process_events(const bContext *C)
+{
+ int hasevent= GHOST_ProcessEvents(g_system, 0); /* 0 is no wait */
+
+ if(hasevent)
GHOST_DispatchEvents(g_system);
- }
+
+ hasevent |= wm_window_timer(C);
+
+ /* no event, we sleep 5 milliseconds */
+ if(hasevent==0)
+ PIL_sleep_ms(5);
}
/* **************** init ********************** */
@@ -529,24 +558,42 @@ void wm_ghost_init(bContext *C)
/* **************** timer ********************** */
-static void window_event_timer_proc(GHOST_TimerTaskHandle timer, GHOST_TUns64 time)
+/* to (de)activate running timers temporary */
+void WM_event_window_timer_sleep(wmWindow *win, wmTimer *timer, int dosleep)
{
- wmWindow *window;
-
- window= GHOST_GetTimerTaskUserData(timer);
-
- wm_event_add_ghostevent(window, GHOST_kEventTimer, (wmTimerHandle*)timer);
+ wmTimer *wt;
+
+ for(wt= win->timers.first; wt; wt= wt->next)
+ if(wt==timer)
+ break;
+ if(wt) {
+ wt->sleep= dosleep;
+ }
}
-wmTimerHandle *WM_event_add_window_timer(wmWindow *win, int delay_ms, int interval_ms)
+wmTimer *WM_event_add_window_timer(wmWindow *win, double timestep)
{
- return (wmTimerHandle*)GHOST_InstallTimer(g_system, delay_ms, interval_ms,
- window_event_timer_proc, win);
+ wmTimer *wt= MEM_callocN(sizeof(wmTimer), "window timer");
+
+ wt->ltime= PIL_check_seconds_timer();
+ wt->timestep= timestep;
+
+ BLI_addtail(&win->timers, wt);
+
+ return wt;
}
-void WM_event_remove_window_timer(wmWindow *wm, wmTimerHandle *handle)
+void WM_event_remove_window_timer(wmWindow *win, wmTimer *timer)
{
- GHOST_RemoveTimer(g_system, (GHOST_TimerTaskHandle)handle);
+ wmTimer *wt;
+
+ for(wt= win->timers.first; wt; wt= wt->next)
+ if(wt==timer)
+ break;
+ if(wt) {
+ BLI_remlink(&win->timers, wt);
+ MEM_freeN(wt);
+ }
}
/* ************************************ */
diff --git a/source/blender/windowmanager/wm_window.h b/source/blender/windowmanager/wm_window.h
index b02a16304cb..03f2060e706 100644
--- a/source/blender/windowmanager/wm_window.h
+++ b/source/blender/windowmanager/wm_window.h
@@ -37,7 +37,7 @@ void wm_ghost_init (bContext *C);
wmWindow *wm_window_new (bContext *C);
void wm_window_free (bContext *C, wmWindow *win);
void wm_window_add_ghostwindows (wmWindowManager *wm);
-void wm_window_process_events (int wait_for_event);
+void wm_window_process_events (const bContext *C);
void wm_window_make_drawable(bContext *C, wmWindow *win);