From 25f1c2b04e0d98587c88c5ea26b59650e5c2e3f7 Mon Sep 17 00:00:00 2001
From: Brecht Van Lommel <brechtvanlommel@gmail.com>
Date: Tue, 21 May 2019 11:07:17 +0200
Subject: [PATCH] Add-ons: remove temporary disabling of use_global_undo

This can cause bugs where if the operator throws an exception, undo is not
properly enabled again. There have been maybe a dozen Blender bug reports
related to this. This could get worse now that we are autosaving preferences.

Some add-ons guard against this, but turning off undo should not be needed in
the first place. If the operator is set to do an undo push, any operators it
calls will automatically not do any undo pushes.

If this fail in some cases, it should be reported as a bug in Blender. I could
not find issues or a performance impact testing a few add-ons though.

Differential Revision: https://developer.blender.org/D4908
---
 .../add_curve_aceous_galore.py                |  9 +----
 .../add_curve_spirofit_bouncespline.py        | 12 -------
 .../add_curve_torus_knots.py                  |  9 +----
 add_mesh_extra_objects/add_mesh_solid.py      |  7 ----
 ant_landscape/add_mesh_ant_landscape.py       |  5 ---
 ant_landscape/ant_functions.py                | 14 --------
 ant_landscape/mesh_ant_displace.py            |  7 ----
 curve_simplify.py                             |  7 ----
 io_scene_ms3d/ms3d_export.py                  |  3 --
 io_scene_ms3d/ms3d_utils.py                   |  8 -----
 mesh_bsurfaces.py                             | 14 --------
 mesh_looptools.py                             | 36 +++++++++----------
 rigify/legacy/rig_ui_pitchipoy_template.py    | 28 +++------------
 rigify/legacy/rig_ui_template.py              | 28 +++------------
 rigify/legacy/ui.py                           |  7 ----
 rigify/rig_ui_template.py                     | 28 +++------------
 rigify/ui.py                                  | 11 ------
 17 files changed, 30 insertions(+), 203 deletions(-)

diff --git a/add_curve_extra_objects/add_curve_aceous_galore.py b/add_curve_extra_objects/add_curve_aceous_galore.py
index 62ac823c0..5b67dcad7 100644
--- a/add_curve_extra_objects/add_curve_aceous_galore.py
+++ b/add_curve_extra_objects/add_curve_aceous_galore.py
@@ -1433,10 +1433,6 @@ class Curveaceous_galore(Operator, object_utils.AddObjectHelper):
         return context.scene is not None
 
     def execute(self, context):
-        # turn off undo
-        undo = context.preferences.edit.use_global_undo
-        context.preferences.edit.use_global_undo = False
-
         # deal with 2D - 3D curve differences
         if self.ProfileType in ['Helix', 'Cycloid', 'Noise']:
             self.shape = '3D'
@@ -1460,9 +1456,6 @@ class Curveaceous_galore(Operator, object_utils.AddObjectHelper):
         self.align_matrix = align_matrix(context, self.startlocation)
         main(context, self, self.align_matrix or Matrix())
 
-        # restore pre operator undo state
-        context.preferences.edit.use_global_undo = undo
-
         return {'FINISHED'}
 
 # Register
@@ -1481,4 +1474,4 @@ def unregister():
         unregister_class(cls)
 
 if __name__ == "__main__":
-    register()
\ No newline at end of file
+    register()
diff --git a/add_curve_extra_objects/add_curve_spirofit_bouncespline.py b/add_curve_extra_objects/add_curve_spirofit_bouncespline.py
index 5c35d2bc0..8d4179ba2 100644
--- a/add_curve_extra_objects/add_curve_spirofit_bouncespline.py
+++ b/add_curve_extra_objects/add_curve_spirofit_bouncespline.py
@@ -317,9 +317,6 @@ class SpiroFitSpline(Operator):
                         "Active Object is not a Mesh. Operation Cancelled")
             return {'CANCELLED'}
 
-        #undo = context.preferences.edit.use_global_undo
-        #context.preferences.edit.use_global_undo = False
-
         bpy.ops.object.select_all(action='DESELECT')
 
         r.seed(self.random_seed)
@@ -357,7 +354,6 @@ class SpiroFitSpline(Operator):
         if self.auto_refresh is False:
             self.refresh = False
 
-        #context.preferences.edit.use_global_undo = undo
         return {'FINISHED'}
 
 
@@ -585,9 +581,6 @@ class BounceSpline(Operator):
         if obj.type != 'MESH':
             return {'CANCELLED'}
 
-        #undo = context.preferences.edit.use_global_undo
-        #context.preferences.edit.use_global_undo = False
-
         bpy.ops.object.select_all(action='DESELECT')
 
         r.seed(self.random_seed)
