[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56402] trunk/blender/source/blender: fix [#35156] Edge slide gg shortcut brings up wrong settings.
Campbell Barton
ideasman42 at gmail.com
Tue Apr 30 05:44:06 CEST 2013
Revision: 56402
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56402
Author: campbellbarton
Date: 2013-04-30 03:44:03 +0000 (Tue, 30 Apr 2013)
Log Message:
-----------
fix [#35156] Edge slide gg shortcut brings up wrong settings.
switch operator types from transform, this would normally be problematic, but transform operators share callbacks so it can be supported.
Modified Paths:
--------------
trunk/blender/source/blender/editors/transform/transform_ops.c
trunk/blender/source/blender/windowmanager/WM_api.h
trunk/blender/source/blender/windowmanager/intern/wm.c
Modified: trunk/blender/source/blender/editors/transform/transform_ops.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_ops.c 2013-04-30 02:45:57 UTC (rev 56401)
+++ trunk/blender/source/blender/editors/transform/transform_ops.c 2013-04-30 03:44:03 UTC (rev 56402)
@@ -339,6 +339,7 @@
int exit_code;
TransInfo *t = op->customdata;
+ const enum TfmMode mode_prev = t->mode;
#if 0
// stable 2D mouse coords map to different 3D coords while the 3D mouse is active
@@ -362,7 +363,29 @@
transformops_exit(C, op);
exit_code &= ~OPERATOR_PASS_THROUGH; /* preventively remove passthrough */
}
+ else {
+ if (mode_prev != t->mode) {
+ /* WARNING: this is not normal to switch operator types
+ * normally it would not be supported but transform happens
+ * to share callbacks between differernt operators. */
+ wmOperatorType *ot_new = NULL;
+ TransformModeItem *item = transform_modes;
+ while (item->idname) {
+ if (item->mode == t->mode) {
+ ot_new = WM_operatortype_find(item->idname, false);
+ break;
+ }
+ item++;
+ }
+ BLI_assert(ot_new != NULL);
+ if (ot_new) {
+ WM_operator_type_set(op, ot_new);
+ }
+ /* end suspicious code */
+ }
+ }
+
return exit_code;
}
Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h 2013-04-30 02:45:57 UTC (rev 56401)
+++ trunk/blender/source/blender/windowmanager/WM_api.h 2013-04-30 03:44:03 UTC (rev 56402)
@@ -203,10 +203,11 @@
/* operator api */
void WM_operator_free (struct wmOperator *op);
+void WM_operator_type_set(struct wmOperator *op, struct wmOperatorType *ot);
void WM_operator_stack_clear(struct wmWindowManager *wm);
void WM_operator_handlers_clear(wmWindowManager *wm, struct wmOperatorType *ot);
-struct wmOperatorType *WM_operatortype_find(const char *idnamem, bool quiet);
+struct wmOperatorType *WM_operatortype_find(const char *idname, bool quiet);
struct GHashIterator *WM_operatortype_iter(void);
void WM_operatortype_append(void (*opfunc)(struct wmOperatorType *));
void WM_operatortype_append_ptr(void (*opfunc)(struct wmOperatorType *, void *), void *userdata);
Modified: trunk/blender/source/blender/windowmanager/intern/wm.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm.c 2013-04-30 02:45:57 UTC (rev 56401)
+++ trunk/blender/source/blender/windowmanager/intern/wm.c 2013-04-30 03:44:03 UTC (rev 56402)
@@ -108,6 +108,22 @@
MEM_freeN(op);
}
+/**
+ * Use with extreme care!,
+ * properties, customdata etc - must be compatible.
+ *
+ * \param op Operator to assign the type to.
+ * \param ot OperatorType to assign.
+ */
+void WM_operator_type_set(wmOperator *op, wmOperatorType *ot)
+{
+ /* not supported for Python */
+ BLI_assert(op->py_instance == NULL);
+
+ op->type = ot;
+ op->ptr->type = ot->srna;
+}
+
static void wm_reports_free(wmWindowManager *wm)
{
BKE_reports_clear(&wm->reports);
More information about the Bf-blender-cvs
mailing list