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