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