diff options
author | Ton Roosendaal <ton@blender.org> | 2009-02-17 18:53:52 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2009-02-17 18:53:52 +0300 |
commit | 9322bddf2c8997adafe3474e50bbb2eab7ab2076 (patch) | |
tree | dcb59d85488efc58d745c9b124bf44a8264526b1 /source | |
parent | 9185f7931aba220c0b8ac82878e869225f2549dd (diff) |
2.5
Fix for the 'repeat last operator' option. It didn't work yet well
outside editmode. Now undo/redo has to fully keep the UI alive,
even when called from within a running popup.
Another fix: when regions collapse/hide they were not effectively
disabled, still accepting events. (like Nkey in 3d window).
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/blender.c | 15 | ||||
-rw-r--r-- | source/blender/editors/interface/interface.c | 12 | ||||
-rw-r--r-- | source/blender/editors/screen/area.c | 16 | ||||
-rw-r--r-- | source/blender/editors/transform/transform.c | 6 |
4 files changed, 34 insertions, 15 deletions
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index 64acd933d46..be64faec3cf 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -321,10 +321,6 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename) G.main= bfd->main; CTX_data_main_set(C, G.main); - CTX_wm_screen_set(C, NULL); - CTX_wm_area_set(C, NULL); - CTX_wm_region_set(C, NULL); - CTX_wm_ui_block_set(C, NULL, NULL); if (bfd->user) { @@ -340,15 +336,19 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename) /* case G_FILE_NO_UI or no screens in file */ if(mode) { - CTX_wm_screen_set(C, curscreen); + /* leave entire context further unaltered? */ CTX_data_scene_set(C, curscene); } else { G.winpos= bfd->winpos; G.displaymode= bfd->displaymode; G.fileflags= bfd->fileflags; + CTX_wm_screen_set(C, bfd->curscreen); CTX_data_scene_set(C, bfd->curscreen->scene); + CTX_wm_area_set(C, NULL); + CTX_wm_region_set(C, NULL); + CTX_wm_ui_block_set(C, NULL, NULL); } /* this can happen when active scene was lib-linked, and doesnt exist anymore */ @@ -372,8 +372,9 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename) //setscreen(G.curscreen); } - // XXX is this in the right place? - do_versions_ipos_to_animato(G.main); // XXX fixme... complicated versionpatching + // XXX temporarily here + if(G.main->versionfile < 250) + do_versions_ipos_to_animato(G.main); // XXX fixme... complicated versionpatching /* baseflags, groups, make depsgraph, etc */ set_scene_bg(CTX_data_scene(C)); diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 66d9653bdd0..f6a5086773a 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -1494,6 +1494,7 @@ static void ui_free_link(uiLink *link) } } +/* can be called with C==NULL */ static void ui_free_but(const bContext *C, uiBut *but) { if(but->opptr) { @@ -1501,13 +1502,21 @@ static void ui_free_but(const bContext *C, uiBut *but) MEM_freeN(but->opptr); } if(but->func_argN) MEM_freeN(but->func_argN); - if(but->active) ui_button_active_cancel(C, but); + if(but->active) { + /* XXX solve later, buttons should be free-able without context? */ + if(C) + ui_button_active_cancel(C, but); + else + if(but->active) + MEM_freeN(but->active); + } if(but->str && but->str != but->strdata) MEM_freeN(but->str); ui_free_link(but->link); MEM_freeN(but); } +/* can be called with C==NULL */ void uiFreeBlock(const bContext *C, uiBlock *block) { uiBut *but; @@ -1525,6 +1534,7 @@ void uiFreeBlock(const bContext *C, uiBlock *block) MEM_freeN(block); } +/* can be called with C==NULL */ void uiFreeBlocks(const bContext *C, ListBase *lb) { uiBlock *block; diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index c738aa78d51..dfbd6c031d1 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -330,6 +330,8 @@ static void region_rect_recursive(ARegion *ar, rcti *remainder, int quad) if(ar==NULL) return; + BLI_init_rcti(&ar->winrct, 0, 0, 0, 0); + /* clear state flags first */ ar->flag &= ~RGN_FLAG_TOO_SMALL; /* user errors */ @@ -603,11 +605,17 @@ void ED_area_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa) for(ar= sa->regionbase.first; ar; ar= ar->next) { region_subwindow(wm, win, ar); - /* default region handlers */ - ed_default_handlers(wm, &ar->handlers, ar->type->keymapflag); + if(ar->swinid) { + /* default region handlers */ + ed_default_handlers(wm, &ar->handlers, ar->type->keymapflag); - if(ar->type->init) - ar->type->init(wm, ar); + if(ar->type->init) + ar->type->init(wm, ar); + } + else { + /* prevent uiblocks to run */ + uiFreeBlocks(NULL, &ar->uiblocks); + } } area_azone_initialize(sa); diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 8c7bb0463c2..e6b8662ce4c 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -1175,11 +1175,11 @@ int transformEnd(bContext *C, TransInfo *t) /* Undo as last, certainly after special_trans_update! */ if(t->state == TRANS_CANCEL) { - if(t->undostr) ED_undo_push(C, t->undostr); +// if(t->undostr) ED_undo_push(C, t->undostr); } else { - if(t->undostr) ED_undo_push(C, t->undostr); - else ED_undo_push(C, transform_to_undostr(t)); +// if(t->undostr) ED_undo_push(C, t->undostr); +// else ED_undo_push(C, transform_to_undostr(t)); } t->undostr= NULL; |