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