[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