diff options
author | Ton Roosendaal <ton@blender.org> | 2008-01-10 20:38:17 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2008-01-10 20:38:17 +0300 |
commit | 43cf3af8c07a534f06b14a003eef2fc65c3c937b (patch) | |
tree | 9a93be5e2e3b4abb969ce751f0b8aa7d4948d7f8 /source/blender/windowmanager | |
parent | b81b6be18458462939aefbb260ca6a68020131d4 (diff) |
Blender 2.5 project: added first more complex handler + operator
- on mouse-over edge, you can drag area borders around.
- note it's a handerized system now, so it updates UI while you
move mouse.
Feedback needed:
- read bottom part of the screen_edit.c file. It's the proposed
method for adding tools and handlers. I think it's close, but
might need some tweaks.
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r-- | source/blender/windowmanager/WM_api.h | 8 | ||||
-rw-r--r-- | source/blender/windowmanager/WM_types.h | 5 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/screen_edit.c | 0 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 67 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_files.c | 4 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_keymap.c | 11 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_operators.c | 6 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_window.c | 11 |
8 files changed, 81 insertions, 31 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 6f94bfac456..915c55f4cf7 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -61,10 +61,14 @@ void WM_keymap_set_item (ListBase *lb, char *idname, short type, short val, int modifier, short keymodifier); 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); -struct wmEventHandler *WM_event_add_modal_keymap_handler(ListBase *keymap, ListBase *handlers, wmOperator *op); +struct wmEventHandler *WM_event_add_modal_handler(ListBase *handlers, wmOperator *op); +void WM_event_remove_modal_handler(ListBase *handlers, wmOperator *op); -void WM_event_add_notifier(wmWindowManager *wm, wmWindow *window, int swinid, int type, int value); +void WM_event_add_notifier(wmWindowManager *wm, wmWindow *window, int swinid, int type, + int value); /* operator api, default callbacks */ diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 9c670aff71e..c232815fd49 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -99,8 +99,9 @@ typedef struct wmNotifier { enum { - WM_NOTE_REDRAW, - WM_NOTE_REFRESH, + WM_NOTE_WINDOW_REDRAW, + WM_NOTE_SCREEN_CHANGED, + WM_NOTE_OBJECT_CHANGED, WM_NOTE_LAST }; diff --git a/source/blender/windowmanager/intern/screen_edit.c b/source/blender/windowmanager/intern/screen_edit.c deleted file mode 100644 index e69de29bb2d..00000000000 --- a/source/blender/windowmanager/intern/screen_edit.c +++ /dev/null diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 37efc1a1367..ebf94bfc5c3 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -205,14 +205,20 @@ void wm_draw_update(bContext *C) /* ********************* handlers *************** */ +/* not handler itself */ +static void wm_event_free_handler(wmEventHandler *handler) +{ + if(handler->op) + MEM_freeN(handler->op); +} + void wm_event_free_handlers(ListBase *lb) { wmEventHandler *handler; - for(handler= lb->first; handler; handler= handler->next) { - if(handler->op) - MEM_freeN(handler->op); - } + for(handler= lb->first; handler; handler= handler->next) + wm_event_free_handler(handler); + BLI_freelistN(lb); } @@ -227,7 +233,8 @@ static int wm_eventmatch(wmEvent *winevent, wmKeymapItem *km) if(winevent->ctrl!=km->ctrl) return 0; if(winevent->alt!=km->alt) return 0; if(winevent->oskey!=km->oskey) return 0; - if(winevent->keymodifier!=km->keymodifier) return 0; + if(km->keymodifier) + if(winevent->keymodifier!=km->keymodifier) return 0; /* optional boundbox */ @@ -240,25 +247,23 @@ static int wm_handler_operator_call(bContext *C, wmEventHandler *handler, wmEven /* derived, modal or blocking operator */ if(handler->op) { - if( handler->op->type->poll(C)) { - if(handler->op->type->interactive) - retval= handler->op->type->interactive(C, handler->op, event); - else - printf("wm_handler_operator_call error\n"); - } + if(handler->op->type->modal) + retval= handler->op->type->modal(C, handler->op, event); + else + printf("wm_handler_operator_call error\n"); } else { wmOperatorType *ot= WM_operatortype_find(event->keymap_idname); if(ot) { - if(ot->poll(C)) { + if(ot->poll==NULL || ot->poll(C)) { /* operator on stack, register or new modal handle malloc-copies */ wmOperator op; memset(&op, 0, sizeof(wmOperator)); op.type= ot; - if(op.type->interactive) - retval= op.type->interactive(C, &op, event); + if(op.type->invoke) + retval= (*op.type->invoke)(C, &op, event); else if(&op.type->exec) retval= op.type->exec(C, &op); @@ -298,6 +303,11 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers) if(action==WM_HANDLER_BREAK) break; } + else { + /* modal, swallows all */ + action= wm_handler_operator_call(C, handler, event); + } + /* modal+blocking handler */ if(handler->flag & WM_HANDLER_BLOCKING) action= WM_HANDLER_BREAK; @@ -336,7 +346,7 @@ void wm_event_do_handlers(bContext *C) ScrArea *sa= win->screen->areabase.first; for(; sa; sa= sa->next) { - if(wm_event_inside_i(event, &sa->winrct)) { + if(wm_event_inside_i(event, &sa->totrct)) { C->curarea= sa; action= wm_handlers_do(C, event, &sa->handlers); @@ -368,7 +378,7 @@ void WM_event_set_handler_flag(wmEventHandler *handler, int flag) handler->flag= flag; } -wmEventHandler *WM_event_add_modal_keymap_handler(ListBase *keymap, ListBase *handlers, wmOperator *op) +wmEventHandler *WM_event_add_modal_handler(ListBase *handlers, wmOperator *op) { /* debug test; operator not in registry */ if(op->type->flag & OPTYPE_REGISTER) { @@ -378,8 +388,7 @@ wmEventHandler *WM_event_add_modal_keymap_handler(ListBase *keymap, ListBase *ha wmEventHandler *handler= MEM_callocN(sizeof(wmEventHandler), "event handler"); wmOperator *opc= MEM_mallocN(sizeof(wmOperator), "operator modal"); - BLI_addtail(handlers, handler); - handler->keymap= keymap; + BLI_addhead(handlers, handler); *opc= *op; handler->op= opc; @@ -388,6 +397,20 @@ wmEventHandler *WM_event_add_modal_keymap_handler(ListBase *keymap, ListBase *ha return NULL; } +void WM_event_remove_modal_handler(ListBase *handlers, wmOperator *op) +{ + wmEventHandler *handler; + + for(handler= handlers->first; handler; handler= handler->next) { + if(handler->op==op) { + BLI_remlink(handlers, handler); + wm_event_free_handler(handler); + MEM_freeN(handler); + break; + } + } +} + wmEventHandler *WM_event_add_keymap_handler(ListBase *keymap, ListBase *handlers) { wmEventHandler *handler= MEM_callocN(sizeof(wmEventHandler), "event handler"); @@ -398,6 +421,7 @@ wmEventHandler *WM_event_add_keymap_handler(ListBase *keymap, ListBase *handlers return handler; } + /* ********************* ghost stuff *************** */ static int convert_key(GHOST_TKey key) @@ -517,6 +541,8 @@ void wm_event_add_ghostevent(wmWindow *win, int type, void *customdata) event.x= evt->x= cx; event.y= evt->y= (win->sizey-1) - cy; + ED_screen_set_subwinactive(win); /* state variables in screen */ + update_tablet_data(win, &event); wm_event_add(win, &event); } @@ -535,6 +561,11 @@ void wm_event_add_ghostevent(wmWindow *win, int type, void *customdata) else event.type= MIDDLEMOUSE; + if(event.val) + event.keymodifier= evt->keymodifier= event.type; + else + event.keymodifier= evt->keymodifier= 0; + update_tablet_data(win, &event); wm_event_add(win, &event); diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index da81c0edff2..8dbe235d256 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -557,7 +557,9 @@ int WM_read_homefile(bContext *C, int from_memory) if (!from_memory && BLI_exists(tstr)) { success = BKE_read_file(C, tstr, NULL); } else { - //XXX success = BKE_read_file_from_memory(C, datatoc_B_blend, datatoc_B_blend_size, NULL); + extern int datatoc_B_blend_size; + extern char datatoc_B_blend[]; + success = BKE_read_file_from_memory(C, datatoc_B_blend, datatoc_B_blend_size, NULL); /* outliner patch for 2.42 .b.blend */ outliner_242_patch(); } diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c index da340e35d79..7a5ec0e4d47 100644 --- a/source/blender/windowmanager/intern/wm_keymap.c +++ b/source/blender/windowmanager/intern/wm_keymap.c @@ -108,5 +108,16 @@ void WM_keymap_set_item(ListBase *lb, char *idname, short type, short val, int m keymap_set(km, type, val, modifier, keymodifier); } +/* always add item */ +void WM_keymap_add_item(ListBase *lb, char *idname, short type, short val, int modifier, short keymodifier) +{ + wmKeymapItem *km= MEM_callocN(sizeof(wmKeymapItem), "keymap entry"); + + BLI_addtail(lb, km); + BLI_strncpy(km->idname, idname, OP_MAX_TYPENAME); + + keymap_set(km, type, val, modifier, keymodifier); +} + diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 49989000c6f..27f8b48451a 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -87,7 +87,7 @@ static void WM_OT_window_duplicate(wmOperatorType *ot) ot->name= "Duplicate Window"; ot->idname= "WM_OT_window_duplicate"; - ot->interactive= NULL; //WM_operator_confirm; + ot->invoke= NULL; //WM_operator_confirm; ot->exec= wm_window_duplicate_op; ot->poll= WM_operator_winactive; } @@ -97,7 +97,7 @@ static void WM_OT_save_homefile(wmOperatorType *ot) ot->name= "Save User Settings"; ot->idname= "WM_OT_save_homefile"; - ot->interactive= NULL; //WM_operator_confirm; + ot->invoke= NULL; //WM_operator_confirm; ot->exec= WM_write_homefile; ot->poll= WM_operator_winactive; @@ -109,7 +109,7 @@ static void WM_OT_window_fullscreen_toggle(wmOperatorType *ot) ot->name= "Toggle Fullscreen"; ot->idname= "WM_OT_window_fullscreen_toggle"; - ot->interactive= NULL; + ot->invoke= NULL; ot->exec= wm_window_fullscreen_toggle_op; ot->poll= WM_operator_winactive; } diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index a802efffb96..21c456fd51c 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -381,6 +381,8 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private) win->eventstate->x= cx; win->eventstate->y= (win->sizey-1) - cy; + ED_screen_set_subwinactive(win); /* active subwindow in screen */ + wm_window_make_drawable(C, win); break; } @@ -392,7 +394,7 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private) printf("ghost redraw\n"); wm_window_make_drawable(C, win); - WM_event_add_notifier(C->wm, win, 0, WM_NOTE_REDRAW, 0); + WM_event_add_notifier(C->wm, win, 0, WM_NOTE_WINDOW_REDRAW, 0); break; } @@ -432,14 +434,13 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private) } 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); + WM_event_add_notifier(C->wm, win, 0, WM_NOTE_SCREEN_CHANGED, 0); break; } default: - if(type==GHOST_kEventKeyDown) - WM_event_add_notifier(C->wm, win, 0, WM_NOTE_REDRAW, 0); + if(type==GHOST_kEventKeyDown) // XXX debug + WM_event_add_notifier(C->wm, win, 0, WM_NOTE_WINDOW_REDRAW, 0); wm_event_add_ghostevent(win, type, data); break; } |