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-12-15 22:19:39 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2008-12-15 22:19:39 +0300
commit6283b0c8c5a93baafa040c612ed356472b633582 (patch)
tree8b38ef8fbc1a0fef93418f249cd0860e5fe3f3a3 /source/blender/windowmanager
parentaad5e497013dc37acc1913fbbeec4bc0d16ccbc6 (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.h7
-rw-r--r--source/blender/windowmanager/WM_types.h4
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c11
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c21
-rw-r--r--source/blender/windowmanager/wm_event_system.h1
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 */