@@ -622,7 +615,6 @@ class BounceSpline(Operator):
         if self.auto_refresh is False:
             self.refresh = False
 
-        #context.preferences.edit.use_global_undo = undo
         return {'FINISHED'}
 
 
@@ -823,9 +815,6 @@ class CatenaryCurve(Operator):
 
         bpy.ops.object.select_all(action='DESELECT')
 
-        #undo = context.preferences.edit.use_global_undo
-        #context.preferences.edit.use_global_undo = False
-
         r.seed(self.random_seed)
 
         points = catenary_curve(
@@ -857,7 +846,6 @@ class CatenaryCurve(Operator):
         if self.auto_refresh is False:
             self.refresh = False
 
-        #context.preferences.edit.use_global_undo = undo
         return {'FINISHED'}
 
 
diff --git a/add_curve_extra_objects/add_curve_torus_knots.py b/add_curve_extra_objects/add_curve_torus_knots.py
index 8352ecfaf..3b2b362c8 100644
--- a/add_curve_extra_objects/add_curve_torus_knots.py
+++ b/add_curve_extra_objects/add_curve_torus_knots.py
@@ -711,16 +711,9 @@ class torus_knot_plus(Operator, AddObjectHelper):
         # update align matrix
         self.align_matrix = align_matrix(self, context)
 
-        # turn off undo
-        #undo = bpy.context.preferences.edit.use_global_undo
-        #bpy.context.preferences.edit.use_global_undo = False
-
         # create the curve
         create_torus_knot(self, context)
 
-        # restore pre operator undo state
-        #bpy.context.preferences.edit.use_global_undo = undo
-
         return {'FINISHED'}
 
     def invoke(self, context, event):
@@ -744,4 +737,4 @@ def unregister():
         unregister_class(cls)
 
 if __name__ == "__main__":
-    register()
\ No newline at end of file
+    register()
diff --git a/add_mesh_extra_objects/add_mesh_solid.py b/add_mesh_extra_objects/add_mesh_solid.py
index 98172d373..59e070df1 100644
--- a/add_mesh_extra_objects/add_mesh_solid.py
+++ b/add_mesh_extra_objects/add_mesh_solid.py
@@ -449,10 +449,6 @@ class Solids(bpy.types.Operator):
     previousSetting = ""
 
     def execute(self, context):
-        # turn off undo for better performance (3-5x faster), also makes sure
-        #  that mesh ops are undoable and entire script acts as one operator
-        bpy.context.preferences.edit.use_global_undo = False
-
         # piece of code to make presets remain until parameters are changed
         if self.preset != "0":
             # if preset, set preset
@@ -512,7 +508,4 @@ class Solids(bpy.types.Operator):
         object_data_add(context, mesh, operator=None)
         # object generation done
 
-        # turn undo back on
-        bpy.context.preferences.edit.use_global_undo = True
-
         return {'FINISHED'}
diff --git a/ant_landscape/add_mesh_ant_landscape.py b/ant_landscape/add_mesh_ant_landscape.py
index bb2173d0e..c80256d5f 100644
--- a/ant_landscape/add_mesh_ant_landscape.py
+++ b/ant_landscape/add_mesh_ant_landscape.py
@@ -593,10 +593,6 @@ class AntAddLandscape(bpy.types.Operator):
         if not self.refresh:
             return {'PASS_THROUGH'}
 
-        # turn off undo
-        undo = bpy.context.preferences.edit.use_global_undo
-        bpy.context.preferences.edit.use_global_undo = False
-
         # turn off 'Enter Edit Mode'
         use_enter_edit_mode = bpy.context.preferences.edit.use_enter_edit_mode
         bpy.context.preferences.edit.use_enter_edit_mode = False
@@ -783,7 +779,6 @@ class AntAddLandscape(bpy.types.Operator):
             self.refresh = False
 
         # restore pre operator state
-        context.preferences.edit.use_global_undo = undo
         bpy.context.preferences.edit.use_enter_edit_mode = use_enter_edit_mode
 
         return {'FINISHED'}
diff --git a/ant_landscape/ant_functions.py b/ant_landscape/ant_functions.py
index 62fe4916b..075c33b0f 100644
--- a/ant_landscape/ant_functions.py
+++ b/ant_landscape/ant_functions.py
@@ -141,10 +141,6 @@ class AntLandscapeRefresh(bpy.types.Operator):
 
 
     def execute(self, context):
-        # turn off undo
-        undo = bpy.context.preferences.edit.use_global_undo
-        bpy.context.preferences.edit.use_global_undo = False
-
         # ant object items
         obj = bpy.context.active_object
 
@@ -177,9 +173,6 @@ class AntLandscapeRefresh(bpy.types.Operator):
         else:
             pass
 
-        # restore pre operator undo state
-        context.preferences.edit.use_global_undo = undo
-
         return {'FINISHED'}
 
 # ------------------------------------------------------------
@@ -201,10 +194,6 @@ class AntLandscapeRegenerate(bpy.types.Operator):
 
     def execute(self, context):
 
-        # turn off undo
-        undo = bpy.context.preferences.edit.use_global_undo
-        bpy.context.preferences.edit.use_global_undo = False
-
         view_layer = bpy.context.view_layer
         # ant object items
         obj = bpy.context.active_object
@@ -328,9 +317,6 @@ class AntLandscapeRegenerate(bpy.types.Operator):
             new_ob.select_set(True)
             view_layer.objects.active = new_ob
 
-            # restore pre operator undo state
-            context.preferences.edit.use_global_undo = undo
-
         return {'FINISHED'}
 
 
diff --git a/ant_landscape/mesh_ant_displace.py b/ant_landscape/mesh_ant_displace.py
index 3442711f0..917cc34b6 100644
--- a/ant_landscape/mesh_ant_displace.py
+++ b/ant_landscape/mesh_ant_displace.py
@@ -596,10 +596,6 @@ class AntMeshDisplace(bpy.types.Operator):
         if not self.refresh:
             return {'PASS_THROUGH'}
 
-        # turn off undo
-        undo = bpy.context.preferences.edit.use_global_undo
-        bpy.context.preferences.edit.use_global_undo = False
-
         ob = context.object
 
         # Properties:
@@ -725,7 +721,4 @@ class AntMeshDisplace(bpy.types.Operator):
         if self.auto_refresh is False:
             self.refresh = False
 
-        # restore pre operator undo state
-        context.preferences.edit.use_global_undo = undo
-
         return {'FINISHED'}
diff --git a/curve_simplify.py b/curve_simplify.py
index 1518ed5fb..ff42c878f 100644
--- a/curve_simplify.py
+++ b/curve_simplify.py
@@ -574,20 +574,13 @@ class CURVE_OT_simplify(Operator):
                 self.keepShort   # 7
                 ]
         try:
