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