diff options
author | Ton Roosendaal <ton@blender.org> | 2008-12-10 16:56:54 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2008-12-10 16:56:54 +0300 |
commit | 54c4ed469ad632b06e444ff577f35effca952e38 (patch) | |
tree | 7571934754e1ebd1d95c146d7fc21ba1bddda4ed /source/blender/windowmanager | |
parent | 1fdb9da2a730b9b9fc12cf6b70f5c3ba69cce178 (diff) |
2.5
Cleanup in area/region management
- more intelligence in area management for adding handlers and setting
data correct. Space/Region type callbacks only have to do own things.
- added option for adding default handlers to areas/regions. (flag in
type definition)
- ensured that region-types store the minsizes for regions.
- added boundbox check for handlers; note that it accepts pointer to
boundbox, because handlers don't get reset on area-resizing or
view changes. Example: view2d handlers use mask rect.
- handlers get now added on correct context levels (example frame change
also worked in header)
- removed ->refresh() callback. Context refreshing is Listener.
- the ->init() is being called on all WM level actions, also after a
file read, moving areas, re-opening areas etc.
- fixed bug: crash on exit was caused by cleaning up Screen too late.
- UI_view2d_size_update() removed from draw callback, is init()
- regions now store (winx, winy) subwindow size.
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r-- | source/blender/windowmanager/WM_api.h | 3 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 94 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_init_exit.c | 7 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_window.c | 7 | ||||
-rw-r--r-- | source/blender/windowmanager/wm_event_system.h | 8 |
5 files changed, 64 insertions, 55 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 2f53545f544..08c6a786f69 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -72,6 +72,9 @@ ListBase *WM_keymap_listbase (wmWindowManager *wm, const char *nameid, struct wmEventHandler *WM_event_add_keymap_handler(ListBase *handlers, ListBase *keymap); + /* boundbox, optional subwindow boundbox for offset */ +struct wmEventHandler *WM_event_add_keymap_handler_bb(ListBase *handlers, ListBase *keymap, rcti *bb, rcti *swinbb); + void WM_event_remove_keymap_handler(ListBase *handlers, ListBase *keymap); struct wmEventHandler *WM_event_add_ui_handler(bContext *C, ListBase *handlers, diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 94df7abfed9..54fbbacfaaa 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -193,18 +193,12 @@ static int wm_draw_update_test_window(wmWindow *win) return 1; for(ar=win->screen->regionbase.first; ar; ar= ar->next) { - /* cached notifiers */ - if(ar->do_refresh) - return 1; 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) { - /* cached notifiers */ - if(ar->do_refresh) - return 1; if(ar->swinid && ar->do_draw) return 1; } @@ -239,10 +233,6 @@ void wm_draw_update(bContext *C) for(ar=sa->regionbase.first; ar; ar= ar->next) { C->region= ar; - /* cached notifiers */ - if(ar->do_refresh) - ED_region_do_refresh(C, ar); - if(ar->swinid && ar->do_draw) { ED_region_do_draw(C, ar); area_do_draw= 1; @@ -265,10 +255,6 @@ void wm_draw_update(bContext *C) for(ar=win->screen->regionbase.first; ar; ar= ar->next) { C->region= ar; - /* cached notifiers */ - if(ar->do_refresh) - ED_region_do_refresh(C, ar); - if(ar->swinid && ar->do_draw) ED_region_do_draw(C, ar); @@ -386,7 +372,6 @@ static int wm_eventmatch(wmEvent *winevent, wmKeymapItem *kmi) if(kmi->keymodifier) if(winevent->keymodifier!=kmi->keymodifier) return 0; - /* optional boundbox */ return 1; } @@ -480,6 +465,20 @@ static int wm_event_always_pass(wmEvent *event) return (event->type == TIMER); } +static int handler_boundbox_test(wmEventHandler *handler, wmEvent *event) +{ + if(handler->bbwin) { + if(handler->bblocal) { + rcti rect= *handler->bblocal; + BLI_translate_rcti(&rect, handler->bbwin->xmin, handler->bbwin->ymin); + return BLI_in_rcti(&rect, event->x, event->y); + } + else + return BLI_in_rcti(handler->bbwin, event->x, event->y); + } + return 1; +} + static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers) { wmEventHandler *handler, *nexthandler; @@ -491,36 +490,40 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers) for(handler= handlers->first; handler; handler= nexthandler) { nexthandler= handler->next; - /* modal+blocking handler */ - if(handler->flag & WM_HANDLER_BLOCKING) - action= WM_HANDLER_BREAK; + /* optional boundbox */ + if(handler_boundbox_test(handler, event)) { + + /* modal+blocking handler */ + if(handler->flag & WM_HANDLER_BLOCKING) + action= WM_HANDLER_BREAK; - if(handler->keymap) { - wmKeymapItem *kmi; - - for(kmi= handler->keymap->first; kmi; kmi= kmi->next) { - if(wm_eventmatch(event, kmi)) { - /* if(event->type!=MOUSEMOVE) - printf("handle evt %d win %d op %s\n", event->type, C->window->winid, kmi->idname); */ - - event->keymap_idname= kmi->idname; /* weak, but allows interactive callback to not use rawkey */ - - action= wm_handler_operator_call(C, handlers, handler, event); - if(action==WM_HANDLER_BREAK) /* not wm_event_always_pass(event) here, it denotes removed handler */ - break; + if(handler->keymap) { + wmKeymapItem *kmi; + + for(kmi= handler->keymap->first; kmi; kmi= kmi->next) { + if(wm_eventmatch(event, kmi)) { + /* if(event->type!=MOUSEMOVE) + printf("handle evt %d win %d op %s\n", event->type, C->window->winid, kmi->idname); */ + + event->keymap_idname= kmi->idname; /* weak, but allows interactive callback to not use rawkey */ + + action= wm_handler_operator_call(C, handlers, handler, event); + if(action==WM_HANDLER_BREAK) /* not wm_event_always_pass(event) here, it denotes removed handler */ + break; + } } } - } - else if(handler->ui_handle) { - action= wm_handler_ui_call(C, handler, event); - } - else { - /* modal, swallows all */ - action= wm_handler_operator_call(C, handlers, handler, event); - } + else if(handler->ui_handle) { + action= wm_handler_ui_call(C, handler, event); + } + else { + /* modal, swallows all */ + action= wm_handler_operator_call(C, handlers, handler, event); + } - if(!wm_event_always_pass(event) && action==WM_HANDLER_BREAK) - break; + if(!wm_event_always_pass(event) && action==WM_HANDLER_BREAK) + break; + } } return action; @@ -671,6 +674,15 @@ wmEventHandler *WM_event_add_keymap_handler(ListBase *handlers, ListBase *keymap return handler; } +wmEventHandler *WM_event_add_keymap_handler_bb(ListBase *handlers, ListBase *keymap, rcti *bblocal, rcti *bbwin) +{ + wmEventHandler *handler= WM_event_add_keymap_handler(handlers, keymap); + handler->bblocal= bblocal; + handler->bbwin= bbwin; + + return handler; +} + void WM_event_remove_keymap_handler(ListBase *handlers, ListBase *keymap) { wmEventHandler *handler; diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c index 3346f0607a9..db37f0754a0 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.c +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -164,7 +164,6 @@ void WM_exit(bContext *C) /* modal handlers are on window level freed, others too? */ if(C && C->wm) { for(win= C->wm->windows.first; win; win= win->next) { - ScrArea *sa; ARegion *ar; C->window= win; /* needed by operator close callbacks */ @@ -173,11 +172,7 @@ void WM_exit(bContext *C) for(ar= win->screen->regionbase.first; ar; ar= ar->next) WM_event_remove_handlers(C, &ar->handlers); - for(sa= win->screen->areabase.first; sa; sa= sa->next) { - WM_event_remove_handlers(C, &sa->handlers); - for(ar= sa->regionbase.first; ar; ar= ar->next) - WM_event_remove_handlers(C, &ar->handlers); - } + ED_screen_exit(C, win, win->screen); } } wm_operatortype_free(); diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 508fe21b039..50263b8084b 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -82,11 +82,10 @@ static void wm_ghostwindow_destroy(wmWindow *win) } } -/* including window itself */ +/* including window itself, C can be NULL. + ED_screen_exit should have been called */ void wm_window_free(bContext *C, wmWindow *win) { - ED_screen_exit(C, win, win->screen); - /* update context */ if(C) { if(C->wm->windrawable==win) @@ -98,8 +97,6 @@ void wm_window_free(bContext *C, wmWindow *win) if(C->screen==win->screen) C->screen= NULL; } - - /* XXX free screens */ if(win->eventstate) MEM_freeN(win->eventstate); diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h index 61670388879..d4dddf8e222 100644 --- a/source/blender/windowmanager/wm_event_system.h +++ b/source/blender/windowmanager/wm_event_system.h @@ -45,10 +45,12 @@ typedef struct wmEventHandler { /* keymap handler */ ListBase *keymap; /* pointer to builtin/custom keymaps */ + rcti *bblocal, *bbwin; /* optional local and windowspace bb */ + /* modal operator handler */ - wmOperator *op; /* for derived/modal handlers */ - struct ScrArea *op_area; /* for derived/modal handlers */ - struct ARegion *op_region; /* for derived/modal handlers */ + wmOperator *op; /* for derived/modal handlers */ + struct ScrArea *op_area; /* for derived/modal handlers */ + struct ARegion *op_region; /* for derived/modal handlers */ /* ui handler */ wmUIHandlerFunc ui_handle; /* callback receiving events */ |