Change the core internal event dispatch to use a BWinEvent structure

instead of passing seperate arguments. For when we want to pass 'richer'
events around.
This commit is contained in:
Daniel Dunbar 2003-03-23 22:52:11 +00:00
parent 3dd8dfa32b
commit 510e2d5840
5 changed files with 64 additions and 45 deletions

@ -40,6 +40,14 @@ struct rcti;
/*---*/ /*---*/
typedef struct BWinEvent {
unsigned short event;
short val;
char ascii;
} BWinEvent;
/*---*/
int mywinget(void); int mywinget(void);
void mywinclose(int winid); void mywinclose(int winid);
void mywinposition(int winid, void mywinposition(int winid,
@ -47,9 +55,27 @@ void mywinposition(int winid,
int ymin, int ymax); int ymin, int ymax);
/*---*/ /*---*/
/** Test if there are events available on a BWin queue.
*
* @param winid The ID of the window to query.
* @return True if there is an event available for _qread'ing.
*/
int bwin_qtest(int winid); int bwin_qtest(int winid);
unsigned short bwin_qread(int winid, short *val_r, char *ascii_r);
void bwin_qadd(int winid, unsigned short event, short val, char ascii); /** Read an event off of the BWin queue (if available).
*
* @param winid The ID of the window to read from.
* @param event_r A pointer to return the event in.
* @return True if an event was read and @a event_r filled.
*/
int bwin_qread(int winid, BWinEvent *event_r);
/** Add an event to the BWin queue.
*
* @param winid The ID of the window to add to.
* @param event A pointer to copy the event from.
*/
void bwin_qadd(int winid, BWinEvent *event);
/*---*/ /*---*/

@ -37,6 +37,7 @@ struct ListBase;
struct ScrArea; struct ScrArea;
struct SpaceButs; struct SpaceButs;
struct View2D; struct View2D;
struct BWinEvent;
#define REMAKEIPO 1 #define REMAKEIPO 1
#define OOPS_TEST 2 #define OOPS_TEST 2
@ -44,7 +45,7 @@ struct View2D;
void scrarea_do_windraw (struct ScrArea *sa); void scrarea_do_windraw (struct ScrArea *sa);
void scrarea_do_winchange (struct ScrArea *sa); void scrarea_do_winchange (struct ScrArea *sa);
void scrarea_do_winhandle (struct ScrArea *sa, unsigned short event, short val, char ascii); void scrarea_do_winhandle (struct ScrArea *sa, struct BWinEvent *evt);
void scrarea_do_headdraw (struct ScrArea *sa); void scrarea_do_headdraw (struct ScrArea *sa);
void scrarea_do_headchange (struct ScrArea *sa); void scrarea_do_headchange (struct ScrArea *sa);

@ -392,7 +392,11 @@ static void addqueue_ext(short win, unsigned short event, short val, char ascii)
if (win<4 || !areawinar[win]) { if (win<4 || !areawinar[win]) {
printf("bad call to addqueue: %d (%d, %d)\n", win, event, val); printf("bad call to addqueue: %d (%d, %d)\n", win, event, val);
} else { } else {
bwin_qadd(win, event, val, ascii); BWinEvent evt;
evt.event= event;
evt.val= val;
evt.ascii= ascii;
bwin_qadd(win, &evt);
} }
} }
@ -419,21 +423,18 @@ static void scrollheader(ScrArea *area);
static void scrarea_dispatch_header_events(ScrArea *sa) static void scrarea_dispatch_header_events(ScrArea *sa)
{ {
ScrArea *tempsa; ScrArea *tempsa;
BWinEvent evt;
short do_redraw=0, do_change=0; short do_redraw=0, do_change=0;
areawinset(sa->headwin); areawinset(sa->headwin);
while(bwin_qtest(sa->headwin)) { while(bwin_qread(sa->headwin, &evt)) {
char ascii; if(evt.val) {
short val; if( uiDoBlocks(&curarea->uiblocks, evt.event)!=UI_NOTHING ) evt.event= 0;
unsigned short event= bwin_qread(sa->headwin, &val, &ascii);
if(val) { switch(evt.event) {
if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
switch(event) {
case UI_BUT_EVENT: case UI_BUT_EVENT:
do_headerbuttons(val); do_headerbuttons(evt.val);
break; break;
case LEFTMOUSE: case LEFTMOUSE:
@ -460,7 +461,7 @@ static void scrarea_dispatch_header_events(ScrArea *sa)
break; break;
default: default:
if (winqueue_break == 0) { if (winqueue_break == 0) {
scrarea_do_winhandle(sa, event, val, ascii); scrarea_do_winhandle(sa, &evt);
if (winqueue_break == 0) areawinset(sa->headwin); if (winqueue_break == 0) areawinset(sa->headwin);
} }
} }
@ -481,25 +482,22 @@ static void scrarea_dispatch_header_events(ScrArea *sa)
static void scrarea_dispatch_events(ScrArea *sa) static void scrarea_dispatch_events(ScrArea *sa)
{ {
ScrArea *tempsa; ScrArea *tempsa;
BWinEvent evt;
short do_redraw=0, do_change=0; short do_redraw=0, do_change=0;
if(sa!=curarea || sa->win!=mywinget()) areawinset(sa->win); if(sa!=curarea || sa->win!=mywinget()) areawinset(sa->win);
while(bwin_qtest(sa->win)) { while(bwin_qread(sa->win, &evt)) {
char ascii; if(evt.event==REDRAW) {
short val;
unsigned short event= bwin_qread(sa->win, &val, &ascii);
if(event==REDRAW) {
do_redraw= 1; do_redraw= 1;
} }
else if(event==CHANGED) { else if(evt.event==CHANGED) {
sa->win_swap= 0; sa->win_swap= 0;
do_change= 1; do_change= 1;
do_redraw= 1; do_redraw= 1;
} }
else { else {
scrarea_do_winhandle(sa, event, val, ascii); scrarea_do_winhandle(sa, &evt);
} }
if(winqueue_break) return; if(winqueue_break) return;
@ -900,6 +898,13 @@ void screenmain(void)
has_input= val; has_input= val;
} }
/* If the main window is active, find the current active ScrArea
* underneath the mouse cursor, updating the headers & cursor for
* the appropriate internal window if things have changed.
*
* If the main window is not active, deactivate the internal
* window.
*/
if (has_input) { if (has_input) {
ScrArea *newactarea; ScrArea *newactarea;
int newactwin; int newactwin;

@ -63,13 +63,6 @@
#include "winlay.h" #include "winlay.h"
typedef struct {
unsigned short event;
short val;
char ascii;
} QEvent;
typedef struct { typedef struct {
struct bWindow *next, *prev; struct bWindow *next, *prev;
int id, pad; int id, pad;
@ -117,6 +110,8 @@ void mywindow_init_mainwin(Window *win, int orx, int ory, int sizex, int sizey)
/* XXXXXXXXXXXXXXXX very hacky, not allowed to release /* XXXXXXXXXXXXXXXX very hacky, not allowed to release
* again after 2.24 * again after 2.24
*
* Nah ha! And you thought you'd be in business that long!
*/ */
void mywindow_build_and_set_renderwin(void) void mywindow_build_and_set_renderwin(void)
{ {
@ -145,26 +140,18 @@ int bwin_qtest(int winid)
{ {
return !BLI_gsqueue_is_empty(bwin_from_winid(winid)->qevents); return !BLI_gsqueue_is_empty(bwin_from_winid(winid)->qevents);
} }
unsigned short bwin_qread(int winid, short *val_r, char *ascii_r) int bwin_qread(int winid, BWinEvent *evt_r)
{ {
if (bwin_qtest(winid)) { if (bwin_qtest(winid)) {
QEvent evt; BLI_gsqueue_pop(bwin_from_winid(winid)->qevents, evt_r);
BLI_gsqueue_pop(bwin_from_winid(winid)->qevents, &evt); return 1;
*val_r= evt.val;
*ascii_r= evt.ascii;
return evt.event;
} else { } else {
*val_r= 0;
return 0; return 0;
} }
} }
void bwin_qadd(int winid, unsigned short event, short val, char ascii) void bwin_qadd(int winid, BWinEvent *evt)
{ {
QEvent evt; BLI_gsqueue_push(bwin_from_winid(winid)->qevents, evt);
evt.event= event;
evt.val= val;
evt.ascii= ascii;
BLI_gsqueue_push(bwin_from_winid(winid)->qevents, &evt);
} }
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
@ -383,7 +370,7 @@ int myswinopen(int parentid, int xmin, int xmax, int ymin, int ymax)
win->xmax= xmax; win->xmax= xmax;
win->ymax= ymax; win->ymax= ymax;
win->qevents= BLI_gsqueue_new(sizeof(QEvent)); win->qevents= BLI_gsqueue_new(sizeof(BWinEvent));
Mat4One(win->viewmat); Mat4One(win->viewmat);
Mat4One(win->winmat); Mat4One(win->winmat);

@ -129,13 +129,13 @@ void scrarea_do_winchange(ScrArea *area)
} }
} }
} }
void scrarea_do_winhandle(ScrArea *area, unsigned short event, short val, char ascii) void scrarea_do_winhandle(ScrArea *area, BWinEvent *evt)
{ {
SpaceType *st= spacetype_from_code(area->spacetype); SpaceType *st= spacetype_from_code(area->spacetype);
areawinset(area->win); areawinset(area->win);
if (st->winhandle) { if (st->winhandle) {
st->winhandle(event, val, ascii); st->winhandle(evt->event, evt->val, evt->ascii);
} }
} }