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
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.
-rw-r--r--intern/ghost/GHOST_Types.h2
-rw-r--r--intern/ghost/intern/GHOST_SystemCarbon.cpp6
-rw-r--r--intern/ghost/intern/GHOST_SystemWin32.cpp5
-rw-r--r--intern/ghost/intern/GHOST_SystemX11.cpp5
-rw-r--r--source/blender/blenkernel/BKE_screen.h2
-rw-r--r--source/blender/blenkernel/intern/screen.c10
-rw-r--r--source/blender/blenloader/intern/readfile.c8
-rw-r--r--source/blender/editors/include/BIF_glutil.h1
-rw-r--r--source/blender/editors/include/ED_screen.h4
-rw-r--r--source/blender/editors/screen/area.c36
-rw-r--r--source/blender/editors/screen/glutil.c12
-rw-r--r--source/blender/editors/screen/screen_edit.c51
-rw-r--r--source/blender/editors/space_time/space_time.c8
-rw-r--r--source/blender/editors/space_view3d/space_view3d.c2
-rw-r--r--source/blender/makesdna/DNA_screen_types.h12
-rw-r--r--source/blender/makesdna/DNA_windowmanager_types.h20
-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
24 files changed, 429 insertions, 176 deletions
diff --git a/intern/ghost/GHOST_Types.h b/intern/ghost/GHOST_Types.h
index 349fb5a02fc..a413b765ccb 100644
--- a/intern/ghost/GHOST_Types.h
+++ b/intern/ghost/GHOST_Types.h
@@ -143,6 +143,8 @@ typedef enum {
GHOST_kEventWindowSize,
GHOST_kEventWindowMove,
+ GHOST_kEventTimer,
+
GHOST_kNumEventTypes
} GHOST_TEventType;
diff --git a/intern/ghost/intern/GHOST_SystemCarbon.cpp b/intern/ghost/intern/GHOST_SystemCarbon.cpp
index 5523fab50f1..e1980521eb0 100644
--- a/intern/ghost/intern/GHOST_SystemCarbon.cpp
+++ b/intern/ghost/intern/GHOST_SystemCarbon.cpp
@@ -423,17 +423,15 @@ bool GHOST_SystemCarbon::processEvents(bool waitForEvent)
GHOST_TimerManager* timerMgr = getTimerManager();
if (waitForEvent) {
- GHOST_TUns64 curtime = getMilliSeconds();
GHOST_TUns64 next = timerMgr->nextFireTime();
double timeOut;
if (next == GHOST_kFireTimeNever) {
timeOut = kEventDurationForever;
} else {
- if (next<=curtime)
+ timeOut = (double)(next - getMilliSeconds())/1000.0;
+ if (timeOut < 0.0)
timeOut = 0.0;
- else
- timeOut = (double) (next - getMilliSeconds())/1000.0;
}
::ReceiveNextEvent(0, NULL, timeOut, false, &event);
diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp
index 6f9bad0f876..61b504400d2 100644
--- a/intern/ghost/intern/GHOST_SystemWin32.cpp
+++ b/intern/ghost/intern/GHOST_SystemWin32.cpp
@@ -190,11 +190,12 @@ bool GHOST_SystemWin32::processEvents(bool waitForEvent)
::Sleep(1);
#else
GHOST_TUns64 next = timerMgr->nextFireTime();
+ GHOST_TInt64 maxSleep = next - getMilliSeconds();
if (next == GHOST_kFireTimeNever) {
::WaitMessage();
- } else {
- ::SetTimer(NULL, 0, next - getMilliSeconds(), NULL);
+ } else if(maxSleep >= 0.0) {
+ ::SetTimer(NULL, 0, maxSleep, NULL);
::WaitMessage();
::KillTimer(NULL, 0);
}
diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp
index bbce940f1b3..170a7c23843 100644
--- a/intern/ghost/intern/GHOST_SystemX11.cpp
+++ b/intern/ghost/intern/GHOST_SystemX11.cpp
@@ -309,7 +309,10 @@ processEvents(
if (next==GHOST_kFireTimeNever) {
SleepTillEvent(m_display, -1);
} else {
- SleepTillEvent(m_display, next - getMilliSeconds());
+ GHOST_TInt64 maxSleep = next - getMilliSeconds();
+
+ if(maxSleep >= 0)
+ SleepTillEvent(m_display, next - getMilliSeconds());
}
}
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index 14090719de6..ebaf85a58f9 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -82,10 +82,12 @@ typedef struct ARegionType {
void (*draw)(const struct bContext *, struct ARegion *); /* draw entirely, windowsize changes should be handled here */
void (*listener)(struct ARegion *, struct wmNotifier *);
+ void (*free)(struct ARegion *);
} ARegionType;
void BKE_screen_area_free(struct ScrArea *sa);
+void BKE_area_region_free(struct ARegion *ar);
void free_screen(struct bScreen *sc);
struct SpaceType *BKE_spacetype_from_id(int spaceid);
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index b259138ee42..926a62e9f69 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -90,11 +90,21 @@ void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2)
}
}
+/* not region itself */
+void BKE_area_region_free(ARegion *ar)
+{
+ if(ar->type && ar->type->free)
+ ar->type->free(ar);
+}
/* not area itself */
void BKE_screen_area_free(ScrArea *sa)
{
+ ARegion *ar;
+ for(ar=sa->regionbase.first; ar; ar=ar->next)
+ BKE_area_region_free(ar);
+
BKE_spacedata_freelist(&sa->spacedata);
BLI_freelistN(&sa->regionbase);
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 4fffaf02b09..5c8583cd5ee 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -3492,6 +3492,7 @@ static void direct_link_windowmanager(FileData *fd, wmWindowManager *wm)
win->queue.first= win->queue.last= NULL;
win->handlers.first= win->handlers.last= NULL;
+ win->modalops.first= win->modalops.last= NULL;
win->subwindows.first= win->subwindows.last= NULL;
}
@@ -3836,7 +3837,8 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
link_list(fd, &(sc->vertbase));
link_list(fd, &(sc->edgebase));
link_list(fd, &(sc->areabase));
-
+ sc->regionbase.first= sc->regionbase.last= NULL;
+
sc->mainwin= sc->subwinactive= 0; /* indices */
/* hacky patch... but people have been saving files with the verse-blender,
@@ -3875,6 +3877,7 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
link_list(fd, &(sa->regionbase));
sa->handlers.first= sa->handlers.last= NULL;
+ sa->modalops.first= sa->modalops.last= NULL;
sa->uiblocks.first= sa->uiblocks.last= NULL;
sa->type= NULL; /* spacetype callbacks */
@@ -3937,6 +3940,9 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
for(ar= sa->regionbase.first; ar; ar= ar->next) {
ar->handlers.first= ar->handlers.last= NULL;
+ ar->modalops.first= ar->modalops.last= NULL;
+ ar->uiblocks.first= ar->uiblocks.last= NULL;
+ ar->regiondata= NULL;
ar->swinid= 0;
ar->type= NULL;
}
diff --git a/source/blender/editors/include/BIF_glutil.h b/source/blender/editors/include/BIF_glutil.h
index bc622a94be5..3fcb88b1c49 100644
--- a/source/blender/editors/include/BIF_glutil.h
+++ b/source/blender/editors/include/BIF_glutil.h
@@ -206,6 +206,7 @@ void bglVertex2fv(float *vec);
void bglFlush(void);
int is_a_really_crappy_intel_card(void);
void set_inverted_drawing(int enable);
+void setlinestyle(int nr);
/* own working polygon offset */
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index f1ce0d5e66e..095ccf09457 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -38,9 +38,11 @@ struct wmWindow;
struct wmNotifier;
/* regions */
+void ED_region_initialize(struct wmWindowManager *wm, struct wmWindow *win, struct ARegion *ar);
void ED_region_do_listen(ARegion *ar, struct wmNotifier *note);
void ED_region_do_draw(struct bContext *C, ARegion *ar);
void ED_region_do_refresh(struct bContext *C, ARegion *ar);
+void ED_region_exit(struct bContext *C, ARegion *ar);
/* spaces */
void ED_spacetypes_init(void);
@@ -48,6 +50,7 @@ void ED_spacetypes_keymap(struct wmWindowManager *wm);
/* areas */
void ED_area_initialize(struct wmWindowManager *wm, struct wmWindow *win, struct ScrArea *sa);
+void ED_area_exit(struct bContext *C, ScrArea *sa);
/* screens */
void ED_screens_initialize(struct wmWindowManager *wm);
@@ -58,6 +61,7 @@ void ED_screen_do_listen(struct wmWindow *win, struct wmNotifier *note);
bScreen *ED_screen_duplicate(struct wmWindow *win, bScreen *sc);
bScreen *ED_screen_riparea(struct wmWindow *win, bScreen *sc, struct ScrArea *sa);
void ED_screen_set_subwinactive(struct wmWindow *win);
+void ED_screen_exit(struct bContext *C, struct wmWindow *window, bScreen *screen);
void ED_operatortypes_screen(void);
void ED_keymap_screen(struct wmWindowManager *wm);
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index ac6058a0c5c..6d77dc4eee9 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -173,6 +173,8 @@ static void region_rect_recursive(ARegion *ar, rcti *remainder)
/* hidden is user flag */
if(ar->flag & RGN_FLAG_HIDDEN);
+ /* XXX floating area region, not handled yet here */
+ else if(ar->alignment == RGN_ALIGN_FLOAT);
/* remainder is too small for any usage */
else if( rct_fits(remainder, 'v', 1)==0 || rct_fits(remainder, 'h', 1) < 0 ) {
ar->flag |= RGN_FLAG_TOO_SMALL;
@@ -189,7 +191,7 @@ static void region_rect_recursive(ARegion *ar, rcti *remainder)
}
else {
int fac= rct_fits(remainder, 'v', ar->size);
-
+
if(fac < 0 )
ar->size += fac;
@@ -352,6 +354,20 @@ void area_azone_initialize(ScrArea *sa) {
}
}
+/* used for area and screen regions */
+void ED_region_initialize(wmWindowManager *wm, wmWindow *win, ARegion *ar)
+{
+ if(ar->flag & (RGN_FLAG_HIDDEN|RGN_FLAG_TOO_SMALL)) {
+ if(ar->swinid)
+ wm_subwindow_close(win, ar->swinid);
+ ar->swinid= 0;
+ }
+ else if(ar->swinid==0)
+ ar->swinid= wm_subwindow_open(win, &ar->winrct);
+ else
+ wm_subwindow_position(win, ar->swinid, &ar->winrct);
+}
+
/* called in screen_refresh, or screens_init */
void ED_area_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa)
{
@@ -376,17 +392,8 @@ void ED_area_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa)
region_rect_recursive(sa->regionbase.first, &rect);
/* region windows */
- for(ar= sa->regionbase.first; ar; ar= ar->next) {
- if(ar->flag & (RGN_FLAG_HIDDEN|RGN_FLAG_TOO_SMALL)) {
- if(ar->swinid)
- wm_subwindow_close(win, ar->swinid);
- ar->swinid= 0;
- }
- else if(ar->swinid==0)
- ar->swinid= wm_subwindow_open(win, &ar->winrct);
- else
- wm_subwindow_position(win, ar->swinid, &ar->winrct);
- }
+ for(ar= sa->regionbase.first; ar; ar= ar->next)
+ ED_region_initialize(wm, win, ar);
area_azone_initialize(sa);
}
@@ -435,8 +442,11 @@ void area_copy_data(ScrArea *sa1, ScrArea *sa2, int swap_space)
/* regions */
BLI_freelistN(&sa1->regionbase);
BLI_duplicatelist(&sa1->regionbase, &sa2->regionbase);
- for(ar= sa1->regionbase.first; ar; ar= ar->next)
+ for(ar= sa1->regionbase.first; ar; ar= ar->next) {
+ ar->handlers.first= ar->handlers.last= NULL;
+ ar->uiblocks.first= ar->uiblocks.last= NULL;
ar->swinid= 0;
+ }
/* scripts */
BPY_free_scriptlink(&sa1->scriptlink);
diff --git a/source/blender/editors/screen/glutil.c b/source/blender/editors/screen/glutil.c
index 4a7b3766ea8..5b776fd7f49 100644
--- a/source/blender/editors/screen/glutil.c
+++ b/source/blender/editors/screen/glutil.c
@@ -151,6 +151,18 @@ void sdrawbox(short x1, short y1, short x2, short y2)
/* ******************************************** */
+void setlinestyle(int nr)
+{
+ if(nr==0) {
+ glDisable(GL_LINE_STIPPLE);
+ }
+ else {
+
+ glEnable(GL_LINE_STIPPLE);
+ glLineStipple(nr, 0xAAAA);
+ }
+}
+
/* Invert line handling */
#define glToggle(mode, onoff) (((onoff)?glEnable:glDisable)(mode))
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 7d827a5daad..98c5eecfe4b 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -37,7 +37,6 @@
#include "BIF_gl.h"
#include "BIF_glutil.h"
-#include "BIF_resources.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -389,7 +388,6 @@ static void select_connected_scredge(bScreen *sc, ScrEdge *edge)
static ScrArea *screen_addarea(bScreen *sc, ScrVert *v1, ScrVert *v2, ScrVert *v3, ScrVert *v4, short headertype, short spacetype)
{
- AZone *az= NULL;
ScrArea *sa= MEM_callocN(sizeof(ScrArea), "addscrarea");
sa->v1= v1;
sa->v2= v2;
@@ -404,7 +402,8 @@ static ScrArea *screen_addarea(bScreen *sc, ScrVert *v1, ScrVert *v2, ScrVert *v
}
static void screen_delarea(bScreen *sc, ScrArea *sa)
-{
+{
+ /* XXX need context to cancel operators ED_area_exit(C, sa); */
BKE_screen_area_free(sa);
BLI_remlink(&sc->areabase, sa);
MEM_freeN(sa);
@@ -456,6 +455,7 @@ static void screen_copy(bScreen *to, bScreen *from)
BLI_duplicatelist(&to->vertbase, &from->vertbase);
BLI_duplicatelist(&to->edgebase, &from->edgebase);
BLI_duplicatelist(&to->areabase, &from->areabase);
+ to->regionbase.first= to->regionbase.last= NULL;
s2= to->vertbase.first;
for(s1= from->vertbase.first; s1; s1= s1->next, s2= s2->next) {
@@ -808,11 +808,8 @@ void screen_test_scale(bScreen *sc, int winsizex, int winsizey)
/* test for collapsed areas. This could happen in some blender version... */
for(sa= sc->areabase.first; sa; sa= san) {
san= sa->next;
- if(sa->v1==sa->v2 || sa->v3==sa->v4 || sa->v2==sa->v3) {
- BKE_screen_area_free(sa);
- BLI_remlink(&sc->areabase, sa);
- MEM_freeN(sa);
- }
+ if(sa->v1==sa->v2 || sa->v3==sa->v4 || sa->v2==sa->v3)
+ screen_delarea(sc, sa);
}
}
@@ -1123,6 +1120,7 @@ void ED_screen_gesture(wmWindow *win)
void ED_screen_refresh(wmWindowManager *wm, wmWindow *win)
{
ScrArea *sa;
+ ARegion *ar;
rcti winrct= {0, win->sizex, 0, win->sizey};
screen_test_scale(win->screen, win->sizex, win->sizey);
@@ -1137,6 +1135,11 @@ void ED_screen_refresh(wmWindowManager *wm, wmWindow *win)
/* sets subwindow */
ED_area_initialize(wm, win, sa);
}
+
+ for(ar= win->screen->regionbase.first; ar; ar= ar->next) {
+ /* set subwindow */
+ ED_region_initialize(wm, win, ar);
+ }
if(G.f & G_DEBUG) printf("set screen\n");
win->screen->do_refresh= 0;
@@ -1157,6 +1160,38 @@ void ED_screens_initialize(wmWindowManager *wm)
}
}
+void ED_region_exit(bContext *C, ARegion *ar)
+{
+ WM_operator_cancel(C, &ar->modalops, NULL);
+ WM_event_remove_handlers(&ar->handlers);
+}
+
+void ED_area_exit(bContext *C, ScrArea *sa)
+{
+ ARegion *ar;
+
+ for(ar= sa->regionbase.first; ar; ar= ar->next)
+ ED_region_exit(C, ar);
+
+ WM_operator_cancel(C, &sa->modalops, NULL);
+ WM_event_remove_handlers(&sa->handlers);
+}
+
+void ED_screen_exit(bContext *C, wmWindow *window, bScreen *screen)
+{
+ ScrArea *sa;
+ ARegion *ar;
+
+ for(ar= screen->regionbase.first; ar; ar= ar->next)
+ ED_region_exit(C, ar);
+
+ for(sa= screen->areabase.first; sa; sa= sa->next)
+ ED_area_exit(C, sa);
+
+ WM_operator_cancel(C, &window->modalops, NULL);
+ WM_event_remove_handlers(&window->handlers);
+}
+
void placeholder()
{
removenotused_scrverts(NULL);
diff --git a/source/blender/editors/space_time/space_time.c b/source/blender/editors/space_time/space_time.c
index 1d35e7a57e0..02a07044a8a 100644
--- a/source/blender/editors/space_time/space_time.c
+++ b/source/blender/editors/space_time/space_time.c
@@ -202,7 +202,7 @@ static void time_init(wmWindowManager *wm, ScrArea *sa)
/* add types to regions */
for(ar= sa->regionbase.first; ar; ar= ar->next) {
if(ar->regiontype == RGN_TYPE_WINDOW) {
- static ARegionType mainart={NULL, NULL, NULL, NULL};
+ static ARegionType mainart={NULL, NULL, NULL, NULL, NULL};
mainart.init= time_main_area_init;
mainart.refresh= time_main_area_refresh;
@@ -216,11 +216,11 @@ static void time_init(wmWindowManager *wm, ScrArea *sa)
* to add the keymap handler, also will need to take care of
* area type changes, etc, basically space callbacks need to
* be looked at further */
- WM_event_remove_keymap_handler(&wm->timekeymap, &ar->handlers);
- WM_event_add_keymap_handler(&wm->timekeymap, &ar->handlers);
+ WM_event_remove_keymap_handler(&ar->handlers, &wm->timekeymap);
+ WM_event_add_keymap_handler(&ar->handlers, &wm->timekeymap);
}
else {
- static ARegionType art={NULL, NULL, NULL, NULL};
+ static ARegionType art={NULL, NULL, NULL, NULL, NULL};
/* for time being; register 1 type */
ar->type= &art;
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 1abd860c661..d60dd6a4062 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -128,7 +128,7 @@ static void view3d_init(struct wmWindowManager *wm, ScrArea *sa)
/* add types to regions */
for(ar= sa->regionbase.first; ar; ar= ar->next) {
- static ARegionType art={NULL, NULL, NULL, NULL};
+ static ARegionType art={NULL, NULL, NULL, NULL, NULL};
/* for time being; register 1 type */
ar->type= &art;
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index 1a128730910..c5ec847608f 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -46,7 +46,9 @@ struct wmWindowManager;
typedef struct bScreen {
ID id;
- ListBase vertbase, edgebase, areabase;
+ ListBase vertbase, edgebase;
+ ListBase areabase;
+ ListBase regionbase; /* screen level regions, runtime only */
struct Scene *scene;
short scenenr, screennr; /* only for pupmenu */
@@ -127,6 +129,7 @@ typedef struct ScrArea {
ListBase panels;
ListBase regionbase; /* ARegion */
ListBase handlers; /* wmEventHandler */
+ ListBase modalops; /* wmOperator */
ListBase actionzones; /* AZone */
} ScrArea;
@@ -149,8 +152,11 @@ typedef struct ARegion {
struct ARegionType *type; /* callbacks for this region type */
- ListBase handlers;
+ ListBase uiblocks;
+ ListBase handlers; /* wmEventHandler */
+ ListBase modalops; /* wmOperator */
+ void *regiondata; /* XXX 2.50, need spacedata equivalent? */
} ARegion;
/* area->flag */
@@ -205,6 +211,7 @@ typedef struct ARegion {
/* regiontype, first two are the default set */
#define RGN_TYPE_WINDOW 0
#define RGN_TYPE_HEADER 1
+#define RGN_TYPE_TEMPORARY 2
/* region alignment */
#define RGN_ALIGN_NONE 0
@@ -214,6 +221,7 @@ typedef struct ARegion {
#define RGN_ALIGN_RIGHT 4
#define RGN_ALIGN_HSPLIT 5
#define RGN_ALIGN_VSPLIT 6
+#define RGN_ALIGN_FLOAT 7
/* region flag */
#define RGN_FLAG_HIDDEN 1
diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h
index 99334d705dc..bb5bf6d19b3 100644
--- a/source/blender/makesdna/DNA_windowmanager_types.h
+++ b/source/blender/makesdna/DNA_windowmanager_types.h
@@ -78,10 +78,8 @@ typedef struct wmWindow {
struct wmWindow *next, *prev;
void *ghostwin; /* dont want to include ghost.h stuff */
- void *timer;
- int timer_event;
- int winid; /* winid also in screens, is for retrieving this window after read */
+ int winid, pad; /* winid also in screens, is for retrieving this window after read */
struct bScreen *screen; /* active screen */
char screenname[32]; /* MAX_ID_NAME for matching window with active screen after file read */
@@ -96,11 +94,12 @@ typedef struct wmWindow {
struct wmSubWindow *curswin; /* internal for wm_subwindow.c only */
- ListBase queue; /* all events (ghost level events were handled) */
- ListBase handlers; /* window+screen handlers, overriding all queues */
+ ListBase queue; /* all events (ghost level events were handled) */
+ ListBase handlers; /* window+screen handlers, overriding all queues */
+ ListBase modalops; /* wmOperator, operators running modal */
ListBase subwindows; /* opengl stuff for sub windows, see notes in wm_subwindow.c */
- ListBase gesture; /* gesture stuff */
+ ListBase gesture; /* gesture stuff */
} wmWindow;
#
@@ -169,13 +168,16 @@ typedef struct wmOperator {
/* or IDproperty list */
IDProperty *properties;
+ /* runtime */
+ ListBase *modallist;
} wmOperator;
-/* operator type exec(), invoke() modal(), cancel() return values */
-#define OPERATOR_PASS_THROUGH 0
+/* operator type exec(), invoke() modal(), return values */
#define OPERATOR_RUNNING_MODAL 1
#define OPERATOR_CANCELLED 2
-#define OPERATOR_FINISHED 3
+#define OPERATOR_FINISHED 4
+/* add this flag if the event should pass through */
+#define OPERATOR_PASS_THROUGH 8
#endif /* DNA_WINDOWMANAGER_TYPES_H */
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 */