Blender V5.0
wm_keymap_utils.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10
11#include <cstring>
12
13#include "DNA_space_types.h"
15
16#include "BLI_listbase.h"
17#include "BLI_utildefines.h"
18
19#include "BKE_context.hh"
20
21#include "RNA_access.hh"
22
23#include "WM_api.hh"
24#include "WM_keymap.hh"
25#include "WM_types.hh"
26
27/* Menu wrapper for #WM_keymap_add_item. */
28
29/* -------------------------------------------------------------------- */
32
34 const char *idname,
36{
37 wmKeyMapItem *kmi = WM_keymap_add_item(keymap, "WM_OT_call_menu", params);
38 RNA_string_set(kmi->ptr, "name", idname);
39 return kmi;
40}
41
43 const char *idname,
45{
46 wmKeyMapItem *kmi = WM_keymap_add_item(keymap, "WM_OT_call_menu_pie", params);
47 RNA_string_set(kmi->ptr, "name", idname);
48 return kmi;
49}
50
52 const char *idname,
54{
55 wmKeyMapItem *kmi = WM_keymap_add_item(keymap, "WM_OT_call_panel", params);
56 RNA_string_set(kmi->ptr, "name", idname);
57 /* TODO: we might want to disable this. */
58 RNA_boolean_set(kmi->ptr, "keep_open", false);
59 return kmi;
60}
61
63 const char *idname,
65{
66 wmKeyMapItem *kmi = WM_keymap_add_item(keymap, "WM_OT_tool_set_by_id", params);
67 RNA_string_set(kmi->ptr, "name", idname);
68 return kmi;
69}
70
72
73/* -------------------------------------------------------------------- */
76
78{
79 eSpace_Type space_type = SPACE_EMPTY;
80 eRegion_Type region_type = RGN_TYPE_WINDOW;
82
83 /* Tool property tab is a special case where 3d tool properties are shown in the properties
84 * editor. This would allow assigning tool shortcut keys from properties editor. */
85 bool allow_properties_keymap = false;
86 if (sl->spacetype == SPACE_PROPERTIES) {
87 SpaceProperties *sp = reinterpret_cast<SpaceProperties *>(sl);
88 if (sp->mainb == BCONTEXT_TOOL) {
89 allow_properties_keymap = true;
90 }
91 }
92
93 const char *km_id = nullptr;
94 if (sl->spacetype == SPACE_VIEW3D || allow_properties_keymap) {
95 const enum eContextObjectMode mode = CTX_data_mode_enum(C);
96 switch (mode) {
98 km_id = "Mesh";
99 break;
101 km_id = "Curve";
102 break;
104 km_id = "Curves";
105 break;
107 km_id = "Curve";
108 break;
110 km_id = "Font";
111 break;
113 km_id = "Armature";
114 break;
116 km_id = "Metaball";
117 break;
119 km_id = "Lattice";
120 break;
122 km_id = "Grease Pencil Edit Mode";
123 break;
125 km_id = "Point Cloud";
126 break;
127 case CTX_MODE_POSE:
128 km_id = "Pose";
129 break;
130 case CTX_MODE_SCULPT:
131 km_id = "Sculpt";
132 break;
134 km_id = "Weight Paint";
135 break;
137 km_id = "Vertex Paint";
138 break;
140 km_id = "Image Paint";
141 break;
143 km_id = "Particle";
144 break;
145 case CTX_MODE_OBJECT:
146 km_id = "Object Mode";
147 break;
149 km_id = "Grease Pencil Stroke Paint Mode";
150 break;
152 km_id = "Grease Pencil Stroke Edit Mode";
153 break;
155 km_id = "Grease Pencil Stroke Sculpt Mode";
156 break;
158 km_id = "Grease Pencil Stroke Weight Mode";
159 break;
161 km_id = "Grease Pencil Stroke Vertex Mode";
162 break;
164 km_id = "Sculpt Curves";
165 break;
167 km_id = "Grease Pencil Paint Mode";
168 break;
170 km_id = "Grease Pencil Sculpt Mode";
171 break;
173 km_id = "Grease Pencil Weight Mode";
174 break;
176 km_id = "Grease Pencil Vertex Mode";
177 break;
178 }
179 }
180 else if (sl->spacetype == SPACE_IMAGE) {
181 const SpaceImage *sima = (SpaceImage *)sl;
182 const eSpaceImage_Mode mode = eSpaceImage_Mode(sima->mode);
183 space_type = SPACE_IMAGE;
184 switch (mode) {
185 case SI_MODE_VIEW:
186 km_id = "Image";
187 break;
188 case SI_MODE_PAINT:
189 km_id = "Image Paint";
190 break;
191 case SI_MODE_MASK:
192 km_id = "Mask Editing";
193 break;
194 case SI_MODE_UV:
195 km_id = "UV Editor";
196 break;
197 }
198 }
199 else if (sl->spacetype == SPACE_SEQ) {
200 const SpaceSeq *sseq = (SpaceSeq *)sl;
202 space_type = SPACE_SEQ;
203 switch (view) {
205 km_id = "Sequencer";
206 break;
207 case SEQ_VIEW_PREVIEW:
208 km_id = "Preview";
209 break;
211 km_id = "Video Sequence Editor";
212 break;
213 }
214 }
215 else {
216 return nullptr;
217 }
218
219 wmKeyMap *km = WM_keymap_find_all(CTX_wm_manager(C), km_id, space_type, region_type);
220 BLI_assert(km);
221 return km;
222}
223
224wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname)
225{
226 /* Op types purposely skipped for now:
227 * BOID_OT
228 * BUTTONS_OT
229 * CONSTRAINT_OT
230 * ED_OT
231 * FLUID_OT
232 * TEXTURE_OT
233 * WORLD_OT
234 */
235
236 wmKeyMap *km = nullptr;
239
240 /* Window. */
241 if (STRPREFIX(opname, "WM_OT") || STRPREFIX(opname, "ED_OT_undo")) {
242 if (STREQ(opname, "WM_OT_tool_set_by_id") || STREQ(opname, "WM_OT_call_asset_shelf_popover")) {
244 }
245
246 if (km == nullptr) {
248 }
249 }
250 /* Screen & Render. */
251 else if (STRPREFIX(opname, "SCREEN_OT") || STRPREFIX(opname, "RENDER_OT") ||
252 STRPREFIX(opname, "SOUND_OT") || STRPREFIX(opname, "SCENE_OT"))
253 {
255 }
256 /* Grease Pencil. */
257 else if (STRPREFIX(opname, "GPENCIL_OT")) {
258 km = WM_keymap_find_all(wm, "Grease Pencil", SPACE_EMPTY, RGN_TYPE_WINDOW);
259 }
260 else if (STRPREFIX(opname, "GREASE_PENCIL_OT")) {
261 km = WM_keymap_find_all(wm, "Grease Pencil", SPACE_EMPTY, RGN_TYPE_WINDOW);
262 }
263 /* Markers. */
264 else if (STRPREFIX(opname, "MARKER_OT")) {
265 km = WM_keymap_find_all(wm, "Markers", SPACE_EMPTY, RGN_TYPE_WINDOW);
266 }
267 /* Import/Export. */
268 else if (STRPREFIX(opname, "IMPORT_") || STRPREFIX(opname, "EXPORT_")) {
270 }
271
272 /* 3D View. */
273 else if (STRPREFIX(opname, "VIEW3D_OT")) {
274 km = WM_keymap_find_all(wm, "3D View", sl->spacetype, RGN_TYPE_WINDOW);
275 }
276 else if (STRPREFIX(opname, "OBJECT_OT")) {
277 /* Exception, this needs to work outside object mode too. */
278 if (STRPREFIX(opname, "OBJECT_OT_mode_set") || STRPREFIX(opname, "OBJECT_OT_transfer_mode")) {
279 km = WM_keymap_find_all(wm, "Object Non-modal", SPACE_EMPTY, RGN_TYPE_WINDOW);
280 }
281 else {
283 }
284
285 if (km == nullptr) {
286 km = WM_keymap_find_all(wm, "Object Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
287 }
288 }
289 /* Object mode related. */
290 else if (STRPREFIX(opname, "GROUP_OT") || STRPREFIX(opname, "MATERIAL_OT") ||
291 STRPREFIX(opname, "PTCACHE_OT") || STRPREFIX(opname, "RIGIDBODY_OT"))
292 {
293 km = WM_keymap_find_all(wm, "Object Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
294 }
295
296 /* Editing Modes. */
297 else if (STRPREFIX(opname, "MESH_OT")) {
299
300 /* Some mesh operators are active in object mode too, like add-prim. */
301 if (km && !WM_keymap_poll((bContext *)C, km)) {
302 km = WM_keymap_find_all(wm, "Object Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
303 }
304 }
305 else if (STRPREFIX(opname, "CURVE_OT") || STRPREFIX(opname, "SURFACE_OT")) {
307
308 /* Some curve operators are active in object mode too, like add-prim. */
309 if (km && !WM_keymap_poll((bContext *)C, km)) {
310 km = WM_keymap_find_all(wm, "Object Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
311 }
312 }
313 else if (STRPREFIX(opname, "ARMATURE_OT") || STRPREFIX(opname, "SKETCH_OT")) {
314 km = WM_keymap_find_all(wm, "Armature", SPACE_EMPTY, RGN_TYPE_WINDOW);
315 }
316 else if (STRPREFIX(opname, "POSE_OT") || STRPREFIX(opname, "POSELIB_OT")) {
318 }
319 else if (STRPREFIX(opname, "SCULPT_OT")) {
320 switch (CTX_data_mode_enum(C)) {
321 case CTX_MODE_SCULPT:
323 break;
324 default:
325 break;
326 }
327 }
328 else if (STRPREFIX(opname, "CURVES_OT")) {
330 }
331 else if (STRPREFIX(opname, "SCULPT_CURVES_OT")) {
332 km = WM_keymap_find_all(wm, "Sculpt Curves", SPACE_EMPTY, RGN_TYPE_WINDOW);
333 }
334 else if (STRPREFIX(opname, "MBALL_OT")) {
335 km = WM_keymap_find_all(wm, "Metaball", SPACE_EMPTY, RGN_TYPE_WINDOW);
336
337 /* Some meta-ball operators are active in object mode too, like add-primitive. */
338 if (km && !WM_keymap_poll((bContext *)C, km)) {
339 km = WM_keymap_find_all(wm, "Object Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
340 }
341 }
342 else if (STRPREFIX(opname, "LATTICE_OT")) {
343 km = WM_keymap_find_all(wm, "Lattice", SPACE_EMPTY, RGN_TYPE_WINDOW);
344 }
345 else if (STRPREFIX(opname, "PARTICLE_OT")) {
346 km = WM_keymap_find_all(wm, "Particle", SPACE_EMPTY, RGN_TYPE_WINDOW);
347 }
348 else if (STRPREFIX(opname, "POINTCLOUD_OT")) {
349 km = WM_keymap_find_all(wm, "Point Cloud", SPACE_EMPTY, RGN_TYPE_WINDOW);
350 }
351 else if (STRPREFIX(opname, "FONT_OT")) {
353 }
354 /* Paint Face Mask. */
355 else if (STRPREFIX(opname, "PAINT_OT_face_select")) {
357 wm, "Paint Face Mask (Weight, Vertex, Texture)", SPACE_EMPTY, RGN_TYPE_WINDOW);
358 }
359 else if (STRPREFIX(opname, "PAINT_OT") || STRPREFIX(opname, "BRUSH_OT")) {
360 /* Check for relevant mode. */
362 }
363 /* General 2D View, not bound to a specific spacetype. */
364 else if (STRPREFIX(opname, "VIEW2D_OT")) {
366 }
367 /* Image Editor. */
368 else if (STRPREFIX(opname, "IMAGE_OT")) {
369 km = WM_keymap_find_all(wm, "Image", sl->spacetype, RGN_TYPE_WINDOW);
370 }
371 /* Clip Editor. */
372 else if (STRPREFIX(opname, "CLIP_OT")) {
373 km = WM_keymap_find_all(wm, "Clip", sl->spacetype, RGN_TYPE_WINDOW);
374 }
375 else if (STRPREFIX(opname, "MASK_OT")) {
376 km = WM_keymap_find_all(wm, "Mask Editing", SPACE_EMPTY, RGN_TYPE_WINDOW);
377 }
378 /* UV Editor. */
379 else if (STRPREFIX(opname, "UV_OT")) {
380 /* Hack to allow using UV unwrapping ops from 3DView/editmode.
381 * Mesh keymap is probably not ideal, but best place I could find to put those. */
382 if (sl->spacetype == SPACE_VIEW3D) {
384 if (km && !WM_keymap_poll((bContext *)C, km)) {
385 km = nullptr;
386 }
387 }
388 if (!km) {
389 km = WM_keymap_find_all(wm, "UV Editor", SPACE_EMPTY, RGN_TYPE_WINDOW);
390 }
391 }
392 /* Node Editor. */
393 else if (STRPREFIX(opname, "NODE_OT")) {
394 km = WM_keymap_find_all(wm, "Node Editor", sl->spacetype, RGN_TYPE_WINDOW);
395 }
396 /* Animation Editor Channels. */
397 else if (STRPREFIX(opname, "ANIM_OT_channels")) {
398 km = WM_keymap_find_all(wm, "Animation Channels", SPACE_EMPTY, RGN_TYPE_WINDOW);
399 }
400 /* Animation Generic - after channels. */
401 else if (STRPREFIX(opname, "ANIM_OT")) {
402 if (sl->spacetype == SPACE_VIEW3D) {
403 switch (CTX_data_mode_enum(C)) {
404 case CTX_MODE_OBJECT:
405 km = WM_keymap_find_all(wm, "Object Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
406 break;
407 case CTX_MODE_POSE:
409 break;
410 default:
411 break;
412 }
413
414 if (ARegion *region = CTX_wm_region(C)) {
415 /* When property is in side panel, add shortcut key to User interface Keymap, see: #136998.
416 */
417 if (region->regiontype == RGN_TYPE_UI) {
418 km = WM_keymap_find_all(wm, "User Interface", SPACE_EMPTY, RGN_TYPE_WINDOW);
419 }
420 }
421 if (km && !WM_keymap_poll((bContext *)C, km)) {
422 km = nullptr;
423 }
424 }
425 else if (sl->spacetype == SPACE_PROPERTIES) {
426 km = WM_keymap_find_all(wm, "User Interface", SPACE_EMPTY, RGN_TYPE_WINDOW);
427 }
428
429 if (!km) {
430 km = WM_keymap_find_all(wm, "Animation", SPACE_EMPTY, RGN_TYPE_WINDOW);
431 }
432 }
433 /* Graph Editor. */
434 else if (STRPREFIX(opname, "GRAPH_OT")) {
435 km = WM_keymap_find_all(wm, "Graph Editor", sl->spacetype, RGN_TYPE_WINDOW);
436 }
437 /* Dopesheet Editor. */
438 else if (STRPREFIX(opname, "ACTION_OT")) {
439 km = WM_keymap_find_all(wm, "Dopesheet", sl->spacetype, RGN_TYPE_WINDOW);
440 }
441 /* NLA Editor. */
442 else if (STRPREFIX(opname, "NLA_OT")) {
443 km = WM_keymap_find_all(wm, "NLA Editor", sl->spacetype, RGN_TYPE_WINDOW);
444 }
445 /* Script. */
446 else if (STRPREFIX(opname, "SCRIPT_OT")) {
447 km = WM_keymap_find_all(wm, "Script", sl->spacetype, RGN_TYPE_WINDOW);
448 }
449 /* Text. */
450 else if (STRPREFIX(opname, "TEXT_OT")) {
451 km = WM_keymap_find_all(wm, "Text", sl->spacetype, RGN_TYPE_WINDOW);
452 }
453 /* Sequencer. */
454 else if (STRPREFIX(opname, "SEQUENCER_OT")) {
455 km = WM_keymap_find_all(wm, "Sequencer", sl->spacetype, RGN_TYPE_WINDOW);
456 }
457 /* Console. */
458 else if (STRPREFIX(opname, "CONSOLE_OT")) {
459 km = WM_keymap_find_all(wm, "Console", sl->spacetype, RGN_TYPE_WINDOW);
460 }
461 /* Console. */
462 else if (STRPREFIX(opname, "INFO_OT")) {
463 km = WM_keymap_find_all(wm, "Info", sl->spacetype, RGN_TYPE_WINDOW);
464 }
465 /* File browser. */
466 else if (STRPREFIX(opname, "FILE_OT")) {
467 km = WM_keymap_find_all(wm, "File Browser", sl->spacetype, RGN_TYPE_WINDOW);
468 }
469 /* Logic Editor. */
470 else if (STRPREFIX(opname, "LOGIC_OT")) {
471 km = WM_keymap_find_all(wm, "Logic Editor", sl->spacetype, RGN_TYPE_WINDOW);
472 }
473 /* Outliner. */
474 else if (STRPREFIX(opname, "OUTLINER_OT")) {
475 km = WM_keymap_find_all(wm, "Outliner", sl->spacetype, RGN_TYPE_WINDOW);
476 }
477 /* Transform. */
478 else if (STRPREFIX(opname, "TRANSFORM_OT")) {
479 /* Check for relevant editor. */
480 switch (sl->spacetype) {
481 case SPACE_VIEW3D:
482 km = WM_keymap_find_all(wm, "3D View", sl->spacetype, RGN_TYPE_WINDOW);
483 break;
484 case SPACE_GRAPH:
485 km = WM_keymap_find_all(wm, "Graph Editor", sl->spacetype, RGN_TYPE_WINDOW);
486 break;
487 case SPACE_ACTION:
488 km = WM_keymap_find_all(wm, "Dopesheet", sl->spacetype, RGN_TYPE_WINDOW);
489 break;
490 case SPACE_NLA:
491 km = WM_keymap_find_all(wm, "NLA Editor", sl->spacetype, RGN_TYPE_WINDOW);
492 break;
493 case SPACE_IMAGE:
494 km = WM_keymap_find_all(wm, "UV Editor", SPACE_EMPTY, RGN_TYPE_WINDOW);
495 break;
496 case SPACE_NODE:
497 km = WM_keymap_find_all(wm, "Node Editor", sl->spacetype, RGN_TYPE_WINDOW);
498 break;
499 case SPACE_SEQ:
500 km = WM_keymap_find_all(wm, "Sequencer", sl->spacetype, RGN_TYPE_WINDOW);
501 break;
502 }
503 }
504 /* User Interface. */
505 else if (STRPREFIX(opname, "UI_OT")) {
506 km = WM_keymap_find_all(wm, "User Interface", SPACE_EMPTY, RGN_TYPE_WINDOW);
507 }
508 /* Geometry. */
509 else if (STRPREFIX(opname, "GEOMETRY_OT")) {
510 switch (sl->spacetype) {
511 case SPACE_VIEW3D:
512 switch (CTX_data_mode_enum(C)) {
515 break;
518 break;
520 km = WM_keymap_find_all(wm, "Point Cloud", SPACE_EMPTY, RGN_TYPE_WINDOW);
521 break;
522 case CTX_MODE_SCULPT:
524 break;
526 km = WM_keymap_find_all(wm, "Sculpt Curves", SPACE_EMPTY, RGN_TYPE_WINDOW);
527 break;
528 default:
529 break;
530 }
531 break;
532 }
533 }
534
535 return km;
536}
537
538static bool wm_keymap_item_uses_modifier(const wmKeyMapItem *kmi, const int event_modifier)
539{
540 if (kmi->ctrl != KM_ANY) {
541 if ((kmi->ctrl == KM_NOTHING) != ((event_modifier & KM_CTRL) == 0)) {
542 return false;
543 }
544 }
545
546 if (kmi->alt != KM_ANY) {
547 if ((kmi->alt == KM_NOTHING) != ((event_modifier & KM_ALT) == 0)) {
548 return false;
549 }
550 }
551
552 if (kmi->shift != KM_ANY) {
553 if ((kmi->shift == KM_NOTHING) != ((event_modifier & KM_SHIFT) == 0)) {
554 return false;
555 }
556 }
557
558 if (kmi->oskey != KM_ANY) {
559 if ((kmi->oskey == KM_NOTHING) != ((event_modifier & KM_OSKEY) == 0)) {
560 return false;
561 }
562 }
563 if (kmi->hyper != KM_ANY) {
564 if ((kmi->hyper == KM_NOTHING) != ((event_modifier & KM_HYPER) == 0)) {
565 return false;
566 }
567 }
568
569 return true;
570}
571
572bool WM_keymap_uses_event_modifier(const wmKeyMap *keymap, const int event_modifier)
573{
574 LISTBASE_FOREACH (const wmKeyMapItem *, kmi, &keymap->items) {
575 if ((kmi->flag & KMI_INACTIVE) == 0) {
576 if (wm_keymap_item_uses_modifier(kmi, event_modifier)) {
577 return true;
578 }
579 }
580 }
581 return false;
582}
583
585
eContextObjectMode
@ CTX_MODE_VERTEX_GPENCIL_LEGACY
@ CTX_MODE_WEIGHT_GPENCIL_LEGACY
@ CTX_MODE_SCULPT_GPENCIL_LEGACY
@ CTX_MODE_PAINT_GREASE_PENCIL
@ CTX_MODE_PAINT_GPENCIL_LEGACY
@ CTX_MODE_EDIT_CURVE
@ CTX_MODE_PAINT_TEXTURE
@ CTX_MODE_EDIT_SURFACE
@ CTX_MODE_SCULPT_GREASE_PENCIL
@ CTX_MODE_PARTICLE
@ CTX_MODE_SCULPT
@ CTX_MODE_OBJECT
@ CTX_MODE_EDIT_MESH
@ CTX_MODE_EDIT_POINTCLOUD
@ CTX_MODE_EDIT_GREASE_PENCIL
@ CTX_MODE_SCULPT_CURVES
@ CTX_MODE_EDIT_TEXT
@ CTX_MODE_EDIT_CURVES
@ CTX_MODE_EDIT_ARMATURE
@ CTX_MODE_EDIT_LATTICE
@ CTX_MODE_WEIGHT_GREASE_PENCIL
@ CTX_MODE_VERTEX_GREASE_PENCIL
@ CTX_MODE_PAINT_VERTEX
@ CTX_MODE_EDIT_METABALL
@ CTX_MODE_PAINT_WEIGHT
@ CTX_MODE_EDIT_GPENCIL_LEGACY
@ CTX_MODE_POSE
SpaceLink * CTX_wm_space_data(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
enum eContextObjectMode CTX_data_mode_enum(const bContext *C)
#define BLI_assert(a)
Definition BLI_assert.h:46
#define LISTBASE_FOREACH(type, var, list)
#define STRPREFIX(a, b)
#define STREQ(a, b)
eRegion_Type
@ RGN_TYPE_UI
@ RGN_TYPE_WINDOW
eSpace_Type
@ SPACE_ACTION
@ SPACE_NODE
@ SPACE_PROPERTIES
@ SPACE_NLA
@ SPACE_SEQ
@ SPACE_EMPTY
@ SPACE_IMAGE
@ SPACE_GRAPH
@ SPACE_VIEW3D
eSpaceSeq_Displays
@ SEQ_VIEW_SEQUENCE_PREVIEW
@ SEQ_VIEW_SEQUENCE
@ SEQ_VIEW_PREVIEW
eSpaceImage_Mode
@ SI_MODE_PAINT
@ SI_MODE_VIEW
@ SI_MODE_MASK
@ SI_MODE_UV
@ BCONTEXT_TOOL
static AppView * view
#define C
Definition RandGen.cpp:29
@ KM_CTRL
Definition WM_types.hh:279
@ KM_ALT
Definition WM_types.hh:280
@ KM_HYPER
Definition WM_types.hh:292
@ KM_OSKEY
Definition WM_types.hh:282
@ KM_SHIFT
Definition WM_types.hh:278
@ KM_NOTHING
Definition WM_types.hh:310
@ KM_ANY
Definition WM_types.hh:309
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
struct PointerRNA * ptr
wmKeyMap * WM_keymap_find_all(wmWindowManager *wm, const char *idname, int spaceid, int regionid)
Definition wm_keymap.cc:909
bool WM_keymap_poll(bContext *C, wmKeyMap *keymap)
Definition wm_keymap.cc:470
wmKeyMapItem * WM_keymap_add_item(wmKeyMap *keymap, const char *idname, const KeyMapItem_Params *params)
Definition wm_keymap.cc:548
wmKeyMapItem * WM_keymap_add_panel(wmKeyMap *keymap, const char *idname, const KeyMapItem_Params *params)
wmKeyMap * WM_keymap_guess_from_context(const bContext *C)
wmKeyMapItem * WM_keymap_add_menu(wmKeyMap *keymap, const char *idname, const KeyMapItem_Params *params)
wmKeyMapItem * WM_keymap_add_menu_pie(wmKeyMap *keymap, const char *idname, const KeyMapItem_Params *params)
bool WM_keymap_uses_event_modifier(const wmKeyMap *keymap, const int event_modifier)
void WM_keymap_fix_linking()
static bool wm_keymap_item_uses_modifier(const wmKeyMapItem *kmi, const int event_modifier)
wmKeyMap * WM_keymap_guess_opname(const bContext *C, const char *opname)
wmKeyMapItem * WM_keymap_add_tool(wmKeyMap *keymap, const char *idname, const KeyMapItem_Params *params)