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:
authorTon Roosendaal <ton@blender.org>2009-07-26 16:52:39 +0400
committerTon Roosendaal <ton@blender.org>2009-07-26 16:52:39 +0400
commit9ac754eca5466d62abed6d207d1efdbbb7d77b18 (patch)
tree3b0d63d120c6b24de6f5c161774cc9a3d874ab08 /source/blender/windowmanager
parent7084447c73bd5b2b5fb9aa12a4e3b2e983723c2f (diff)
2.5
First step towards keymap editor! Before getting too excited: - doesn't save yet - no rna properties can be defined - no insert/remove keymap options yet - no option yet to set 'key press/release' But what does work; - Keymap list is in outliner, new category (Keymaps are listed in order as being created now) - enable/disable a keymap entry: click on dot icon - it displays python api names for ops - browse new operator for keymap (menu button) - set keymap to use other keys, mouse or tweak events - four modifier key options I first intent to test it all well, there are still quite some modal map conflicts (like border select) and there's problems assigning items to tweaks Another issue is that a visual editor for keymaps might be quite hard to use... the amount of data and options is just not so fun for a buttons menu. There are ways to improve this though. Maybe do this via a script?
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r--source/blender/windowmanager/WM_api.h1
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c2
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c10
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c20
4 files changed, 27 insertions, 6 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 0a68d2c9053..ca60c6e7637 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -96,6 +96,7 @@ wmKeyMap *WM_modalkeymap_get(struct wmWindowManager *wm, const char *nameid);
void WM_modalkeymap_add_item(wmKeyMap *km, short type, short val, int modifier, short keymodifier, short value);
void WM_modalkeymap_assign(wmKeyMap *km, const char *opname);
+int WM_key_event_is_tweak(short type);
const char *WM_key_event_string(short type);
char *WM_key_event_operator_string(const struct bContext *C, const char *opname, int opcontext, struct IDProperty *properties, char *str, int len);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 78c7f7a7383..2a1fc009baa 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -626,6 +626,8 @@ static int wm_eventmatch(wmEvent *winevent, wmKeymapItem *kmi)
{
int kmitype= wm_userdef_event_map(kmi->type);
+ if(kmi->inactive) return 0;
+
/* the matching rules */
if(kmitype==KM_TEXTINPUT)
if(ISKEYBOARD(winevent->type)) return 1;
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index 764b209d755..1d959665f40 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -290,3 +290,13 @@ char *WM_key_event_operator_string(const bContext *C, const char *opname, int op
return NULL;
}
+/* ********************* */
+
+int WM_key_event_is_tweak(short type)
+{
+ if(type>=EVT_TWEAK_L && type<=EVT_GESTURE)
+ return 1;
+ return 0;
+}
+
+
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 5c484dfa322..6c90926d545 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -906,7 +906,7 @@ void WM_paint_cursor_end(wmWindowManager *wm, void *handle)
It stores 4 values (xmin, xmax, ymin, ymax) and event it ended with (event_type)
*/
-static int border_apply(bContext *C, wmOperator *op, int event_type)
+static int border_apply(bContext *C, wmOperator *op, int event_type, int event_orig)
{
wmGesture *gesture= op->customdata;
rcti *rect= gesture->customdata;
@@ -924,9 +924,14 @@ static int border_apply(bContext *C, wmOperator *op, int event_type)
RNA_int_set(op->ptr, "ymin", rect->ymin);
RNA_int_set(op->ptr, "xmax", rect->xmax);
RNA_int_set(op->ptr, "ymax", rect->ymax);
- if( RNA_struct_find_property(op->ptr, "event_type") )
- RNA_int_set(op->ptr, "event_type", event_type);
+ /* XXX weak; border should be configured for this without reading event types */
+ if( RNA_struct_find_property(op->ptr, "event_type") ) {
+ if(ELEM4(event_orig, EVT_TWEAK_L, EVT_TWEAK_R, EVT_TWEAK_A, EVT_TWEAK_S))
+ event_type= LEFTMOUSE;
+
+ RNA_int_set(op->ptr, "event_type", event_type);
+ }
op->type->exec(C, op);
return 1;
@@ -947,7 +952,10 @@ static void wm_gesture_end(bContext *C, wmOperator *op)
int WM_border_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- op->customdata= WM_gesture_new(C, event, WM_GESTURE_CROSS_RECT);
+ if(WM_key_event_is_tweak(event->type))
+ op->customdata= WM_gesture_new(C, event, WM_GESTURE_RECT);
+ else
+ op->customdata= WM_gesture_new(C, event, WM_GESTURE_CROSS_RECT);
/* add modal handler */
WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
@@ -984,14 +992,14 @@ int WM_border_select_modal(bContext *C, wmOperator *op, wmEvent *event)
case LEFTMOUSE:
case MIDDLEMOUSE:
case RIGHTMOUSE:
- if(event->val==1) {
+ if(event->val==KM_PRESS) {
if(gesture->type==WM_GESTURE_CROSS_RECT && gesture->mode==0) {
gesture->mode= 1;
wm_gesture_tag_redraw(C);
}
}
else {
- if(border_apply(C, op, event->type)) {
+ if(border_apply(C, op, event->type, gesture->event_type)) {
wm_gesture_end(C, op);
return OPERATOR_FINISHED;
}