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-16 21:42:12 +0300
committerTon Roosendaal <ton@blender.org>2008-12-16 21:42:12 +0300
commit962870b2358775ebef96198da4efe61a4224b526 (patch)
tree00e43e1188b7ec826e2a70232bc48852f11f4204 /source/blender/windowmanager
parente34528e1a659996a0efc95353b99cb662fc1e1f5 (diff)
2.5
More notifier and redraw cleanup - notifiers are not filtered anymore, apart from window/screen notifiers, they get to all regions. - fixed drawing of 'action zones' in areas. - added support for basic multilayer draw, like for action zones now, and future other area decorations (tabs, region handlers) check: ED_area_overdraw_flush() ED_area_overdraw() - bugfix in UI redraw tags, it was calling region pointer in free'd data - added notifier for marker-changed - added keymap for markers to ipo window
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r--source/blender/windowmanager/WM_types.h3
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c75
2 files changed, 34 insertions, 44 deletions
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index 5a148ef9a4f..b85a83931bf 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -121,9 +121,8 @@ enum {
WM_NOTE_WINDOW_REDRAW,
WM_NOTE_SCREEN_CHANGED,
WM_NOTE_GESTURE_REDRAW,
-
+ WM_NOTE_MARKERS_CHANGED,
WM_NOTE_OBJECT_CHANGED,
-
WM_NOTE_LAST
};
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 710e7a5a4cc..7bfda3437a9 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -101,15 +101,8 @@ void WM_event_add_notifier(bContext *C, int type, int value, void *data)
BLI_addtail(&C->wm->queue, note);
note->window= C->window;
-
- /* catch local notifications here */
- switch (type) {
- case WM_NOTE_GESTURE_REDRAW:
- if(C->region)
- note->swinid= C->region->swinid;
- break;
- }
-
+ if(C->region)
+ note->swinid= C->region->swinid;
note->type= type;
note->value= value;
note->data= data;
@@ -136,7 +129,7 @@ void wm_event_do_notifiers(bContext *C)
ARegion *ar;
C->window= win;
- C->screen= win->screen;
+ C->screen= win->screen; /* XXX context in notifiers? */
if(note->window && note->window!=win)
continue;
@@ -147,27 +140,13 @@ void wm_event_do_notifiers(bContext *C)
ED_screen_do_listen(win, note);
for(ar=win->screen->regionbase.first; ar; ar= ar->next) {
- if(note->swinid && note->swinid!=ar->swinid)
- continue;
-
- C->region= ar;
ED_region_do_listen(ar, note);
- C->region= NULL;
}
for(sa= win->screen->areabase.first; sa; sa= sa->next) {
- C->area= sa;
-
for(ar=sa->regionbase.first; ar; ar= ar->next) {
- if(note->swinid && note->swinid!=ar->swinid)
- continue;
-
- C->region= ar;
ED_region_do_listen(ar, note);
- C->region= NULL;
}
-
- C->area= NULL;
}
C->window= NULL;
@@ -178,7 +157,8 @@ void wm_event_do_notifiers(bContext *C)
}
}
-static void wm_flush_draw_updates(bScreen *screen, rcti *dirty)
+/* mark regions to redraw if overlapped with rect */
+static void wm_flush_regions(bScreen *screen, rcti *dirty)
{
ScrArea *sa;
ARegion *ar;
@@ -191,19 +171,28 @@ static void wm_flush_draw_updates(bScreen *screen, rcti *dirty)
}
}
-/* quick test to prevent changing window drawable */
-static int wm_draw_update_test_window(wmWindow *win)
+/* all the overlay management, menus, actionzones, region tabs, etc */
+static void wm_flush_draw_update(bContext *C)
{
- ScrArea *sa;
ARegion *ar;
- /* flush */
- for(ar=win->screen->regionbase.first; ar; ar= ar->next) {
+ /* flush redraws of screen regions (menus) down */
+ for(ar= C->screen->regionbase.first; ar; ar= ar->next) {
if(ar->swinid && ar->do_draw) {
- wm_flush_draw_updates(win->screen, &ar->winrct);
+ wm_flush_regions(C->screen, &ar->winrct);
}
}
+
+ /* sets redraws for Azones, future region tabs, etc */
+ ED_area_overdraw_flush(C);
+}
+/* quick test to prevent changing window drawable */
+static int wm_draw_update_test_window(wmWindow *win)
+{
+ ScrArea *sa;
+ ARegion *ar;
+
if(win->screen->do_refresh)
return 1;
if(win->screen->do_draw)
@@ -211,12 +200,15 @@ static int wm_draw_update_test_window(wmWindow *win)
if(win->screen->do_gesture)
return 1;
- for(sa= win->screen->areabase.first; sa; sa= sa->next) {
- for(ar=sa->regionbase.first; ar; ar= ar->next) {
+ for(ar= win->screen->regionbase.first; ar; ar= ar->next)
+ if(ar->swinid && ar->do_draw)
+ return 1;
+
+ for(sa= win->screen->areabase.first; sa; sa= sa->next)
+ for(ar=sa->regionbase.first; ar; ar= ar->next)
if(ar->swinid && ar->do_draw)
return 1;
- }
- }
+
return 0;
}
@@ -238,25 +230,22 @@ void wm_draw_update(bContext *C)
/* notifiers for screen redraw */
if(win->screen->do_refresh)
ED_screen_refresh(C->wm, win);
+
+ /* flush draw updates for multiple layers */
+ wm_flush_draw_update(C);
for(sa= win->screen->areabase.first; sa; sa= sa->next) {
- int area_do_draw= 0;
C->area= sa;
for(ar=sa->regionbase.first; ar; ar= ar->next) {
C->region= ar;
- if(ar->swinid && ar->do_draw) {
+ if(ar->swinid && ar->do_draw)
ED_region_do_draw(C, ar);
- area_do_draw= 1;
- }
C->region= NULL;
}
- /* only internal decoration, like AZone */
- if(area_do_draw)
- ED_area_do_draw(C, sa);
C->area = NULL;
}
@@ -264,6 +253,8 @@ void wm_draw_update(bContext *C)
/* move this here so we can do area 'overlay' drawing */
if(win->screen->do_draw)
ED_screen_draw(win);
+
+ ED_area_overdraw(C);
/* regions are menus here */
for(ar=win->screen->regionbase.first; ar; ar= ar->next) {