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