-            global_undo = bpy.context.preferences.edit.use_global_undo
-            context.preferences.edit.use_global_undo = False
-
             bpy.ops.object.mode_set(mode='OBJECT')
             obj = context.active_object
             curve_dimension = obj.data.dimensions
 
             main(context, obj, options, curve_dimension)
-
-            context.preferences.edit.use_global_undo = global_undo
         except Exception as e:
             error_handlers(self, "curve.simplify", e, "Simplify Curves")
-
-            context.preferences.edit.use_global_undo = global_undo
             return {'CANCELLED'}
 
         return {'FINISHED'}
diff --git a/io_scene_ms3d/ms3d_export.py b/io_scene_ms3d/ms3d_export.py
index 4fe31c00b..bd5d2f2f2 100644
--- a/io_scene_ms3d/ms3d_export.py
+++ b/io_scene_ms3d/ms3d_export.py
@@ -164,9 +164,6 @@ class Ms3dExporter():
                 blender_context.view_layer.objects.active \
                         = blender_context.selected_objects[0]
 
-            # restore pre operator undo state
-            blender_context.preferences.edit.use_global_undo = self.undo
-
             is_valid, statistics = ms3d_model.is_valid()
             if self.options_verbose in Ms3dUi.VERBOSE_NORMAL:
                 print()
diff --git a/io_scene_ms3d/ms3d_utils.py b/io_scene_ms3d/ms3d_utils.py
index 330c53bba..943d87084 100644
--- a/io_scene_ms3d/ms3d_utils.py
+++ b/io_scene_ms3d/ms3d_utils.py
@@ -97,11 +97,6 @@ def select_all(select):
 
 ###############################################################################
 def pre_setup_environment(porter, blender_context):
-    # inject undo to porter
-    # and turn off undo
-    porter.undo = blender_context.preferences.edit.use_global_undo
-    blender_context.preferences.edit.use_global_undo = False
-
     # inject active_object to self
     porter.active_object = blender_context.view_layer.objects.active
 
@@ -125,9 +120,6 @@ def post_setup_environment(porter, blender_context):
         blender_context.view_layer.objects.active \
                 = blender_context.selected_objects[0]
 
-    # restore pre operator undo state
-    blender_context.preferences.edit.use_global_undo = porter.undo
-
 
 ###############################################################################
 def get_edge_split_modifier_add_if(blender_mesh_object):
