Keymap: Frame active element with Mouse Button 4

Most modern mice include extra side buttons, commonly labeled
"Previous" and "Next" buttons which are more and more used.
Until now those buttons weren't used by default in Blender keymap.

This PR assigns various "Frame Selected" operators to the Button 4.
In every place where Numpad . (dot/comma) was used for framing active
element, now works with Mouse Button 4 as well (only exception being
File Browser, where MB4 is already used as "Back" to mimic how OS
file browsers work).

Pull Request: https://projects.blender.org/blender/blender/pulls/158549
This commit is contained in:
1P2D 2026-05-28 13:19:24 +02:00 • committed by Nika Kutsniashvili
parent 40c0786af9
commit bbf1ac1b4a

View file

@ -1396,6 +1396,7 @@ def km_outliner(params):
("outliner.show_hierarchy", {"type": 'HOME', "value": 'PRESS'}, None),
("outliner.show_active", {"type": 'PERIOD', "value": 'PRESS'}, None),
("outliner.show_active", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
("outliner.show_active", {"type": 'BUTTON4MOUSE', "value": 'PRESS'}, None),
("outliner.scroll_page", {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True},
{"properties": [("up", False)]}),
("outliner.scroll_page", {"type": 'PAGE_UP', "value": 'PRESS', "repeat": True},
@ -1659,6 +1660,7 @@ def km_view3d(params):
("view3d.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS', "ctrl": True},
{"properties": [("use_all_regions", True)]}),
("view3d.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
("view3d.view_selected", {"type": 'BUTTON4MOUSE', "value": 'PRESS'}, None),
("view3d.smoothview", {"type": 'TIMER1', "value": 'ANY', "any": True}, None),
("view3d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
("view3d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
@ -2073,6 +2075,7 @@ def km_graph_editor(params):
("graph.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
("graph.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
("graph.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
("graph.view_selected", {"type": 'BUTTON4MOUSE', "value": 'PRESS'}, None),
("graph.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
op_menu_pie("GRAPH_MT_view_pie", {"type": 'ACCENT_GRAVE', "value": 'PRESS'}),
("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
@ -2168,6 +2171,7 @@ def km_image(params):
("image.view_all", {"type": 'HOME', "value": 'PRESS', "shift": True},
{"properties": [("fit_view", True)]}),
("image.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
("image.view_selected", {"type": 'BUTTON4MOUSE', "value": 'PRESS'}, None),
("image.view_cursor_center", {"type": 'C', "value": 'PRESS', "shift": True}, None),
("image.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
("image.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
@ -2353,6 +2357,7 @@ def km_node_editor(params):
("node.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
("node.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
("node.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
("node.view_selected", {"type": 'BUTTON4MOUSE', "value": 'PRESS'}, None),
op_menu_pie("NODE_MT_view_pie", {"type": 'ACCENT_GRAVE', "value": 'PRESS'}),
("node.delete", {"type": 'X', "value": 'PRESS'}, None),
("node.delete", {"type": 'DEL', "value": 'PRESS'}, None),
@ -2721,6 +2726,7 @@ def km_dopesheet(params):
("action.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
("action.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
("action.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
("action.view_selected", {"type": 'BUTTON4MOUSE', "value": 'PRESS'}, None),
("action.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
op_menu_pie("DOPESHEET_MT_view_pie", {"type": 'ACCENT_GRAVE', "value": 'PRESS'}),
("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
@ -2839,6 +2845,7 @@ def km_nla_editor(params):
("nla.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
("nla.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
("nla.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
("nla.view_selected", {"type": 'BUTTON4MOUSE', "value": 'PRESS'}, None),
("nla.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
op_menu_pie("NLA_MT_view_pie", {"type": 'ACCENT_GRAVE', "value": 'PRESS'}),
("nla.actionclip_add", {"type": 'A', "value": 'PRESS', "shift": True}, None),
@ -3176,6 +3183,7 @@ def km_sequencer(params):
("sequencer.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
("sequencer.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
("sequencer.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
("sequencer.view_selected", {"type": 'BUTTON4MOUSE', "value": 'PRESS'}, None),
("sequencer.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
("sequencer.strip_jump", {"type": 'PAGE_UP', "value": 'PRESS', "repeat": True},
{"properties": [("next", False), ("center", False)]}),
@ -3304,6 +3312,7 @@ def km_sequencer_preview(params):
# View.
("sequencer.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
("sequencer.view_selected", {"type": 'BUTTON4MOUSE', "value": 'PRESS'}, None),
("sequencer.view_all_preview", {"type": 'HOME', "value": 'PRESS'}, None),
("sequencer.view_all_preview", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
("sequencer.view_ghost_border", {"type": 'O', "value": 'PRESS'}, None),
@ -3561,6 +3570,7 @@ def km_clip_editor(params):
("clip.view_all", {"type": 'F', "value": 'PRESS'},
{"properties": [("fit_view", True)]}),
("clip.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
("clip.view_selected", {"type": 'BUTTON4MOUSE', "value": 'PRESS'}, None),
("clip.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
("clip.view_ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
("clip.frame_jump", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True},
@ -3911,6 +3921,7 @@ def km_animation_channels(params):
# View
("anim.channel_view_pick", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "alt": True}, None),
("anim.channels_view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
("anim.channels_view_selected", {"type": 'BUTTON4MOUSE', "value": 'PRESS'}, None),
])
return keymap