From 640dc4f2b474486246e69727571745bc8f1d0a5b Mon Sep 17 00:00:00 2001 From: Ryan Date: Tue, 10 Mar 2026 18:19:06 +0800 Subject: [PATCH 1/4] Applied fallbacks to RMB key rebinding. --- __init__.py | 18 ++++++++++++++++-- preferences.py | 27 ++++++++++----------------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/__init__.py b/__init__.py index 2979ca0..def5464 100644 --- a/__init__.py +++ b/__init__.py @@ -90,8 +90,22 @@ def rebind_rmb(scene): addon_prefs = bpy.context.preferences.addons[__package__].preferences addon_prefs.menumodes = menumodes addon_prefs.panelmodes = panelmodes - addon_prefs.rebind_3dview_keymap(bpy.context, addon_prefs.rmb_pan_rotate) - addon_prefs.rebind_switch_nav_rotate(bpy.context, addon_prefs.rmb_rotate_switch) + + wm = bpy.context.window_manager + active_keyconfig = wm.keyconfigs.active + addon_keyconfig = wm.keyconfigs.addon + blender_keyconfig = wm.keyconfigs["Blender"] + user_keyconfig = wm.keyconfigs["Blender user"] + + try: + addon_prefs.rebind_3dview_keymap(active_keyconfig, addon_prefs.rmb_pan_rotate) + addon_prefs.rebind_switch_nav_rotate(active_keyconfig, addon_keyconfig, addon_prefs.rmb_rotate_switch) + except KeyError: + addon_prefs.rebind_3dview_keymap(blender_keyconfig, addon_prefs.rmb_pan_rotate) + addon_prefs.rebind_switch_nav_rotate(blender_keyconfig, addon_keyconfig, addon_prefs.rmb_rotate_switch) + except KeyError: + addon_prefs.rebind_3dview_keymap(user_keyconfig, addon_prefs.rmb_pan_rotate) + addon_prefs.rebind_switch_nav_rotate(user_keyconfig, addon_keyconfig, addon_prefs.rmb_rotate_switch) def register(): diff --git a/preferences.py b/preferences.py index f054394..da6846d 100644 --- a/preferences.py +++ b/preferences.py @@ -152,13 +152,9 @@ class RightMouseNavigationPreferences(AddonPreferences): update=update_rebind_switch_nav_rotate, ) - def rebind_3dview_keymap(self, context, isActive): - wm = context.window_manager - active_kc = wm.keyconfigs.active - addon_kc = wm.keyconfigs.addon - + def rebind_3dview_keymap(self, keyconfig, isActive): if isActive: - for key in active_kc.keymaps["3D View"].keymap_items: + for key in keyconfig.keymaps["3D View"].keymap_items: if key.idname == "view3d.cursor3d" and key.type == "RIGHTMOUSE": key.type = "MIDDLEMOUSE" key.value = "CLICK" @@ -201,7 +197,7 @@ def rebind_3dview_keymap(self, context, isActive): if key.idname == "transform.translate" and key.type == "RIGHTMOUSE": key.type = "MIDDLEMOUSE" else: - for key in active_kc.keymaps["3D View"].keymap_items: + for key in keyconfig.keymaps["3D View"].keymap_items: if key.idname == "view3d.cursor3d" and key.type == "MIDDLEMOUSE": key.type = "RIGHTMOUSE" key.value = "CLICK" @@ -244,10 +240,7 @@ def rebind_3dview_keymap(self, context, isActive): if key.idname == "transform.translate" and key.type == "MIDDLEMOUSE": key.type = "RIGHTMOUSE" - def rebind_switch_nav_rotate(self, context, isActive): - wm = context.window_manager - active_kc = wm.keyconfigs.active - addon_kc = wm.keyconfigs.addon + def rebind_switch_nav_rotate(self, keyconfig, addon_kc, isActive): if isActive: for key in addon_kc.keymaps["3D View"].keymap_items: @@ -255,18 +248,18 @@ def rebind_switch_nav_rotate(self, context, isActive): key.type = "RIGHTMOUSE" key.value = "PRESS" key.alt = True - for key in active_kc.keymaps["3D View"].keymap_items: + for key in keyconfig.keymaps["3D View"].keymap_items: if key.idname == "view3d.rotate" and key.type == "RIGHTMOUSE": key.type = "RIGHTMOUSE" key.value = "CLICK_DRAG" key.alt = False for i in menumodes: - for key in active_kc.keymaps[i].keymap_items: + for key in keyconfig.keymaps[i].keymap_items: if key.idname == "wm.call_menu" and key.type == "RIGHTMOUSE": key.active = True key.value = "CLICK" for i in panelmodes: - for key in active_kc.keymaps[i].keymap_items: + for key in keyconfig.keymaps[i].keymap_items: if key.idname == "wm.call_panel" and key.type == "RIGHTMOUSE" and key.active: key.active = False key.value = "CLICK" @@ -276,18 +269,18 @@ def rebind_switch_nav_rotate(self, context, isActive): key.type = "RIGHTMOUSE" key.value = "PRESS" key.alt = False - for key in active_kc.keymaps["3D View"].keymap_items: + for key in keyconfig.keymaps["3D View"].keymap_items: if key.idname == "view3d.rotate" and key.type == "RIGHTMOUSE": key.type = "RIGHTMOUSE" key.value = "CLICK_DRAG" key.alt = True for i in menumodes: - for key in active_kc.keymaps[i].keymap_items: + for key in keyconfig.keymaps[i].keymap_items: if key.idname == "wm.call_menu" and key.type == "RIGHTMOUSE": key.active = False key.value = "PRESS" for i in panelmodes: - for key in active_kc.keymaps[i].keymap_items: + for key in keyconfig.keymaps[i].keymap_items: if key.idname == "wm.call_panel" and key.type == "RIGHTMOUSE": key.active = True key.value = "PRESS" From bb6957eda830d3e69a591bf6765e9cc76bfab9bf Mon Sep 17 00:00:00 2001 From: Ryan Date: Tue, 10 Mar 2026 18:33:32 +0800 Subject: [PATCH 2/4] Fixed rebind on preferences update. --- preferences.py | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/preferences.py b/preferences.py index da6846d..ae29742 100644 --- a/preferences.py +++ b/preferences.py @@ -67,12 +67,33 @@ def update_node_keymap(self, context): key.active = addon_prefs.enable_for_node_editors -def update_rebind_3dview_keymap(self, context): - self.rebind_3dview_keymap(context, self.rmb_pan_rotate) +def update_rebind_3dview_keymap(self, context): + wm = context.window_manager + active_keyconfig = wm.keyconfigs.active + blender_keyconfig = wm.keyconfigs["Blender"] + user_keyconfig = wm.keyconfigs["Blender user"] + try: + self.rebind_3dview_keymap(active_keyconfig, self.rmb_pan_rotate) + except KeyError: + self.rebind_3dview_keymap(blender_keyconfig, self.rmb_pan_rotate) + except KeyError: + self.rebind_3dview_keymap(user_keyconfig, self.rmb_pan_rotate) -def update_rebind_switch_nav_rotate(self, context): - self.rebind_switch_nav_rotate(context, self.rmb_rotate_switch) + +def update_rebind_switch_nav_rotate(self, context): + wm = context.window_manager + active_keyconfig = wm.keyconfigs.active + addon_keyconfig = wm.keyconfigs.addon + blender_keyconfig = wm.keyconfigs["Blender"] + user_keyconfig = wm.keyconfigs["Blender user"] + + try: + self.rebind_switch_nav_rotate(active_keyconfig, addon_keyconfig, self.rmb_rotate_switch) + except KeyError: + self.rebind_switch_nav_rotate(blender_keyconfig, addon_keyconfig, self.rmb_rotate_switch) + except KeyError: + self.rebind_switch_nav_rotate(user_keyconfig, addon_keyconfig, self.rmb_rotate_switch) class RightMouseNavigationPreferences(AddonPreferences): @@ -241,7 +262,6 @@ def rebind_3dview_keymap(self, keyconfig, isActive): key.type = "RIGHTMOUSE" def rebind_switch_nav_rotate(self, keyconfig, addon_kc, isActive): - if isActive: for key in addon_kc.keymaps["3D View"].keymap_items: if key.idname == "rmn.right_mouse_navigation": From 10785459ea6c3f9790b2b9cf81a693cfd423d4b7 Mon Sep 17 00:00:00 2001 From: Ryan Date: Tue, 10 Mar 2026 19:00:57 +0800 Subject: [PATCH 3/4] Fixed unregister. --- __init__.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/__init__.py b/__init__.py index def5464..1ab79b3 100644 --- a/__init__.py +++ b/__init__.py @@ -171,8 +171,24 @@ def unregister(): bpy.app.handlers.load_post.remove(rebind_rmb) addon_prefs = bpy.context.preferences.addons[__package__].preferences - addon_prefs.rebind_switch_nav_rotate(bpy.context, False) - addon_prefs.rebind_3dview_keymap(bpy.context, False) + addon_prefs.menumodes = menumodes + addon_prefs.panelmodes = panelmodes + + wm = bpy.context.window_manager + active_keyconfig = wm.keyconfigs.active + addon_keyconfig = wm.keyconfigs.addon + blender_keyconfig = wm.keyconfigs["Blender"] + user_keyconfig = wm.keyconfigs["Blender user"] + + try: + addon_prefs.rebind_3dview_keymap(active_keyconfig, False) + addon_prefs.rebind_switch_nav_rotate(active_keyconfig, addon_keyconfig, False) + except KeyError: + addon_prefs.rebind_3dview_keymap(blender_keyconfig, False) + addon_prefs.rebind_switch_nav_rotate(blender_keyconfig, addon_keyconfig, False) + except KeyError: + addon_prefs.rebind_3dview_keymap(user_keyconfig, False) + addon_prefs.rebind_switch_nav_rotate(user_keyconfig, addon_keyconfig, False) for cls in classes: bpy.utils.unregister_class(cls) From 8ec374146f0be3f045c3c6f6d7adac1f3a7e5ca3 Mon Sep 17 00:00:00 2001 From: Ryan Date: Tue, 10 Mar 2026 19:48:57 +0800 Subject: [PATCH 4/4] Fixed empty lists causing rebinds to fail. --- __init__.py | 4 ++-- preferences.py | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/__init__.py b/__init__.py index 1ab79b3..08ed1f3 100644 --- a/__init__.py +++ b/__init__.py @@ -33,7 +33,7 @@ ] -def register_keymaps(menumodes, panelmodes, keyconfig): +def register_keymaps(menumodes, panelmodes, keyconfig): # Deactivating menus for i in menumodes: for key in keyconfig.keymaps[i].keymap_items: @@ -90,7 +90,7 @@ def rebind_rmb(scene): addon_prefs = bpy.context.preferences.addons[__package__].preferences addon_prefs.menumodes = menumodes addon_prefs.panelmodes = panelmodes - + wm = bpy.context.window_manager active_keyconfig = wm.keyconfigs.active addon_keyconfig = wm.keyconfigs.addon diff --git a/preferences.py b/preferences.py index ae29742..cc0e625 100644 --- a/preferences.py +++ b/preferences.py @@ -261,7 +261,7 @@ def rebind_3dview_keymap(self, keyconfig, isActive): if key.idname == "transform.translate" and key.type == "MIDDLEMOUSE": key.type = "RIGHTMOUSE" - def rebind_switch_nav_rotate(self, keyconfig, addon_kc, isActive): + def rebind_switch_nav_rotate(self, keyconfig, addon_kc, isActive): if isActive: for key in addon_kc.keymaps["3D View"].keymap_items: if key.idname == "rmn.right_mouse_navigation": @@ -273,15 +273,15 @@ def rebind_switch_nav_rotate(self, keyconfig, addon_kc, isActive): key.type = "RIGHTMOUSE" key.value = "CLICK_DRAG" key.alt = False - for i in menumodes: + for i in self.menumodes: for key in keyconfig.keymaps[i].keymap_items: if key.idname == "wm.call_menu" and key.type == "RIGHTMOUSE": key.active = True key.value = "CLICK" - for i in panelmodes: + for i in self.panelmodes: for key in keyconfig.keymaps[i].keymap_items: - if key.idname == "wm.call_panel" and key.type == "RIGHTMOUSE" and key.active: - key.active = False + if key.idname == "wm.call_panel" and key.type == "RIGHTMOUSE": + key.active = True key.value = "CLICK" else: for key in addon_kc.keymaps["3D View"].keymap_items: @@ -294,15 +294,15 @@ def rebind_switch_nav_rotate(self, keyconfig, addon_kc, isActive): key.type = "RIGHTMOUSE" key.value = "CLICK_DRAG" key.alt = True - for i in menumodes: + for i in self.menumodes: for key in keyconfig.keymaps[i].keymap_items: if key.idname == "wm.call_menu" and key.type == "RIGHTMOUSE": key.active = False key.value = "PRESS" - for i in panelmodes: + for i in self.panelmodes: for key in keyconfig.keymaps[i].keymap_items: if key.idname == "wm.call_panel" and key.type == "RIGHTMOUSE": - key.active = True + key.active = False key.value = "PRESS" def draw(self, context):