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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2008-11-11 18:18:21 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2008-11-11 18:18:21 +0300
commit4a4b0732e5d1bc71dde53934a4e74dc782beee1c (patch)
tree89731bd1e7c0a2305d947c8db1d68055c82f1f4e /source/blender/windowmanager
parent3bb5fc9c7d10f7dec32f8d2a772fce69be468b15 (diff)
Various changes made in the process of working on the UI code:
* Added functions to generate Timer events. There was some unfinished code to create one timer per window, this replaces that with a way to let operators or other handlers add/remove their own timers as needed. This is currently delivered as an event with the timer handle, perhaps this should be a notifier instead? Also includes some fixes in ghost for timer events that were not delivered in time, due to passing negative timeout. * Added a Message event, which is a generic event that can be added by any operator. This is used in the UI code to communicate the results of opened blocks. Again, this may be better as a notifier. * These two events should not be blocked as they are intended for a specific operator or handler, so there were exceptions added for this, which is one of the reasons they might work better as notifiers, but currently these things can't listen to notifier yet. * Added an option to events to indicate if the customdata should be freed or not. * Added a free() callback for area regions, and added a free function for area regions in blenkernel since it was already there for screens and areas. * Added ED_screen/area/region_exit functions to clean up things like operators and handlers when they are closed. * Added screen level regions, these will draw over areas boundaries, with the last created region on top. These are useful for tooltips, menus, etc, and are not saved to file. It's using the same ARegion struct as areas to avoid code duplication, but perhaps that should be renamed then. Note that redraws currently go correct, because only full window redraws are used, for partial redraws without any frontbuffer drawing, the window manager needs to get support for compositing subwindows. * Minor changes in the subwindow code to retrieve the matrix, and moved setlinestyle to glutil.c. * Reversed argument order in WM_event_add/remove_keymap_handler to be consistent with modal_handler. * Operators can now block events but not necessarily cancel/finish. * Modal operators are now stored in a list in the window/area/region they were created in. This means for example that when a transform operator is invoked from a region but registers a handler at the window level (since mouse motion across areas should work), it will still get removed when the region is closed while the operator is running.
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r--source/blender/windowmanager/WM_api.h14
-rw-r--r--source/blender/windowmanager/WM_types.h4
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c260
-rw-r--r--source/blender/windowmanager/intern/wm_files.c9
-rw-r--r--source/blender/windowmanager/intern/wm_subwindow.c68
-rw-r--r--source/blender/windowmanager/intern/wm_window.c36
-rw-r--r--source/blender/windowmanager/wm_event_types.h24
-rw-r--r--source/blender/windowmanager/wm_subwindow.h6
8 files changed, 290 insertions, 131 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 2f450c9bbd7..d19d189af82 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -64,15 +64,22 @@ void WM_keymap_verify_item(ListBase *lb, char *idname, short type,
short val, int modifier, short keymodifier);
void WM_keymap_add_item (ListBase *lb, char *idname, short type,
short val, int modifier, short keymodifier);
-struct wmEventHandler *WM_event_add_keymap_handler(ListBase *keymap, ListBase *handlers);
-void WM_event_remove_keymap_handler(ListBase *keymap, ListBase *handlers);
+struct wmEventHandler *WM_event_add_keymap_handler(ListBase *handlers, ListBase *keymap);
+void WM_event_remove_keymap_handler(ListBase *handlers, ListBase *keymap);
struct wmEventHandler *WM_event_add_modal_handler(ListBase *handlers, wmOperator *op);
void WM_event_remove_modal_handler(ListBase *handlers, wmOperator *op);
+void WM_event_remove_handlers(ListBase *handlers);
+
+void WM_event_add_message(wmWindowManager *wm, void *customdata,
+ short customdatafree);
void WM_event_add_notifier(wmWindowManager *wm, wmWindow *window,
int swinid, int type,
int value, void *data);
+ /* one-shot timer, returns wmTimerData.handle */
+struct wmTimerHandle *WM_event_add_window_timer(wmWindow *win, int delay_ms, int interval_ms);
+void WM_event_remove_window_timer(wmWindow *wm, struct wmTimerHandle *handle);
/* operator api, default callbacks */
/* confirm menu + exec */
@@ -84,6 +91,9 @@ int WM_operator_winactive (struct bContext *C);
wmOperatorType *WM_operatortype_find(const char *idname);
void WM_operatortype_append(void (*opfunc)(wmOperatorType*));
+int WM_operator_invoke(struct bContext *C, wmOperatorType *ot, struct wmEvent *event);
+void WM_operator_cancel(struct bContext *C, ListBase *modalops, wmOperatorType *ot);
+
/*
* Operator property api
*
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index a85988b6a09..5bb79681467 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -63,6 +63,7 @@ typedef struct wmEvent {
/* custom data */
short custom; /* custom data type, stylus, 6dof, see wm_event_types.h */
void *customdata; /* ascii, unicode, mouse coords, angles, vectors, dragdrop info */
+ short customdatafree;
} wmEvent;
@@ -138,6 +139,9 @@ typedef struct wmBorderSelect {
short x2, y2;
} wmBorderSelect;
+struct wmTimerHandle;
+typedef struct wmTimerHandle wmTimerHandle;
+
/* ****************** Messages ********************* */
enum {
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index c33ac0cd342..700ac04603d 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -73,7 +73,8 @@ wmEvent *wm_event_next(wmWindow *win)
static void wm_event_free(wmEvent *event)
{
- if(event->customdata) MEM_freeN(event->customdata);
+ if(event->customdata && event->customdatafree)
+ MEM_freeN(event->customdata);
MEM_freeN(event);
}
@@ -121,6 +122,7 @@ void wm_event_do_notifiers(bContext *C)
for(win= C->wm->windows.first; win; win= win->next) {
ScrArea *sa;
+ ARegion *ar;
C->window= win;
C->screen= win->screen;
@@ -130,15 +132,22 @@ void wm_event_do_notifiers(bContext *C)
if(win->screen==NULL)
continue;
- printf("notifier win %d screen %s\n", win->winid, win->screen->id.name+2);
+ /* printf("notifier win %d screen %s\n", win->winid, win->screen->id.name+2); */
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) {
- ARegion *ar= sa->regionbase.first;
-
C->area= sa;
- for(; ar; ar= ar->next) {
+ for(ar=sa->regionbase.first; ar; ar= ar->next) {
if(note->swinid && note->swinid!=ar->swinid)
continue;
@@ -163,6 +172,7 @@ void wm_event_do_notifiers(bContext *C)
static int wm_draw_update_test_window(wmWindow *win)
{
ScrArea *sa;
+ ARegion *ar;
if(win->screen->do_refresh)
return 1;
@@ -171,10 +181,16 @@ static int wm_draw_update_test_window(wmWindow *win)
if(win->screen->do_gesture)
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) {
- ARegion *ar= sa->regionbase.first;
-
- for(; ar; ar= ar->next) {
+ for(ar=sa->regionbase.first; ar; ar= ar->next) {
/* cached notifiers */
if(ar->do_refresh)
return 1;
@@ -192,6 +208,7 @@ void wm_draw_update(bContext *C)
for(win= C->wm->windows.first; win; win= win->next) {
if(wm_draw_update_test_window(win)) {
ScrArea *sa;
+ ARegion *ar;
C->window= win;
C->screen= win->screen;
@@ -202,16 +219,11 @@ void wm_draw_update(bContext *C)
/* notifiers for screen redraw */
if(win->screen->do_refresh)
ED_screen_refresh(C->wm, win);
-
- for(sa= win->screen->areabase.first; sa; sa= sa->next) {
- ARegion *ar= sa->regionbase.first;
- int hasdrawn= 0;
+ for(sa= win->screen->areabase.first; sa; sa= sa->next) {
C->area= sa;
- for(; ar; ar= ar->next) {
- hasdrawn |= ar->do_draw;
-
+ for(ar=sa->regionbase.first; ar; ar= ar->next) {
C->region= ar;
/* cached notifiers */
@@ -230,6 +242,19 @@ 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);
+
+ 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);
+
+ C->region= NULL;
+ }
if(win->screen->do_gesture)
ED_screen_gesture(win);
@@ -242,6 +267,73 @@ void wm_draw_update(bContext *C)
}
}
+/* ********************* operators ******************* */
+
+static ListBase *wm_modalops_list(bContext *C)
+{
+ if(C->region)
+ return &C->region->modalops;
+ else if(C->area)
+ return &C->area->modalops;
+ else if(C->window)
+ return &C->window->modalops;
+ else
+ return NULL;
+}
+
+int WM_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event)
+{
+ int retval= OPERATOR_PASS_THROUGH;
+
+ if(ot->poll==NULL || ot->poll(C)) {
+ wmOperator *op= MEM_callocN(sizeof(wmOperator), "wmOperator");
+
+ op->type= ot;
+
+ if(op->type->invoke)
+ retval= (*op->type->invoke)(C, op, event);
+ else if(op->type->exec)
+ retval= op->type->exec(C, op);
+
+ if((retval & OPERATOR_FINISHED) && (ot->flag & OPTYPE_REGISTER)) {
+ wm_operator_register(C->wm, op);
+ }
+ else if(!(retval & OPERATOR_RUNNING_MODAL)) {
+ wm_operator_free(op);
+ }
+ else {
+ op->modallist= wm_modalops_list(C);
+ BLI_addtail(op->modallist, op);
+ }
+ }
+
+ return retval;
+}
+
+void WM_operator_cancel(bContext *C, ListBase *lb, wmOperatorType *type)
+{
+ wmOperator *op, *nextop;
+
+ if(!lb)
+ lb= wm_modalops_list(C);
+ if(!lb)
+ return;
+
+ for(op=lb->first; op; op=nextop) {
+ nextop= op->next;
+
+ if(type == NULL || op->type == type) {
+ if(op->type->cancel)
+ op->type->cancel(C, op);
+
+ BLI_remlink(op->modallist, op);
+ op->modallist= NULL;
+
+ wm_operator_free(op);
+ }
+ }
+}
+
/* ********************* handlers *************** */
/* not handler itself */
@@ -259,6 +351,11 @@ void wm_event_free_handlers(ListBase *lb)
BLI_freelistN(lb);
}
+void WM_event_remove_handlers(ListBase *handlers)
+{
+ wm_event_free_handlers(handlers);
+}
+
static int wm_eventmatch(wmEvent *winevent, wmKeymapItem *km)
{
if(winevent->type!=km->type) return 0;
@@ -289,13 +386,18 @@ static int wm_handler_operator_call(bContext *C, wmEventHandler *handler, wmEven
wmOperatorType *ot= op->type;
if(ot->modal) {
-
retval= ot->modal(C, op, event);
- if(retval == OPERATOR_FINISHED && (ot->flag & OPTYPE_REGISTER))
+ if((retval & OPERATOR_FINISHED) && (ot->flag & OPTYPE_REGISTER)) {
+ BLI_remlink(op->modallist, op);
+ op->modallist= NULL;
wm_operator_register(C->wm, op);
- else if(retval == OPERATOR_CANCELLED || retval == OPERATOR_FINISHED)
+ }
+ else if(retval & (OPERATOR_CANCELLED|OPERATOR_FINISHED)) {
+ BLI_remlink(op->modallist, op);
+ op->modallist= NULL;
wm_operator_free(op);
+ }
}
else
printf("wm_handler_operator_call error\n");
@@ -303,36 +405,27 @@ static int wm_handler_operator_call(bContext *C, wmEventHandler *handler, wmEven
else {
wmOperatorType *ot= WM_operatortype_find(event->keymap_idname);
- if(ot) {
- if(ot->poll==NULL || ot->poll(C)) {
- wmOperator *op= MEM_callocN(sizeof(wmOperator), "wmOperator");
-
- op->type= ot;
-
- if(op->type->invoke)
- retval= (*op->type->invoke)(C, op, event);
- else if(op->type->exec)
- retval= op->type->exec(C, op);
-
- if(retval == OPERATOR_FINISHED && (ot->flag & OPTYPE_REGISTER))
- wm_operator_register(C->wm, op);
- else if(retval != OPERATOR_RUNNING_MODAL)
- wm_operator_free(op);
- }
- }
+ if(ot)
+ retval= WM_operator_invoke(C, ot, event);
}
- if(retval == OPERATOR_PASS_THROUGH)
+ if(retval & OPERATOR_PASS_THROUGH)
return WM_HANDLER_CONTINUE;
return WM_HANDLER_BREAK;
}
+static int wm_event_always_pass(wmEvent *event)
+{
+ /* some events we always pass on, to ensure proper communication */
+ return (event->type == TIMER || event->type == MESSAGE);
+}
+
static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
{
wmEventHandler *handler, *nexthandler;
int action= WM_HANDLER_CONTINUE;
-
+
if(handlers==NULL) return action;
/* in this loop, the handler might be freed in wm_handler_operator_call,
@@ -349,13 +442,13 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
for(km= handler->keymap->first; km; km= km->next) {
if(wm_eventmatch(event, km)) {
- if(event->type!=MOUSEMOVE)
- printf("handle evt %d win %d op %s\n", event->type, C->window->winid, km->idname);
+ /*if(event->type!=MOUSEMOVE)
+ printf("handle evt %d win %d op %s\n", event->type, C->window->winid, km->idname);*/
event->keymap_idname= km->idname; /* weak, but allows interactive callback to not use rawkey */
action= wm_handler_operator_call(C, handler, event);
- if(action==WM_HANDLER_BREAK)
+ if(!wm_event_always_pass(event) && action==WM_HANDLER_BREAK)
break;
}
}
@@ -365,7 +458,7 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
action= wm_handler_operator_call(C, handler, event);
}
- if(action==WM_HANDLER_BREAK)
+ if(!wm_event_always_pass(event) && action==WM_HANDLER_BREAK)
break;
}
@@ -401,30 +494,55 @@ void wm_event_do_handlers(bContext *C)
action= wm_handlers_do(C, event, &win->handlers);
- if(action==WM_HANDLER_CONTINUE) {
- ScrArea *sa= win->screen->areabase.first;
-
- for(; sa; sa= sa->next) {
- if(wm_event_inside_i(event, &sa->totrct)) {
-
+ if(wm_event_always_pass(event) || action==WM_HANDLER_CONTINUE) {
+ ARegion *ar;
+
+ /* region are in drawing order, i.e. frontmost region last so
+ * we handle events in the opposite order last to first */
+ for(ar=win->screen->regionbase.last; ar; ar= ar->prev) {
+ if(wm_event_always_pass(event) || wm_event_inside_i(event, &ar->winrct)) {
+ C->region= ar;
+ wm_handlers_do(C, event, &ar->handlers);
+ C->region= NULL;
+
+ if(!wm_event_always_pass(event)) {
+ action= WM_HANDLER_BREAK;
+ break;
+ }
+ }
+ }
+ }
+
+ if(wm_event_always_pass(event) || action==WM_HANDLER_CONTINUE) {
+ ScrArea *sa;
+ ARegion *ar;
+
+ for(sa= win->screen->areabase.first; sa; sa= sa->next) {
+ if(wm_event_always_pass(event) || wm_event_inside_i(event, &sa->totrct)) {
C->area= sa;
action= wm_handlers_do(C, event, &sa->handlers);
- if(action==WM_HANDLER_CONTINUE) {
- ARegion *ar= sa->regionbase.first;
-
- for(; ar; ar= ar->next) {
- if(wm_event_inside_i(event, &ar->winrct)) {
+
+ if(wm_event_always_pass(event) || action==WM_HANDLER_CONTINUE) {
+ for(ar=sa->regionbase.first; ar; ar= ar->next) {
+ if(wm_event_always_pass(event) || wm_event_inside_i(event, &ar->winrct)) {
C->region= ar;
action= wm_handlers_do(C, event, &ar->handlers);
C->region= NULL;
- if(action==WM_HANDLER_BREAK)
+
+ if(!wm_event_always_pass(event)) {
+ action= WM_HANDLER_BREAK;
break;
+ }
}
}
}
+
C->area= NULL;
- if(action==WM_HANDLER_BREAK)
+
+ if(!wm_event_always_pass(event)) {
+ action= WM_HANDLER_BREAK;
break;
+ }
}
}
}
@@ -472,7 +590,7 @@ void WM_event_remove_modal_handler(ListBase *handlers, wmOperator *op)
}
}
-wmEventHandler *WM_event_add_keymap_handler(ListBase *keymap, ListBase *handlers)
+wmEventHandler *WM_event_add_keymap_handler(ListBase *handlers, ListBase *keymap)
{
wmEventHandler *handler;
@@ -484,11 +602,11 @@ wmEventHandler *WM_event_add_keymap_handler(ListBase *keymap, ListBase *handlers
handler= MEM_callocN(sizeof(wmEventHandler), "event handler");
BLI_addtail(handlers, handler);
handler->keymap= keymap;
-
+
return handler;
}
-void WM_event_remove_keymap_handler(ListBase *keymap, ListBase *handlers)
+void WM_event_remove_keymap_handler(ListBase *handlers, ListBase *keymap)
{
wmEventHandler *handler;
@@ -502,6 +620,24 @@ void WM_event_remove_keymap_handler(ListBase *keymap, ListBase *handlers)
}
}
+void WM_event_add_message(wmWindowManager *wm, void *customdata, short customdatafree)
+{
+ wmEvent event;
+ wmWindow *win;
+
+ for(win=wm->windows.first; win; win=win->next) {
+ event= *(win->eventstate);
+
+ event.type= MESSAGE;
+ if(customdata) {
+ event.custom= EVT_MESSAGE;
+ event.customdata= customdata;
+ event.customdatafree= customdatafree;
+ }
+ wm_event_add(win, &event);
+ }
+}
+
/* ********************* ghost stuff *************** */
static int convert_key(GHOST_TKey key)
@@ -596,6 +732,7 @@ static void update_tablet_data(wmWindow *win, wmEvent *event)
event->custom= EVT_TABLET;
event->customdata= wmtab;
+ event->customdatafree= 1;
}
}
@@ -688,6 +825,15 @@ void wm_event_add_ghostevent(wmWindow *win, int type, void *customdata)
break;
}
+ case GHOST_kEventTimer: {
+ event.type= TIMER;
+ event.custom= EVT_TIMER;
+ event.customdata= customdata;
+ wm_event_add(win, &event);
+
+ break;
+ }
+
case GHOST_kEventUnknown:
case GHOST_kNumEventTypes:
break;
diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c
index 70bdb60eb48..ec2e750eb2c 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -405,12 +405,11 @@ static void wm_window_match_do(bContext *C, ListBase *wmlist)
for(wm= wmlist->first; wm; wm= wm->id.next) {
for(win= wm->windows.first; win; win= win->next) {
win->screen= (bScreen *)find_id("SR", win->screenname);
- if(win->screen->winid==0) {
- if(win->screen==NULL)
- win->screen= C->screen; /* active screen */
-
+ if(win->screen==NULL)
+ win->screen= C->screen; /* active screen */
+
+ if(win->screen->winid==0)
win->screen->winid= win->winid;
- }
}
}
/* XXX still solve, case where multiple windows open */
diff --git a/source/blender/windowmanager/intern/wm_subwindow.c b/source/blender/windowmanager/intern/wm_subwindow.c
index b0789ba08ed..cfd111d355c 100644
--- a/source/blender/windowmanager/intern/wm_subwindow.c
+++ b/source/blender/windowmanager/intern/wm_subwindow.c
@@ -46,6 +46,7 @@
#include "BIF_glutil.h"
#include "WM_api.h"
+#include "wm_subwindow.h"
#include "wm_window.h"
/* wmSubWindow stored in wmWindow... but not exposed outside this C file */
@@ -88,24 +89,6 @@ void wm_subwindows_free(wmWindow *win)
}
-void wm_subwindow_getsize(wmWindow *win, int *x, int *y)
-{
- if(win->curswin) {
- wmSubWindow *swin= win->curswin;
- *x= swin->winrct.xmax - swin->winrct.xmin + 1;
- *y= swin->winrct.ymax - swin->winrct.ymin + 1;
- }
-}
-
-void wm_subwindow_getorigin(wmWindow *win, int *x, int *y)
-{
- if(win->curswin) {
- wmSubWindow *swin= win->curswin;
- *x= swin->winrct.xmin;
- *y= swin->winrct.ymin;
- }
-}
-
int wm_subwindow_get(wmWindow *win)
{
if(win->curswin)
@@ -123,6 +106,34 @@ static wmSubWindow *swin_from_swinid(wmWindow *win, int swinid)
return swin;
}
+void wm_subwindow_getsize(wmWindow *win, int swinid, int *x, int *y)
+{
+ wmSubWindow *swin= swin_from_swinid(win, swinid);
+
+ if(swin) {
+ *x= swin->winrct.xmax - swin->winrct.xmin + 1;
+ *y= swin->winrct.ymax - swin->winrct.ymin + 1;
+ }
+}
+
+void wm_subwindow_getorigin(wmWindow *win, int swinid, int *x, int *y)
+{
+ wmSubWindow *swin= swin_from_swinid(win, swinid);
+
+ if(swin) {
+ *x= swin->winrct.xmin;
+ *y= swin->winrct.ymin;
+ }
+}
+
+void wm_subwindow_getmatrix(wmWindow *win, int swinid, float mat[][4])
+{
+ wmSubWindow *swin= swin_from_swinid(win, swinid);
+
+ if(swin)
+ Mat4MulMat4(mat, swin->viewmat, swin->winmat);
+}
+
void wm_subwindow_set(wmWindow *win, int swinid)
{
wmSubWindow *swin= swin_from_swinid(win, swinid);
@@ -134,7 +145,7 @@ void wm_subwindow_set(wmWindow *win, int swinid)
}
win->curswin= swin;
- wm_subwindow_getsize(win, &width, &height);
+ wm_subwindow_getsize(win, swinid, &width, &height);
glViewport(swin->winrct.xmin, swin->winrct.ymin, width, height);
glScissor(swin->winrct.xmin, swin->winrct.ymin, width, height);
@@ -174,7 +185,7 @@ int wm_subwindow_open(wmWindow *win, rcti *winrct)
wm_subwindow_set(win, swin->swinid);
/* extra service */
- wm_subwindow_getsize(win, &width, &height);
+ wm_subwindow_getsize(win, swin->swinid, &width, &height);
wmOrtho2(win, -0.375, (float)width-0.375, -0.375, (float)height-0.375);
wmLoadIdentity(win);
@@ -229,7 +240,7 @@ void wm_subwindow_position(wmWindow *win, int swinid, rcti *winrct)
/* extra service */
wm_subwindow_set(win, swinid);
- wm_subwindow_getsize(win, &width, &height);
+ wm_subwindow_getsize(win, swinid, &width, &height);
wmOrtho2(win, -0.375, (float)width-0.375, -0.375, (float)height-0.375);
}
else {
@@ -515,18 +526,3 @@ void myswapbuffers(void) /* XXX */
#endif
}
-
-/* *********************** PATTERNS ETC ***************** */
-
-void setlinestyle(int nr) /* Move? XXX */
-{
- if(nr==0) {
- glDisable(GL_LINE_STIPPLE);
- }
- else {
-
- glEnable(GL_LINE_STIPPLE);
- glLineStipple(nr, 0xAAAA);
- }
-}
-
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 9425dd6cf58..259e16a389a 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -76,12 +76,6 @@ static void wm_get_screensize(int *width_r, int *height_r)
static void wm_ghostwindow_destroy(wmWindow *win)
{
-
- if (win->timer) {
- GHOST_RemoveTimer(g_system, (GHOST_TimerTaskHandle)win->timer);
- win->timer= NULL;
- }
-
if(win->ghostwin) {
GHOST_DisposeWindow(g_system, win->ghostwin);
win->ghostwin= NULL;
@@ -91,6 +85,7 @@ static void wm_ghostwindow_destroy(wmWindow *win)
/* including window itself */
void wm_window_free(bContext *C, wmWindow *win)
{
+ ED_screen_exit(C, win, win->screen);
/* update context */
if(C) {
@@ -103,12 +98,12 @@ 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);
WM_gesture_free(win);
- wm_event_free_handlers(&win->handlers);
wm_event_free_all(win);
wm_subwindows_free(win);
@@ -276,8 +271,8 @@ static void wm_window_open(wmWindowManager *wm, char *title, wmWindow *win)
win->eventstate= MEM_callocN(sizeof(wmEvent), "window event state");
/* add keymap handlers (1 for all keys in map!) */
- WM_event_add_keymap_handler(&wm->windowkeymap, &win->handlers);
- WM_event_add_keymap_handler(&wm->screenkeymap, &win->handlers);
+ WM_event_add_keymap_handler(&win->handlers, &wm->windowkeymap);
+ WM_event_add_keymap_handler(&win->handlers, &wm->screenkeymap);
/* until screens get drawn, make it nice grey */
glClearColor(.55, .55, .55, 0.0);
@@ -523,19 +518,24 @@ void wm_ghost_init(bContext *C)
/* **************** timer ********************** */
-static void window_timer_proc(GHOST_TimerTaskHandle timer, GHOST_TUns64 time)
+static void window_event_timer_proc(GHOST_TimerTaskHandle timer, GHOST_TUns64 time)
{
- wmWindow *win= GHOST_GetTimerTaskUserData(timer);
-
- wm_event_add_ghostevent(win, win->timer_event, NULL);
+ wmWindow *window;
+
+ window= GHOST_GetTimerTaskUserData(timer);
+
+ wm_event_add_ghostevent(window, GHOST_kEventTimer, (wmTimerHandle*)timer);
}
-void wm_window_set_timer(wmWindow *win, int delay_ms, int event)
+wmTimerHandle *WM_event_add_window_timer(wmWindow *win, int delay_ms, int interval_ms)
{
- if (win->timer) GHOST_RemoveTimer(g_system, win->timer);
-
- win->timer_event= event;
- win->timer= GHOST_InstallTimer(g_system, delay_ms, delay_ms, window_timer_proc, win);
+ return (wmTimerHandle*)GHOST_InstallTimer(g_system, delay_ms, interval_ms,
+ window_event_timer_proc, win);
+}
+
+void WM_event_remove_window_timer(wmWindow *wm, wmTimerHandle *handle)
+{
+ GHOST_RemoveTimer(g_system, (GHOST_TimerTaskHandle)handle);
}
/* ************************************ */
diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h
index 842bf0fce84..0e2a7c3b9fb 100644
--- a/source/blender/windowmanager/wm_event_types.h
+++ b/source/blender/windowmanager/wm_event_types.h
@@ -38,6 +38,8 @@
/* custom data type */
#define EVT_TABLET 1
#define EVT_GESTURE 2
+#define EVT_TIMER 3
+#define EVT_MESSAGE 4
#define MOUSEX 0x004
#define MOUSEY 0x005
@@ -56,16 +58,18 @@
/* SYSTEM : 0x01x */
-#define KEYBD 0x010 /* keyboard */
-#define RAWKEYBD 0x011 /* raw keyboard for keyboard manager */
-#define REDRAW 0x012 /* used by port manager to signal redraws */
-#define INPUTCHANGE 0x013 /* input connected or disconnected */
-#define QFULL 0x014 /* queue was filled */
-#define WINFREEZE 0x015 /* user wants process in this win to shut up */
-#define WINTHAW 0x016 /* user wants process in this win to go again */
-#define WINCLOSE 0x017 /* window close */
-#define WINQUIT 0x018 /* signal from user that app is to go away */
-#define Q_FIRSTTIME 0x019 /* on startup */
+#define KEYBD 0x0100 /* keyboard */
+#define RAWKEYBD 0x0101 /* raw keyboard for keyboard manager */
+#define REDRAW 0x0102 /* used by port manager to signal redraws */
+#define INPUTCHANGE 0x0103 /* input connected or disconnected */
+#define QFULL 0x0104 /* queue was filled */
+#define WINFREEZE 0x0105 /* user wants process in this win to shut up */
+#define WINTHAW 0x0106 /* user wants process in this win to go again */
+#define WINCLOSE 0x0107 /* window close */
+#define WINQUIT 0x0108 /* signal from user that app is to go away */
+#define Q_FIRSTTIME 0x0109 /* on startup */
+#define TIMER 0x0110 /* timer event */
+#define MESSAGE 0x0111 /* message event */
/* standard keyboard */
diff --git a/source/blender/windowmanager/wm_subwindow.h b/source/blender/windowmanager/wm_subwindow.h
index b4d12d1358c..0e8c76a8eec 100644
--- a/source/blender/windowmanager/wm_subwindow.h
+++ b/source/blender/windowmanager/wm_subwindow.h
@@ -42,9 +42,9 @@ int wm_subwindow_get(wmWindow *win); /* returns id */
void wm_subwindow_position(wmWindow *win, int swinid, rcti *winrct);
-
-void wm_subwindow_getsize(wmWindow *win, int *x, int *y);
-void wm_subwindow_getorigin(wmWindow *win, int *x, int *y);
+void wm_subwindow_getsize(wmWindow *win, int swinid, int *x, int *y);
+void wm_subwindow_getorigin(wmWindow *win, int swinid, int *x, int *y);
+void wm_subwindow_getmatrix(wmWindow *win, int swinid, float mat[][4]);
#endif /* WM_SUBWINDOW_H */