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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to