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-10 16:56:54 +0300
committerTon Roosendaal <ton@blender.org>2008-12-10 16:56:54 +0300
commit54c4ed469ad632b06e444ff577f35effca952e38 (patch)
tree7571934754e1ebd1d95c146d7fc21ba1bddda4ed /source/blender/windowmanager
parent1fdb9da2a730b9b9fc12cf6b70f5c3ba69cce178 (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.h3
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c94
-rw-r--r--source/blender/windowmanager/intern/wm_init_exit.c7
-rw-r--r--source/blender/windowmanager/intern/wm_window.c7
-rw-r--r--source/blender/windowmanager/wm_event_system.h8
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 */