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