b924625b4defc3537d4ae85b55fe2516abc80496
[blender.git] / release / scripts / presets / keyconfig / keymap_data / blender_default.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19
20 # ------------------------------------------------------------------------------
21 # Configurable Parameters
22
23 class Params:
24     __slots__ = (
25         "apple",
26         "legacy",
27         "select_mouse",
28         "select_mouse_value",
29         "select_tweak",
30         "action_mouse",
31         "action_tweak",
32         "tool_mouse",
33         "tool_tweak",
34         "context_menu_event",
35         "cursor_set_event",
36         "cursor_tweak_event",
37         "use_mouse_emulate_3_button",
38         # Experimental option.
39         "pie_value",
40
41         # User preferences.
42         #
43         # Swap 'Space/Shift-Space'.
44         "spacebar_action",
45         # Key toggles selection with 'A'.
46         "use_select_all_toggle",
47         # Activate gizmo on drag (which support it).
48         "use_gizmo_drag",
49         # Use pie menu for tab by default (swap 'Tab/Ctrl-Tab').
50         "use_v3d_tab_menu",
51         # Use extended pie menu for shading.
52         "use_v3d_shade_ex_pie",
53         # Swap orbit/pan keys (for 2D workflows).
54         "use_v3d_mmb_pan",
55         # Experimental option.
56         "use_pie_click_drag",
57         "v3d_tilde_action",
58         # Alt-MMB axis switching 'RELATIVE' or 'ABSOLUTE' axis switching.
59         "v3d_alt_mmb_drag_action",
60     )
61
62     def __init__(
63             self,
64             *,
65             legacy=False,
66             select_mouse='RIGHT',
67             use_mouse_emulate_3_button=False,
68
69             # User preferences.
70             spacebar_action='TOOL',
71             use_select_all_toggle=False,
72             use_gizmo_drag=True,
73             use_v3d_tab_menu=False,
74             use_v3d_shade_ex_pie=False,
75             use_v3d_mmb_pan=False,
76             use_pie_click_drag=False,
77             v3d_tilde_action='VIEW',
78             v3d_alt_mmb_drag_action='RELATIVE',
79     ):
80         from sys import platform
81         self.apple = (platform == 'darwin')
82         self.legacy = legacy
83
84         if select_mouse == 'RIGHT':
85             # Right mouse select.
86             self.select_mouse = 'RIGHTMOUSE'
87             self.select_mouse_value = 'PRESS'
88             self.select_tweak = 'EVT_TWEAK_R'
89             self.action_mouse = 'LEFTMOUSE'
90             self.action_tweak = 'EVT_TWEAK_L'
91             self.tool_mouse = 'LEFTMOUSE'
92             self.tool_tweak = 'EVT_TWEAK_L'
93             self.context_menu_event = {"type": 'W', "value": 'PRESS'}
94             self.cursor_set_event = {"type": 'LEFTMOUSE', "value": 'CLICK'}
95             self.cursor_tweak_event = None
96         else:
97             # Left mouse select uses Click event for selection. This is a little
98             # less immediate, but is needed to distinguish between click and tweak
99             # events on the same mouse buttons.
100             self.select_mouse = 'LEFTMOUSE'
101             self.select_mouse_value = 'CLICK'
102             self.select_tweak = 'EVT_TWEAK_L'
103             self.action_mouse = 'RIGHTMOUSE'
104             self.action_tweak = 'EVT_TWEAK_R'
105             self.tool_mouse = 'LEFTMOUSE'
106             self.tool_tweak = 'EVT_TWEAK_L'
107
108             if self.legacy:
109                 self.context_menu_event = {"type": 'W', "value": 'PRESS'}
110             else:
111                 self.context_menu_event = {"type": 'RIGHTMOUSE', "value": 'PRESS'}
112
113             self.cursor_set_event = {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True}
114             self.cursor_tweak_event = {"type": 'EVT_TWEAK_R', "value": 'ANY', "shift": True}
115
116         self.use_mouse_emulate_3_button = use_mouse_emulate_3_button
117
118         # User preferences
119         self.spacebar_action = spacebar_action
120
121         self.use_gizmo_drag = use_gizmo_drag
122         self.use_select_all_toggle = use_select_all_toggle
123         self.use_v3d_tab_menu = use_v3d_tab_menu
124         self.use_v3d_shade_ex_pie = use_v3d_shade_ex_pie
125         self.use_v3d_mmb_pan = use_v3d_mmb_pan
126         self.v3d_tilde_action = v3d_tilde_action
127         self.v3d_alt_mmb_drag_action = v3d_alt_mmb_drag_action
128
129         self.use_pie_click_drag = use_pie_click_drag
130         if not use_pie_click_drag:
131             self.pie_value = 'PRESS'
132         else:
133             self.pie_value = 'CLICK_DRAG'
134
135
136 # ------------------------------------------------------------------------------
137 # Constants
138
139
140 # Physical layout.
141 NUMBERS_1 = ('ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE', 'ZERO')
142 # Numeric order.
143 NUMBERS_0 = ('ZERO', 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE')
144
145
146 # ------------------------------------------------------------------------------
147 # Keymap Item Wrappers
148
149 def op_menu(menu, kmi_args):
150     return ("wm.call_menu", kmi_args, {"properties": [("name", menu)]})
151
152
153 def op_menu_pie(menu, kmi_args):
154     return ("wm.call_menu_pie", kmi_args, {"properties": [("name", menu)]})
155
156
157 def op_panel(menu, kmi_args, kmi_data=()):
158     return ("wm.call_panel", kmi_args, {"properties": [("name", menu), *kmi_data]})
159
160
161 def op_tool(tool, kmi_args):
162     return ("wm.tool_set_by_id", kmi_args, {"properties": [("name", tool)]})
163
164
165 def op_tool_cycle(tool, kmi_args):
166     return ("wm.tool_set_by_id", kmi_args, {"properties": [("name", tool), ("cycle", True)]})
167
168
169 # ------------------------------------------------------------------------------
170 # Keymap Templates
171
172 def _template_items_context_menu(menu, key_args_primary):
173     return [
174         op_menu(menu, kmi_args)
175         for kmi_args in (key_args_primary, {"type": 'APP', "value": 'PRESS'})
176     ]
177
178
179 def _template_items_context_panel(menu, key_args_primary):
180     return [
181         op_panel(menu, kmi_args)
182         for kmi_args in (key_args_primary, {"type": 'APP', "value": 'PRESS'})
183     ]
184
185
186 def _template_space_region_type_toggle(*, toolbar_key=None, sidebar_key=None):
187     items = []
188     if toolbar_key is not None:
189         items.append(
190             ("wm.context_toggle", toolbar_key,
191              {"properties": [("data_path", 'space_data.show_region_toolbar')]})
192         )
193     if sidebar_key is not None:
194         items.append(
195             ("wm.context_toggle", sidebar_key,
196              {"properties": [("data_path", 'space_data.show_region_ui')]}),
197         )
198     return items
199
200
201 def _template_items_select_actions(params, operator):
202     if not params.use_select_all_toggle:
203         return [
204             (operator, {"type": 'A', "value": 'PRESS'}, {"properties": [("action", 'SELECT')]}),
205             (operator, {"type": 'A', "value": 'PRESS', "alt": True}, {"properties": [("action", 'DESELECT')]}),
206             (operator, {"type": 'I', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'INVERT')]}),
207             (operator, {"type": 'A', "value": 'DOUBLE_CLICK'}, {"properties": [("action", 'DESELECT')]}),
208         ]
209     elif params.legacy:
210         # Alt+A is for playback in legacy keymap.
211         return [
212             (operator, {"type": 'A', "value": 'PRESS'}, {"properties": [("action", 'TOGGLE')]}),
213             (operator, {"type": 'I', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'INVERT')]}),
214         ]
215     else:
216         return [
217             (operator, {"type": 'A', "value": 'PRESS'}, {"properties": [("action", 'TOGGLE')]}),
218             (operator, {"type": 'A', "value": 'PRESS', "alt": True}, {"properties": [("action", 'DESELECT')]}),
219             (operator, {"type": 'I', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'INVERT')]}),
220         ]
221
222
223 def _template_items_object_subdivision_set():
224     return [
225         ("object.subdivision_set",
226          {"type": NUMBERS_0[i], "value": 'PRESS', "ctrl": True},
227          {"properties": [("level", i), ("relative", False)]})
228         for i in range(6)
229     ]
230
231
232 def _template_items_gizmo_tweak_value():
233     return [
234         ("gizmogroup.gizmo_tweak", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
235     ]
236
237
238 def _template_items_gizmo_tweak_value_click_drag():
239     return [
240         ("gizmogroup.gizmo_tweak", {"type": 'LEFTMOUSE', "value": 'CLICK', "any": True}, None),
241         ("gizmogroup.gizmo_tweak", {"type": 'EVT_TWEAK_L', "value": 'ANY', "any": True}, None),
242     ]
243
244
245 def _template_items_gizmo_tweak_value_drag():
246     return [
247         ("gizmogroup.gizmo_tweak", {"type": 'EVT_TWEAK_L', "value": 'ANY', "any": True}, None),
248     ]
249
250
251 def _template_items_editmode_mesh_select_mode(params):
252     if params.legacy:
253         return [
254             op_menu("VIEW3D_MT_edit_mesh_select_mode", {"type": 'TAB', "value": 'PRESS', "ctrl": True}),
255         ]
256     else:
257         return [
258             (
259                 "mesh.select_mode",
260                 {"type": k, "value": 'PRESS', **key_expand, **key_extend},
261                 {"properties": [*prop_extend, *prop_expand, ("type", e)]}
262             )
263             for key_expand, prop_expand in (({}, ()), ({"ctrl": True}, (("use_expand", True),)))
264             for key_extend, prop_extend in (({}, ()), ({"shift": True}, (("use_extend", True),)))
265             for k, e in (('ONE', 'VERT'), ('TWO', 'EDGE'), ('THREE', 'FACE'))
266         ]
267
268 def _template_items_uv_select_mode(params):
269     if params.legacy:
270         return [
271             op_menu("IMAGE_MT_uvs_select_mode", {"type": 'TAB', "value": 'PRESS', "ctrl": True}),
272         ]
273     else:
274         return [
275             *_template_items_editmode_mesh_select_mode(params),
276             ("mesh.select_mode", {"type": 'FOUR', "value": 'PRESS'}, None),
277             ("wm.context_set_enum", {"type": 'ONE', "value": 'PRESS'},
278              {"properties": [("data_path", 'tool_settings.uv_select_mode'), ("value", 'VERTEX')]}),
279             ("wm.context_set_enum", {"type": 'TWO', "value": 'PRESS'},
280              {"properties": [("data_path", 'tool_settings.uv_select_mode'), ("value", 'EDGE')]}),
281             ("wm.context_set_enum", {"type": 'THREE', "value": 'PRESS'},
282              {"properties": [("data_path", 'tool_settings.uv_select_mode'), ("value", 'FACE')]}),
283             ("wm.context_set_enum", {"type": 'FOUR', "value": 'PRESS'},
284              {"properties": [("data_path", 'tool_settings.uv_select_mode'), ("value", 'ISLAND')]}),
285         ]
286
287 def _template_items_proportional_editing(*, connected=False):
288     return [
289         op_menu_pie("VIEW3D_MT_proportional_editing_falloff_pie", {"type": 'O', "value": 'PRESS', "shift": True}),
290         ("wm.context_toggle", {"type": 'O', "value": 'PRESS'},
291          {"properties": [("data_path", 'tool_settings.use_proportional_edit')]}),
292         *(() if not connected else (
293             ("wm.context_toggle", {"type": 'O', "value": 'PRESS', "alt": True},
294              {"properties": [("data_path", 'tool_settings.use_proportional_connected')]}),
295         ))
296     ]
297
298
299 def _template_items_change_frame(params):
300     if params.select_mouse == 'LEFTMOUSE' and not params.legacy:
301         return [
302             ("anim.change_frame", {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True}, None),
303         ]
304     else:
305         return [
306             ("anim.change_frame", {"type": params.action_mouse, "value": 'PRESS'}, None),
307         ]
308
309
310 # Tool System Templates
311
312 def _template_items_tool_select(params, operator, cursor_operator, *, extend):
313     if params.select_mouse == 'LEFTMOUSE':
314         # Immediate select without quick delay.
315         return [
316             (operator, {"type": 'LEFTMOUSE', "value": 'PRESS'},
317              {"properties": [("deselect_all", True)]}),
318             (operator, {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
319              {"properties": [(extend, True)]}),
320         ]
321     else:
322         # For right mouse, set the cursor.
323         return [
324             (cursor_operator, {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
325             ("transform.translate", {"type": 'EVT_TWEAK_L', "value": 'ANY'},
326              {"properties": [("release_confirm", True), ("cursor_transform", True)]}),
327         ]
328
329
330 def _template_items_tool_select_actions(operator, *, type, value):
331     kmi_args = {"type": type, "value": value}
332     return [
333         (operator, kmi_args, None),
334         (operator, {**kmi_args, "shift": True},
335          {"properties": [("mode", 'ADD')]}),
336         (operator, {**kmi_args, "ctrl": True},
337          {"properties": [("mode", 'SUB')]}),
338         (operator, {**kmi_args, "shift": True, "ctrl": True},
339          {"properties": [("mode", 'AND')]}),
340     ]
341
342
343 # This could have a more generic name, for now use for circle select.
344 def _template_items_tool_select_actions_simple(operator, *, type, value, properties=[]):
345     kmi_args = {"type": type, "value": value}
346     return [
347         # Don't define 'SET' here, take from the tool options.
348         (operator, kmi_args,
349          {"properties": properties}),
350         (operator, {**kmi_args, "shift": True},
351          {"properties": [*properties, ("mode", 'ADD')]}),
352         (operator, {**kmi_args, "ctrl": True},
353          {"properties": [*properties, ("mode", 'SUB')]}),
354     ]
355
356
357 def _template_items_legacy_tools_from_numbers():
358     return [
359         ("wm.tool_set_by_index",
360          {"type": NUMBERS_1[i % 10], "value": 'PRESS', "shift": i >= 10},
361          {"properties": [("index", i)]})
362         for i in range(20)
363     ]
364
365
366 # ------------------------------------------------------------------------------
367 # Window, Screen, Areas, Regions
368
369 def km_window(params):
370     items = []
371     keymap = (
372         "Window",
373         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
374         {"items": items},
375     )
376
377     if params.legacy:
378         # Old shortcuts
379         items.extend([
380             ("wm.save_homefile", {"type": 'U', "value": 'PRESS', "ctrl": True}, None),
381             ("wm.open_mainfile", {"type": 'F1', "value": 'PRESS'}, None),
382             ("wm.link", {"type": 'O', "value": 'PRESS', "ctrl": True, "alt": True}, None),
383             ("wm.append", {"type": 'F1', "value": 'PRESS', "shift": True}, None),
384             ("wm.save_mainfile", {"type": 'W', "value": 'PRESS', "ctrl": True}, None),
385             ("wm.save_as_mainfile", {"type": 'F2', "value": 'PRESS'}, None),
386             ("wm.save_as_mainfile", {"type": 'S', "value": 'PRESS', "ctrl": True, "alt": True},
387              {"properties": [("copy", True)]}),
388             ("wm.window_new", {"type": 'W', "value": 'PRESS', "ctrl": True, "alt": True}, None),
389             ("wm.window_fullscreen_toggle", {"type": 'F11', "value": 'PRESS', "alt": True}, None),
390             ("wm.doc_view_manual_ui_context", {"type": 'F1', "value": 'PRESS', "alt": True}, None),
391             ("wm.search_menu", {"type": 'SPACE', "value": 'PRESS'}, None),
392             ("wm.redraw_timer", {"type": 'T', "value": 'PRESS', "ctrl": True, "alt": True}, None),
393             ("wm.debug_menu", {"type": 'D', "value": 'PRESS', "ctrl": True, "alt": True}, None),
394         ])
395
396     items.extend([
397         # File operations
398         op_menu("TOPBAR_MT_file_new", {"type": 'N', "value": 'PRESS', "ctrl": True}),
399         op_menu("TOPBAR_MT_file_open_recent", {"type": 'O', "value": 'PRESS', "shift": True, "ctrl": True}),
400         ("wm.open_mainfile", {"type": 'O', "value": 'PRESS', "ctrl": True}, None),
401         ("wm.save_mainfile", {"type": 'S', "value": 'PRESS', "ctrl": True}, None),
402         ("wm.save_as_mainfile", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True}, None),
403         ("wm.quit_blender", {"type": 'Q', "value": 'PRESS', "ctrl": True}, None),
404
405         # Quick menu and toolbar
406         op_menu("SCREEN_MT_user_menu", {"type": 'Q', "value": 'PRESS'}),
407
408         # Fast editor switching
409         *(
410             ("screen.space_type_set_or_cycle",
411              {"type": k, "value": 'PRESS', "shift": True},
412              {"properties": [("space_type", t)]})
413             for k, t in (
414                 ('F1', 'FILE_BROWSER'),
415                 ('F2', 'CLIP_EDITOR'),
416                 ('F3', 'NODE_EDITOR'),
417                 ('F4', 'CONSOLE'),
418                 ('F5', 'VIEW_3D'),
419                 ('F6', 'GRAPH_EDITOR'),
420                 ('F7', 'PROPERTIES'),
421                 ('F8', 'SEQUENCE_EDITOR'),
422                 ('F9', 'OUTLINER'),
423                 ('F10', 'IMAGE_EDITOR'),
424                 ('F11', 'TEXT_EDITOR'),
425                 ('F12', 'DOPESHEET_EDITOR'),
426             )
427         ),
428
429         # NDOF settings
430         op_panel("USERPREF_PT_ndof_settings", {"type": 'NDOF_BUTTON_MENU', "value": 'PRESS'}),
431         ("wm.context_scale_float", {"type": 'NDOF_BUTTON_PLUS', "value": 'PRESS'},
432          {"properties": [("data_path", 'preferences.inputs.ndof_sensitivity'), ("value", 1.1)]}),
433         ("wm.context_scale_float", {"type": 'NDOF_BUTTON_MINUS', "value": 'PRESS'},
434          {"properties": [("data_path", 'preferences.inputs.ndof_sensitivity'), ("value", 1.0 / 1.1)]}),
435         ("wm.context_scale_float", {"type": 'NDOF_BUTTON_PLUS', "value": 'PRESS', "shift": True},
436          {"properties": [("data_path", 'preferences.inputs.ndof_sensitivity'), ("value", 1.5)]}),
437         ("wm.context_scale_float", {"type": 'NDOF_BUTTON_MINUS', "value": 'PRESS', "shift": True},
438          {"properties": [("data_path", 'preferences.inputs.ndof_sensitivity'), ("value", 2.0 / 3.0)]}),
439         ("info.reports_display_update", {"type": 'TIMER_REPORT', "value": 'ANY', "any": True}, None),
440     ])
441
442     if not params.legacy:
443         # New shortcuts
444         items.extend([
445             ("wm.doc_view_manual_ui_context", {"type": 'F1', "value": 'PRESS'}, None),
446             op_panel("TOPBAR_PT_name", {"type": 'F2', "value": 'PRESS'}, [("keep_open", False)]),
447             ("wm.batch_rename", {"type": 'F2', "value": 'PRESS', "ctrl": True}, None),
448             ("wm.search_menu", {"type": 'F3', "value": 'PRESS'}, None),
449             op_menu("TOPBAR_MT_file_context_menu", {"type": 'F4', "value": 'PRESS'}),
450             # Pass through when when no tool-system exists or the fallback isn't available.
451             ("wm.toolbar_fallback_pie", {"type": 'W', "value": 'PRESS', "alt": True}, None),
452             # Alt as "Leader-Key".
453             ("wm.toolbar_prompt", {"type": 'LEFT_ALT', "value": 'CLICK'}, None),
454             ("wm.toolbar_prompt", {"type": 'RIGHT_ALT', "value": 'CLICK'}, None),
455         ])
456
457         if params.spacebar_action == 'TOOL':
458             items.append(
459                 ("wm.toolbar", {"type": 'SPACE', "value": 'PRESS'}, None),
460             )
461         elif params.spacebar_action == 'PLAY':
462             items.append(
463                 ("wm.toolbar", {"type": 'SPACE', "value": 'PRESS', "shift": True}, None),
464             )
465         elif params.spacebar_action == 'SEARCH':
466             items.append(
467                 ("wm.search_menu", {"type": 'SPACE', "value": 'PRESS'}, None),
468             )
469         else:
470             assert False
471
472     return keymap
473
474
475 def km_screen(params):
476     items = []
477     keymap = (
478         "Screen",
479         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
480         {"items": items},
481     )
482
483     items.extend([
484         # Animation
485         ("screen.animation_step", {"type": 'TIMER0', "value": 'ANY', "any": True}, None),
486         ("screen.region_blend", {"type": 'TIMERREGION', "value": 'ANY', "any": True}, None),
487         # Full screen and cycling
488         ("screen.space_context_cycle", {"type": 'TAB', "value": 'PRESS', "ctrl": True},
489          {"properties": [("direction", 'NEXT')]}),
490         ("screen.space_context_cycle", {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True},
491          {"properties": [("direction", 'PREV')]}),
492         ("screen.workspace_cycle", {"type": 'PAGE_DOWN', "value": 'PRESS', "ctrl": True},
493          {"properties": [("direction", 'NEXT')]}),
494         ("screen.workspace_cycle", {"type": 'PAGE_UP', "value": 'PRESS', "ctrl": True},
495          {"properties": [("direction", 'PREV')]}),
496         # Quad view
497         ("screen.region_quadview", {"type": 'Q', "value": 'PRESS', "ctrl": True, "alt": True}, None),
498         # Repeat last
499         ("screen.repeat_last", {"type": 'R', "value": 'PRESS', "shift": True}, None),
500         # Files
501         ("file.execute", {"type": 'RET', "value": 'PRESS'}, None),
502         ("file.execute", {"type": 'NUMPAD_ENTER', "value": 'PRESS'}, None),
503         ("file.cancel", {"type": 'ESC', "value": 'PRESS'}, None),
504         # Undo
505         ("ed.undo", {"type": 'Z', "value": 'PRESS', "ctrl": True}, None),
506         ("ed.redo", {"type": 'Z', "value": 'PRESS', "shift": True, "ctrl": True}, None),
507         # Render
508         ("render.render", {"type": 'F12', "value": 'PRESS'},
509          {"properties": [("use_viewport", True)]}),
510         ("render.render", {"type": 'F12', "value": 'PRESS', "ctrl": True},
511          {"properties": [("animation", True), ("use_viewport", True)]}),
512         ("render.view_cancel", {"type": 'ESC', "value": 'PRESS'}, None),
513         ("render.view_show", {"type": 'F11', "value": 'PRESS'}, None),
514         ("render.play_rendered_anim", {"type": 'F11', "value": 'PRESS', "ctrl": True}, None),
515     ])
516
517     if not params.legacy:
518         items.extend([
519             ("screen.screen_full_area", {"type": 'SPACE', "value": 'PRESS', "ctrl": True}, None),
520             ("screen.screen_full_area", {"type": 'SPACE', "value": 'PRESS', "ctrl": True, "alt": True},
521              {"properties": [("use_hide_panels", True)]}),
522             ("screen.redo_last", {"type": 'F9', "value": 'PRESS'}, None),
523         ])
524     else:
525         # Old keymap
526         items.extend([
527             ("ed.undo_history", {"type": 'Z', "value": 'PRESS', "ctrl": True, "alt": True}, None),
528             ("screen.screen_full_area", {"type": 'UP_ARROW', "value": 'PRESS', "ctrl": True}, None),
529             ("screen.screen_full_area", {"type": 'DOWN_ARROW', "value": 'PRESS', "ctrl": True}, None),
530             ("screen.screen_set", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True},
531              {"properties": [("delta", 1)]}),
532             ("screen.screen_set", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True},
533              {"properties": [("delta", -1)]}),
534             ("screen.screenshot", {"type": 'F3', "value": 'PRESS', "ctrl": True}, None),
535             ("screen.repeat_history", {"type": 'R', "value": 'PRESS', "ctrl": True, "alt": True}, None),
536             ("screen.region_flip", {"type": 'F5', "value": 'PRESS'}, None),
537             ("screen.redo_last", {"type": 'F6', "value": 'PRESS'}, None),
538             ("script.reload", {"type": 'F8', "value": 'PRESS'}, None),
539             ("screen.userpref_show", {"type": 'U', "value": 'PRESS', "ctrl": True, "alt": True}, None),
540         ])
541
542     if params.apple:
543         # Apple undo and user prefs
544         items.extend([
545             ("screen.userpref_show", {"type": 'COMMA', "value": 'PRESS', "oskey": True}, None),
546         ])
547
548     return keymap
549
550
551 def km_screen_editing(params):
552     items = []
553     keymap = ("Screen Editing",
554               {"space_type": 'EMPTY', "region_type": 'WINDOW'},
555               {"items": items})
556
557     items.extend([
558         # Action zones
559         ("screen.actionzone", {"type": 'LEFTMOUSE', "value": 'PRESS'},
560          {"properties": [("modifier", 0)]}),
561         ("screen.actionzone", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
562          {"properties": [("modifier", 1)]}),
563         ("screen.actionzone", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
564          {"properties": [("modifier", 2)]}),
565         # Screen tools
566         ("screen.area_split", {"type": 'ACTIONZONE_AREA', "value": 'ANY'}, None),
567         ("screen.area_join", {"type": 'ACTIONZONE_AREA', "value": 'ANY'}, None),
568         ("screen.area_dupli", {"type": 'ACTIONZONE_AREA', "value": 'ANY', "shift": True}, None),
569         ("screen.area_swap", {"type": 'ACTIONZONE_AREA', "value": 'ANY', "ctrl": True}, None),
570         ("screen.region_scale", {"type": 'ACTIONZONE_REGION', "value": 'ANY'}, None),
571         ("screen.screen_full_area", {"type": 'ACTIONZONE_FULLSCREEN', "value": 'ANY'},
572          {"properties": [("use_hide_panels", True)]}),
573         # Area move after action zones
574         ("screen.area_move", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
575         ("screen.area_options", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
576     ])
577
578     if params.legacy:
579         items.extend([
580             ("wm.context_toggle", {"type": 'F9', "value": 'PRESS', "alt": True},
581              {"properties": [("data_path", 'space_data.show_region_header')]})
582         ])
583
584     return keymap
585
586
587 def km_screen_region_context_menu(_params):
588     items = []
589     keymap = (
590         "Region Context Menu",
591         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
592         {"items": items},
593     )
594
595     items.extend([
596         ("screen.region_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
597     ])
598
599     return keymap
600
601
602 def km_view2d(_params):
603     items = []
604     keymap = (
605         "View2D",
606         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
607         {"items": items},
608     )
609
610     items.extend([
611         # Scrollbars
612         ("view2d.scroller_activate", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
613         ("view2d.scroller_activate", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
614         # Pan/scroll
615         ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
616         ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
617         ("view2d.pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
618         ("view2d.scroll_right", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True}, None),
619         ("view2d.scroll_left", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True}, None),
620         ("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True}, None),
621         ("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True}, None),
622         ("view2d.ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
623         # Zoom with single step
624         ("view2d.zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None),
625         ("view2d.zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS'}, None),
626         ("view2d.zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
627         ("view2d.zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
628         ("view2d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
629         ("view2d.smoothview", {"type": 'TIMER1', "value": 'ANY', "any": True}, None),
630         # Scroll up/down, only when zoom is not available.
631         ("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None),
632         ("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None),
633         ("view2d.scroll_right", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None),
634         ("view2d.scroll_left", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None),
635         # Zoom with drag and border
636         ("view2d.zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
637         ("view2d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
638         ("view2d.zoom_border", {"type": 'B', "value": 'PRESS', "shift": True}, None),
639     ])
640
641     return keymap
642
643
644 def km_view2d_buttons_list(_params):
645     items = []
646     keymap = (
647         "View2D Buttons List",
648         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
649         {"items": items},
650     )
651
652     items.extend([
653         # Scrollbars
654         ("view2d.scroller_activate", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
655         ("view2d.scroller_activate", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
656         # Pan scroll
657         ("view2d.pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
658         ("view2d.pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
659         ("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None),
660         ("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None),
661         ("view2d.scroll_down", {"type": 'PAGE_DOWN', "value": 'PRESS'},
662          {"properties": [("page", True)]}),
663         ("view2d.scroll_up", {"type": 'PAGE_UP', "value": 'PRESS'},
664          {"properties": [("page", True)]}),
665         # Zoom
666         ("view2d.zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
667         ("view2d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
668         ("view2d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
669         ("view2d.zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
670         ("view2d.zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
671         ("view2d.reset", {"type": 'HOME', "value": 'PRESS'}, None),
672     ])
673
674     return keymap
675
676
677 def km_user_interface(_params):
678     items = []
679     keymap = (
680         "User Interface",
681         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
682         {"items": items},
683     )
684
685     items.extend([
686         # Eyedroppers all have the same event, and pass it through until
687         # a suitable eyedropper handles it.
688         ("ui.eyedropper_color", {"type": 'E', "value": 'PRESS'}, None),
689         ("ui.eyedropper_colorramp", {"type": 'E', "value": 'PRESS'}, None),
690         ("ui.eyedropper_colorramp_point", {"type": 'E', "value": 'PRESS', "alt": True}, None),
691         ("ui.eyedropper_id", {"type": 'E', "value": 'PRESS'}, None),
692         ("ui.eyedropper_depth", {"type": 'E', "value": 'PRESS'}, None),
693         # Copy data path
694         ("ui.copy_data_path_button", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True}, None),
695         ("ui.copy_data_path_button", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
696          {"properties": [("full_path", True)]}),
697         # Keyframes and drivers
698         ("anim.keyframe_insert_button", {"type": 'I', "value": 'PRESS'},
699          {"properties": [("all", True)]}),
700         ("anim.keyframe_delete_button", {"type": 'I', "value": 'PRESS', "alt": True},
701          {"properties": [("all", True)]}),
702         ("anim.keyframe_clear_button", {"type": 'I', "value": 'PRESS', "shift": True, "alt": True},
703          {"properties": [("all", True)]}),
704         ("anim.driver_button_add", {"type": 'D', "value": 'PRESS', "ctrl": True}, None),
705         ("anim.driver_button_remove", {"type": 'D', "value": 'PRESS', "ctrl": True, "alt": True}, None),
706         ("anim.keyingset_button_add", {"type": 'K', "value": 'PRESS'}, None),
707         ("anim.keyingset_button_remove", {"type": 'K', "value": 'PRESS', "alt": True}, None),
708     ])
709
710     return keymap
711
712
713 # ------------------------------------------------------------------------------
714 # Editors
715
716
717 def km_property_editor(_params):
718     items = []
719     keymap = (
720         "Property Editor",
721         {"space_type": 'PROPERTIES', "region_type": 'WINDOW'},
722         {"items": items},
723     )
724
725     items.extend([
726         ("buttons.context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
727         ("screen.space_context_cycle", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True},
728          {"properties": [("direction", 'PREV'), ], },),
729         ("screen.space_context_cycle", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True},
730          {"properties": [("direction", 'NEXT'), ], },),
731         # Modifier panels
732         ("object.modifier_remove", {"type": 'X', "value": 'PRESS'}, {"properties": [("report", True)]}),
733         ("object.modifier_remove", {"type": 'DEL', "value": 'PRESS'}, {"properties": [("report", True)]}),
734         ("object.modifier_copy", {"type": 'D', "value": 'PRESS', "shift": True}, None),
735         ("object.modifier_apply", {"type": 'A', "value": 'PRESS', "ctrl": True}, {"properties": [("report", True)]}),
736     ])
737
738     return keymap
739
740
741 def km_outliner(params):
742     items = []
743     keymap = (
744         "Outliner",
745         {"space_type": 'OUTLINER', "region_type": 'WINDOW'},
746         {"items": items},
747     )
748
749     items.extend([
750         ("outliner.highlight_update", {"type": 'MOUSEMOVE', "value": 'ANY', "any": True}, None),
751         ("outliner.item_rename", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
752         ("outliner.item_rename", {"type": 'F2', "value": 'PRESS'}, None),
753         ("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK'},
754          {"properties": [("extend", False), ("deselect_all", not params.legacy)]}),
755         ("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True},
756          {"properties": [("extend", True), ("deselect_all", not params.legacy)]}),
757         ("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
758          {"properties": [("extend", False), ("extend_range", True), ("deselect_all", not params.legacy)]}),
759         ("outliner.item_activate", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True, "shift": True},
760          {"properties": [("extend", True), ("extend_range", True), ("deselect_all", not params.legacy)]}),
761         ("outliner.select_box", {"type": 'B', "value": 'PRESS'}, None),
762         ("outliner.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, {"properties": [("tweak", True)]}),
763         ("outliner.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', "shift": True},
764          {"properties": [("tweak", True), ("mode", "ADD")]}),
765         ("outliner.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', "ctrl": True},
766          {"properties": [("tweak", True), ("mode", "SUB")]}),
767         ("outliner.select_walk", {"type": 'UP_ARROW', "value": 'PRESS'}, {"properties": [("direction", 'UP')]}),
768         ("outliner.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
769          {"properties": [("direction", 'UP'), ("extend", True)]}),
770         ("outliner.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS'}, {"properties": [("direction", 'DOWN')]}),
771         ("outliner.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True},
772          {"properties": [("direction", 'DOWN'), ("extend", True)]}),
773         ("outliner.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS'}, {"properties": [("direction", 'LEFT')]}),
774         ("outliner.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True},
775          {"properties": [("direction", 'LEFT'), ("toggle_all", True)]}),
776         ("outliner.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS'}, {"properties": [("direction", 'RIGHT')]}),
777         ("outliner.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True},
778          {"properties": [("direction", 'RIGHT'), ("toggle_all", True)]}),
779         ("outliner.item_openclose", {"type": 'LEFTMOUSE', "value": 'CLICK'},
780          {"properties": [("all", False)]}),
781         ("outliner.item_openclose", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
782          {"properties": [("all", True)]}),
783         ("outliner.item_openclose", {"type": 'EVT_TWEAK_L', "value": 'ANY'},
784          {"properties": [("all", False)]}),
785         # Fall through to generic context menu if the item(s) selected have no type specific actions.
786         ("outliner.operation", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
787         op_menu("OUTLINER_MT_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}),
788         ("outliner.item_drag_drop", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
789         ("outliner.item_drag_drop", {"type": 'EVT_TWEAK_L', "value": 'ANY', "shift": True}, None),
790         ("outliner.show_hierarchy", {"type": 'HOME', "value": 'PRESS'}, None),
791         ("outliner.show_active", {"type": 'PERIOD', "value": 'PRESS'}, None),
792         ("outliner.show_active", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
793         ("outliner.scroll_page", {"type": 'PAGE_DOWN', "value": 'PRESS'},
794          {"properties": [("up", False)]}),
795         ("outliner.scroll_page", {"type": 'PAGE_UP', "value": 'PRESS'},
796          {"properties": [("up", True)]}),
797         ("outliner.show_one_level", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
798         ("outliner.show_one_level", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
799          {"properties": [("open", False)]}),
800         *_template_items_select_actions(params, "outliner.select_all"),
801         ("outliner.expanded_toggle", {"type": 'A', "value": 'PRESS', "shift": True}, None),
802         ("outliner.keyingset_add_selected", {"type": 'K', "value": 'PRESS'}, None),
803         ("outliner.keyingset_remove_selected", {"type": 'K', "value": 'PRESS', "alt": True}, None),
804         ("anim.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None),
805         ("anim.keyframe_delete", {"type": 'I', "value": 'PRESS', "alt": True}, None),
806         ("outliner.drivers_add_selected", {"type": 'D', "value": 'PRESS', "ctrl": True}, None),
807         ("outliner.drivers_delete_selected", {"type": 'D', "value": 'PRESS', "ctrl": True, "alt": True}, None),
808         ("outliner.collection_new", {"type": 'C', "value": 'PRESS'}, None),
809         ("outliner.delete", {"type": 'X', "value": 'PRESS'}, None),
810         ("outliner.delete", {"type": 'DEL', "value": 'PRESS'}, None),
811         ("object.move_to_collection", {"type": 'M', "value": 'PRESS'}, None),
812         ("object.link_to_collection", {"type": 'M', "value": 'PRESS', "shift": True}, None),
813         ("outliner.collection_exclude_set", {"type": 'E', "value": 'PRESS'}, None),
814         ("outliner.collection_exclude_clear", {"type": 'E', "value": 'PRESS', "alt": True}, None),
815         ("outliner.hide", {"type": 'H', "value": 'PRESS'}, None),
816         ("outliner.unhide_all", {"type": 'H', "value": 'PRESS', "alt": True}, None),
817         # Copy/paste.
818         ("outliner.id_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
819         ("outliner.id_paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
820     ])
821
822     return keymap
823
824
825 def km_uv_editor(params):
826     items = []
827     keymap = (
828         "UV Editor",
829         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
830         {"items": items},
831     )
832
833     items.extend([
834         # Selection modes.
835         *_template_items_uv_select_mode(params),
836         ("uv.mark_seam", {"type": 'E', "value": 'PRESS', "ctrl": True}, None),
837         ("uv.select", {"type": params.select_mouse, "value": params.select_mouse_value},
838          {"properties": [("extend", False), ("deselect_all", not params.legacy)]}),
839         ("uv.select", {"type": params.select_mouse, "value": params.select_mouse_value, "shift": True},
840          {"properties": [("extend", True)]}),
841         ("uv.select_loop", {"type": params.select_mouse, "value": params.select_mouse_value, "alt": True},
842          {"properties": [("extend", False)]}),
843         ("uv.select_loop", {"type": params.select_mouse, "value": params.select_mouse_value, "shift": True, "alt": True},
844          {"properties": [("extend", True)]}),
845         ("uv.select_split", {"type": 'Y', "value": 'PRESS'}, None),
846         ("uv.select_box", {"type": 'B', "value": 'PRESS'},
847          {"properties": [("pinned", False)]}),
848         ("uv.select_box", {"type": 'B', "value": 'PRESS', "ctrl": True},
849          {"properties": [("pinned", True)]}),
850         ("uv.select_circle", {"type": 'C', "value": 'PRESS'}, None),
851         ("uv.select_lasso", {"type": params.action_tweak, "value": 'ANY', "ctrl": True},
852          {"properties": [("mode", 'ADD')]}),
853         ("uv.select_lasso", {"type": params.action_tweak, "value": 'ANY', "shift": True, "ctrl": True},
854          {"properties": [("mode", 'SUB')]}),
855         ("uv.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
856         ("uv.select_linked_pick", {"type": 'L', "value": 'PRESS'},
857          {"properties": [("extend", True), ("deselect", False)]}),
858         ("uv.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
859          {"properties": [("extend", False), ("deselect", True)]}),
860         ("uv.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
861         ("uv.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
862         *_template_items_select_actions(params, "uv.select_all"),
863         ("uv.select_pinned", {"type": 'P', "value": 'PRESS', "shift": True}, None),
864         op_menu("IMAGE_MT_uvs_weldalign", {"type": 'W', "value": 'PRESS', "shift": True}),
865         ("uv.stitch", {"type": 'V', "value": 'PRESS'}, None),
866         ("uv.pin", {"type": 'P', "value": 'PRESS'},
867          {"properties": [("clear", False)]}),
868         ("uv.pin", {"type": 'P', "value": 'PRESS', "alt": True},
869          {"properties": [("clear", True)]}),
870         ("uv.unwrap", {"type": 'U', "value": 'PRESS'}, None),
871         ("uv.hide", {"type": 'H', "value": 'PRESS'},
872          {"properties": [("unselected", False)]}),
873         ("uv.hide", {"type": 'H', "value": 'PRESS', "shift": True},
874          {"properties": [("unselected", True)]}),
875         ("uv.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
876         op_menu_pie("IMAGE_MT_uvs_snap_pie", {"type": 'S', "value": 'PRESS', "shift": True}),
877         op_menu("IMAGE_MT_uvs_select_mode", {"type": 'TAB', "value": 'PRESS', "ctrl": True}),
878         *_template_items_proportional_editing(connected=False),
879         ("transform.translate", {"type": 'G', "value": 'PRESS', "repeat": False}, None),
880         ("transform.translate", {"type": params.select_tweak, "value": 'ANY'}, None),
881         ("transform.rotate", {"type": 'R', "value": 'PRESS', "repeat": False}, None),
882         ("transform.resize", {"type": 'S', "value": 'PRESS', "repeat": False}, None),
883         ("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True, "repeat": False}, None),
884         ("transform.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True, "repeat": False}, None),
885         ("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True},
886          {"properties": [("data_path", 'tool_settings.use_snap')]}),
887         ("wm.context_menu_enum", {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True},
888          {"properties": [("data_path", 'tool_settings.snap_uv_element')]}),
889         *_template_items_context_menu("IMAGE_MT_uvs_context_menu", params.context_menu_event),
890     ])
891
892     # Fallback for MMB emulation
893     if params.use_mouse_emulate_3_button and params.select_mouse == 'LEFTMOUSE':
894         items.extend([
895             ("uv.select_loop", {"type": params.select_mouse, "value": 'DOUBLE_CLICK'},
896              {"properties": [("extend", False)]}),
897             ("uv.select_loop", {"type": params.select_mouse, "value": 'DOUBLE_CLICK', "alt": True},
898              {"properties": [("extend", True)]}),
899         ])
900
901     # 3D cursor
902     if params.cursor_tweak_event:
903         items.extend([
904             ("uv.cursor_set", params.cursor_set_event, None),
905             ("transform.translate", params.cursor_tweak_event,
906              {"properties": [("release_confirm", True), ("cursor_transform", True)]}),
907         ])
908     else:
909         items.extend([
910             ("uv.cursor_set", params.cursor_set_event, None),
911         ])
912
913     if params.legacy:
914         items.extend([
915             ("uv.minimize_stretch", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
916             ("uv.pack_islands", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
917             ("uv.average_islands_scale", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
918         ])
919
920     if params.select_mouse == 'LEFTMOUSE' and not params.legacy:
921         # Quick switch to select tool, since left select can't easily
922         # select with any tool active.
923         items.extend([
924             op_tool_cycle("builtin.select_box", {"type": 'W', "value": 'PRESS'}),
925         ])
926
927     return keymap
928
929
930 # 3D View: all regions.
931 def km_view3d_generic(_params):
932     items = []
933     keymap = (
934         "3D View Generic",
935         {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
936         {"items": items},
937     )
938
939     items.extend([
940         *_template_space_region_type_toggle(
941             toolbar_key={"type": 'T', "value": 'PRESS'},
942             sidebar_key={"type": 'N', "value": 'PRESS'},
943         )
944     ])
945
946     return keymap
947
948
949 # 3D View: main region.
950 def km_view3d(params):
951     items = []
952     keymap = (
953         "3D View",
954         {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
955         {"items": items},
956     )
957
958     # 3D cursor
959     if params.cursor_tweak_event:
960         items.extend([
961             ("view3d.cursor3d", params.cursor_set_event, None),
962             ("transform.translate", params.cursor_tweak_event,
963              {"properties": [("release_confirm", True), ("cursor_transform", True)]}),
964         ])
965     else:
966         items.extend([
967             ("view3d.cursor3d", params.cursor_set_event, None),
968         ])
969
970     items.extend([
971         # Visibility.
972         ("view3d.localview", {"type": 'NUMPAD_SLASH', "value": 'PRESS'}, None),
973         ("view3d.localview", {"type": 'SLASH', "value": 'PRESS'}, None),
974         ("view3d.localview", {"type": 'MOUSESMARTZOOM', "value": 'ANY'}, None),
975         ("view3d.localview_remove_from", {"type": 'M', "value": 'PRESS'}, None),
976         # Navigation.
977         *((
978             ("view3d.rotate", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
979             ("view3d.move", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
980         ) if params.use_v3d_mmb_pan else (
981             ("view3d.rotate", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
982             ("view3d.move", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
983         )),
984         ("view3d.zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
985         ("view3d.dolly", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None),
986         ("view3d.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS', "ctrl": True},
987          {"properties": [("use_all_regions", True)]}),
988         ("view3d.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'},
989          {"properties": [("use_all_regions", False)]}),
990         ("view3d.smoothview", {"type": 'TIMER1', "value": 'ANY', "any": True}, None),
991         ("view3d.rotate", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
992         ("view3d.rotate", {"type": 'MOUSEROTATE', "value": 'ANY'}, None),
993         ("view3d.move", {"type": 'TRACKPADPAN', "value": 'ANY', "shift": True}, None),
994         ("view3d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
995         ("view3d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
996         ("view3d.zoom", {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
997          {"properties": [("delta", 1)]}),
998         ("view3d.zoom", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
999          {"properties": [("delta", -1)]}),
1000         ("view3d.zoom", {"type": 'EQUAL', "value": 'PRESS', "ctrl": True},
1001          {"properties": [("delta", 1)]}),
1002         ("view3d.zoom", {"type": 'MINUS', "value": 'PRESS', "ctrl": True},
1003          {"properties": [("delta", -1)]}),
1004         ("view3d.zoom", {"type": 'WHEELINMOUSE', "value": 'PRESS'},
1005          {"properties": [("delta", 1)]}),
1006         ("view3d.zoom", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'},
1007          {"properties": [("delta", -1)]}),
1008         ("view3d.dolly", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
1009          {"properties": [("delta", 1)]}),
1010         ("view3d.dolly", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
1011          {"properties": [("delta", -1)]}),
1012         ("view3d.dolly", {"type": 'EQUAL', "value": 'PRESS', "shift": True, "ctrl": True},
1013          {"properties": [("delta", 1)]}),
1014         ("view3d.dolly", {"type": 'MINUS', "value": 'PRESS', "shift": True, "ctrl": True},
1015          {"properties": [("delta", -1)]}),
1016         ("view3d.view_center_camera", {"type": 'HOME', "value": 'PRESS'}, None),
1017         ("view3d.view_center_lock", {"type": 'HOME', "value": 'PRESS'}, None),
1018         ("view3d.view_all", {"type": 'HOME', "value": 'PRESS'},
1019          {"properties": [("center", False)]}),
1020         ("view3d.view_all", {"type": 'HOME', "value": 'PRESS', "ctrl": True},
1021          {"properties": [("use_all_regions", True), ("center", False)]}),
1022         ("view3d.view_all", {"type": 'C', "value": 'PRESS', "shift": True},
1023          {"properties": [("center", True)]}),
1024         op_menu_pie(
1025             "VIEW3D_MT_view_pie" if params.v3d_tilde_action == 'VIEW' else "VIEW3D_MT_transform_gizmo_pie",
1026             {"type": 'ACCENT_GRAVE', "value": params.pie_value},
1027         ),
1028         *(() if not params.use_pie_click_drag else
1029           (("view3d.navigate", {"type": 'ACCENT_GRAVE', "value": 'CLICK'}, None),)),
1030         ("view3d.navigate", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "shift": True}, None),
1031         # Numpad views.
1032         ("view3d.view_camera", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
1033         ("view3d.view_axis", {"type": 'NUMPAD_1', "value": 'PRESS'},
1034          {"properties": [("type", 'FRONT')]}),
1035         ("view3d.view_orbit", {"type": 'NUMPAD_2', "value": 'PRESS'},
1036          {"properties": [("type", 'ORBITDOWN')]}),
1037         ("view3d.view_axis", {"type": 'NUMPAD_3', "value": 'PRESS'},
1038          {"properties": [("type", 'RIGHT')]}),
1039         ("view3d.view_orbit", {"type": 'NUMPAD_4', "value": 'PRESS'},
1040          {"properties": [("type", 'ORBITLEFT')]}),
1041         ("view3d.view_persportho", {"type": 'NUMPAD_5', "value": 'PRESS'}, None),
1042         ("view3d.view_orbit", {"type": 'NUMPAD_6', "value": 'PRESS'},
1043          {"properties": [("type", 'ORBITRIGHT')]}),
1044         ("view3d.view_axis", {"type": 'NUMPAD_7', "value": 'PRESS'},
1045          {"properties": [("type", 'TOP')]}),
1046         ("view3d.view_orbit", {"type": 'NUMPAD_8', "value": 'PRESS'},
1047          {"properties": [("type", 'ORBITUP')]}),
1048         ("view3d.view_axis", {"type": 'NUMPAD_1', "value": 'PRESS', "ctrl": True},
1049          {"properties": [("type", 'BACK')]}),
1050         ("view3d.view_axis", {"type": 'NUMPAD_3', "value": 'PRESS', "ctrl": True},
1051          {"properties": [("type", 'LEFT')]}),
1052         ("view3d.view_axis", {"type": 'NUMPAD_7', "value": 'PRESS', "ctrl": True},
1053          {"properties": [("type", 'BOTTOM')]}),
1054         ("view3d.view_pan", {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True},
1055          {"properties": [("type", 'PANDOWN')]}),
1056         ("view3d.view_pan", {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True},
1057          {"properties": [("type", 'PANLEFT')]}),
1058         ("view3d.view_pan", {"type": 'NUMPAD_6', "value": 'PRESS', "ctrl": True},
1059          {"properties": [("type", 'PANRIGHT')]}),
1060         ("view3d.view_pan", {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True},
1061          {"properties": [("type", 'PANUP')]}),
1062         ("view3d.view_roll", {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True},
1063          {"properties": [("type", 'LEFT')]}),
1064         ("view3d.view_roll", {"type": 'NUMPAD_6', "value": 'PRESS', "shift": True},
1065          {"properties": [("type", 'RIGHT')]}),
1066         ("view3d.view_orbit", {"type": 'NUMPAD_9', "value": 'PRESS'},
1067          {"properties": [("angle", 3.1415927), ("type", 'ORBITRIGHT')]}),
1068         ("view3d.view_axis", {"type": 'NUMPAD_1', "value": 'PRESS', "shift": True},
1069          {"properties": [("type", 'FRONT'), ("align_active", True)]}),
1070         ("view3d.view_axis", {"type": 'NUMPAD_3', "value": 'PRESS', "shift": True},
1071          {"properties": [("type", 'RIGHT'), ("align_active", True)]}),
1072         ("view3d.view_axis", {"type": 'NUMPAD_7', "value": 'PRESS', "shift": True},
1073          {"properties": [("type", 'TOP'), ("align_active", True)]}),
1074         ("view3d.view_axis", {"type": 'NUMPAD_1', "value": 'PRESS', "shift": True, "ctrl": True},
1075          {"properties": [("type", 'BACK'), ("align_active", True)]}),
1076         ("view3d.view_axis", {"type": 'NUMPAD_3', "value": 'PRESS', "shift": True, "ctrl": True},
1077          {"properties": [("type", 'LEFT'), ("align_active", True)]}),
1078         ("view3d.view_axis", {"type": 'NUMPAD_7', "value": 'PRESS', "shift": True, "ctrl": True},
1079          {"properties": [("type", 'BOTTOM'), ("align_active", True)]}),
1080         *((
1081             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'NORTH', "alt": True},
1082              {"properties": [("type", 'TOP'), ("relative", True)]}),
1083             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'SOUTH', "alt": True},
1084              {"properties": [("type", 'BOTTOM'), ("relative", True)]}),
1085             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'EAST', "alt": True},
1086              {"properties": [("type", 'RIGHT'), ("relative", True)]}),
1087             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'WEST', "alt": True},
1088              {"properties": [("type", 'LEFT'), ("relative", True)]}),
1089         ) if params.v3d_alt_mmb_drag_action == 'RELATIVE' else (
1090             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'NORTH', "alt": True},
1091              {"properties": [("type", 'TOP')]}),
1092             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'SOUTH', "alt": True},
1093              {"properties": [("type", 'BOTTOM')]}),
1094             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'EAST', "alt": True},
1095              {"properties": [("type", 'RIGHT')]}),
1096             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'WEST', "alt": True},
1097              {"properties": [("type", 'LEFT')]}),
1098             # Match the pie menu.
1099             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'NORTH_WEST', "alt": True},
1100              {"properties": [("type", 'FRONT')]}),
1101             ("view3d.view_axis", {"type": 'EVT_TWEAK_M', "value": 'NORTH_EAST', "alt": True},
1102              {"properties": [("type", 'BACK')]}),
1103         )),
1104         ("view3d.view_center_pick", {"type": 'MIDDLEMOUSE', "value": 'CLICK', "alt": True}, None),
1105         ("view3d.ndof_orbit_zoom", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
1106         ("view3d.ndof_orbit", {"type": 'NDOF_MOTION', "value": 'ANY', "ctrl": True}, None),
1107         ("view3d.ndof_pan", {"type": 'NDOF_MOTION', "value": 'ANY', "shift": True}, None),
1108         ("view3d.ndof_all", {"type": 'NDOF_MOTION', "value": 'ANY', "shift": True, "ctrl": True}, None),
1109         ("view3d.view_selected", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'},
1110          {"properties": [("use_all_regions", False)]}),
1111         ("view3d.view_roll", {"type": 'NDOF_BUTTON_ROLL_CCW', "value": 'PRESS'},
1112          {"properties": [("type", 'LEFT')]}),
1113         ("view3d.view_roll", {"type": 'NDOF_BUTTON_ROLL_CCW', "value": 'PRESS'},
1114          {"properties": [("type", 'RIGHT')]}),
1115         ("view3d.view_axis", {"type": 'NDOF_BUTTON_FRONT', "value": 'PRESS'},
1116          {"properties": [("type", 'FRONT')]}),
1117         ("view3d.view_axis", {"type": 'NDOF_BUTTON_BACK', "value": 'PRESS'},
1118          {"properties": [("type", 'BACK')]}),
1119         ("view3d.view_axis", {"type": 'NDOF_BUTTON_LEFT', "value": 'PRESS'},
1120          {"properties": [("type", 'LEFT')]}),
1121         ("view3d.view_axis", {"type": 'NDOF_BUTTON_RIGHT', "value": 'PRESS'},
1122          {"properties": [("type", 'RIGHT')]}),
1123         ("view3d.view_axis", {"type": 'NDOF_BUTTON_TOP', "value": 'PRESS'},
1124          {"properties": [("type", 'TOP')]}),
1125         ("view3d.view_axis", {"type": 'NDOF_BUTTON_BOTTOM', "value": 'PRESS'},
1126          {"properties": [("type", 'BOTTOM')]}),
1127         ("view3d.view_axis", {"type": 'NDOF_BUTTON_FRONT', "value": 'PRESS', "shift": True},
1128          {"properties": [("type", 'FRONT'), ("align_active", True)]}),
1129         ("view3d.view_axis", {"type": 'NDOF_BUTTON_RIGHT', "value": 'PRESS', "shift": True},
1130          {"properties": [("type", 'RIGHT'), ("align_active", True)]}),
1131         ("view3d.view_axis", {"type": 'NDOF_BUTTON_TOP', "value": 'PRESS', "shift": True},
1132          {"properties": [("type", 'TOP'), ("align_active", True)]}),
1133         # Selection.
1134         *((
1135             "view3d.select",
1136             {"type": params.select_mouse, "value": params.select_mouse_value, **{m: True for m in mods}},
1137             {"properties": [(c, True) for c in props]},
1138         ) for props, mods in (
1139             (("deselect_all",) if not params.legacy else (), ()),
1140             (("toggle",), ("shift",)),
1141             (("center", "object"), ("ctrl",)),
1142             (("enumerate",), ("alt",)),
1143             (("toggle", "center"), ("shift", "ctrl")),
1144             (("center", "enumerate"), ("ctrl", "alt")),
1145             (("toggle", "enumerate"), ("shift", "alt")),
1146             (("toggle", "center", "enumerate"), ("shift", "ctrl", "alt")),
1147         )),
1148         ("view3d.select_box", {"type": 'B', "value": 'PRESS'}, None),
1149         ("view3d.select_lasso", {"type": params.action_tweak, "value": 'ANY', "ctrl": True},
1150          {"properties": [("mode", 'ADD')]}),
1151         ("view3d.select_lasso", {"type": params.action_tweak, "value": 'ANY', "shift": True, "ctrl": True},
1152          {"properties": [("mode", 'SUB')]}),
1153         ("view3d.select_circle", {"type": 'C', "value": 'PRESS'}, None),
1154         # Borders.
1155         ("view3d.clip_border", {"type": 'B', "value": 'PRESS', "alt": True}, None),
1156         ("view3d.zoom_border", {"type": 'B', "value": 'PRESS', "shift": True}, None),
1157         ("view3d.render_border", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
1158         ("view3d.clear_render_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True}, None),
1159         # Cameras.
1160         ("view3d.camera_to_view", {"type": 'NUMPAD_0', "value": 'PRESS', "ctrl": True, "alt": True}, None),
1161         ("view3d.object_as_camera", {"type": 'NUMPAD_0', "value": 'PRESS', "ctrl": True}, None),
1162         # Copy/paste.
1163         ("view3d.copybuffer", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
1164         ("view3d.pastebuffer", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
1165         # Transform.
1166         ("transform.translate", {"type": 'G', "value": 'PRESS', "repeat": False}, None),
1167         ("transform.translate", {"type": params.select_tweak, "value": 'ANY'}, None),
1168         ("transform.rotate", {"type": 'R', "value": 'PRESS', "repeat": False}, None),
1169         ("transform.resize", {"type": 'S', "value": 'PRESS', "repeat": False}, None),
1170         ("transform.bend", {"type": 'W', "value": 'PRESS', "shift": True, "repeat": False}, None),
1171         ("transform.tosphere", {"type": 'S', "value": 'PRESS', "shift": True, "alt": True, "repeat": False}, None),
1172         ("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True, "repeat": False}, None),
1173         ("transform.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True, "repeat": False}, None),
1174         ("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True},
1175          {"properties": [("data_path", 'tool_settings.use_snap')]}),
1176         op_panel("VIEW3D_PT_snapping", {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True}, [("keep_open", False)]),
1177         ("object.transform_axis_target", {"type": 'T', "value": 'PRESS', "shift": True}, None),
1178         ("transform.skin_resize", {"type": 'A', "value": 'PRESS', "ctrl": True, "repeat": False}, None),
1179     ])
1180
1181     if not params.legacy:
1182         # New pie menus.
1183         items.extend([
1184             op_menu_pie("VIEW3D_MT_snap_pie", {"type": 'S', "value": 'PRESS', "shift": True}),
1185             ("wm.context_toggle", {"type": 'ACCENT_GRAVE', "value": 'PRESS', "ctrl": True},
1186              {"properties": [("data_path", 'space_data.show_gizmo')]}),
1187             op_menu_pie("VIEW3D_MT_pivot_pie", {"type": 'PERIOD', "value": 'PRESS'}),
1188             op_menu_pie("VIEW3D_MT_orientations_pie", {"type": 'COMMA', "value": 'PRESS'}),
1189             op_menu_pie(
1190                 "VIEW3D_MT_shading_pie" if not params.use_v3d_shade_ex_pie else
1191                 "VIEW3D_MT_shading_ex_pie",
1192                 {"type": 'Z', "value": params.pie_value}),
1193             *(() if not params.use_pie_click_drag else
1194               (("view3d.toggle_shading", {"type": 'Z', "value": 'CLICK'},
1195                 {"properties": [("type", 'WIREFRAME')]}),)),
1196             ("view3d.toggle_shading", {"type": 'Z', "value": 'PRESS', "shift": True},
1197              {"properties": [("type", 'WIREFRAME')]}),
1198             ("view3d.toggle_xray", {"type": 'Z', "value": 'PRESS', "alt": True}, None),
1199             ("wm.context_toggle", {"type": 'Z', "value": 'PRESS', "alt": True, "shift": True},
1200              {"properties": [("data_path", "space_data.overlay.show_overlays")]}),
1201         ])
1202     else:
1203         items.extend([
1204             # Old navigation.
1205             op_menu("VIEW3D_MT_snap", {"type": 'S', "value": 'PRESS', "shift": True}),
1206             ("view3d.view_lock_to_active", {"type": 'NUMPAD_PERIOD', "value": 'PRESS', "shift": True}, None),
1207             ("view3d.view_lock_clear", {"type": 'NUMPAD_PERIOD', "value": 'PRESS', "alt": True}, None),
1208             ("view3d.navigate", {"type": 'F', "value": 'PRESS', "shift": True}, None),
1209             ("view3d.zoom_camera_1_to_1", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "shift": True}, None),
1210             ("view3d.view_center_cursor", {"type": 'HOME', "value": 'PRESS', "alt": True}, None),
1211             ("view3d.view_center_pick", {"type": 'F', "value": 'PRESS', "alt": True}, None),
1212             ("view3d.view_pan", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True},
1213              {"properties": [("type", 'PANRIGHT')]}),
1214             ("view3d.view_pan", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True},
1215              {"properties": [("type", 'PANLEFT')]}),
1216             ("view3d.view_pan", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True},
1217              {"properties": [("type", 'PANUP')]}),
1218             ("view3d.view_pan", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True},
1219              {"properties": [("type", 'PANDOWN')]}),
1220             ("view3d.view_orbit", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
1221              {"properties": [("type", 'ORBITLEFT')]}),
1222             ("view3d.view_orbit", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True, "alt": True},
1223              {"properties": [("type", 'ORBITRIGHT')]}),
1224             ("view3d.view_orbit", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True, "alt": True},
1225              {"properties": [("type", 'ORBITUP')]}),
1226             ("view3d.view_orbit", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True, "alt": True},
1227              {"properties": [("type", 'ORBITDOWN')]}),
1228             ("view3d.view_roll", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
1229              {"properties": [("type", 'LEFT')]}),
1230             ("view3d.view_roll", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
1231              {"properties": [("type", 'RIGHT')]}),
1232             ("transform.create_orientation", {"type": 'SPACE', "value": 'PRESS', "ctrl": True, "alt": True},
1233              {"properties": [("use", True)]}),
1234             ("transform.translate", {"type": 'T', "value": 'PRESS', "shift": True, "repeat": False},
1235              {"properties": [("texture_space", True)]}),
1236             ("transform.resize", {"type": 'T', "value": 'PRESS', "shift": True, "alt": True, "repeat": False},
1237              {"properties": [("texture_space", True)]}),
1238             # Old pivot.
1239             ("wm.context_set_enum", {"type": 'COMMA', "value": 'PRESS'},
1240              {"properties": [("data_path", 'tool_settings.transform_pivot_point'), ("value", 'BOUNDING_BOX_CENTER')]}),
1241             ("wm.context_set_enum", {"type": 'COMMA', "value": 'PRESS', "ctrl": True},
1242              {"properties": [("data_path", 'tool_settings.transform_pivot_point'), ("value", 'MEDIAN_POINT')]}),
1243             ("wm.context_toggle", {"type": 'COMMA', "value": 'PRESS', "alt": True},
1244              {"properties": [("data_path", 'tool_settings.use_transform_pivot_point_align')]}),
1245             ("wm.context_toggle", {"type": 'SPACE', "value": 'PRESS', "ctrl": True},
1246              {"properties": [("data_path", 'space_data.show_gizmo_context')]}),
1247             ("wm.context_set_enum", {"type": 'PERIOD', "value": 'PRESS'},
1248              {"properties": [("data_path", 'tool_settings.transform_pivot_point'), ("value", 'CURSOR')]}),
1249             ("wm.context_set_enum", {"type": 'PERIOD', "value": 'PRESS', "ctrl": True},
1250              {"properties": [("data_path", 'tool_settings.transform_pivot_point'), ("value", 'INDIVIDUAL_ORIGINS')]}),
1251             ("wm.context_set_enum", {"type": 'PERIOD', "value": 'PRESS', "alt": True},
1252              {"properties": [("data_path", 'tool_settings.transform_pivot_point'), ("value", 'ACTIVE_ELEMENT')]}),
1253             # Old shading.
1254             ("wm.context_toggle_enum", {"type": 'Z', "value": 'PRESS'},
1255              {"properties": [("data_path", 'space_data.shading.type'), ("value_1", 'WIREFRAME'), ("value_2", 'SOLID')]}),
1256             ("wm.context_toggle_enum", {"type": 'Z', "value": 'PRESS', "shift": True},
1257              {"properties": [("data_path", 'space_data.shading.type'), ("value_1", 'RENDERED'), ("value_2", 'SOLID')]}),
1258             ("wm.context_toggle_enum", {"type": 'Z', "value": 'PRESS', "alt": True},
1259              {"properties": [("data_path", 'space_data.shading.type'), ("value_1", 'MATERIAL'), ("value_2", 'SOLID')]}),
1260         ])
1261
1262     if params.select_mouse == 'LEFTMOUSE' and not params.legacy:
1263         # Quick switch to select tool, since left select can't easily
1264         # select with any tool active.
1265         items.extend([
1266             op_tool_cycle("builtin.select_box", {"type": 'W', "value": 'PRESS'}),
1267         ])
1268
1269     return keymap
1270
1271
1272 def km_mask_editing(params):
1273     items = []
1274     keymap = (
1275         "Mask Editing",
1276         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
1277         {"items": items},
1278     )
1279
1280     if params.select_mouse == 'RIGHTMOUSE':
1281         # mask.slide_point performs mostly the same function, so for the left
1282         # click select keymap it's fine to have the context menu instead.
1283         items.extend([
1284             ("mask.select", {"type": 'RIGHTMOUSE', "value": 'PRESS'},
1285              {"properties": [
1286                  ("extend", False), ("deselect", False), ("toggle", False),
1287                  ("deselect_all", not params.legacy)]}),
1288             ("transform.translate", {"type": 'EVT_TWEAK_R', "value": 'ANY'}, None),
1289         ])
1290
1291     items.extend([
1292         ("mask.new", {"type": 'N', "value": 'PRESS', "alt": True}, None),
1293         op_menu("MASK_MT_add", {"type": 'A', "value": 'PRESS', "shift": True}),
1294         op_menu_pie("VIEW3D_MT_proportional_editing_falloff_pie", {"type": 'O', "value": 'PRESS', "shift": True}),
1295         ("wm.context_toggle", {"type": 'O', "value": 'PRESS'},
1296          {"properties": [("data_path", 'tool_settings.use_proportional_edit_mask')]}),
1297         ("mask.add_vertex_slide", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
1298         ("mask.add_feather_vertex_slide", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None),
1299         ("mask.delete", {"type": 'X', "value": 'PRESS'}, None),
1300         ("mask.delete", {"type": 'DEL', "value": 'PRESS'}, None),
1301         ("mask.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
1302          {"properties": [("extend", False), ("deselect", False), ("toggle", True)]}),
1303         *_template_items_select_actions(params, "mask.select_all"),
1304         ("mask.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
1305         ("mask.select_linked_pick", {"type": 'L', "value": 'PRESS'},
1306          {"properties": [("deselect", False)]}),
1307         ("mask.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
1308          {"properties": [("deselect", True)]}),
1309         ("mask.select_box", {"type": 'B', "value": 'PRESS'}, None),
1310         ("mask.select_circle", {"type": 'C', "value": 'PRESS'}, None),
1311         ("mask.select_lasso", {"type": params.action_tweak, "value": 'ANY', "ctrl": True, "alt": True},
1312          {"properties": [("mode", 'ADD')]}),
1313         ("mask.select_lasso", {"type": params.action_tweak, "value": 'ANY', "shift": True, "ctrl": True, "alt": True},
1314          {"properties": [("mode", 'SUB')]}),
1315         ("mask.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
1316         ("mask.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
1317         ("mask.hide_view_clear", {"type": 'H', "value": 'PRESS', "alt": True}, None),
1318         ("mask.hide_view_set", {"type": 'H', "value": 'PRESS'},
1319          {"properties": [("unselected", False)]}),
1320         ("mask.hide_view_set", {"type": 'H', "value": 'PRESS', "shift": True},
1321          {"properties": [("unselected", True)]}),
1322         ("clip.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True},
1323          {"properties": [("extend", False)]}),
1324         ("mask.cyclic_toggle", {"type": 'C', "value": 'PRESS', "alt": True}, None),
1325         ("mask.slide_point", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
1326         ("mask.slide_spline_curvature", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
1327         ("mask.handle_type_set", {"type": 'V', "value": 'PRESS'}, None),
1328         ("mask.normals_make_consistent", {"type": 'N', "value": 'PRESS', "ctrl" if params.legacy else "shift": True}, None),
1329         ("mask.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
1330         ("mask.parent_clear", {"type": 'P', "value": 'PRESS', "alt": True}, None),
1331         ("mask.shape_key_insert", {"type": 'I', "value": 'PRESS'}, None),
1332         ("mask.shape_key_clear", {"type": 'I', "value": 'PRESS', "alt": True}, None),
1333         ("mask.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
1334         ("mask.copy_splines", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
1335         ("mask.paste_splines", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
1336         ("transform.translate", {"type": 'G', "value": 'PRESS', "repeat": False}, None),
1337         ("transform.resize", {"type": 'S', "value": 'PRESS', "repeat": False}, None),
1338         ("transform.rotate", {"type": 'R', "value": 'PRESS', "repeat": False}, None),
1339         ("transform.transform", {"type": 'S', "value": 'PRESS', "alt": True, "repeat": False},
1340          {"properties": [("mode", 'MASK_SHRINKFATTEN')]}),
1341     ])
1342
1343     # 3D cursor
1344     if params.cursor_tweak_event:
1345         items.extend([
1346             ("uv.cursor_set", params.cursor_set_event, None),
1347             ("transform.translate", params.cursor_tweak_event,
1348              {"properties": [("release_confirm", True), ("cursor_transform", True)]}),
1349         ])
1350     else:
1351         items.extend([
1352             ("uv.cursor_set", params.cursor_set_event, None),
1353         ])
1354
1355     return keymap
1356
1357
1358 def km_markers(params):
1359     items = []
1360     keymap = (
1361         "Markers",
1362         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
1363         {"items": items},
1364     )
1365
1366     items.extend([
1367         ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
1368         ("marker.move", {"type": params.select_tweak, "value": 'ANY'},
1369          {"properties": [("tweak", True)]}),
1370         ("marker.duplicate", {"type": 'D', "value": 'PRESS', "shift": True}, None),
1371         ("marker.select", {"type": params.select_mouse, "value": 'PRESS'}, None),
1372         ("marker.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
1373          {"properties": [("extend", True)]}),
1374         ("marker.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True},
1375          {"properties": [("extend", False), ("camera", True)]}),
1376         ("marker.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True},
1377          {"properties": [("extend", True), ("camera", True)]}),
1378         ("marker.select_box", {"type": params.select_tweak, "value": 'ANY'},
1379          {"properties": [("tweak", True)]}),
1380         ("marker.select_box", {"type": 'B', "value": 'PRESS'}, None),
1381         *_template_items_select_actions(params, "marker.select_all"),
1382         ("marker.delete", {"type": 'X', "value": 'PRESS'}, None),
1383         ("marker.delete", {"type": 'DEL', "value": 'PRESS'}, None),
1384         ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
1385         ("marker.move", {"type": 'G', "value": 'PRESS'}, None),
1386         ("marker.camera_bind", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
1387     ])
1388
1389     return keymap
1390
1391
1392 def km_time_scrub(_params):
1393     items = []
1394     keymap = (
1395         "Time Scrub",
1396         {"space_type": 'EMPTY', "region_type": 'WINDOW'},
1397         {"items": items},
1398     )
1399
1400     items.extend([
1401         ("anim.change_frame", {"type": "LEFTMOUSE", "value": 'PRESS'}, None),
1402     ])
1403
1404     return keymap
1405
1406 def km_time_scrub_clip(_params):
1407     items = []
1408     keymap = (
1409         "Clip Time Scrub",
1410         {"space_type": 'CLIP_EDITOR', "region_type": 'PREVIEW'},
1411         {"items": items},
1412     )
1413
1414     items.extend([
1415         ("clip.change_frame", {"type": "LEFTMOUSE", "value": 'PRESS'}, None),
1416     ])
1417
1418     return keymap
1419
1420
1421 def km_graph_editor_generic(_params):
1422     items = []
1423     keymap = (
1424         "Graph Editor Generic",
1425         {"space_type": 'GRAPH_EDITOR', "region_type": 'WINDOW'},
1426         {"items": items},
1427     )
1428
1429     items.extend([
1430         *_template_space_region_type_toggle(
1431             sidebar_key={"type": 'N', "value": 'PRESS'},
1432         ),
1433         ("graph.extrapolation_type", {"type": 'E', "value": 'PRESS', "shift": True}, None),
1434         ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
1435         ("graph.hide", {"type": 'H', "value": 'PRESS'},
1436          {"properties": [("unselected", False)]}),
1437         ("graph.hide", {"type": 'H', "value": 'PRESS', "shift": True},
1438          {"properties": [("unselected", True)]}),
1439         ("graph.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
1440         ("wm.context_set_enum", {"type": 'TAB', "value": 'PRESS', "ctrl": True},
1441          {"properties": [("data_path", 'area.type'), ("value", 'DOPESHEET_EDITOR')]}),
1442     ])
1443
1444     return keymap
1445
1446
1447 def km_graph_editor(params):
1448     items = []
1449     keymap = (
1450         "Graph Editor",
1451         {"space_type": 'GRAPH_EDITOR', "region_type": 'WINDOW'},
1452         {"items": items},
1453     )
1454
1455     items.extend([
1456         ("wm.context_toggle", {"type": 'H', "value": 'PRESS', "ctrl": True},
1457          {"properties": [("data_path", 'space_data.show_handles')]}),
1458         ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS'},
1459          {"properties": [
1460              ("extend", False), ("deselect_all", not params.legacy),
1461              ("column", False), ("curves", False)]}),
1462         ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
1463          {"properties": [("extend", False), ("column", True), ("curves", False)]}),
1464         ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
1465          {"properties": [("extend", True), ("column", False), ("curves", False)]}),
1466         ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "alt": True},
1467          {"properties": [("extend", True), ("column", True), ("curves", False)]}),
1468         ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True, "alt": True},
1469          {"properties": [("extend", False), ("column", False), ("curves", True)]}),
1470         ("graph.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
1471          {"properties": [("extend", True), ("column", False), ("curves", True)]}),
1472         ("graph.select_leftright",
1473          {"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True},
1474          {"properties": [("mode", 'CHECK'), ("extend", False)]}),
1475         ("graph.select_leftright",
1476          {"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True, "shift": True},
1477          {"properties": [("mode", 'CHECK'), ("extend", True)]}),
1478         ("graph.select_leftright", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
1479          {"properties": [("mode", 'LEFT'), ("extend", False)]}),
1480         ("graph.select_leftright", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
1481          {"properties": [("mode", 'RIGHT'), ("extend", False)]}),
1482         *_template_items_select_actions(params, "graph.select_all"),
1483         ("graph.select_box", {"type": 'B', "value": 'PRESS'}, None),
1484         ("graph.select_box", {"type": 'B', "value": 'PRESS', "alt": True},
1485          {"properties": [("axis_range", True)]}),
1486         ("graph.select_box", {"type": params.select_tweak, "value": 'ANY'},
1487          {"properties": [("tweak", True), ("mode", 'SET')]}),
1488         ("graph.select_box", {"type": params.select_tweak, "value": 'ANY', "shift": True},
1489          {"properties": [("tweak", True), ("mode", 'ADD')]}),
1490         ("graph.select_box", {"type": params.select_tweak, "value": 'ANY', "ctrl": True},
1491          {"properties": [("tweak", True), ("mode", 'SUB')]}),
1492         ("graph.select_lasso", {"type": params.action_tweak, "value": 'ANY', "ctrl": True},
1493          {"properties": [("mode", 'ADD')]}),
1494         ("graph.select_lasso", {"type": params.action_tweak, "value": 'ANY', "shift": True, "ctrl": True},
1495          {"properties": [("mode", 'SUB')]}),
1496         ("graph.select_circle", {"type": 'C', "value": 'PRESS'}, None),
1497         ("graph.select_column", {"type": 'K', "value": 'PRESS'},
1498          {"properties": [("mode", 'KEYS')]}),
1499         ("graph.select_column", {"type": 'K', "value": 'PRESS', "ctrl": True},
1500          {"properties": [("mode", 'CFRA')]}),
1501         ("graph.select_column", {"type": 'K', "value": 'PRESS', "shift": True},
1502          {"properties": [("mode", 'MARKERS_COLUMN')]}),
1503         ("graph.select_column", {"type": 'K', "value": 'PRESS', "alt": True},
1504          {"properties": [("mode", 'MARKERS_BETWEEN')]}),
1505         ("graph.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
1506         ("graph.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
1507         ("graph.select_linked", {"type": 'L', "value": 'PRESS'}, None),
1508         ("graph.frame_jump", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
1509         op_menu_pie("GRAPH_MT_snap_pie", {"type": 'S', "value": 'PRESS', "shift": True}),
1510         ("graph.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
1511         ("graph.handle_type", {"type": 'V', "value": 'PRESS'}, None),
1512         ("graph.interpolation_type", {"type": 'T', "value": 'PRESS'}, None),
1513         ("graph.easing_type", {"type": 'E', "value": 'PRESS', "ctrl": True}, None),
1514         ("graph.smooth", {"type": 'O', "value": 'PRESS', "alt": True}, None),
1515         ("graph.sample", {"type": 'O', "value": 'PRESS', "shift": True, "alt": True}, None),
1516         ("graph.bake", {"type": 'C', "value": 'PRESS', "alt": True}, None),
1517         op_menu("GRAPH_MT_delete", {"type": 'X', "value": 'PRESS'}),
1518         op_menu("GRAPH_MT_delete", {"type": 'DEL', "value": 'PRESS'}),
1519         ("graph.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
1520         ("graph.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None),
1521         ("graph.click_insert", {"type": params.action_mouse, "value": 'CLICK', "ctrl": True},
1522          {"properties": [("extend", False)]}),
1523         ("graph.click_insert", {"type": params.action_mouse, "value": 'CLICK', "shift": True, "ctrl": True},
1524          {"properties": [("extend", True)]}),
1525         ("graph.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
1526         ("graph.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
1527         ("graph.paste", {"type": 'V', "value": 'PRESS', "shift": True, "ctrl": True},
1528          {"properties": [("flipped", True)]}),
1529         ("graph.previewrange_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None),
1530         ("graph.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
1531         ("graph.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
1532         ("graph.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
1533         ("graph.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
1534         ("graph.fmodifier_add", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True},
1535          {"properties": [("only_active", False)]}),
1536         ("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
1537         ("transform.translate", {"type": 'G', "value": 'PRESS', "repeat": False}, None),
1538         ("transform.translate", {"type": params.select_tweak, "value": 'ANY'}, None),
1539         ("transform.transform", {"type": 'E', "value": 'PRESS', "repeat": False},
1540          {"properties": [("mode", 'TIME_EXTEND')]}),
1541         ("transform.rotate", {"type": 'R', "value": 'PRESS', "repeat": False}, None),
1542         ("transform.resize", {"type": 'S', "value": 'PRESS', "repeat": False}, None),
1543         ("wm.context_toggle", {"type": 'O', "value": 'PRESS'},
1544          {"properties": [("data_path", 'tool_settings.use_proportional_fcurve')]}),
1545         op_menu_pie("VIEW3D_MT_proportional_editing_falloff_pie", {"type": 'O', "value": 'PRESS', "shift": True}),
1546         op_menu_pie("GRAPH_MT_pivot_pie", {"type": 'PERIOD', "value": 'PRESS'}),
1547         ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
1548         ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
1549         *_template_items_context_menu("GRAPH_MT_context_menu", params.context_menu_event),
1550     ])
1551
1552     if params.select_mouse == 'LEFTMOUSE' and not params.legacy:
1553         items.extend([
1554             ("graph.cursor_set", {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True}, None),
1555         ])
1556     else:
1557         items.extend([
1558             ("graph.cursor_set", {"type": params.action_mouse, "value": 'PRESS'}, None),
1559         ])
1560
1561     return keymap
1562
1563
1564 def km_image_generic(_params):
1565     items = []
1566     keymap = (
1567         "Image Generic",
1568         {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
1569         {"items": items},
1570     )
1571
1572     items.extend([
1573         *_template_space_region_type_toggle(
1574             toolbar_key={"type": 'T', "value": 'PRESS'},
1575             sidebar_key={"type": 'N', "value": 'PRESS'},
1576         ),
1577         ("image.new", {"type": 'N', "value": 'PRESS', "alt": True}, None),
1578         ("image.open", {"type": 'O', "value": 'PRESS', "alt": True}, None),
1579         ("image.reload", {"type": 'R', "value": 'PRESS', "alt": True}, None),
1580         ("image.read_viewlayers", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
1581         ("image.save", {"type": 'S', "value": 'PRESS', "alt": True}, None),
1582         ("image.save_as", {"type": 'S', "value": 'PRESS', "shift": True, "alt": True}, None),
1583         ("image.cycle_render_slot", {"type": 'J', "value": 'PRESS'}, None),
1584         ("image.cycle_render_slot", {"type": 'J', "value": 'PRESS', "alt": True},
1585          {"properties": [("reverse", True)]}),
1586     ])
1587
1588     return keymap
1589
1590
1591 def km_image(params):
1592     items = []
1593     keymap = (
1594         "Image",
1595         {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
1596         {"items": items},
1597     )
1598
1599     items.extend([
1600         ("image.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
1601         ("image.view_all", {"type": 'HOME', "value": 'PRESS', "shift": True},
1602          {"properties": [("fit_view", True)]}),
1603         ("image.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
1604         ("image.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
1605         ("image.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
1606         ("image.view_pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
1607         ("image.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
1608         ("image.view_ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
1609         ("image.view_zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS'}, None),
1610         ("image.view_zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None),
1611         ("image.view_zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
1612         ("image.view_zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
1613         ("image.view_zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
1614         ("image.view_zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
1615         ("image.view_zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
1616         ("image.view_zoom_border", {"type": 'B', "value": 'PRESS', "shift": True}, None),
1617         ("image.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True},
1618          {"properties": [("ratio", 8.0)]}),
1619         ("image.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True},
1620          {"properties": [("ratio", 4.0)]}),
1621         ("image.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True},
1622          {"properties": [("ratio", 2.0)]}),
1623         ("image.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "shift": True},
1624          {"properties": [("ratio", 8.0)]}),
1625         ("image.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True},
1626          {"properties": [("ratio", 4.0)]}),
1627         ("image.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "shift": True},
1628          {"properties": [("ratio", 2.0)]}),
1629         ("image.view_zoom_ratio", {"type": 'NUMPAD_1', "value": 'PRESS'},
1630          {"properties": [("ratio", 1.0)]}),
1631         ("image.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS'},
1632          {"properties": [("ratio", 0.5)]}),
1633         ("image.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS'},
1634          {"properties": [("ratio", 0.25)]}),
1635         ("image.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS'},
1636          {"properties": [("ratio", 0.125)]}),
1637         ("image.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
1638         ("image.sample", {"type": params.action_mouse, "value": 'PRESS'}, None),
1639         ("image.curves_point_set", {"type": params.action_mouse, "value": 'PRESS', "ctrl": True},
1640          {"properties": [("point", 'BLACK_POINT')]}),
1641         ("image.curves_point_set", {"type": params.action_mouse, "value": 'PRESS', "shift": True},
1642          {"properties": [("point", 'WHITE_POINT')]}),
1643         ("object.mode_set", {"type": 'TAB', "value": 'PRESS'},
1644          {"properties": [("mode", 'EDIT'), ("toggle", True)]}),
1645         *(
1646             (("wm.context_set_int",
1647               {"type": NUMBERS_1[i], "value": 'PRESS'},
1648               {"properties": [("data_path", 'space_data.image.render_slots.active_index'), ("value", i)]})
1649              for i in range(9)
1650              )
1651         ),
1652         op_menu_pie("IMAGE_MT_pivot_pie", {"type": 'PERIOD', "value": 'PRESS'}),
1653         ("image.render_border", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
1654         ("image.clear_render_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True}, None),
1655         *_template_items_context_menu("IMAGE_MT_mask_context_menu", params.context_menu_event),
1656     ])
1657
1658     if params.legacy:
1659         items.extend([
1660             ("image.view_center_cursor", {"type": 'HOME', "value": 'PRESS', "alt": True}, None),
1661         ])
1662
1663     return keymap
1664
1665
1666 def km_node_generic(_params):
1667     items = []
1668     keymap = (
1669         "Node Generic",
1670         {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
1671         {"items": items},
1672     )
1673
1674     items.extend([
1675         *_template_space_region_type_toggle(
1676             toolbar_key={"type": 'T', "value": 'PRESS'},
1677             sidebar_key={"type": 'N', "value": 'PRESS'},
1678         ),
1679     ])
1680
1681     return keymap
1682
1683
1684 def km_node_editor(params):
1685     items = []
1686     keymap = (
1687         "Node Editor",
1688         {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
1689         {"items": items},
1690     )
1691
1692     def node_select_ops(select_mouse):
1693         return [
1694             ("node.select", {"type": select_mouse, "value": 'PRESS'},
1695              {"properties": [("extend", False), ("deselect_all", True)]}),
1696             ("node.select", {"type": select_mouse, "value": 'PRESS', "ctrl": True},
1697              {"properties": [("extend", False)]}),
1698             ("node.select", {"type": select_mouse, "value": 'PRESS', "alt": True},
1699              {"properties": [("extend", False)]}),
1700             ("node.select", {"type": select_mouse, "value": 'PRESS', "ctrl": True, "alt": True},
1701              {"properties": [("extend", False)]}),
1702             ("node.select", {"type": select_mouse, "value": 'PRESS', "shift": True},
1703              {"properties": [("extend", True)]}),
1704             ("node.select", {"type": select_mouse, "value": 'PRESS', "shift": True, "ctrl": True},
1705              {"properties": [("extend", True)]}),
1706             ("node.select", {"type": select_mouse, "value": 'PRESS', "shift": True, "alt": True},
1707              {"properties": [("extend", True)]}),
1708             ("node.select", {"type": select_mouse, "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
1709              {"properties": [("extend", True)]}),
1710         ]
1711
1712     # Allow node selection with both for RMB select
1713     if params.select_mouse == 'RIGHTMOUSE':
1714         items.extend(node_select_ops('LEFTMOUSE'))
1715         items.extend(node_select_ops('RIGHTMOUSE'))
1716     else:
1717         items.extend(node_select_ops('LEFTMOUSE'))
1718
1719     items.extend([
1720         ("node.select_box", {"type": params.select_tweak, "value": 'ANY'},
1721          {"properties": [("tweak", True)]}),
1722         ("node.select_lasso", {"type": 'EVT_TWEAK_L', "value": 'ANY', "ctrl": True, "alt": True},
1723          {"properties": [("mode", 'ADD')]}),
1724         ("node.select_lasso", {"type": 'EVT_TWEAK_L', "value": 'ANY', "shift": True, "ctrl": True, "alt": True},
1725          {"properties": [("mode", 'SUB')]}),
1726         ("node.select_circle", {"type": 'C', "value": 'PRESS'}, None),
1727         ("node.link", {"type": 'EVT_TWEAK_L', "value": 'ANY'},
1728          {"properties": [("detach", False)]}),
1729         ("node.link", {"type": 'EVT_TWEAK_L', "value": 'ANY', "ctrl": True},
1730          {"properties": [("detach", True)]}),
1731         ("node.resize", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
1732         ("node.add_reroute", {"type": 'EVT_TWEAK_R', "value": 'ANY', "shift": True}, None),
1733         ("node.links_cut", {"type": 'EVT_TWEAK_R', "value": 'ANY', "ctrl": True}, None),
1734         ("node.select_link_viewer", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None),
1735         ("node.backimage_move", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "alt": True}, None),
1736         ("node.backimage_zoom", {"type": 'V', "value": 'PRESS'},
1737          {"properties": [("factor", 1.0 / 1.2)]}),
1738         ("node.backimage_zoom", {"type": 'V', "value": 'PRESS', "alt": True},
1739          {"properties": [("factor", 1.2)]}),
1740         ("node.backimage_fit", {"type": 'HOME', "value": 'PRESS', "alt": True}, None),
1741         ("node.backimage_sample", {"type": params.action_mouse, "value": 'PRESS', "alt": True}, None),
1742         ("node.link_make", {"type": 'F', "value": 'PRESS'},
1743          {"properties": [("replace", False)]}),
1744         ("node.link_make", {"type": 'F', "value": 'PRESS', "shift": True},
1745          {"properties": [("replace", True)]}),
1746         op_menu("NODE_MT_add", {"type": 'A', "value": 'PRESS', "shift": True}),
1747         ("node.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
1748         ("node.duplicate_move_keep_inputs", {"type": 'D', "value": 'PRESS', "shift": True, "ctrl": True}, None),
1749         ("node.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
1750         ("node.detach", {"type": 'P', "value": 'PRESS', "alt": True}, None),
1751         ("node.join", {"type": 'J', "value": 'PRESS', "ctrl": True}, None),
1752         ("node.hide_toggle", {"type": 'H', "value": 'PRESS'}, None),
1753         ("node.mute_toggle", {"type": 'M', "value": 'PRESS'}, None),
1754         ("node.preview_toggle", {"type": 'H', "value": 'PRESS', "shift": True}, None),
1755         ("node.hide_socket_toggle", {"type": 'H', "value": 'PRESS', "ctrl": True}, None),
1756         ("node.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
1757         ("node.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
1758         ("node.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
1759         ("node.select_box", {"type": 'B', "value": 'PRESS'},
1760          {"properties": [("tweak", False)]}),
1761         ("node.delete", {"type": 'X', "value": 'PRESS'}, None),
1762         ("node.delete", {"type": 'DEL', "value": 'PRESS'}, None),
1763         ("node.delete_reconnect", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
1764         ("node.delete_reconnect", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None),
1765         *_template_items_select_actions(params, "node.select_all"),
1766         ("node.select_linked_to", {"type": 'L', "value": 'PRESS', "shift": True}, None),
1767         ("node.select_linked_from", {"type": 'L', "value": 'PRESS'}, None),
1768         ("node.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True},
1769          {"properties": [("extend", False)]}),
1770         ("node.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True, "ctrl": True},
1771          {"properties": [("extend", True)]}),
1772         ("node.select_same_type_step", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True},
1773          {"properties": [("prev", False)]}),
1774         ("node.select_same_type_step", {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True},
1775          {"properties": [("prev", True)]}),
1776         ("node.find_node", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
1777         ("node.group_make", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
1778         ("node.group_ungroup", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None),
1779         ("node.group_separate", {"type": 'P', "value": 'PRESS'}, None),
1780         ("node.group_edit", {"type": 'TAB', "value": 'PRESS'},
1781          {"properties": [("exit", False)]}),
1782         ("node.group_edit", {"type": 'TAB', "value": 'PRESS', "ctrl": True},
1783          {"properties": [("exit", True)]}),
1784         ("node.read_viewlayers", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
1785         ("node.render_changed", {"type": 'Z', "value": 'PRESS'}, None),
1786         ("node.clipboard_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
1787         ("node.clipboard_paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
1788         ("node.viewer_border", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
1789         ("node.clear_viewer_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True}, None),
1790         ("node.translate_attach", {"type": 'G', "value": 'PRESS'}, None),
1791         ("node.translate_attach", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
1792         ("node.translate_attach", {"type": params.select_tweak, "value": 'ANY'}, None),
1793         ("transform.translate", {"type": 'G', "value": 'PRESS', "repeat": False}, None),
1794         ("transform.translate", {"type": 'EVT_TWEAK_L', "value": 'ANY'},
1795          {"properties": [("release_confirm", True)]}),
1796         ("transform.translate", {"type": params.select_tweak, "value": 'ANY'},
1797          {"properties": [("release_confirm", True)]}),
1798         ("transform.rotate", {"type": 'R', "value": 'PRESS', "repeat": False}, None),
1799         ("transform.resize", {"type": 'S', "value": 'PRESS', "repeat": False}, None),
1800         ("node.move_detach_links", {"type": 'D', "value": 'PRESS', "alt": True}, None),
1801         ("node.move_detach_links_release", {"type": params.action_tweak, "value": 'ANY', "alt": True}, None),
1802         ("node.move_detach_links", {"type": params.select_tweak, "value": 'ANY', "alt": True}, None),
1803         ("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True},
1804          {"properties": [("data_path", 'tool_settings.use_snap')]}),
1805         ("wm.context_menu_enum", {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True},
1806          {"properties": [("data_path", 'tool_settings.snap_node_element')]}),
1807         *_template_items_context_menu("NODE_MT_context_menu", params.context_menu_event),
1808     ])
1809
1810     return keymap
1811
1812
1813 def km_info(params):
1814     items = []
1815     keymap = (
1816         "Info",
1817         {"space_type": 'INFO', "region_type": 'WINDOW'},
1818         {"items": items},
1819     )
1820
1821     items.extend([
1822         ("info.select_pick", {"type": 'LEFTMOUSE', "value": 'CLICK'}, None),
1823         ("info.select_pick", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
1824          {"properties": [("extend", True)]}),
1825         ("info.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY'},
1826          {"properties": [("wait_for_input", False)]}),
1827         *_template_items_select_actions(params, "info.select_all"),
1828         ("info.select_box", {"type": 'B', "value": 'PRESS'}, None),
1829         ("info.report_replay", {"type": 'R', "value": 'PRESS'}, None),
1830         ("info.report_delete", {"type": 'X', "value": 'PRESS'}, None),
1831         ("info.report_delete", {"type": 'DEL', "value": 'PRESS'}, None),
1832         ("info.report_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
1833         *_template_items_context_menu("INFO_MT_context_menu", params.context_menu_event),
1834     ])
1835
1836     return keymap
1837
1838
1839 def km_file_browser(params):
1840     items = []
1841     keymap = (
1842         "File Browser",
1843         {"space_type": 'FILE_BROWSER', "region_type": 'WINDOW'},
1844         {"items": items},
1845     )
1846
1847     items.extend([
1848         *_template_space_region_type_toggle(
1849             toolbar_key={"type": 'T', "value": 'PRESS'},
1850         ),
1851         ("screen.region_toggle", {"type": 'N', "value": 'PRESS'},
1852          {"properties": [("region_type", 'TOOL_PROPS')]}),
1853         ("file.parent", {"type": 'UP_ARROW', "value": 'PRESS', "alt": True}, None),
1854         ("file.previous", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True}, None),
1855         ("file.next", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True}, None),
1856         ("file.refresh", {"type": 'R', "value": 'PRESS'}, None),
1857         ("file.parent", {"type": 'P', "value": 'PRESS'}, None),
1858         ("file.previous", {"type": 'BACK_SPACE', "value": 'PRESS'}, None),
1859         ("file.next", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, None),
1860         ("wm.context_toggle", {"type": 'H', "value": 'PRESS'},
1861          {"properties": [("data_path", 'space_data.params.show_hidden')]}),
1862         ("file.directory_new", {"type": 'I', "value": 'PRESS'},
1863          {"properties": [("confirm", False)]}),
1864         ("file.rename", {"type": 'F2', "value": 'PRESS'}, None),
1865         ("file.delete", {"type": 'X', "value": 'PRESS'}, None),
1866         ("file.delete", {"type": 'DEL', "value": 'PRESS'}, None),
1867         ("file.smoothscroll", {"type": 'TIMER1', "value": 'ANY', "any": True}, None),
1868         ("file.bookmark_add", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
1869         ("file.start_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
1870         ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
1871          {"properties": [("increment", 1)]}),
1872         ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
1873          {"properties": [("increment", 10)]}),
1874         ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
1875          {"properties": [("increment", 100)]}),
1876         ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
1877          {"properties": [("increment", -1)]}),
1878         ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
1879          {"properties": [("increment", -10)]}),
1880         ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
1881          {"properties": [("increment", -100)]}),
1882         *_template_items_context_menu("FILEBROWSER_MT_context_menu", params.context_menu_event),
1883     ])
1884
1885     return keymap
1886
1887
1888 def km_file_browser_main(params):
1889     items = []
1890     keymap = (
1891         "File Browser Main",
1892         {"space_type": 'FILE_BROWSER', "region_type": 'WINDOW'},
1893         {"items": items},
1894     )
1895
1896     items.extend([
1897         ("file.execute", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'},
1898          {"properties": [("need_active", True)]}),
1899         ("file.refresh", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
1900         ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK'},
1901          {"properties": [("open", False), ("deselect_all", not params.legacy)]}),
1902         ("file.select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
1903         ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True},
1904          {"properties": [("extend", True)]}),
1905         ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
1906          {"properties": [("extend", True), ("fill", True), ("open", False)]}),
1907         ("file.select_walk", {"type": 'UP_ARROW', "value": 'PRESS'},
1908          {"properties": [("direction", 'UP')]}),
1909         ("file.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
1910          {"properties": [("direction", 'UP'), ("extend", True)]}),
1911         ("file.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
1912          {"properties": [("direction", 'UP'), ("extend", True), ("fill", True)]}),
1913         ("file.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS'},
1914          {"properties": [("direction", 'DOWN')]}),
1915         ("file.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True},
1916          {"properties": [("direction", 'DOWN'), ("extend", True)]}),
1917         ("file.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
1918          {"properties": [("direction", 'DOWN'), ("extend", True), ("fill", True)]}),
1919         ("file.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS'},
1920          {"properties": [("direction", 'LEFT')]}),
1921         ("file.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True},
1922          {"properties": [("direction", 'LEFT'), ("extend", True)]}),
1923         ("file.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
1924          {"properties": [("direction", 'LEFT'), ("extend", True), ("fill", True)]}),
1925         ("file.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS'},
1926          {"properties": [("direction", 'RIGHT')]}),
1927         ("file.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True},
1928          {"properties": [("direction", 'RIGHT'), ("extend", True)]}),
1929         ("file.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
1930          {"properties": [("direction", 'RIGHT'), ("extend", True), ("fill", True)]}),
1931         ("file.previous", {"type": 'BUTTON4MOUSE', "value": 'CLICK'}, None),
1932         ("file.next", {"type": 'BUTTON5MOUSE', "value": 'CLICK'}, None),
1933         *_template_items_select_actions(params, "file.select_all"),
1934         ("file.select_box", {"type": 'B', "value": 'PRESS'}, None),
1935         ("file.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
1936         ("file.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', "shift": True},
1937          {"properties": [("mode", 'ADD')]}),
1938         ("file.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', "ctrl": True},
1939          {"properties": [("mode", 'SUB')]}),
1940         ("file.highlight", {"type": 'MOUSEMOVE', "value": 'ANY', "any": True}, None),
1941         ("file.sort_column_ui_context", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
1942     ])
1943
1944     return keymap
1945
1946
1947 def km_file_browser_buttons(_params):
1948     items = []
1949     keymap = (
1950         "File Browser Buttons",
1951         {"space_type": 'FILE_BROWSER', "region_type": 'WINDOW'},
1952         {"items": items},
1953     )
1954
1955     items.extend([
1956         ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
1957          {"properties": [("increment", 1)]}),
1958         ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
1959          {"properties": [("increment", 10)]}),
1960         ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
1961          {"properties": [("increment", 100)]}),
1962         ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
1963          {"properties": [("increment", -1)]}),
1964         ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
1965          {"properties": [("increment", -10)]}),
1966         ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
1967          {"properties": [("increment", -100)]}),
1968     ])
1969
1970     return keymap
1971
1972
1973 def km_dopesheet_generic(_params):
1974     items = []
1975     keymap = (
1976         "Dopesheet Generic",
1977         {"space_type": 'DOPESHEET_EDITOR', "region_type": 'WINDOW'},
1978         {"items": items},
1979     )
1980
1981     items.extend([
1982         *_template_space_region_type_toggle(
1983             sidebar_key={"type": 'N', "value": 'PRESS'},
1984         ),
1985         ("wm.context_set_enum", {"type": 'TAB', "value": 'PRESS', "ctrl": True},
1986          {"properties": [("data_path", 'area.type'), ("value", 'GRAPH_EDITOR')]}),
1987         ("action.extrapolation_type", {"type": 'E', "value": 'PRESS', "shift": True}, None),
1988     ])
1989
1990     return keymap
1991
1992
1993 def km_dopesheet(params):
1994     items = []
1995     keymap = (
1996         "Dopesheet",
1997         {"space_type": 'DOPESHEET_EDITOR', "region_type": 'WINDOW'},
1998         {"items": items},
1999     )
2000
2001     items.extend([
2002         ("action.clickselect", {"type": params.select_mouse, "value": 'PRESS'},
2003          {"properties": [
2004              ("extend", False), ("deselect_all", not params.legacy),
2005              ("column", False), ("channel", False)]}),
2006         ("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
2007          {"properties": [("extend", False), ("column", True), ("channel", False)]}),
2008         ("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
2009          {"properties": [("extend", True), ("column", False), ("channel", False)]}),
2010         ("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "alt": True},
2011          {"properties": [("extend", True), ("column", True), ("channel", False)]}),
2012         ("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True, "alt": True},
2013          {"properties": [("extend", False), ("column", False), ("channel", True)]}),
2014         ("action.clickselect", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True, "alt": True},
2015          {"properties": [("extend", True), ("column", False), ("channel", True)]}),
2016         ("action.select_leftright",
2017          {"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True},
2018          {"properties": [("mode", 'CHECK'), ("extend", False)]}),
2019         ("action.select_leftright",
2020          {"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True, "shift": True},
2021          {"properties": [("mode", 'CHECK'), ("extend", True)]}),
2022         ("action.select_leftright", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
2023          {"properties": [("mode", 'LEFT'), ("extend", False)]}),
2024         ("action.select_leftright", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
2025          {"properties": [("mode", 'RIGHT'), ("extend", False)]}),
2026         *_template_items_select_actions(params, "action.select_all"),
2027         ("action.select_box", {"type": 'B', "value": 'PRESS'},
2028          {"properties": [("axis_range", False)]}),
2029         ("action.select_box", {"type": 'B', "value": 'PRESS', "alt": True},
2030          {"properties": [("axis_range", True)]}),
2031         ("action.select_box", {"type": params.select_tweak, "value": 'ANY'},
2032          {"properties": [("tweak", True), ("mode", 'SET')]}),
2033         ("action.select_box", {"type": params.select_tweak, "value": 'ANY', "shift": True},
2034          {"properties": [("tweak", True), ("mode", 'ADD')]}),
2035         ("action.select_box", {"type": params.select_tweak, "value": 'ANY', "ctrl": True},
2036          {"properties": [("tweak", True), ("mode", 'SUB')]}),
2037         ("action.select_lasso", {"type": params.action_tweak, "value": 'ANY', "ctrl": True},
2038          {"properties": [("mode", 'ADD')]}),
2039         ("action.select_lasso", {"type": params.action_tweak, "value": 'ANY', "shift": True, "ctrl": True},
2040          {"properties": [("mode", 'SUB')]}),
2041         ("action.select_circle", {"type": 'C', "value": 'PRESS'}, None),
2042         ("action.select_column", {"type": 'K', "value": 'PRESS'},
2043          {"properties": [("mode", 'KEYS')]}),
2044         ("action.select_column", {"type": 'K', "value": 'PRESS', "ctrl": True},
2045          {"properties": [("mode", 'CFRA')]}),
2046         ("action.select_column", {"type": 'K', "value": 'PRESS', "shift": True},
2047          {"properties": [("mode", 'MARKERS_COLUMN')]}),
2048         ("action.select_column", {"type": 'K', "value": 'PRESS', "alt": True},
2049          {"properties": [("mode", 'MARKERS_BETWEEN')]}),
2050         ("action.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
2051         ("action.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
2052         ("action.select_linked", {"type": 'L', "value": 'PRESS'}, None),
2053         ("action.frame_jump", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
2054         op_menu_pie("DOPESHEET_MT_snap_pie", {"type": 'S', "value": 'PRESS', "shift": True}),
2055         ("action.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
2056         ("action.handle_type", {"type": 'V', "value": 'PRESS'}, None),
2057         ("action.interpolation_type", {"type": 'T', "value": 'PRESS'}, None),
2058         ("action.extrapolation_type", {"type": 'E', "value": 'PRESS', "shift": True}, None),
2059         ("action.easing_type", {"type": 'E', "value": 'PRESS', "ctrl": True}, None),
2060         ("action.keyframe_type", {"type": 'R', "value": 'PRESS'}, None),
2061         ("action.sample", {"type": 'O', "value": 'PRESS', "shift": True, "alt": True}, None),
2062         op_menu("DOPESHEET_MT_delete", {"type": 'X', "value": 'PRESS'}),
2063         op_menu("DOPESHEET_MT_delete", {"type": 'DEL', "value": 'PRESS'}),
2064         ("action.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
2065         ("action.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None),
2066         ("action.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
2067         ("action.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
2068         ("action.paste", {"type": 'V', "value": 'PRESS', "shift": True, "ctrl": True},
2069          {"properties": [("flipped", True)]}),
2070         ("action.previewrange_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None),
2071         ("action.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
2072         ("action.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
2073         ("action.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
2074         ("action.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
2075         ("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
2076         ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
2077         ("transform.transform", {"type": 'G', "value": 'PRESS', "repeat": False},
2078          {"properties": [("mode", 'TIME_TRANSLATE')]}),
2079         ("transform.transform", {"type": params.select_tweak, "value": 'ANY'},
2080          {"properties": [("mode", 'TIME_TRANSLATE')]}),
2081         ("transform.transform", {"type": 'E', "value": 'PRESS', "repeat": False},
2082          {"properties": [("mode", 'TIME_EXTEND')]}),
2083         ("transform.transform", {"type": 'S', "value": 'PRESS', "repeat": False},
2084          {"properties": [("mode", 'TIME_SCALE')]}),
2085         ("transform.transform", {"type": 'T', "value": 'PRESS', "shift": True, "repeat": False},
2086          {"properties": [("mode", 'TIME_SLIDE')]}),
2087         ("wm.context_toggle", {"type": 'O', "value": 'PRESS'},
2088          {"properties": [("data_path", 'tool_settings.use_proportional_action')]}),
2089         op_menu_pie("VIEW3D_MT_proportional_editing_falloff_pie", {"type": 'O', "value": 'PRESS', "shift": True}),
2090         ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
2091         ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
2092         ("marker.camera_bind", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
2093         *_template_items_context_menu("DOPESHEET_MT_context_menu", params.context_menu_event),
2094         *_template_items_change_frame(params),
2095     ])
2096
2097     return keymap
2098
2099
2100 def km_nla_generic(_params):
2101     items = []
2102     keymap = (
2103         "NLA Generic",
2104         {"space_type": 'NLA_EDITOR', "region_type": 'WINDOW'},
2105         {"items": items},
2106     )
2107
2108     items.extend([
2109         *_template_space_region_type_toggle(
2110             sidebar_key={"type": 'N', "value": 'PRESS'},
2111         ),
2112         ("nla.tweakmode_enter", {"type": 'TAB', "value": 'PRESS'}, None),
2113         ("nla.tweakmode_exit", {"type": 'TAB', "value": 'PRESS'}, None),
2114         ("nla.tweakmode_enter", {"type": 'TAB', "value": 'PRESS', "shift": True},
2115          {"properties": [("isolate_action", True)]}),
2116         ("nla.tweakmode_exit", {"type": 'TAB', "value": 'PRESS', "shift": True},
2117          {"properties": [("isolate_action", True)]}),
2118         ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
2119     ])
2120
2121     return keymap
2122
2123
2124 def km_nla_channels(params):
2125     items = []
2126     keymap = (
2127         "NLA Channels",
2128         {"space_type": 'NLA_EDITOR', "region_type": 'WINDOW'},
2129         {"items": items},
2130     )
2131
2132     items.extend([
2133         ("nla.channels_click", {"type": 'LEFTMOUSE', "value": 'PRESS'},
2134          {"properties": [("extend", False)]}),
2135         ("nla.channels_click", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
2136          {"properties": [("extend", True)]}),
2137         ("nla.tracks_add", {"type": 'A', "value": 'PRESS', "shift": True},
2138          {"properties": [("above_selected", False)]}),
2139         ("nla.tracks_add", {"type": 'A', "value": 'PRESS', "shift": True, "ctrl": True},
2140          {"properties": [("above_selected", True)]}),
2141         ("nla.tracks_delete", {"type": 'X', "value": 'PRESS'}, None),
2142         ("nla.tracks_delete", {"type": 'DEL', "value": 'PRESS'}, None),
2143         *_template_items_context_menu("NLA_MT_channel_context_menu", params.context_menu_event),
2144     ])
2145
2146     return keymap
2147
2148
2149 def km_nla_editor(params):
2150     items = []
2151     keymap = (
2152         "NLA Editor",
2153         {"space_type": 'NLA_EDITOR', "region_type": 'WINDOW'},
2154         {"items": items},
2155     )
2156
2157     items.extend([
2158         ("nla.click_select", {"type": params.select_mouse, "value": 'PRESS'},
2159          {"properties": [("extend", False), ("deselect_all", not params.legacy)]}),
2160         ("nla.click_select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
2161          {"properties": [("extend", True)]}),
2162         ("nla.select_leftright",
2163          {"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True},
2164          {"properties": [("mode", 'CHECK'), ("extend", False)]}),
2165         ("nla.select_leftright",
2166          {"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True, "shift": True},
2167          {"properties": [("mode", 'CHECK'), ("extend", True)]}),
2168         ("nla.select_leftright", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
2169          {"properties": [("mode", 'LEFT'), ("extend", False)]}),
2170         ("nla.select_leftright", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
2171          {"properties": [("mode", 'RIGHT'), ("extend", False)]}),
2172         *_template_items_select_actions(params, "nla.select_all"),
2173         ("nla.select_box", {"type": 'B', "value": 'PRESS'},
2174          {"properties": [("axis_range", False)]}),
2175         ("nla.select_box", {"type": 'B', "value": 'PRESS', "alt": True},
2176          {"properties": [("axis_range", True)]}),
2177         ("nla.select_box", {"type": params.select_tweak, "value": 'ANY'},
2178          {"properties": [("tweak", True), ("mode", 'SET')]}),
2179         ("nla.select_box", {"type": params.select_tweak, "value": 'ANY', "shift": True},
2180          {"properties": [("tweak", True), ("mode", 'ADD')]}),
2181         ("nla.select_box", {"type": params.select_tweak, "value": 'ANY', "ctrl": True},
2182          {"properties": [("tweak", True), ("mode", 'SUB')]}),
2183         ("nla.previewrange_set", {"type": 'P', "value": 'PRESS', "ctrl": True, "alt": True}, None),
2184         ("nla.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
2185         ("nla.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
2186         ("nla.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
2187         ("nla.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
2188         ("nla.actionclip_add", {"type": 'A', "value": 'PRESS', "shift": True}, None),
2189         ("nla.transition_add", {"type": 'T', "value": 'PRESS', "shift": True}, None),
2190         ("nla.soundclip_add", {"type": 'K', "value": 'PRESS', "shift": True}, None),
2191         ("nla.meta_add", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
2192         ("nla.meta_remove", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None),
2193         ("nla.duplicate", {"type": 'D', "value": 'PRESS', "shift": True},
2194          {"properties": [("linked", False)]}),
2195         ("nla.duplicate", {"type": 'D', "value": 'PRESS', "alt": True},
2196          {"properties": [("linked", True)]}),
2197         ("nla.make_single_user", {"type": 'U', "value": 'PRESS'}, None),
2198         ("nla.delete", {"type": 'X', "value": 'PRESS'}, None),
2199         ("nla.delete", {"type": 'DEL', "value": 'PRESS'}, None),
2200         ("nla.split", {"type": 'Y', "value": 'PRESS'}, None),
2201         ("nla.mute_toggle", {"type": 'H', "value": 'PRESS'}, None),
2202         ("nla.swap", {"type": 'F', "value": 'PRESS', "alt": True}, None),
2203         ("nla.move_up", {"type": 'PAGE_UP', "value": 'PRESS'}, None),
2204         ("nla.move_down", {"type": 'PAGE_DOWN', "value": 'PRESS'}, None),
2205         ("nla.apply_scale", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
2206         ("nla.clear_scale", {"type": 'S', "value": 'PRESS', "alt": True}, None),
2207         op_menu_pie("NLA_MT_snap_pie", {"type": 'S', "value": 'PRESS', "shift": True}),
2208         ("nla.fmodifier_add", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}, None),
2209         ("transform.transform", {"type": 'G', "value": 'PRESS', "repeat": False},
2210          {"properties": [("mode", 'TRANSLATION')]}),
2211         ("transform.transform", {"type": params.select_tweak, "value": 'ANY'},
2212          {"properties": [("mode", 'TRANSLATION')]}),
2213         ("transform.transform", {"type": 'E', "value": 'PRESS', "repeat": False},
2214          {"properties": [("mode", 'TIME_EXTEND')]}),
2215         ("transform.transform", {"type": 'S', "value": 'PRESS', "repeat": False},
2216          {"properties": [("mode", 'TIME_SCALE')]}),
2217         ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
2218         ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
2219         *_template_items_context_menu("NLA_MT_context_menu", params.context_menu_event),
2220         *_template_items_change_frame(params),
2221     ])
2222
2223     return keymap
2224
2225
2226 def km_text_generic(_params):
2227     items = []
2228     keymap = (
2229         "Text Generic",
2230         {"space_type": 'TEXT_EDITOR', "region_type": 'WINDOW'},
2231         {"items": items},
2232     )
2233
2234     items.extend([
2235         *_template_space_region_type_toggle(
2236             sidebar_key={"type": 'T', "value": 'PRESS', "ctrl": True},
2237         ),
2238         ("text.start_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
2239         ("text.jump", {"type": 'J', "value": 'PRESS', "ctrl": True}, None),
2240         ("text.find_set_selected", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
2241         ("text.replace", {"type": 'H', "value": 'PRESS', "ctrl": True}, None),
2242     ])
2243
2244     return keymap
2245
2246
2247 def km_text(params):
2248     items = []
2249     keymap = (
2250         "Text",
2251         {"space_type": 'TEXT_EDITOR', "region_type": 'WINDOW'},
2252         {"items": items},
2253     )
2254
2255     items.extend([
2256         ("wm.context_cycle_int", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True},
2257          {"properties": [("data_path", 'space_data.font_size'), ("reverse", False)]}),
2258         ("wm.context_cycle_int", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True},
2259          {"properties": [("data_path", 'space_data.font_size'), ("reverse", True)]}),
2260         ("wm.context_cycle_int", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
2261          {"properties": [("data_path", 'space_data.font_size'), ("reverse", False)]}),
2262         ("wm.context_cycle_int", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
2263          {"properties": [("data_path", 'space_data.font_size'), ("reverse", True)]}),
2264     ])
2265
2266     if not params.legacy:
2267         items.extend([
2268             ("text.new", {"type": 'N', "value": 'PRESS', "alt": True}, None),
2269         ])
2270     else:
2271         items.extend([
2272             ("text.new", {"type": 'N', "value": 'PRESS', "ctrl": True}, None),
2273
2274             ("text.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True},
2275              {"properties": [("type", 'PREVIOUS_WORD')]}),
2276             ("text.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True},
2277              {"properties": [("type", 'NEXT_WORD')]}),
2278         ])
2279
2280     items.extend([
2281         ("text.open", {"type": 'O', "value": 'PRESS', "alt": True}, None),
2282         ("text.reload", {"type": 'R', "value": 'PRESS', "alt": True}, None),
2283         ("text.save", {"type": 'S', "value": 'PRESS', "alt": True}, None),
2284         ("text.save_as", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
2285         ("text.run_script", {"type": 'P', "value": 'PRESS', "alt": True}, None),
2286         ("text.cut", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
2287         ("text.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
2288         ("text.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
2289         ("text.cut", {"type": 'DEL', "value": 'PRESS', "shift": True}, None),
2290         ("text.copy", {"type": 'INSERT', "value": 'PRESS', "ctrl": True}, None),
2291         ("text.paste", {"type": 'INSERT', "value": 'PRESS', "shift": True}, None),
2292         ("text.duplicate_line", {"type": 'D', "value": 'PRESS', "ctrl": True}, None),
2293         ("text.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
2294         ("text.select_line", {"type": 'A', "value": 'PRESS', "shift": True, "ctrl": True}, None),
2295         ("text.select_word", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
2296         ("text.move_lines", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
2297          {"properties": [("direction", 'UP')]}),
2298         ("text.move_lines", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
2299          {"properties": [("direction", 'DOWN')]}),
2300         ("text.indent_or_autocomplete", {"type": 'TAB', "value": 'PRESS'}, None),
2301         ("text.unindent", {"type": 'TAB', "value": 'PRESS', "shift": True}, None),
2302         ("text.comment_toggle", {"type": 'SLASH', "value": 'PRESS', "ctrl": True}, None),
2303         ("text.move", {"type": 'HOME', "value": 'PRESS'},
2304          {"properties": [("type", 'LINE_BEGIN')]}),
2305         ("text.move", {"type": 'END', "value": 'PRESS'},
2306          {"properties": [("type", 'LINE_END')]}),
2307         ("text.move", {"type": 'E', "value": 'PRESS', "ctrl": True},
2308          {"properties": [("type", 'LINE_END')]}),
2309         ("text.move", {"type": 'E', "value": 'PRESS', "shift": True, "ctrl": True},
2310          {"properties": [("type", 'LINE_END')]}),
2311         ("text.move", {"type": 'LEFT_ARROW', "value": 'PRESS'},
2312          {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
2313         ("text.move", {"type": 'RIGHT_ARROW', "value": 'PRESS'},
2314          {"properties": [("type", 'NEXT_CHARACTER')]}),
2315         ("text.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True},
2316          {"properties": [("type", 'PREVIOUS_WORD')]}),
2317         ("text.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True},
2318          {"properties": [("type", 'NEXT_WORD')]}),
2319         ("text.move", {"type": 'UP_ARROW', "value": 'PRESS'},
2320          {"properties": [("type", 'PREVIOUS_LINE')]}),
2321         ("text.move", {"type": 'DOWN_ARROW', "value": 'PRESS'},
2322          {"properties": [("type", 'NEXT_LINE')]}),
2323         ("text.move", {"type": 'PAGE_UP', "value": 'PRESS'},
2324          {"properties": [("type", 'PREVIOUS_PAGE')]}),
2325         ("text.move", {"type": 'PAGE_DOWN', "value": 'PRESS'},
2326          {"properties": [("type", 'NEXT_PAGE')]}),
2327         ("text.move", {"type": 'HOME', "value": 'PRESS', "ctrl": True},
2328          {"properties": [("type", 'FILE_TOP')]}),
2329         ("text.move", {"type": 'END', "value": 'PRESS', "ctrl": True},
2330          {"properties": [("type", 'FILE_BOTTOM')]}),
2331         ("text.move_select", {"type": 'HOME', "value": 'PRESS', "shift": True},
2332          {"properties": [("type", 'LINE_BEGIN')]}),
2333         ("text.move_select", {"type": 'END', "value": 'PRESS', "shift": True},
2334          {"properties": [("type", 'LINE_END')]}),
2335         ("text.move_select", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True},
2336          {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
2337         ("text.move_select", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True},
2338          {"properties": [("type", 'NEXT_CHARACTER')]}),
2339         ("text.move_select", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
2340          {"properties": [("type", 'PREVIOUS_WORD')]}),
2341         ("text.move_select", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
2342          {"properties": [("type", 'NEXT_WORD')]}),
2343         ("text.move_select", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
2344          {"properties": [("type", 'PREVIOUS_LINE')]}),
2345         ("text.move_select", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True},
2346          {"properties": [("type", 'NEXT_LINE')]}),
2347         ("text.move_select", {"type": 'PAGE_UP', "value": 'PRESS', "shift": True},
2348          {"properties": [("type", 'PREVIOUS_PAGE')]}),
2349         ("text.move_select", {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True},
2350          {"properties": [("type", 'NEXT_PAGE')]}),
2351         ("text.move_select", {"type": 'HOME', "value": 'PRESS', "shift": True, "ctrl": True},
2352          {"properties": [("type", 'FILE_TOP')]}),
2353         ("text.move_select", {"type": 'END', "value": 'PRESS', "shift": True, "ctrl": True},
2354          {"properties": [("type", 'FILE_BOTTOM')]}),
2355         ("text.delete", {"type": 'DEL', "value": 'PRESS'},
2356          {"properties": [("type", 'NEXT_CHARACTER')]}),
2357         ("text.delete", {"type": 'BACK_SPACE', "value": 'PRESS'},
2358          {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
2359         ("text.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True},
2360          {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
2361         ("text.delete", {"type": 'DEL', "value": 'PRESS', "ctrl": True},
2362          {"properties": [("type", 'NEXT_WORD')]}),
2363         ("text.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True},
2364          {"properties": [("type", 'PREVIOUS_WORD')]}),
2365         ("text.overwrite_toggle", {"type": 'INSERT', "value": 'PRESS'}, None),
2366         ("text.scroll_bar", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
2367         ("text.scroll_bar", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
2368         ("text.scroll", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
2369         ("text.scroll", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
2370         ("text.selection_set", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
2371         ("text.cursor_set", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
2372         ("text.selection_set", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, None),
2373         ("text.scroll", {"type": 'WHEELUPMOUSE', "value": 'PRESS'},
2374          {"properties": [("lines", -1)]}),
2375         ("text.scroll", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'},
2376          {"properties": [("lines", 1)]}),
2377         ("text.line_break", {"type": 'RET', "value": 'PRESS'}, None),
2378         ("text.line_break", {"type": 'NUMPAD_ENTER', "value": 'PRESS'}, None),
2379         ("text.line_number", {"type": 'TEXTINPUT', "value": 'ANY', "any": True}, None),
2380         op_menu("TEXT_MT_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}),
2381         ("text.insert", {"type": 'TEXTINPUT', "value": 'ANY', "any": True}, None),
2382     ])
2383
2384     return keymap
2385
2386
2387 def km_sequencercommon(_params):
2388     items = []
2389     keymap = (
2390         "SequencerCommon",
2391         {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
2392         {"items": items},
2393     )
2394
2395     items.extend([
2396         *_template_space_region_type_toggle(
2397             toolbar_key={"type": 'T', "value": 'PRESS'},
2398             sidebar_key={"type": 'N', "value": 'PRESS'},
2399         ),
2400         ("wm.context_toggle", {"type": 'O', "value": 'PRESS', "shift": True},
2401          {"properties": [("data_path", 'scene.sequence_editor.show_overlay')]}),
2402         ("wm.context_toggle_enum", {"type": 'TAB', "value": 'PRESS', "ctrl": True},
2403          {"properties": [("data_path", 'space_data.view_type'), ("value_1", 'SEQUENCER'), ("value_2", 'PREVIEW')]}),
2404     ])
2405
2406     if _params.select_mouse == 'LEFTMOUSE' and not _params.legacy:
2407         # Quick switch to select tool, since left select can't easily
2408         # select with any tool active.
2409         items.extend([
2410             op_tool_cycle("builtin.select_box", {"type": 'W', "value": 'PRESS'}),
2411         ])
2412
2413     return keymap
2414
2415
2416 def km_sequencer(params):
2417     items = []
2418     keymap = (
2419         "Sequencer",
2420         {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
2421         {"items": items},
2422     )
2423
2424     items.extend([
2425         *_template_items_select_actions(params, "sequencer.select_all"),
2426         ("sequencer.split", {"type": 'K', "value": 'PRESS'},
2427          {"properties": [("type", 'SOFT')]}),
2428         ("sequencer.split", {"type": 'K', "value": 'PRESS', "shift": True},
2429          {"properties": [("type", 'HARD')]}),
2430         ("sequencer.mute", {"type": 'H', "value": 'PRESS'},
2431          {"properties": [("unselected", False)]}),
2432         ("sequencer.mute", {"type": 'H', "value": 'PRESS', "shift": True},
2433          {"properties": [("unselected", True)]}),
2434         ("sequencer.unmute", {"type": 'H', "value": 'PRESS', "alt": True},
2435          {"properties": [("unselected", False)]}),
2436         ("sequencer.unmute", {"type": 'H', "value": 'PRESS', "shift": True, "alt": True},
2437          {"properties": [("unselected", True)]}),
2438         ("sequencer.lock", {"type": 'L', "value": 'PRESS', "shift": True}, None),
2439         ("sequencer.unlock", {"type": 'L', "value": 'PRESS', "shift": True, "alt": True}, None),
2440         ("sequencer.reassign_inputs", {"type": 'R', "value": 'PRESS'}, None),
2441         ("sequencer.reload", {"type": 'R', "value": 'PRESS', "alt": True}, None),
2442         ("sequencer.reload", {"type": 'R', "value": 'PRESS', "shift": True, "alt": True},
2443          {"properties": [("adjust_length", True)]}),
2444         ("sequencer.refresh_all", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
2445         ("sequencer.offset_clear", {"type": 'O', "value": 'PRESS', "alt": True}, None),
2446         ("sequencer.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
2447         ("sequencer.delete", {"type": 'X', "value": 'PRESS'}, None),
2448         ("sequencer.delete", {"type": 'DEL', "value": 'PRESS'}, None),
2449         ("sequencer.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
2450         ("sequencer.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
2451         ("sequencer.images_separate", {"type": 'Y', "value": 'PRESS'}, None),
2452         ("sequencer.meta_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
2453         ("sequencer.meta_make", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
2454         ("sequencer.meta_separate", {"type": 'G', "value": 'PRESS', "ctrl": True, "alt": True}, None),
2455         ("sequencer.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
2456         ("sequencer.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
2457         ("sequencer.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
2458         ("sequencer.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
2459         ("sequencer.strip_jump", {"type": 'PAGE_UP', "value": 'PRESS'},
2460          {"properties": [("next", True), ("center", False)]}),
2461         ("sequencer.strip_jump", {"type": 'PAGE_DOWN', "value": 'PRESS'},
2462          {"properties": [("next", False), ("center", False)]}),
2463         ("sequencer.strip_jump", {"type": 'PAGE_UP', "value": 'PRESS', "alt": True},
2464          {"properties": [("next", True), ("center", True)]}),
2465         ("sequencer.strip_jump", {"type": 'PAGE_DOWN', "value": 'PRESS', "alt": True},
2466          {"properties": [("next", False), ("center", True)]}),
2467         ("sequencer.swap", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True},
2468          {"properties": [("side", 'LEFT')]}),
2469         ("sequencer.swap", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True},
2470          {"properties": [("side", 'RIGHT')]}),
2471         ("sequencer.gap_remove", {"type": 'BACK_SPACE', "value": 'PRESS'},
2472          {"properties": [("all", False)]}),
2473         ("sequencer.gap_remove", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True},
2474          {"properties": [("all", True)]}),
2475         ("sequencer.gap_insert", {"type": 'EQUAL', "value": 'PRESS', "shift": True}, None),
2476         ("sequencer.snap", {"type": 'S', "value": 'PRESS', "shift": True}, None),
2477         ("sequencer.swap_inputs", {"type": 'S', "value": 'PRESS', "alt": True}, None),
2478         *(
2479             (("sequencer.split_multicam",
2480               {"type": NUMBERS_1[i], "value": 'PRESS'},
2481               {"properties": [("camera", i + 1)]})
2482              for i in range(10)
2483              )
2484         ),
2485         ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS'},
2486          {"properties": [("deselect_all", True)]}),
2487         ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
2488          {"properties": [("extend", True)]}),
2489         ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "alt": True},
2490          {"properties": [("linked_handle", True)]}),
2491         ("sequencer.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "alt": True},
2492          {"properties": [("extend", True), ("linked_handle", True)]}),
2493         ("sequencer.select",
2494          {"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True},
2495          {"properties": [("side_of_frame", True), ("linked_time", True)]}),
2496         ("sequencer.select",
2497          {"type": params.select_mouse, "value": 'PRESS' if params.legacy else 'CLICK', "ctrl": True, "shift": True},
2498          {"properties": [("side_of_frame", True), ("linked_time", True), ("extend", True)]}),
2499         ("sequencer.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None),
2500         ("sequencer.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None),
2501         ("sequencer.select_linked_pick", {"type": 'L', "value": 'PRESS'},
2502          {"properties": [("extend", False)]}),
2503         ("sequencer.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
2504          {"properties": [("extend", True)]}),
2505         ("sequencer.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
2506         ("sequencer.select_box", {"type": params.select_tweak, "value": 'ANY'},
2507          {"properties": [("tweak", True), ("mode", 'SET')]}),
2508         ("sequencer.select_box", {"type": params.select_tweak, "value": 'ANY', "shift": True},
2509          {"properties": [("tweak", True), ("mode", 'ADD')]}),
2510         ("sequencer.select_box", {"type": params.select_tweak, "value": 'ANY', "ctrl": True},
2511          {"properties": [("tweak", True), ("mode", 'SUB')]}),
2512         ("sequencer.select_box", {"type": 'B', "value": 'PRESS'}, None),
2513         ("sequencer.select_box", {"type": 'B', "value": 'PRESS', "ctrl": True},
2514          {"properties": [("include_handles", True)]}),
2515         ("sequencer.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None),
2516         op_menu("SEQUENCER_MT_add", {"type": 'A', "value": 'PRESS', "shift": True}),
2517         op_menu("SEQUENCER_MT_change", {"type": 'C', "value": 'PRESS'}),
2518         ("sequencer.slip", {"type": 'S', "value": 'PRESS'}, None),
2519         ("wm.context_set_int", {"type": 'O', "value": 'PRESS'},
2520          {"properties": [("data_path", 'scene.sequence_editor.overlay_frame'), ("value", 0)]}),
2521         ("transform.seq_slide", {"type": 'G', "value": 'PRESS', "repeat": False}, None),
2522         ("transform.seq_slide", {"type": params.select_tweak, "value": 'ANY'}, None),
2523         ("transform.transform", {"type": 'E', "value": 'PRESS', "repeat": False},
2524          {"properties": [("mode", 'TIME_EXTEND')]}),
2525         ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
2526         ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
2527         ("sequencer.select_side_of_frame", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
2528          {"properties": [("side", 'LEFT')]}),
2529         ("sequencer.select_side_of_frame", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
2530          {"properties": [("side", 'RIGHT')]}),
2531
2532         *_template_items_context_menu("SEQUENCER_MT_context_menu", params.context_menu_event),
2533     ])
2534
2535     return keymap
2536
2537
2538 def km_sequencerpreview(params):
2539     items = []
2540     keymap = (
2541         "SequencerPreview",
2542         {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
2543         {"items": items},
2544     )
2545
2546     items.extend([
2547         ("sequencer.view_all_preview", {"type": 'HOME', "value": 'PRESS'}, None),
2548         ("sequencer.view_all_preview", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
2549         ("sequencer.view_ghost_border", {"type": 'O', "value": 'PRESS'}, None),
2550         ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True},
2551          {"properties": [("ratio", 8.0)]}),
2552         ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True},
2553          {"properties": [("ratio", 4.0)]}),
2554         ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True},
2555          {"properties": [("ratio", 2.0)]}),
2556         ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_1', "value": 'PRESS'},
2557          {"properties": [("ratio", 1.0)]}),
2558         ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS'},
2559          {"properties": [("ratio", 0.5)]}),
2560         ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS'},
2561          {"properties": [("ratio", 0.25)]}),
2562         ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS'},
2563          {"properties": [("ratio", 0.125)]}),
2564         ("sequencer.sample", {"type": params.action_mouse, "value": 'PRESS'}, None),
2565     ])
2566
2567     return keymap
2568
2569
2570 def km_console(_params):
2571     items = []
2572     keymap = (
2573         "Console",
2574         {"space_type": 'CONSOLE', "region_type": 'WINDOW'},
2575         {"items": items},
2576     )
2577
2578     items.extend([
2579         ("console.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True},
2580          {"properties": [("type", 'PREVIOUS_WORD')]}),
2581         ("console.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True},
2582          {"properties": [("type", 'NEXT_WORD')]}),
2583         ("console.move", {"type": 'HOME', "value": 'PRESS'},
2584          {"properties": [("type", 'LINE_BEGIN')]}),
2585         ("console.move", {"type": 'END', "value": 'PRESS'},
2586          {"properties": [("type", 'LINE_END')]}),
2587         ("wm.context_cycle_int", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "ctrl": True},
2588          {"properties": [("data_path", 'space_data.font_size'), ("reverse", False)]}),
2589         ("wm.context_cycle_int", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True},
2590          {"properties": [("data_path", 'space_data.font_size'), ("reverse", True)]}),
2591         ("wm.context_cycle_int", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
2592          {"properties": [("data_path", 'space_data.font_size'), ("reverse", False)]}),
2593         ("wm.context_cycle_int", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
2594          {"properties": [("data_path", 'space_data.font_size'), ("reverse", True)]}),
2595         ("console.move", {"type": 'LEFT_ARROW', "value": 'PRESS'},
2596          {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
2597         ("console.move", {"type": 'RIGHT_ARROW', "value": 'PRESS'},
2598          {"properties": [("type", 'NEXT_CHARACTER')]}),
2599         ("console.history_cycle", {"type": 'UP_ARROW', "value": 'PRESS'},
2600          {"properties": [("reverse", True)]}),
2601         ("console.history_cycle", {"type": 'DOWN_ARROW', "value": 'PRESS'},
2602          {"properties": [("reverse", False)]}),
2603         ("console.delete", {"type": 'DEL', "value": 'PRESS'},
2604          {"properties": [("type", 'NEXT_CHARACTER')]}),
2605         ("console.delete", {"type": 'BACK_SPACE', "value": 'PRESS'},
2606          {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
2607         ("console.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True},
2608          {"properties": [("type", 'PREVIOUS_CHARACTER')]}),
2609         ("console.delete", {"type": 'DEL', "value": 'PRESS', "ctrl": True},
2610          {"properties": [("type", 'NEXT_WORD')]}),
2611         ("console.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True},
2612          {"properties": [("type", 'PREVIOUS_WORD')]}),
2613         ("console.clear_line", {"type": 'RET', "value": 'PRESS', "shift": True}, None),
2614         ("console.clear_line", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "shift": True}, None),
2615         ("console.execute", {"type": 'RET', "value": 'PRESS'},
2616          {"properties": [("interactive", True)]}),
2617         ("console.execute", {"type": 'NUMPAD_ENTER', "value": 'PRESS'},
2618          {"properties": [("interactive", True)]}),
2619         ("console.copy_as_script", {"type": 'C', "value": 'PRESS', "shift": True, "ctrl": True}, None),
2620         ("console.copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
2621         ("console.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
2622         ("console.select_set", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
2623         ("console.select_word", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
2624         ("console.insert", {"type": 'TAB', "value": 'PRESS', "ctrl": True},
2625          {"properties": [("text", '\t')]}),
2626         ("console.indent_or_autocomplete", {"type": 'TAB', "value": 'PRESS'}, None),
2627         ("console.unindent", {"type": 'TAB', "value": 'PRESS', "shift": True}, None),
2628         *_template_items_context_menu("CONSOLE_MT_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}),
2629         ("console.insert", {"type": 'TEXTINPUT', "value": 'ANY', "any": True}, None),
2630     ])
2631
2632     return keymap
2633
2634
2635 def km_clip(_params):
2636     items = []
2637     keymap = (
2638         "Clip",
2639         {"space_type": 'CLIP_EDITOR', "region_type": 'WINDOW'},
2640         {"items": items},
2641     )
2642
2643     items.extend([
2644         *_template_space_region_type_toggle(
2645             toolbar_key={"type": 'T', "value": 'PRESS'},
2646             sidebar_key={"type": 'N', "value": 'PRESS'},
2647         ),
2648         ("clip.open", {"type": 'O', "value": 'PRESS', "alt": True}, None),
2649         ("clip.track_markers", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True},
2650          {"properties": [("backwards", True), ("sequence", False)]}),
2651         ("clip.track_markers", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True},
2652          {"properties": [("backwards", False), ("sequence", False)]}),
2653         ("clip.track_markers", {"type": 'T', "value": 'PRESS', "ctrl": True},
2654          {"properties": [("backwards", False), ("sequence", True)]}),
2655         ("clip.track_markers", {"type": 'T', "value": 'PRESS', "shift": True, "ctrl": True},
2656          {"properties": [("backwards", True), ("sequence", True)]}),
2657         ("wm.context_toggle_enum", {"type": 'TAB', "value": 'PRESS'},
2658          {"properties": [("data_path", 'space_data.mode'), ("value_1", 'TRACKING'), ("value_2", 'MASK')]}),
2659         ("clip.prefetch", {"type": 'P', "value": 'PRESS'}, None),
2660         op_menu_pie("CLIP_MT_tracking_pie", {"type": 'E', "value": 'PRESS'}),
2661         op_menu_pie("CLIP_MT_solving_pie", {"type": 'S', "value": 'PRESS', "shift": True}),
2662         op_menu_pie("CLIP_MT_marker_pie", {"type": 'E', "value": 'PRESS', "shift": True}),
2663         op_menu_pie("CLIP_MT_reconstruction_pie", {"type": 'W', "value": 'PRESS', "shift": True}),
2664     ])
2665
2666     return keymap
2667
2668
2669 def km_clip_editor(params):
2670     items = []
2671     keymap = (
2672         "Clip Editor",
2673         {"space_type": 'CLIP_EDITOR', "region_type": 'WINDOW'},
2674         {"items": items},
2675     )
2676
2677     items.extend([
2678         ("clip.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
2679         ("clip.view_pan", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "shift": True}, None),
2680         ("clip.view_pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
2681         ("clip.view_zoom", {"type": 'MIDDLEMOUSE', "value": 'PRESS', "ctrl": True}, None),
2682         ("clip.view_zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
2683         ("clip.view_zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
2684         ("clip.view_zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS'}, None),
2685         ("clip.view_zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None),
2686         ("clip.view_zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
2687         ("clip.view_zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
2688         ("clip.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True},
2689          {"properties": [("ratio", 8.0)]}),
2690         ("clip.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True},
2691          {"properties": [("ratio", 4.0)]}),
2692         ("clip.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "ctrl": True},
2693          {"properties": [("ratio", 2.0)]}),
2694         ("clip.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "shift": True},
2695          {"properties": [("ratio", 8.0)]}),
2696         ("clip.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "shift": True},
2697          {"properties": [("ratio", 4.0)]}),
2698         ("clip.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS', "shift": True},
2699          {"properties": [("ratio", 2.0)]}),
2700         ("clip.view_zoom_ratio", {"type": 'NUMPAD_1', "value": 'PRESS'},
2701          {"properties": [("ratio", 1.0)]}),
2702         ("clip.view_zoom_ratio", {"type": 'NUMPAD_2', "value": 'PRESS'},
2703          {"properties": [("ratio", 0.5)]}),
2704         ("clip.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS'},
2705          {"properties": [("ratio", 0.25)]}),
2706         ("clip.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS'},
2707          {"properties": [("ratio", 0.125)]}),
2708         ("clip.view_all", {"type": 'HOME', "value": 'PRESS'}, None),
2709         ("clip.view_all", {"type": 'F', "value": 'PRESS'},
2710          {"properties": [("fit_view", True)]}),
2711         ("clip.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
2712         ("clip.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
2713         ("clip.view_ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
2714         ("clip.frame_jump", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
2715          {"properties": [("position", 'PATHSTART')]}),
2716         ("clip.frame_jump", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
2717          {"properties": [("position", 'PATHEND')]}),
2718         ("clip.frame_jump", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "alt": True},
2719          {"properties": [("position", 'FAILEDPREV')]}),
2720         ("clip.frame_jump", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "alt": True},
2721          {"properties": [("position", 'PATHSTART')]}),
2722         ("clip.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
2723         ("clip.select", {"type": params.select_mouse, "value": 'PRESS'},
2724          {"properties": [("extend", False), ("deselect_all", not params.legacy)]}),
2725         ("clip.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
2726          {"properties": [("extend", True)]}),
2727         *_template_items_select_actions(params, "clip.select_all"),
2728         ("clip.select_box", {"type": 'B', "value": 'PRESS'}, None),
2729         ("clip.select_circle", {"type": 'C', "value": 'PRESS'}, None),
2730         op_menu("CLIP_MT_select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}),
2731         ("clip.select_lasso", {"type": params.action_tweak, "value": 'ANY', "ctrl": True, "alt": True},
2732          {"properties": [("mode", 'ADD')]}),
2733         ("clip.select_lasso", {"type": params.action_tweak, "value": 'ANY', "shift": True, "ctrl": True, "alt": True},
2734          {"properties": [("mode", 'SUB')]}),
2735         ("clip.add_marker_slide", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
2736         ("clip.delete_marker", {"type": 'X', "value": 'PRESS', "shift": True}, None),
2737         ("clip.delete_marker", {"type": 'DEL', "value": 'PRESS', "shift": True}, None),
2738         ("clip.slide_marker", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
2739         ("clip.disable_markers", {"type": 'D', "value": 'PRESS', "shift": True},
2740          {"properties": [("action", 'TOGGLE')]}),
2741         ("clip.delete_track", {"type": 'X', "value": 'PRESS'}, None),
2742         ("clip.delete_track", {"type": 'DEL', "value": 'PRESS'}, None),
2743         ("clip.lock_tracks", {"type": 'L', "value": 'PRESS', "ctrl": True},
2744          {"properties": [("action", 'LOCK')]}),
2745         ("clip.lock_tracks", {"type": 'L', "value": 'PRESS', "alt": True},
2746          {"properties": [("action", 'UNLOCK')]}),
2747         ("clip.hide_tracks", {"type": 'H', "value": 'PRESS'},
2748          {"properties": [("unselected", False)]}),
2749         ("clip.hide_tracks", {"type": 'H', "value": 'PRESS', "shift": True},
2750          {"properties": [("unselected", True)]}),
2751         ("clip.hide_tracks_clear", {"type": 'H', "value": 'PRESS', "alt": True}, None),
2752         ("clip.slide_plane_marker", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None),
2753         ("clip.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None),
2754         ("clip.keyframe_delete", {"type": 'I', "value": 'PRESS', "alt": True}, None),
2755         ("clip.join_tracks", {"type": 'J', "value": 'PRESS', "ctrl": True}, None),
2756         ("clip.lock_selection_toggle", {"type": 'L', "value": 'PRESS'}, None),
2757         ("wm.context_toggle", {"type": 'D', "value": 'PRESS', "alt": True},
2758          {"properties": [("data_path", 'space_data.show_disabled')]}),
2759         ("wm.context_toggle", {"type": 'S', "value": 'PRESS', "alt": True},
2760          {"properties": [("data_path", 'space_data.show_marker_search')]}),
2761         ("wm.context_toggle", {"type": 'M', "value": 'PRESS'},
2762          {"properties": [("data_path", 'space_data.use_mute_footage')]}),
2763         ("transform.translate", {"type": 'G', "value": 'PRESS', "repeat": False}, None),
2764         ("transform.translate", {"type": params.select_tweak, "value": 'ANY'}, None),
2765         ("transform.resize", {"type": 'S', "value": 'PRESS', "repeat": False}, None),
2766         ("transform.rotate", {"type": 'R', "value": 'PRESS', "repeat": False}, None),
2767         ("clip.clear_track_path", {"type": 'T', "value": 'PRESS', "alt": True},
2768          {"properties": [("action", 'REMAINED'), ("clear_active", False)]}),
2769         ("clip.clear_track_path", {"type": 'T', "value": 'PRESS', "shift": True},
2770          {"properties": [("action", 'UPTO'), ("clear_active", False)]}),
2771         ("clip.clear_track_path", {"type": 'T', "value": 'PRESS', "shift": True, "alt": True},
2772          {"properties": [("action", 'ALL'), ("clear_active", False)]}),
2773         ("clip.cursor_set", params.cursor_set_event, None),
2774         op_menu_pie("CLIP_MT_pivot_pie", {"type": 'PERIOD', "value": 'PRESS'}),
2775         ("clip.copy_tracks", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
2776         ("clip.paste_tracks", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
2777         *_template_items_context_menu("CLIP_MT_tracking_context_menu", params.context_menu_event),
2778     ])
2779
2780     if params.legacy:
2781         items.extend([
2782             ("clip.view_center_cursor", {"type": 'HOME', "value": 'PRESS', "alt": True},&n