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