diff options
author | Ton Roosendaal <ton@blender.org> | 2008-01-07 21:03:41 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2008-01-07 21:03:41 +0300 |
commit | 1363134dee60ce96ab0772b72283fb405b6a75ed (patch) | |
tree | ece7c62b984d1ebfa8fd1fe1890332c75efa234d /source/blender/windowmanager | |
parent | 1005d99ea5190f34c56f6b30d5eca6bf738a78e8 (diff) |
Whole lot of changes.... here a shortlist:
- removed editors/area and put this all in screen
- added first python calls (note, a new c file for scriptlinks)
- added view3d editor callbacks (no drawing yet)
- added files in editors/interface
(Cmake and Scons has to be fixed, help welcome!)
- now areas/headers are being converted on file read
- note: previously saved 2.50 files will crash!!! (.B.blend)
- area regions are being drawn, first handler for cursor added (on edge)
- window duplicate and scale works correct for screen subdiv
Todos for me:
- need to fix things in syntax (function names) a bit still
- more operators for screen
- define how Context will work... still unresolved when it gets set
- docs!
Reviews of code structure is welcome!
There are also more todos now for others, but it can wait a couple of days
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r-- | source/blender/windowmanager/WM_api.h | 7 | ||||
-rw-r--r-- | source/blender/windowmanager/WM_types.h | 52 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/screen_edit.c | 0 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm.c | 31 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 149 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_init_exit.c | 4 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_operators.c | 10 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_subwindow.c | 27 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_window.c | 71 | ||||
-rw-r--r-- | source/blender/windowmanager/wm.h | 3 | ||||
-rw-r--r-- | source/blender/windowmanager/wm_event_system.h | 41 | ||||
-rw-r--r-- | source/blender/windowmanager/wm_event_types.h | 2 |
12 files changed, 299 insertions, 98 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 2aad763336e..6f94bfac456 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -63,7 +63,10 @@ void WM_keymap_verify_item(ListBase *lb, char *idname, short type, short val, int modifier, short keymodifier); struct wmEventHandler *WM_event_add_keymap_handler(ListBase *keymap, ListBase *handlers); struct wmEventHandler *WM_event_add_modal_keymap_handler(ListBase *keymap, ListBase *handlers, wmOperator *op); - + +void WM_event_add_notifier(wmWindowManager *wm, wmWindow *window, int swinid, int type, int value); + + /* operator api, default callbacks */ /* confirm menu + exec */ int WM_operator_confirm (struct bContext *C, struct wmOperator *op, struct wmEvent *event); @@ -72,7 +75,7 @@ int WM_operator_winactive (struct bContext *C); /* operator api */ wmOperatorType *WM_operatortype_find(const char *idname); -void WM_operator_register(wmWindowManager *wm, wmOperator *ot); +void WM_operatortypelist_append(ListBase *lb); /* OpenGL wrappers, mimicing opengl syntax */ void wmLoadMatrix (wmWindow *win, float mat[][4]); diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index c894a8908f0..9c670aff71e 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -30,11 +30,42 @@ /* exported types for WM */ +#include "wm_cursors.h" +#include "wm_event_types.h" + /* ************** wmOperatorType ************************ */ /* flag */ #define OPTYPE_REGISTER 1 +/* ************** wmEvent ************************ */ + +/* each event should have full modifier state */ +/* event comes from eventmanager and from keymap */ +typedef struct wmEvent { + struct wmEvent *next, *prev; + + short type; /* event code itself (short, is also in keymap) */ + short val; /* press, release, scrollvalue */ + short x, y; /* mouse pointer position */ + short unicode; /* future, ghost? */ + char ascii; /* from ghost */ + char pad1; + + /* modifier states */ + short shift, ctrl, alt, oskey; /* oskey is apple or windowskey, value denotes order of pressed */ + short keymodifier; /* rawkey modifier */ + + /* keymap item, set by handler (weak?) */ + const char *keymap_idname; + + /* custom data */ + short custom; /* custom data type, stylus, 6dof, see wm_event_types.h */ + void *customdata; /* ascii, unicode, mouse coords, angles, vectors, dragdrop info */ + +} wmEvent; + + /* ************** wmKeyMap ************************ */ /* modifier */ @@ -53,6 +84,27 @@ #define KM_RELEASE 1 +/* ************** notifiers ****************** */ + +typedef struct wmNotifier { + struct wmNotifier *prev, *next; + + struct wmWindow *window; + + int swinid; + int type; + int value; + +} wmNotifier; + + +enum { + WM_NOTE_REDRAW, + WM_NOTE_REFRESH, + + WM_NOTE_LAST +}; + /* ************** custom wmEvent data ************** */ #define DEV_STYLUS 1 diff --git a/source/blender/windowmanager/intern/screen_edit.c b/source/blender/windowmanager/intern/screen_edit.c new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/source/blender/windowmanager/intern/screen_edit.c diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c index d62b24ed806..19bf8e67db7 100644 --- a/source/blender/windowmanager/intern/wm.c +++ b/source/blender/windowmanager/intern/wm.c @@ -43,12 +43,14 @@ #include "wm_event_system.h" #include "wm_event_types.h" +#include "ED_screen.h" + /* ****************************************************** */ #define MAX_OP_REGISTERED 32 /* all operations get registered in the windowmanager here */ /* called on event handling by event_system.c */ -void WM_operator_register(wmWindowManager *wm, wmOperator *op) +void wm_operator_register(wmWindowManager *wm, wmOperator *op) { wmOperator *opc= MEM_mallocN(sizeof(wmOperator), "operator registry"); int tot; @@ -90,10 +92,17 @@ void wm_check(bContext *C) /* case: no open windows at all, for old file reads */ wm_window_add_ghostwindows(C->wm); - if(C->window==NULL) C->window= C->wm->windrawable; + if(C->window==NULL) { + wm_window_make_drawable(C, C->wm->windrawable); + } + /* case: fileread */ if(C->wm->initialized==0) { + wm_window_keymap(C->wm); + ed_screen_keymap(C->wm); + + ED_screens_initialize(C->wm); C->wm->initialized= 1; } } @@ -108,7 +117,7 @@ void wm_add_default(bContext *C) win= wm_window_new(C, C->screen); wm->windrawable= win; - C->window= win; + wm_window_make_drawable(C, win); } @@ -123,9 +132,12 @@ void wm_close_and_free(bContext *C, wmWindowManager *wm) } BLI_freelistN(&wm->operators); + BLI_freelistN(&wm->windowkeymap); BLI_freelistN(&wm->screenkeymap); + BLI_freelistN(&wm->queue); + if(C && C->wm==wm) C->wm= NULL; } @@ -151,15 +163,12 @@ void WM_main(bContext *C) /* per window, all events to the window, screen, area and region handlers */ wm_event_do_handlers(C); + /* events have left notes about changes, we handle and cache it */ + wm_event_do_notifiers(C); + + /* execute cached changes draw */ + wm_draw_update(C); } } -/* While (local_event) { -Update controller stack if active changed () -Match event to an action() -Process_event() -Do_notifications() -Do_draw_updates() -} -*/ diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 782c1325e2f..37efc1a1367 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -43,6 +43,9 @@ #include "BKE_blender.h" #include "BKE_global.h" +#include "ED_screen.h" +#include "ED_area.h" + #include "WM_api.h" #include "WM_types.h" #include "wm.h" @@ -84,6 +87,122 @@ void wm_event_free_all(wmWindow *win) } } +/* ********************* notifiers, listeners *************** */ + +/* win and swinid are optional context limitors */ +void WM_event_add_notifier(wmWindowManager *wm, wmWindow *window, int swinid, int type, int value) +{ + wmNotifier *note= MEM_callocN(sizeof(wmNotifier), "notifier"); + + BLI_addtail(&wm->queue, note); + + note->window= window; + note->swinid= swinid; + note->type= type; + note->value= value; +} + +static wmNotifier *wm_notifier_next(wmWindowManager *wm) +{ + wmNotifier *note= wm->queue.first; + + if(note) BLI_remlink(&wm->queue, note); + return note; +} + +/* called in mainloop */ +void wm_event_do_notifiers(bContext *C) +{ + wmNotifier *note; + + while( (note=wm_notifier_next(C->wm)) ) { + wmWindow *win; + + for(win= C->wm->windows.first; win; win= win->next) { + ScrArea *sa; + + if(note->window && note->window!=win) + continue; + if(win->screen==NULL) + continue; + printf("notifier win %d screen %s\n", win->winid, win->screen->id.name+2); + ED_screen_do_listen(win->screen, note); + + for(sa= win->screen->areabase.first; sa; sa= sa->next) { + ARegion *ar= sa->regionbase.first; + + for(; ar; ar= ar->next) { + if(note->swinid && note->swinid!=ar->swinid) + continue; + ED_region_do_listen(ar, note); + } + } + } + MEM_freeN(note); + } +} + +/* quick test to prevent changing window drawable */ +static int wm_draw_update_test_window(wmWindow *win) +{ + ScrArea *sa; + + if(win->screen->do_refresh) + return 1; + if(win->screen->do_draw) + return 1; + + for(sa= win->screen->areabase.first; sa; sa= sa->next) { + ARegion *ar= sa->regionbase.first; + + for(; ar; ar= ar->next) { + /* cached notifiers */ + if(ar->do_refresh) + return 1; + if(ar->swinid && ar->do_draw) + return 1; + } + } + return 0; +} + +void wm_draw_update(bContext *C) +{ + wmWindow *win; + + for(win= C->wm->windows.first; win; win= win->next) { + if(wm_draw_update_test_window(win)) { + ScrArea *sa; + + /* sets context window+screen */ + wm_window_make_drawable(C, win); + + /* notifiers for screen redraw */ + if(win->screen->do_refresh) + ED_screen_refresh(C->wm, win); + if(win->screen->do_draw) + ED_screen_draw(win); + + for(sa= win->screen->areabase.first; sa; sa= sa->next) { + ARegion *ar= sa->regionbase.first; + int hasdrawn= 0; + + for(; ar; ar= ar->next) { + hasdrawn |= ar->do_draw; + + /* cached notifiers */ + if(ar->do_refresh) + ED_region_do_refresh(C, ar); + + if(ar->swinid && ar->do_draw) + ED_region_do_draw(C, ar); + } + } + wm_window_swap_buffers(win); + } + } +} + /* ********************* handlers *************** */ void wm_event_free_handlers(ListBase *lb) @@ -144,7 +263,7 @@ static int wm_handler_operator_call(bContext *C, wmEventHandler *handler, wmEven retval= op.type->exec(C, &op); if( ot->flag & OPTYPE_REGISTER) - WM_operator_register(C->wm, &op); + wm_operator_register(C->wm, &op); } } } @@ -190,10 +309,7 @@ static int wm_event_inside_i(wmEvent *event, rcti *rect) { return BLI_in_rcti(rect, event->x, event->y); } -//static int wm_event_inside_f(wmEvent *event, rctf *rect) -//{ -// return BLI_in_rctf(rect, (float)event->x, (float)event->y); -//} + /* called in main loop */ /* goes over entire hierarchy: events -> window -> screen -> area -> region */ @@ -204,21 +320,20 @@ void wm_event_do_handlers(bContext *C) for(win= C->wm->windows.first; win; win= win->next) { wmEvent *event; - /* MVC demands to not draw in event handlers... for now we leave it */ - /* it also updates context (win, screen) */ - wm_window_make_drawable(C, win); - - if( C->screen==NULL ) - wm_event_free_all(C->window); + if( win->screen==NULL ) + wm_event_free_all(win); - while( (event=wm_event_next(C->window)) ) { - int action= wm_handlers_do(C, event, &C->window->handlers); + while( (event=wm_event_next(win)) ) { + int action; - if(action==WM_HANDLER_CONTINUE) - action= wm_handlers_do(C, event, &C->screen->handlers); + /* MVC demands to not draw in event handlers... for now we leave it */ + /* it also updates context (win, screen) */ + wm_window_make_drawable(C, win); + + action= wm_handlers_do(C, event, &win->handlers); if(action==WM_HANDLER_CONTINUE) { - ScrArea *sa= C->screen->areabase.first; + ScrArea *sa= win->screen->areabase.first; for(; sa; sa= sa->next) { if(wm_event_inside_i(event, &sa->winrct)) { @@ -395,7 +510,7 @@ void wm_event_add_ghostevent(wmWindow *win, int type, void *customdata) if(win->active) { GHOST_TEventCursorData *cd= customdata; int cx, cy; - + GHOST_ScreenToClient(win->ghostwin, cd->x, cd->y, &cx, &cy); event.type= MOUSEMOVE; diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c index 2afc63a7363..ffc535c1d46 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.c +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -74,6 +74,8 @@ #include "wm_files.h" #include "wm_window.h" +#include "ED_screen.h" + static void initbuttons(void) { // uiDefFont(UI_HELVB, @@ -116,6 +118,8 @@ void WM_init(bContext *C) set_free_windowmanager_cb(wm_close_and_free); /* library.c */ + ED_spacetypes_init(); /* editors/area/spacetype.c */ + /* get the default database, plus a wm */ WM_read_homefile(C, 0); diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index a744d949e81..49989000c6f 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -59,6 +59,12 @@ wmOperatorType *WM_operatortype_find(const char *idname) return NULL; } +/* all ops in 1 list (for time being... needs evaluation later) */ +void WM_operatortypelist_append(ListBase *lb) +{ + addlisttolist(&global_ops, lb); +} + /* ************ default ops, exported *********** */ int WM_operator_confirm(bContext *C, wmOperator *op, wmEvent *event) @@ -109,7 +115,6 @@ static void WM_OT_window_fullscreen_toggle(wmOperatorType *ot) } - #define ADD_OPTYPE(opfunc) ot= MEM_callocN(sizeof(wmOperatorType), "operatortype"); \ opfunc(ot); \ BLI_addtail(&global_ops, ot) @@ -132,3 +137,6 @@ void wm_operatortype_init(void) } + + + diff --git a/source/blender/windowmanager/intern/wm_subwindow.c b/source/blender/windowmanager/intern/wm_subwindow.c index 2f4e90a2e71..23fbba7a054 100644 --- a/source/blender/windowmanager/intern/wm_subwindow.c +++ b/source/blender/windowmanager/intern/wm_subwindow.c @@ -135,7 +135,7 @@ void wm_subwindow_set(wmWindow *win, int swinid) win->curswin= swin; wm_subwindow_getsize(win, &width, &height); - + glViewport(swin->winrct.xmin, swin->winrct.ymin, width, height); glScissor(swin->winrct.xmin, swin->winrct.ymin, width, height); @@ -161,20 +161,22 @@ int wm_subwindow_open(wmWindow *win, rcti *winrct) freewinid= swin->swinid+1; win->curswin= swin= MEM_callocN(sizeof(wmSubWindow), "swinopen"); - + BLI_addtail(&win->subwindows, swin); + + printf("swin %d added\n", freewinid); swin->swinid= freewinid; swin->winrct= *winrct; Mat4One(swin->viewmat); Mat4One(swin->winmat); + /* and we appy it all right away */ + wm_subwindow_set(win, swin->swinid); + /* extra service */ wm_subwindow_getsize(win, &width, &height); wmOrtho2(win, -0.375, (float)width-0.375, -0.375, (float)height-0.375); wmLoadIdentity(win); - - /* and we appy it all right away */ - wm_subwindow_set(win, swin->swinid); return swin->swinid; } @@ -203,6 +205,8 @@ void wm_subwindow_position(wmWindow *win, int swinid, rcti *winrct) wmSubWindow *swin= swin_from_swinid(win, swinid); if(swin) { + int width, height; + swin->winrct= *winrct; /* CRITICAL, this clamping ensures that @@ -222,6 +226,11 @@ void wm_subwindow_position(wmWindow *win, int swinid, rcti *winrct) swin->winrct.xmax= win->sizex-1; if (swin->winrct.ymax >= win->sizey) swin->winrct.ymax= win->sizey-1; + + /* extra service */ + wm_subwindow_set(win, swinid); + wm_subwindow_getsize(win, &width, &height); + wmOrtho2(win, -0.375, (float)width-0.375, -0.375, (float)height-0.375); } else { printf("wm_subwindow_position: Internal error, bad winid: %d\n", swinid); @@ -231,10 +240,6 @@ void wm_subwindow_position(wmWindow *win, int swinid, rcti *winrct) /* ---------------- WM versions of OpenGL calls, using glBlah() syntax ------------------------ */ /* ----------------- exported in WM_api.h ------------------------------------------------------ */ -int glaGetOneInteger(int a) -{ - return 0; // XXX -} void wmLoadMatrix(wmWindow *win, float mat[][4]) { @@ -473,8 +478,8 @@ void myswapbuffers(void) /* XXX */ sa= G.curscreen->areabase.first; while(sa) { - if(sa->win_swap==WIN_BACK_OK) sa->win_swap= WIN_FRONT_OK; - if(sa->head_swap==WIN_BACK_OK) sa->head_swap= WIN_FRONT_OK; +// if(sa->win_swap==WIN_BACK_OK) sa->win_swap= WIN_FRONT_OK; +// if(sa->head_swap==WIN_BACK_OK) sa->head_swap= WIN_FRONT_OK; sa= sa->next; } diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index cab852e1763..a802efffb96 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -46,11 +46,14 @@ #include "BIF_gl.h" #include "WM_api.h" +#include "WM_types.h" #include "wm.h" #include "wm_window.h" #include "wm_subwindow.h" #include "wm_event_system.h" +#include "ED_screen.h" + /* the global to talk to ghost */ GHOST_SystemHandle g_system= NULL; @@ -140,13 +143,17 @@ wmWindow *wm_window_new(bContext *C, bScreen *screen) /* part of wm_window.c api */ wmWindow *wm_window_copy(bContext *C, wmWindow *winorig) { - wmWindow *win= wm_window_new(C, winorig->screen); /* XXX need copy */ + wmWindow *win= wm_window_new(C, winorig->screen); win->posx= winorig->posx+10; win->posy= winorig->posy; win->sizex= winorig->sizex; win->sizey= winorig->sizey; + win->screen= ED_screen_duplicate(win, win->screen); + win->screen->do_refresh= 1; + win->screen->do_draw= 1; + return win; } @@ -182,7 +189,7 @@ static void wm_window_close(bContext *C, wmWindow *win) if(C->wm->windows.first==NULL) WM_exit(C); } - + static void wm_window_open(wmWindowManager *wm, char *title, wmWindow *win) { GHOST_WindowHandle ghostwin; @@ -217,16 +224,18 @@ static void wm_window_open(wmWindowManager *wm, char *title, wmWindow *win) if(win->eventstate==NULL) win->eventstate= MEM_callocN(sizeof(wmEvent), "window event state"); - /* add keymap handler (1 for all keys in map!) */ + /* 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); /* until screens get drawn, make it nice grey */ glClearColor(.55, .55, .55, 0.0); glClear(GL_COLOR_BUFFER_BIT); wm_window_swap_buffers(win); + + /* standard state vars for window */ + glEnable(GL_SCISSOR_TEST); } - - } /* for wmWindows without ghostwin, open these and clear */ @@ -300,13 +309,13 @@ void wm_window_make_drawable(bContext *C, wmWindow *win) C->wm->windrawable= win; C->window= win; C->screen= win->screen; - + printf("set drawable %d\n", win->winid); GHOST_ActivateWindowDrawingContext(win->ghostwin); } } /* called by ghost, here we handle events for windows themselves or send to event system */ -int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private) +static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private) { bContext *C= private; GHOST_TEventType type= GHOST_GetEventType(evt); @@ -346,7 +355,7 @@ int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private) win->active= 1; // window_handle(win, INPUTCHANGE, win->active); - /* bad ghost support for modifier keys... */ + /* bad ghost support for modifier keys... so on activate we set the modifiers again */ kdata.ascii= 0; if (win->eventstate->shift && !query_qual('s')) { kdata.key= GHOST_kKeyLeftShift; @@ -372,6 +381,7 @@ int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private) win->eventstate->x= cx; win->eventstate->y= (win->sizey-1) - cy; + wm_window_make_drawable(C, win); break; } case GHOST_kEventWindowClose: { @@ -379,14 +389,17 @@ int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private) break; } case GHOST_kEventWindowUpdate: { -// window_handle(win, REDRAW, 1); + printf("ghost redraw\n"); + + wm_window_make_drawable(C, win); + WM_event_add_notifier(C->wm, win, 0, WM_NOTE_REDRAW, 0); + break; } case GHOST_kEventWindowSize: case GHOST_kEventWindowMove: { GHOST_RectangleHandle client_rect; int l, t, r, b, scr_w, scr_h; - GHOST_TWindowState state; client_rect= GHOST_GetClientBounds(win->ghostwin); GHOST_GetRectangle(client_rect, &l, &t, &r, &b); @@ -399,24 +412,34 @@ int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private) win->posx= l; win->posy= scr_h - t - win->sizey; - if(type!=GHOST_kEventWindowSize) - printf("win move event pos %d %d size %d %d\n", win->posx, win->posy, win->sizex, win->sizey); - - state = GHOST_GetWindowState(win->ghostwin); - - if(state==GHOST_kWindowStateNormal) - printf("window state: normal\n"); - else if(state==GHOST_kWindowStateMinimized) - printf("window state: minimized\n"); - else if(state==GHOST_kWindowStateMaximized) - printf("window state: maximized\n"); - else if(state==GHOST_kWindowStateFullScreen) - printf("window state: fullscreen\n"); + /* debug prints */ + if(0) { + GHOST_TWindowState state; + state = GHOST_GetWindowState(win->ghostwin); + + if(state==GHOST_kWindowStateNormal) + printf("window state: normal\n"); + else if(state==GHOST_kWindowStateMinimized) + printf("window state: minimized\n"); + else if(state==GHOST_kWindowStateMaximized) + printf("window state: maximized\n"); + else if(state==GHOST_kWindowStateFullScreen) + printf("window state: fullscreen\n"); + + if(type!=GHOST_kEventWindowSize) + printf("win move event pos %d %d size %d %d\n", win->posx, win->posy, win->sizex, win->sizey); + + } + + wm_window_make_drawable(C, win); + WM_event_add_notifier(C->wm, win, 0, WM_NOTE_REFRESH, 0); + WM_event_add_notifier(C->wm, win, 0, WM_NOTE_REDRAW, 0); -// window_handle(win, RESHAPE, 1); break; } default: + if(type==GHOST_kEventKeyDown) + WM_event_add_notifier(C->wm, win, 0, WM_NOTE_REDRAW, 0); wm_event_add_ghostevent(win, type, data); break; } diff --git a/source/blender/windowmanager/wm.h b/source/blender/windowmanager/wm.h index 0450adc1268..8269dd48533 100644 --- a/source/blender/windowmanager/wm.h +++ b/source/blender/windowmanager/wm.h @@ -33,6 +33,9 @@ extern void wm_close_and_free_all(bContext *C, ListBase *); extern void wm_add_default(bContext *C); extern void wm_check(bContext *C); + + /* register to windowmanager for redo or macro */ +void wm_operator_register(wmWindowManager *wm, wmOperator *ot); /* wm_operator.c, for init/exit */ void wm_operatortype_free(void); diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h index 9b918ce3cf6..54cf45db61d 100644 --- a/source/blender/windowmanager/wm_event_system.h +++ b/source/blender/windowmanager/wm_event_system.h @@ -33,31 +33,6 @@ #define WM_HANDLER_BREAK 1 -/* each event should have full modifier state */ -/* event comes from eventmanager and from keymap */ -typedef struct wmEvent { - struct wmEvent *next, *prev; - - short type; /* event code itself (short, is also in keymap) */ - short val; /* press, release, scrollvalue */ - short x, y; /* mouse pointer position */ - short unicode; /* future, ghost? */ - char ascii; /* from ghost */ - char pad1; - - /* modifier states */ - short shift, ctrl, alt, oskey; /* oskey is apple or windowskey, value denotes order of pressed */ - short keymodifier; /* rawkey modifier */ - - /* keymap item, set by handler (weak?) */ - const char *keymap_idname; - - /* custom data */ - short custom; /* custom data type, stylus, 6dof, see wm_event_types.h */ - void *customdata; /* ascii, unicode, mouse coords, angles, vectors, dragdrop info */ - -} wmEvent; - /* wmKeyMap is in DNA_windowmanager.h, it's savable */ typedef struct wmEventHandler { @@ -73,10 +48,13 @@ typedef struct wmEventHandler { } wmEventHandler; + /* handler flag */ /* after this handler all others are ignored */ #define WM_HANDLER_BLOCKING 1 + + /* custom types for handlers, for signalling, freeing */ enum { WM_HANDLER_DEFAULT, @@ -84,14 +62,17 @@ enum { }; -void wm_event_free_all (wmWindow *win); -wmEvent *wm_event_next (wmWindow *win); -void wm_event_free_handlers (ListBase *lb); +void wm_event_free_all (wmWindow *win); +wmEvent *wm_event_next (wmWindow *win); +void wm_event_free_handlers (ListBase *lb); /* goes over entire hierarchy: events -> window -> screen -> area -> region */ -void wm_event_do_handlers(bContext *C); +void wm_event_do_handlers (bContext *C); + +void wm_event_add_ghostevent(wmWindow *win, int type, void *customdata); -void wm_event_add_ghostevent(wmWindow *win, int type, void *customdata); +void wm_event_do_notifiers (bContext *C); +void wm_draw_update (bContext *C); #endif /* WM_EVENT_SYSTEM_H */ diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h index ccd1c645297..c6c9046d79e 100644 --- a/source/blender/windowmanager/wm_event_types.h +++ b/source/blender/windowmanager/wm_event_types.h @@ -20,8 +20,6 @@ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. * All rights reserved. * - * The Original Code is: all of this file. - * * Contributor(s): Blender Foundation * * ***** END GPL LICENSE BLOCK ***** |