diff --git a/mesh_bsurfaces.py b/mesh_bsurfaces.py
index 78ccfe4dc..04139c256 100644
--- a/mesh_bsurfaces.py
+++ b/mesh_bsurfaces.py
@@ -3086,8 +3086,6 @@ class GPENCIL_OT_SURFSK_add_surface(Operator):
         self.main_object = bsurfaces_props.SURFSK_object_with_retopology
         self.main_object.select_set(True)
         bpy.context.view_layer.objects.active = self.main_object
-        
-        #bpy.context.preferences.edit.use_global_undo = False
 
         if not self.is_fill_faces:
             bpy.ops.wm.context_set_value(data_path='tool_settings.mesh_select_mode',
@@ -3172,13 +3170,9 @@ class GPENCIL_OT_SURFSK_add_surface(Operator):
 
             bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
 
-        #bpy.context.preferences.edit.use_global_undo = self.initial_global_undo_state
-
         return{'FINISHED'}
 
     def invoke(self, context, event):
-        #self.initial_global_undo_state = bpy.context.preferences.edit.use_global_undo
-
         if bpy.ops.object.mode_set.poll():
              bpy.ops.object.mode_set(mode='OBJECT')
         
@@ -3199,7 +3193,6 @@ class GPENCIL_OT_SURFSK_add_surface(Operator):
 
         self.main_object_selected_verts_count = int(self.main_object.data.total_vert_sel)
 
-        #bpy.context.preferences.edit.use_global_undo = False
         bpy.ops.wm.context_set_value(data_path='tool_settings.mesh_select_mode',
                                      value='True, False, False')
 
@@ -3401,8 +3394,6 @@ class GPENCIL_OT_SURFSK_add_surface(Operator):
             # Delete temporary strokes curve object
             bpy.ops.object.delete({"selected_objects": [self.temporary_curve]})
 
-            #bpy.context.preferences.edit.use_global_undo = False
-
             # If "Keep strokes" option is not active, delete original strokes curve object
             if (not self.stopping_errors and not self.keep_strokes) or self.is_crosshatch:
                 bpy.ops.object.delete({"selected_objects": [self.original_curve]})
@@ -3423,8 +3414,6 @@ class GPENCIL_OT_SURFSK_add_surface(Operator):
             #bpy.ops.gpencil.surfsk_add_surface()
             self.execute(context)
 
-            #bpy.context.preferences.edit.use_global_undo = self.initial_global_undo_state
-
             if not self.stopping_errors:
                 return {"FINISHED"}
             else:
@@ -3435,7 +3424,6 @@ class GPENCIL_OT_SURFSK_add_surface(Operator):
             created_faces_count = self.fill_with_faces(self.main_object)
 
             bpy.ops.object.editmode_toggle('INVOKE_REGION_WIN')
-            #bpy.context.preferences.edit.use_global_undo = self.initial_global_undo_state
 
             if created_faces_count == 0:
                 self.report({'WARNING'}, "There aren't any strokes attached to the object")
@@ -3443,8 +3431,6 @@ class GPENCIL_OT_SURFSK_add_surface(Operator):
             else:
                 return {"FINISHED"}
 
-        #bpy.context.preferences.edit.use_global_undo = self.initial_global_undo_state
-
         if self.strokes_type == "EXTERNAL_NO_CURVE":
             self.report({'WARNING'}, "The secondary object is not a Curve.")
             return{"CANCELLED"}
diff --git a/mesh_looptools.py b/mesh_looptools.py
index 2b11465f2..87c23383b 100644
--- a/mesh_looptools.py
+++ b/mesh_looptools.py
@@ -747,8 +747,6 @@ def get_parallel_loops(bm_mod, loops):
 
 # gather initial data
 def initialise():
-    global_undo = bpy.context.preferences.edit.use_global_undo
-    bpy.context.preferences.edit.use_global_undo = False
     object = bpy.context.active_object
     if 'MIRROR' in [mod.type for mod in object.modifiers if mod.show_viewport]:
         # ensure that selection is synced for the derived mesh
@@ -760,7 +758,7 @@ def initialise():
     bm.edges.ensure_lookup_table()
     bm.faces.ensure_lookup_table()
 
-    return(global_undo, object, bm)
+    return(object, bm)
 
 
 # move the vertices to their new locations
@@ -830,14 +828,12 @@ def settings_write(self):
 
 
 # clean up and set settings back to original state
-def terminate(global_undo):
+def terminate():
     # update editmesh cached data
     obj = bpy.context.active_object
     if obj.mode == 'EDIT':
         bmesh.update_edit_mesh(obj.data, loop_triangles=True, destructive=True)
 
-    bpy.context.preferences.edit.use_global_undo = global_undo
-
 
 # ########################################
 # ##### Bridge functions #################
@@ -3301,7 +3297,7 @@ class Bridge(Operator):
 
     def execute(self, context):
         # initialise
-        global_undo, object, bm = initialise()
+        object, bm = initialise()
         edge_faces, edgekey_to_edge, old_selected_faces, smooth = \
             bridge_initialise(bm, self.interpolation)
         settings_write(self)
@@ -3375,7 +3371,7 @@ class Bridge(Operator):
             bpy.ops.mesh.normals_make_consistent()
 
         # cleaning up
-        terminate(global_undo)
+        terminate()
 
         return{'FINISHED'}
 
@@ -3484,7 +3480,7 @@ class Circle(Operator):
 
     def execute(self, context):
         # initialise
-        global_undo, object, bm = initialise()
+        object, bm = initialise()
         settings_write(self)
         # check cache to see if we can save time
         cached, single_loops, loops, derived, mapping = cache_read("Circle",
@@ -3548,7 +3544,7 @@ class Circle(Operator):
         # cleaning up
         if derived:
             bm_mod.free()
-        terminate(global_undo)
+        terminate()
 
         return{'FINISHED'}
 
@@ -3648,7 +3644,7 @@ class Curve(Operator):
 
     def execute(self, context):
         # initialise
-        global_undo, object, bm = initialise()
+        object, bm = initialise()
         settings_write(self)
         # check cache to see if we can save time
         cached, single_loops, loops, derived, mapping = cache_read("Curve",
@@ -3692,7 +3688,7 @@ class Curve(Operator):
         # cleaning up
         if derived:
             bm_mod.free()
-        terminate(global_undo)
+        terminate()
 
         return{'FINISHED'}
 
@@ -3780,7 +3776,7 @@ class Flatten(Operator):
 
     def execute(self, context):
         # initialise
-        global_undo, object, bm = initialise()
+        object, bm = initialise()
         settings_write(self)
         # check cache to see if we can save time
         cached, single_loops, loops, derived, mapping = cache_read("Flatten",
@@ -3814,7 +3810,7 @@ class Flatten(Operator):
         move_verts(object, bm, False, move, lock, self.influence)
 
         # cleaning up
-        terminate(global_undo)
+        terminate()
 
         return{'FINISHED'}
 
@@ -3989,7 +3985,7 @@ class GStretch(Operator):
 
     def execute(self, context):
         # initialise
-        global_undo, object, bm = initialise()
+        object, bm = initialise()
         settings_write(self)
 
         # check cache to see if we can save time
@@ -4093,7 +4089,7 @@ class GStretch(Operator):
         # cleaning up
         if derived:
             bm_mod.free()
-        terminate(global_undo)
+        terminate()
 
         return{'FINISHED'}
 
@@ -4157,7 +4153,7 @@ class Relax(Operator):
 
     def execute(self, context):
         # initialise
-        global_undo, object, bm = initialise()
+        object, bm = initialise()
         settings_write(self)
         # check cache to see if we can save time
         cached, single_loops, loops, derived, mapping = cache_read("Relax",
@@ -4191,7 +4187,7 @@ class Relax(Operator):
         # cleaning up
         if derived:
             bm_mod.free()
-        terminate(global_undo)
+        terminate()
 
         return{'FINISHED'}
 
@@ -4279,7 +4275,7 @@ class Space(Operator):
 
     def execute(self, context):
         # initialise
-        global_undo, object, bm = initialise()
+        object, bm = initialise()
         settings_write(self)
         # check cache to see if we can save time
         cached, single_loops, loops, derived, mapping = cache_read("Space",
@@ -4317,7 +4313,7 @@ class Space(Operator):
         # cleaning up
         if derived:
             bm_mod.free()
-        terminate(global_undo)
+        terminate()
 
         return{'FINISHED'}
 
diff --git a/rigify/legacy/rig_ui_pitchipoy_template.py b/rigify/legacy/rig_ui_pitchipoy_template.py
index 2e64b7434..2b4ef36c9 100644
--- a/rigify/legacy/rig_ui_pitchipoy_template.py
+++ b/rigify/legacy/rig_ui_pitchipoy_template.py
@@ -541,12 +541,7 @@ class Rigify_Arm_FK2IK(bpy.types.Operator):
         return (context.active_object != None and context.mode == 'POSE')
 
     def execute(self, context):
-        use_global_undo = context.preferences.edit.use_global_undo
-        context.preferences.edit.use_global_undo = False
-        try:
-            fk2ik_arm(context.active_object, fk=[self.uarm_fk, self.farm_fk, self.hand_fk], ik=[self.uarm_ik, self.farm_ik, self.hand_ik])
-        finally:
-            context.preferences.edit.use_global_undo = use_global_undo
+        fk2ik_arm(context.active_object, fk=[self.uarm_fk, self.farm_fk, self.hand_fk], ik=[self.uarm_ik, self.farm_ik, self.hand_ik])
         return {'FINISHED'}
 
 
@@ -571,12 +566,7 @@ class Rigify_Arm_IK2FK(bpy.types.Operator):
         return (context.active_object != None and context.mode == 'POSE')
 
     def execute(self, context):
-        use_global_undo = context.preferences.edit.use_global_undo
-        context.preferences.edit.use_global_undo = False
-        try:
-            ik2fk_arm(context.active_object, fk=[self.uarm_fk, self.farm_fk, self.hand_fk], ik=[self.uarm_ik, self.farm_ik, self.hand_ik, self.pole])
-        finally:
-            context.preferences.edit.use_global_undo = use_global_undo
+        ik2fk_arm(context.active_object, fk=[self.uarm_fk, self.farm_fk, self.hand_fk], ik=[self.uarm_ik, self.farm_ik, self.hand_ik, self.pole])
         return {'FINISHED'}
 
 
@@ -602,12 +592,7 @@ class Rigify_Leg_FK2IK(bpy.types.Operator):
         return (context.active_object != None and context.mode == 'POSE')
 
     def execute(self, context):
-        use_global_undo = context.preferences.edit.use_global_undo
-        context.preferences.edit.use_global_undo = False
-        try:
-            fk2ik_leg(context.active_object, fk=[self.thigh_fk, self.shin_fk, self.foot_fk, self.mfoot_fk], ik=[self.thigh_ik, self.shin_ik, self.foot_ik, self.mfoot_ik])
-        finally:
-            context.preferences.edit.use_global_undo = use_global_undo
+        fk2ik_leg(context.active_object, fk=[self.thigh_fk, self.shin_fk, self.foot_fk, self.mfoot_fk], ik=[self.thigh_ik, self.shin_ik, self.foot_ik, self.mfoot_ik])
         return {'FINISHED'}
 
 
@@ -635,12 +620,7 @@ class Rigify_Leg_IK2FK(bpy.types.Operator):
         return (context.active_object != None and context.mode == 'POSE')
 
     def execute(self, context):
-        use_global_undo = context.preferences.edit.use_global_undo
-        context.preferences.edit.use_global_undo = False
-        try:
-            ik2fk_leg(context.active_object, fk=[self.thigh_fk, self.shin_fk, self.mfoot_fk, self.foot_fk], ik=[self.thigh_ik, self.shin_ik, self.foot_ik, self.footroll, self.pole, self.mfoot_ik])
-        finally:
-            context.preferences.edit.use_global_undo = use_global_undo
+        ik2fk_leg(context.active_object, fk=[self.thigh_fk, self.shin_fk, self.mfoot_fk, self.foot_fk], ik=[self.thigh_ik, self.shin_ik, self.foot_ik, self.footroll, self.pole, self.mfoot_ik])
         return {'FINISHED'}
 
 
diff --git a/rigify/legacy/rig_ui_template.py b/rigify/legacy/rig_ui_template.py
index 5f3840069..6cdd1c635 100644
--- a/rigify/legacy/rig_ui_template.py
+++ b/rigify/legacy/rig_ui_template.py
@@ -389,12 +389,7 @@ class Rigify_Arm_FK2IK(bpy.types.Operator):
         return (context.active_object is not None and context.mode == 'POSE')
 
     def execute(self, context):
-        use_global_undo = context.preferences.edit.use_global_undo
-        context.preferences.edit.use_global_undo = False
-        try:
-            fk2ik_arm(context.active_object, fk=[self.uarm_fk, self.farm_fk, self.hand_fk], ik=[self.uarm_ik, self.farm_ik, self.hand_ik])
-        finally:
-            context.preferences.edit.use_global_undo = use_global_undo
+        fk2ik_arm(context.active_object, fk=[self.uarm_fk, self.farm_fk, self.hand_fk], ik=[self.uarm_ik, self.farm_ik, self.hand_ik])
         return {'FINISHED'}
 
 
@@ -419,12 +414,7 @@ class Rigify_Arm_IK2FK(bpy.types.Operator):
         return (context.active_object is not None and context.mode == 'POSE')
 
     def execute(self, context):
-        use_global_undo = context.preferences.edit.use_global_undo
-        context.preferences.edit.use_global_undo = False
-        try:
-            ik2fk_arm(context.active_object, fk=[self.uarm_fk, self.farm_fk, self.hand_fk], ik=[self.uarm_ik, self.farm_ik, self.hand_ik, self.pole])
-        finally:
-            context.preferences.edit.use_global_undo = use_global_undo
+        ik2fk_arm(context.active_object, fk=[self.uarm_fk, self.farm_fk, self.hand_fk], ik=[self.uarm_ik, self.farm_ik, self.hand_ik, self.pole])
         return {'FINISHED'}
 
 
@@ -450,12 +440,7 @@ class Rigify_Leg_FK2IK(bpy.types.Operator):
         return (context.active_object is not None and context.mode == 'POSE')
 
     def execute(self, context):
-        use_global_undo = context.preferences.edit.use_global_undo
-        context.preferences.edit.use_global_undo = False
-        try:
-            fk2ik_leg(context.active_object, fk=[self.thigh_fk, self.shin_fk, self.foot_fk, self.mfoot_fk], ik=[self.thigh_ik, self.shin_ik, self.foot_ik, self.mfoot_ik])
-        finally:
-            context.preferences.edit.use_global_undo = use_global_undo
+        fk2ik_leg(context.active_object, fk=[self.thigh_fk, self.shin_fk, self.foot_fk, self.mfoot_fk], ik=[self.thigh_ik, self.shin_ik, self.foot_ik, self.mfoot_ik])
         return {'FINISHED'}
 
 
@@ -482,12 +467,7 @@ class Rigify_Leg_IK2FK(bpy.types.Operator):
         return (context.active_object is not None and context.mode == 'POSE')
 
     def execute(self, context):
-        use_global_undo = context.preferences.edit.use_global_undo
-        context.preferences.edit.use_global_undo = False
-        try:
-            ik2fk_leg(context.active_object, fk=[self.thigh_fk, self.shin_fk, self.mfoot_fk], ik=[self.thigh_ik, self.shin_ik, self.foot_ik, self.footroll, self.pole, self.mfoot_ik])
-        finally:
-            context.preferences.edit.use_global_undo = use_global_undo
+        ik2fk_leg(context.active_object, fk=[self.thigh_fk, self.shin_fk, self.mfoot_fk], ik=[self.thigh_ik, self.shin_ik, self.foot_ik, self.footroll, self.pole, self.mfoot_ik])
         return {'FINISHED'}
 
 
diff --git a/rigify/legacy/ui.py b/rigify/legacy/ui.py
index 157b451c8..1cc0c0eb6 100644
--- a/rigify/legacy/ui.py
+++ b/rigify/legacy/ui.py
@@ -284,14 +284,10 @@ class Generate(bpy.types.Operator):
         import importlib
         importlib.reload(generate)
 
-        use_global_undo = context.preferences.edit.use_global_undo
-        context.preferences.edit.use_global_undo = False
         try:
             generate.generate_rig(context, context.object)
         except MetarigError as rig_exception:
             rigify_report_exception(self, rig_exception)
-        finally:
-            context.preferences.edit.use_global_undo = use_global_undo
 
         return {'FINISHED'}
 
@@ -312,8 +308,6 @@ class Sample(bpy.types.Operator):
 
     def execute(self, context):
         if context.mode == 'EDIT_ARMATURE' and self.metarig_type != "":
-            use_global_undo = context.preferences.edit.use_global_undo
-            context.preferences.edit.use_global_undo = False
             try:
                 rig = get_rig_type(self.metarig_type)
                 create_sample = rig.create_sample
@@ -322,7 +316,6 @@ class Sample(bpy.types.Operator):
             else:
                 create_sample(context.active_object)
             finally:
-                context.preferences.edit.use_global_undo = use_global_undo
                 bpy.ops.object.mode_set(mode='EDIT')
 
         return {'FINISHED'}
diff --git a/rigify/rig_ui_template.py b/rigify/rig_ui_template.py
index 6cd46f6a6..cebed827c 100644
--- a/rigify/rig_ui_template.py
+++ b/rigify/rig_ui_template.py
@@ -638,12 +638,7 @@ class Rigify_Arm_FK2IK(bpy.types.Operator):
         return (context.active_object != None and context.mode == 'POSE')
 
     def execute(self, context):
-        use_global_undo = context.preferences.edit.use_global_undo
-        context.preferences.edit.use_global_undo = False
-        try:
-            fk2ik_arm(context.active_object, fk=[self.uarm_fk, self.farm_fk, self.hand_fk], ik=[self.uarm_ik, self.farm_ik, self.hand_ik])
-        finally:
-            context.preferences.edit.use_global_undo = use_global_undo
+        fk2ik_arm(context.active_object, fk=[self.uarm_fk, self.farm_fk, self.hand_fk], ik=[self.uarm_ik, self.farm_ik, self.hand_ik])
         return {'FINISHED'}
 
 
@@ -670,12 +665,7 @@ class Rigify_Arm_IK2FK(bpy.types.Operator):
         return (context.active_object != None and context.mode == 'POSE')
 
     def execute(self, context):
-        use_global_undo = context.preferences.edit.use_global_undo
-        context.preferences.edit.use_global_undo = False
-        try:
-            ik2fk_arm(context.active_object, fk=[self.uarm_fk, self.farm_fk, self.hand_fk], ik=[self.uarm_ik, self.farm_ik, self.hand_ik, self.pole, self.main_parent])
-        finally:
-            context.preferences.edit.use_global_undo = use_global_undo
+        ik2fk_arm(context.active_object, fk=[self.uarm_fk, self.farm_fk, self.hand_fk], ik=[self.uarm_ik, self.farm_ik, self.hand_ik, self.pole, self.main_parent])
         return {'FINISHED'}
 ''']
 
@@ -708,12 +698,7 @@ class Rigify_Leg_FK2IK(bpy.types.Operator):
         return (context.active_object != None and context.mode == 'POSE')
 
     def execute(self, context):
-        use_global_undo = context.preferences.edit.use_global_undo
-        context.preferences.edit.use_global_undo = False
-        try:
-            fk2ik_leg(context.active_object, fk=[self.thigh_fk, self.shin_fk, self.foot_fk, self.mfoot_fk], ik=[self.thigh_ik, self.shin_ik, self.foot_ik, self.mfoot_ik])
-        finally:
-            context.preferences.edit.use_global_undo = use_global_undo
+        fk2ik_leg(context.active_object, fk=[self.thigh_fk, self.shin_fk, self.foot_fk, self.mfoot_fk], ik=[self.thigh_ik, self.shin_ik, self.foot_ik, self.mfoot_ik])
         return {'FINISHED'}
 
 
@@ -742,12 +727,7 @@ class Rigify_Leg_IK2FK(bpy.types.Operator):
         return (context.active_object != None and context.mode == 'POSE')
 
     def execute(self, context):
-        use_global_undo = context.preferences.edit.use_global_undo
-        context.preferences.edit.use_global_undo = False
-        try:
-            ik2fk_leg(context.active_object, fk=[self.thigh_fk, self.shin_fk, self.mfoot_fk, self.foot_fk], ik=[self.thigh_ik, self.shin_ik, self.foot_ik, self.footroll, self.pole, self.mfoot_ik, self.main_parent])
-        finally:
-            context.preferences.edit.use_global_undo = use_global_undo
+        ik2fk_leg(context.active_object, fk=[self.thigh_fk, self.shin_fk, self.mfoot_fk, self.foot_fk], ik=[self.thigh_ik, self.shin_ik, self.foot_ik, self.footroll, self.pole, self.mfoot_ik, self.main_parent])
         return {'FINISHED'}
 ''']
 
diff --git a/rigify/ui.py b/rigify/ui.py
index c3c9f07d3..0ec387917 100644
--- a/rigify/ui.py
+++ b/rigify/ui.py
@@ -755,14 +755,10 @@ class Generate(bpy.types.Operator):
         import importlib
         importlib.reload(generate)
 
-        use_global_undo = context.preferences.edit.use_global_undo
-        context.preferences.edit.use_global_undo = False
         try:
             generate.generate_rig(context, context.object)
         except MetarigError as rig_exception:
             rigify_report_exception(self, rig_exception)
-        finally:
-            context.preferences.edit.use_global_undo = use_global_undo
 
         return {'FINISHED'}
 
@@ -813,8 +809,6 @@ class Sample(bpy.types.Operator):
 
     def execute(self, context):
         if context.mode == 'EDIT_ARMATURE' and self.metarig_type != "":
-            use_global_undo = context.preferences.edit.use_global_undo
-            context.preferences.edit.use_global_undo = False
             try:
                 rig = rig_lists.rigs[self.metarig_type]["module"]
                 create_sample = rig.create_sample
@@ -823,7 +817,6 @@ class Sample(bpy.types.Operator):
             else:
                 create_sample(context.active_object)
             finally:
-                context.preferences.edit.use_global_undo = use_global_undo
                 bpy.ops.object.mode_set(mode='EDIT')
 
         return {'FINISHED'}
@@ -1280,8 +1273,6 @@ class OBJECT_OT_ClearAnimation(bpy.types.Operator):
 
     def execute(self, context):
 
-        use_global_undo = context.preferences.edit.use_global_undo
-        context.preferences.edit.use_global_undo = False
         try:
             rig = context.object
             scn = context.scene
@@ -1292,8 +1283,6 @@ class OBJECT_OT_ClearAnimation(bpy.types.Operator):
                 return {'FINISHED'}
 
             clearAnimation(act, self.anim_type, names=get_limb_generated_names(rig))
-        finally:
-            context.preferences.edit.use_global_undo = use_global_undo
         return {'FINISHED'}
 
 
-- 
GitLab