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