[Bf-blender-cvs] [459fe93] temp_manipulators_core: Hook up manipulator core with window-manager
Julian Eisel
noreply at git.blender.org
Sun Sep 11 20:06:02 CEST 2016
Commit: 459fe932dab433991808824a7f665930e37e17f0
Author: Julian Eisel
Date: Sun Sep 11 20:05:11 2016 +0200
Branches: temp_manipulators_core
https://developer.blender.org/rB459fe932dab433991808824a7f665930e37e17f0
Hook up manipulator core with window-manager
===================================================================
M source/blender/blenkernel/CMakeLists.txt
M source/blender/blenkernel/intern/screen.c
M source/blender/windowmanager/intern/wm_event_system.c
M source/blender/windowmanager/intern/wm_init_exit.c
M source/blender/windowmanager/intern/wm_operators.c
M source/blender/windowmanager/manipulators/intern/wm_manipulator.c
M source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
M source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h
M source/blender/windowmanager/wm.h
M source/blenderplayer/bad_level_call_stubs/stubs.c
===================================================================
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 157c440..b000f91 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -49,6 +49,9 @@ set(INC
../../../intern/smoke/extern
../../../intern/atomic
../../../intern/libmv
+
+ # XXX - BAD LEVEL CALL WM_api.h
+ ../windowmanager
)
set(INC_SYS
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 857bd54..eff98ad 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -53,6 +53,10 @@
#include "BKE_idprop.h"
#include "BKE_screen.h"
+/* XXX bad level call */
+#include "WM_api.h"
+#include "WM_types.h"
+
/* ************ Spacetype/regiontype handling ************** */
/* keep global; this has to be accessible outside of windowmanager */
@@ -337,6 +341,11 @@ void BKE_area_region_free(SpaceType *st, ARegion *ar)
MEM_freeN(uilst->properties);
}
}
+
+ for (wmManipulatorMap *wmap = ar->widgetmaps.first, *wmap_tmp; wmap; wmap = wmap_tmp) {
+ wmap_tmp = wmap->next;
+ WM_manipulatormap_delete(wmap); /* XXX shouldn't be in blenkernel */
+ }
BLI_freelistN(&ar->ui_lists);
BLI_freelistN(&ar->ui_previews);
BLI_freelistN(&ar->panels_category);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 77d7439..57d65cd 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -1674,7 +1674,12 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
wm_handler_op_context(C, handler, event);
wm_region_mouse_co(C, event);
wm_event_modalkeymap(C, op, event, &dbl_click_disabled);
-
+
+ /* attach widgetmap to handler if not there yet */
+ if (ot->wgrouptype && !handler->widgetmap) {
+ wm_manipulatorgroup_attach_to_modal_handler(C, handler, ot->wgrouptype, op);
+ }
+
if (ot->flag & OPTYPE_UNDO)
wm->op_undo_depth++;
@@ -1723,6 +1728,9 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
CTX_wm_region_set(C, NULL);
}
+ /* update widgets during modal handlers */
+ wm_manipulatormaps_handled_modal_update(C, event, handler, ot);
+
/* remove modal handler, operator itself should have been canceled and freed */
if (retval & (OPERATOR_CANCELLED | OPERATOR_FINISHED)) {
WM_cursor_grab_disable(CTX_wm_window(C), NULL);
@@ -2090,6 +2098,63 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
}
}
}
+ else if (handler->widgetmap) {
+ ScrArea *area = CTX_wm_area(C);
+ ARegion *region = CTX_wm_region(C);
+ wmManipulatorMap *wmap = handler->widgetmap;
+ wmManipulator *widget = wm_manipulatormap_get_highlighted_widget(wmap);
+ unsigned char part;
+
+ wm_manipulatormap_handler_context(C, handler);
+ wm_region_mouse_co(C, event);
+
+ /* handle widget highlighting */
+ if (event->type == MOUSEMOVE && !wm_manipulatormap_get_active_widget(wmap)) {
+ if (wm_manipulatormap_is_3d(wmap)) {
+ widget = wm_manipulatormap_find_highlighted_3D(wmap, C, event, &part);
+ wm_manipulatormap_set_highlighted_widget(wmap, C, widget, part);
+ }
+ else {
+ widget = wm_manipulatormap_find_highlighted_widget(wmap, C, event, &part);
+ wm_manipulatormap_set_highlighted_widget(wmap, C, widget, part);
+ }
+ }
+ /* handle user configurable widgetmap keymap */
+ else if (widget && wmap->wmap_context.activegroup) {
+ /* get user customized keymap from default one */
+ const wmKeyMap *keymap = WM_keymap_active(wm, wmap->wmap_context.activegroup->type->keymap);
+ wmKeyMapItem *kmi;
+ /* TODO should probably add some PRINT calls here */
+
+ if (!keymap->poll || keymap->poll(C)) {
+ for (kmi = keymap->items.first; kmi; kmi = kmi->next) {
+ if (wm_eventmatch(event, kmi)) {
+ wmOperator *op = handler->op;
+
+ /* weak, but allows interactive callback to not use rawkey */
+ event->keymap_idname = kmi->idname;
+
+ /* handler->op is called later, we want keymap op to be triggered here */
+ handler->op = NULL;
+ action |= wm_handler_operator_call(C, handlers, handler, event, kmi->ptr);
+ handler->op = op;
+
+ if (action & WM_HANDLER_BREAK) {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ /* restore the area */
+ CTX_wm_area_set(C, area);
+ CTX_wm_region_set(C, region);
+
+ if (handler->op) {
+ action |= wm_handler_operator_call(C, handlers, handler, event, NULL);
+ }
+ }
else {
/* modal, swallows all */
action |= wm_handler_operator_call(C, handlers, handler, event, NULL);
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index 73622cd..776567f 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -530,6 +530,9 @@ void WM_exit_ext(bContext *C, const bool do_python)
ED_clipboard_posebuf_free();
BKE_node_clipboard_clear();
+ /* free manipulator-maps after freeing blender, so no deleted data get accessed during cleaning up of areas */
+ WM_manipulatormaptypes_free();
+
BLF_exit();
#ifdef WITH_INTERNATIONAL
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 7177244..83c52d1 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -491,6 +491,9 @@ void WM_operatortype_remove_ptr(wmOperatorType *ot)
BLI_ghash_remove(global_ops_hash, ot->idname, NULL, NULL);
WM_keyconfig_update_operatortype();
+ if (ot->wgrouptype) {
+ WM_manipulatorgrouptype_unregister(NULL, G.main, ot->wgrouptype);
+ }
MEM_freeN(ot);
}
@@ -4170,6 +4173,10 @@ void wm_operatortype_init(void)
WM_operatortype_append(WM_OT_previews_ensure);
WM_operatortype_append(WM_OT_previews_clear);
WM_operatortype_append(WM_OT_doc_view_manual_ui_context);
+
+ /* manipulators */
+ WM_operatortype_append(MANIPULATORGROUP_OT_manipulator_select);
+ WM_operatortype_append(MANIPULATORGROUP_OT_manipulator_tweak);
}
/* circleselect-like modal operators */
@@ -4475,6 +4482,7 @@ void wm_window_keymap(wmKeyConfig *keyconf)
RNA_float_set(kmi->ptr, "value", 1.0f / 1.5f);
#endif /* WITH_INPUT_NDOF */
+ wm_manipulators_keymap(keyconf);
gesture_circle_modal_keymap(keyconf);
gesture_border_modal_keymap(keyconf);
gesture_zoom_border_modal_keymap(keyconf);
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
index db556fd..a1c1eb5 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
@@ -121,7 +121,7 @@ wmManipulator *WM_manipulator_new(void (*draw)(const bContext *C, wmManipulator
fix_linking_manipulator_arrow2d();
fix_linking_manipulator_cage();
fix_linking_manipulator_dial();
- fix_linking_manipulator_facemap();
+// fix_linking_manipulator_facemap();
fix_linking_manipulator_primitive();
return widget;
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
index b5b58da..49772e5 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
@@ -94,8 +94,10 @@ void WM_manipulatorgroup_free(bContext *C, wmManipulatorMap *wmap, wmManipulator
MEM_freeN(wgroup);
}
-void wm_manipulatorgroup_attach_to_modal_handler(bContext *C, wmEventHandler *handler,
- wmManipulatorGroupType *wgrouptype, wmOperator *op)
+/* TODO could be done a bit nicer */
+void wm_manipulatorgroup_attach_to_modal_handler(
+ bContext *C, wmEventHandler *handler,
+ wmManipulatorGroupType *wgrouptype, wmOperator *op)
{
/* maybe overly careful, but widgetgrouptype could come from a failed creation */
if (!wgrouptype) {
diff --git a/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h b/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h
index 877388b..faf3d0d 100644
--- a/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h
+++ b/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h
@@ -126,8 +126,9 @@ typedef struct wmManipulator {
void MANIPULATORGROUP_OT_manipulator_select(struct wmOperatorType *ot);
void MANIPULATORGROUP_OT_manipulator_tweak(struct wmOperatorType *ot);
-void wm_manipulatorgroup_attach_to_modal_handler(struct bContext *C, struct wmEventHandler *handler,
- struct wmManipulatorGroupType *wgrouptype, struct wmOperator *op);
+void wm_manipulatorgroup_attach_to_modal_handler(
+ struct bContext *C, struct wmEventHandler *handler,
+ struct wmManipulatorGroupType *wgrouptype, struct wmOperator *op);
/* wmManipulatorGroupType->flag */
enum {
diff --git a/source/blender/windowmanager/wm.h b/source/blender/windowmanager/wm.h
index 2f06dda..3dd2941 100644
--- a/source/blender/windowmanager/wm.h
+++ b/source/blender/windowmanager/wm.h
@@ -34,6 +34,8 @@
struct wmWindow;
struct ReportList;
+#include "manipulators/wm_manipulator_wmapi.h"
+
typedef struct wmPaintCursor {
struct wmPaintCursor *next, *prev;
diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c
index d8a4ddc..623f7bc 100644
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@ -336,6 +336,8 @@ void WM_jobs_callbacks(struct wmJob *job,
void WM_jobs_start(struct wmWindowManager *wm, struct wmJob *job) RET_NONE
void WM_report(ReportType type, const char *message) RET_NONE
+void WM_manipulatormap_delete(struct wmManipulatorMap *wmap) RET_NONE
+
#ifdef WITH_INPUT_
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list