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
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/blender/editors
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/blender/editors')
-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
5 files changed, 62 insertions, 29 deletions
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