diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2008-12-15 22:19:39 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2008-12-15 22:19:39 +0300 |
commit | 6283b0c8c5a93baafa040c612ed356472b633582 (patch) | |
tree | 8b38ef8fbc1a0fef93418f249cd0860e5fe3f3a3 /source/blender/windowmanager | |
parent | aad5e497013dc37acc1913fbbeec4bc0d16ccbc6 (diff) |
UI: getting popup menus to work again, just the internal interface
and event handling code still, how it integrates with operators and
handlers is not worked out yet. For testing, Ctrl+Q quit now shows
a confirmation popup using the following call:
okee_operator(C, "WM_OT_exit_blender", "Quit Blender");
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 | 4 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 11 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_operators.c | 21 | ||||
-rw-r--r-- | source/blender/windowmanager/wm_event_system.h | 1 |
5 files changed, 34 insertions, 10 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index b0fdcee2c04..a2544e3e6e5 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -79,8 +79,11 @@ struct wmEventHandler *WM_event_add_keymap_handler_bb(ListBase *handlers, ListBa void WM_event_remove_keymap_handler(ListBase *handlers, ListBase *keymap); struct wmEventHandler *WM_event_add_ui_handler(bContext *C, ListBase *handlers, - int (*func)(bContext *C, struct wmEvent *event), void (*remove)(bContext *C)); -void WM_event_remove_ui_handler(ListBase *handlers); + int (*func)(bContext *C, struct wmEvent *event, void *userdata), + void (*remove)(bContext *C, void *userdata), void *userdata); +void WM_event_remove_ui_handler(ListBase *handlers, + int (*func)(bContext *C, struct wmEvent *event, void *userdata), + void (*remove)(bContext *C, void *userdata), void *userdata); struct wmEventHandler *WM_event_add_modal_handler(bContext *C, ListBase *handlers, wmOperator *op); void WM_event_remove_handlers(bContext *C, ListBase *handlers); diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index b301976aeae..7307cb4bf23 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -91,8 +91,8 @@ typedef struct wmEvent { #define WM_UI_HANDLER_CONTINUE 0 #define WM_UI_HANDLER_BREAK 1 -typedef int (*wmUIHandlerFunc)(bContext *C, struct wmEvent *event); -typedef void (*wmUIHandlerRemoveFunc)(bContext *C); +typedef int (*wmUIHandlerFunc)(bContext *C, struct wmEvent *event, void *userdata); +typedef void (*wmUIHandlerRemoveFunc)(bContext *C, void *userdata); /* ************** Notifiers ****************** */ diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index aeb3899409f..a5cbc835168 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -393,7 +393,7 @@ void WM_event_remove_handlers(bContext *C, ListBase *handlers) if(handler->ui_area) C->area= handler->ui_area; if(handler->ui_region) C->region= handler->ui_region; - handler->ui_remove(C); + handler->ui_remove(C, handler->ui_userdata); C->area= area; C->region= region; @@ -494,7 +494,7 @@ static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, wmEvent *eve if(handler->ui_area) C->area= handler->ui_area; if(handler->ui_region) C->region= handler->ui_region; - retval= handler->ui_handle(C, event); + retval= handler->ui_handle(C, event, handler->ui_userdata); /* putting back screen context */ C->area= area; @@ -748,11 +748,12 @@ void WM_event_remove_keymap_handler(ListBase *handlers, ListBase *keymap) } } -wmEventHandler *WM_event_add_ui_handler(bContext *C, ListBase *handlers, wmUIHandlerFunc func, wmUIHandlerRemoveFunc remove) +wmEventHandler *WM_event_add_ui_handler(bContext *C, ListBase *handlers, wmUIHandlerFunc func, wmUIHandlerRemoveFunc remove, void *userdata) { wmEventHandler *handler= MEM_callocN(sizeof(wmEventHandler), "event ui handler"); handler->ui_handle= func; handler->ui_remove= remove; + handler->ui_userdata= userdata; handler->ui_area= (C)? C->area: NULL; handler->ui_region= (C)? C->region: NULL; @@ -761,12 +762,12 @@ wmEventHandler *WM_event_add_ui_handler(bContext *C, ListBase *handlers, wmUIHan return handler; } -void WM_event_remove_ui_handler(ListBase *handlers) +void WM_event_remove_ui_handler(ListBase *handlers, wmUIHandlerFunc func, wmUIHandlerRemoveFunc remove, void *userdata) { wmEventHandler *handler; for(handler= handlers->first; handler; handler= handler->next) { - if(handler->ui_handle) { + if(handler->ui_handle == func && handler->ui_remove == remove && handler->ui_userdata == userdata) { BLI_remlink(handlers, handler); wm_event_free_handler(handler); MEM_freeN(handler); diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 5dd36d737b1..5ed29a28abd 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -46,6 +46,8 @@ #include "RNA_access.h" #include "RNA_define.h" +#include "UI_interface.h" + #include "WM_api.h" #include "WM_types.h" @@ -141,6 +143,22 @@ static void WM_OT_exit_blender(wmOperatorType *ot) ot->poll= WM_operator_winactive; } +static int exit_okee_blender_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + okee_operator(C, "WM_OT_exit_blender", "Quit Blender"); + + return OPERATOR_FINISHED; +} + +static void WM_OT_exit_okee_blender(wmOperatorType *ot) +{ + ot->name= "Exit Blender"; + ot->idname= "WM_OT_exit_okee_blender"; + + ot->invoke= exit_okee_blender_invoke; + ot->poll= WM_operator_winactive; +} + /* ************ window gesture operator-callback definitions ************** */ /* * These are default callbacks for use in operators requiring gesture input @@ -346,6 +364,7 @@ void wm_operatortype_init(void) WM_operatortype_append(WM_OT_save_homefile); WM_operatortype_append(WM_OT_window_fullscreen_toggle); WM_operatortype_append(WM_OT_exit_blender); + WM_operatortype_append(WM_OT_exit_okee_blender); WM_operatortype_append(WM_OT_tweak_gesture); } @@ -358,6 +377,6 @@ void wm_window_keymap(wmWindowManager *wm) WM_keymap_verify_item(keymap, "WM_OT_window_duplicate", AKEY, KM_PRESS, KM_CTRL|KM_ALT, 0); WM_keymap_verify_item(keymap, "WM_OT_save_homefile", UKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_verify_item(keymap, "WM_OT_window_fullscreen_toggle", FKEY, KM_PRESS, 0, 0); - WM_keymap_verify_item(keymap, "WM_OT_exit_blender", QKEY, KM_PRESS, KM_CTRL, 0); + WM_keymap_verify_item(keymap, "WM_OT_exit_okee_blender", QKEY, KM_PRESS, KM_CTRL, 0); } diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h index d4dddf8e222..26c0b23df30 100644 --- a/source/blender/windowmanager/wm_event_system.h +++ b/source/blender/windowmanager/wm_event_system.h @@ -55,6 +55,7 @@ typedef struct wmEventHandler { /* ui handler */ wmUIHandlerFunc ui_handle; /* callback receiving events */ wmUIHandlerRemoveFunc ui_remove; /* callback when handler is removed */ + void *ui_userdata; /* user data pointer */ struct ScrArea *ui_area; /* for derived/modal handlers */ struct ARegion *ui_region; /* for derived/modal handlers */ |