12#include <fmt/format.h>
67 kmin->
flag &= ~KMI_UPDATE;
70 kmin->
ptr = MEM_new<PointerRNA>(
"UserKeyMapItemPtr");
128 if (kmi->
idname[0] == 0) {
133 if (kmi->
ptr ==
nullptr) {
157 if (keep_properties) {
168 const bool keep_properties)
176 if (kmdi->add_item) {
179 if (kmdi->remove_item) {
188 return (
STREQ(a->idname,
b->idname) &&
197 a->shift ==
b->shift && a->ctrl ==
b->ctrl && a->alt ==
b->alt && a->oskey ==
b->oskey &&
198 a->keymodifier ==
b->keymodifier && a->maptype ==
b->maptype &&
208 MEM_delete(kmi->
ptr);
256 kmdin->
next = kmdin->
prev =
nullptr;
333 U.runtime.is_dirty =
true;
342 for (
int i = 0; i <
ARRAY_SIZE(keyconf_arr_p); i++) {
344 if (*kc_p == keyconf) {
390 U.runtime.is_dirty =
true;
483 if (!
U.app_template[0] &&
497 if (keymap->
poll !=
nullptr) {
498 return keymap->
poll(C);
584 MEM_delete(kmi->
ptr);
662 if (!orig_kmi && addon_km) {
667 orig_kmi->
flag &= ~KMI_EXPANDED;
689 if (kmdi->remove_item) {
697 if (kmdi->add_item) {
718 if (kmi_add !=
nullptr && kmi_add == kmi_remove) {
719 kmi_remove =
nullptr;
722 else if (!kmi_add && (!kmdi->remove_item || kmi_remove)) {
727 kmi_add->
flag &= ~KMI_EXPANDED;
729 kmi_add->
id = kmi_remove->
id;
778 kmi->id = orig_kmi->
id;
781 kmi->id = -(km->
kmi_id++);
871 if (km->spaceid == spaceid && km->regionid == regionid) {
887 if (
ELEM(km->spaceid, spaceid,
SPACE_EMPTY) && km->regionid == regionid) {
1011 const int propvalue)
1015 for (; kmi; kmi = kmi->
next) {
1067 if (kmi->propvalue_str[0]) {
1073 kmi->propvalue = propvalue;
1075 kmi->propvalue_str[0] =
'\0';
1090 const char *single_glyph)
1102 const char *single_glyph =
nullptr;
1110#if defined(__APPLE__)
1112#elif defined(_WIN32)
1122 if (platform == MACOS) {
1130 if (platform == MACOS) {
1136 if (platform == MACOS) {
1143 if (platform == MACOS) {
1147 if (platform == MSWIN) {
1159 if (platform == MACOS) {
1188 if (compact && it->description[0]) {
1190 return IFACE_(it->description);
1200 const short keymodifier,
1208 const char *space =
" ";
1216 result_array.
append(space);
1220 result_array.
append(space);
1224 result_array.
append(space);
1228 result_array.
append(space);
1234 result_array.
append(space);
1247 if (!result_array.
is_empty() && (result_array.
last() == space)) {
1251 return fmt::to_string(fmt::join(result_array,
""));
1261 const int propvalue,
1266 return std::nullopt;
1283 const int propvalue,
1300 const bool is_strict,
1308 if (!
STREQ(kmi->idname, opname)) {
1312 bool kmi_match =
false;
1317 if (
STREQ(
"MESH_OT_rip_move", opname)) {
1327 properties,
static_cast<const IDProperty *
>(kmi->ptr->data), is_strict))
1333 if (is_strict && kmi->ptr) {
1338 static_cast<const IDProperty *
>(kmi->ptr->data));
1347 "%s: Some set values in menu entry match default op values, "
1348 "this might not be desired!\n",
1350 printf(
"\tkm: '%s', kmi: '%s'\n", keymap->
idname, kmi_str.c_str());
1387 const bool is_strict,
1397 for (
int km_index = 0; km_index < km_result.
keymaps_len; km_index++) {
1401 keymap, opname, properties, is_strict,
params);
1402 if (kmi !=
nullptr) {
1414 *r_keymap =
nullptr;
1423 const bool is_strict,
1445 if (found ==
nullptr) {
1447 C, wm, win, &win->
handlers, opname, opcontext, properties, is_strict,
params, r_keymap);
1451 if (area && found ==
nullptr) {
1453 C, wm, win, &area->
handlers, opname, opcontext, properties, is_strict,
params, r_keymap);
1456 if (found ==
nullptr) {
1550 C, opname, opcontext, properties, is_strict,
params, r_keymap);
1561 if (!found && properties) {
1574 C, opname, opcontext, properties_temp, is_strict,
params, r_keymap);
1583 if (!found && is_strict && properties) {
1593 C, opname, opcontext, properties_default, is_strict,
params, &km);
1597 "%s: Some set values in keymap entry match default op values, "
1598 "this might not be desired!\n",
1600 printf(
"\tkm: '%s', kmi: '%s'\n", km->
idname, kmi_str.c_str());
1632 const bool is_strict)
1636 params.user_data =
nullptr;
1638 C, opname, opcontext, properties, is_strict, &
params,
nullptr);
1645 C, opname, properties, is_strict))
1650 return std::nullopt;
1657 short *mask_pair =
static_cast<short int *
>(user_data);
1667 const short include_mask,
1668 const short exclude_mask,
1671 short user_data_mask[2] = {include_mask, exclude_mask};
1675 params.user_data = use_mask ? user_data_mask :
nullptr;
1682 const short include_mask,
1683 const short exclude_mask)
1685 short user_data_mask[2] = {include_mask, exclude_mask};
1689 params.user_data = use_mask ? user_data_mask :
nullptr;
1704 if (k1type !=
KM_ANY && k2type !=
KM_ANY && k1type != k2type) {
1716 if (k1->
val != k2->
val) {
1832 km->
flag &= ~KEYMAP_UPDATE;
1836 kmi->flag &= ~KMI_UPDATE;
1864 bool compat_update =
false;
1869 bool dropbox_update =
false;
1886 dropbox_update =
true;
1896 if (kmdi->add_item) {
1899 if (kmdi->remove_item) {
1933 &
U.user_keymaps, km->idname, km->spaceid, km->regionid);
1945 kmn->
poll = km->poll;
1950 compat_update = compat_update || (usermap && !(usermap->
flag &
KEYMAP_DIFF));
1954 dropbox_update =
true;
1961 if (compat_update) {
1966 if (dropbox_update) {
2106 if (kmi->id ==
id) {
WorkSpace * CTX_wm_workspace(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
void IDP_FreeProperty(IDProperty *prop)
bool IDP_EqualsProperties_ex(const IDProperty *prop1, const IDProperty *prop2, bool is_strict) ATTR_WARN_UNUSED_RESULT
IDProperty * IDP_CopyProperty(const IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void IDP_print(const IDProperty *prop)
ARegion * BKE_area_find_region_type(const ScrArea *area, int region_type)
bool BKE_workspace_owner_id_check(const WorkSpace *workspace, const char *owner_id) ATTR_NONNULL()
bool BLF_has_glyph(int fontid, unsigned int unicode) ATTR_WARN_UNUSED_RESULT
#define BLI_assert_msg(a, msg)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_insertlinkbefore(struct ListBase *listbase, void *vnextlink, void *vnewlink) ATTR_NONNULL(1)
#define STRNCPY(dst, src)
int bool bool BLI_str_endswith(const char *__restrict str, const char *__restrict end) ATTR_NONNULL(1
size_t BLI_strlen_utf8(const char *strc) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
#define STRNCPY_UTF8(dst, src)
unsigned int BLI_str_utf8_as_unicode_or_error(const char *p) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define BLI_STR_UTF8_BROKEN_CIRCLE_WITH_NORTHWEST_ARROW
#define BLI_STR_UTF8_LEFTWARDS_ARROW
#define BLI_STR_UTF8_BLACK_DIAMOND_MINUS_WHITE_X
#define BLI_STR_UTF8_UPWARDS_WHITE_ARROW
#define BLI_STR_UTF8_UPWARDS_ARROW
#define BLI_STR_UTF8_DOWNWARDS_ARROW
#define BLI_STR_UTF8_OPEN_BOX
#define BLI_STR_UTF8_PLACE_OF_INTEREST_SIGN
#define BLI_STR_UTF8_UP_ARROWHEAD
#define BLI_STR_UTF8_HORIZONTAL_TAB_KEY
#define BLI_STR_UTF8_RIGHTWARDS_ARROW
#define BLI_STR_UTF8_ERASE_TO_THE_LEFT
#define BLI_STR_UTF8_RETURN_SYMBOL
#define BLI_STR_UTF8_OPTION_KEY
#define STREQLEN(a, b, n)
#define BLT_I18NCONTEXT_ID_WINDOWMANAGER
#define CTX_N_(context, msgid)
#define CTX_IFACE_(context, msgid)
#define BLT_I18NCONTEXT_UI_EVENTS
#define CLOG_ERROR(clg_ref,...)
#define CLOG_WARN(clg_ref,...)
Object is a sort of wrapper for general info.
@ KEYMAP_CHILDREN_EXPANDED
#define WM_KEYCONFIG_ARRAY_P(wm)
void ED_area_tag_redraw(ScrArea *area)
Read Guarded memory(de)allocation.
@ RNA_EQ_UNSET_MATCH_NONE
std::optional< std::string > UI_key_event_operator_string(const bContext *C, const char *opname, IDProperty *properties, bool is_strict)
@ WM_OP_INVOKE_REGION_WIN
@ WM_OP_EXEC_REGION_PREVIEW
@ WM_OP_INVOKE_REGION_PREVIEW
@ WM_OP_EXEC_REGION_CHANNELS
@ WM_OP_INVOKE_REGION_CHANNELS
CLG_LogRef * WM_LOG_KEYMAPS
void append(const T &value)
const T & last(const int64_t n=0) const
local_group_size(16, 16) .push_constant(Type b
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_dupallocN)(const void *vmemh)
static void update(bNodeTree *ntree)
bool RNA_enum_value_from_id(const EnumPropertyItem *item, const char *identifier, int *r_value)
bool RNA_property_is_set(PointerRNA *ptr, PropertyRNA *prop)
const char * RNA_struct_state_owner_get()
int RNA_enum_from_value(const EnumPropertyItem *item, const int value)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
void RNA_property_unset(PointerRNA *ptr, PropertyRNA *prop)
bool RNA_struct_equals(Main *bmain, PointerRNA *ptr_a, PointerRNA *ptr_b, eRNACompareMode mode)
const EnumPropertyItem rna_enum_event_type_items[]
wmKeyMapItem * remove_item
struct wmKeyMapDiffItem * next
struct wmKeyMapDiffItem * prev
bool(* filter_fn)(const wmKeyMap *km, const wmKeyMapItem *kmi, void *user_data)
struct wmKeyMapItem * next
struct wmKeyMapItem * prev
bool(* poll_modal_item)(const struct wmOperator *op, int value)
bool(* poll)(struct bContext *)
struct wmKeyConfig * defaultconf
struct wmKeyConfig * userconf
struct wmKeyConfig * addonconf
void WM_dropbox_update_ot()
int WM_userdef_event_map(int kmitype)
bool WM_event_type_mask_test(const int event_type, const enum eEventType_Mask mask)
void WM_event_get_keymaps_from_handler(wmWindowManager *wm, wmWindow *win, wmEventHandler_Keymap *handler, wmEventHandler_KeymapResult *km_result)
#define ISTIMER(event_type)
#define IS_EVENT_ACTIONZONE(event_type)
#define ISKEYBOARD(event_type)
#define EVT_TYPE_MASK_ALL
#define ISNDOF(event_type)
#define ISMOUSE(event_type)
void WM_keyconfig_clear(wmKeyConfig *keyconf)
static char wm_keymap_update_flag
static void wm_user_modal_keymap_set_items(wmWindowManager *wm, wmKeyMap *km)
static void keymap_item_set_id(wmKeyMap *keymap, wmKeyMapItem *kmi)
static int8_t wm_keymap_update_suppress_count
std::optional< std::string > WM_modalkeymap_operator_items_to_string(wmOperatorType *ot, const int propvalue, const bool compact)
static wmKeyMap * wm_keymap_copy(wmKeyMap *keymap)
wmKeyConfig * WM_keyconfig_new(wmWindowManager *wm, const char *idname, bool user_defined)
void WM_keymap_item_restore_to_default(wmWindowManager *wm, wmKeyMap *keymap, wmKeyMapItem *kmi)
wmKeyMapItem * WM_key_event_operator(const bContext *C, const char *opname, wmOperatorCallContext opcontext, IDProperty *properties, const short include_mask, const short exclude_mask, wmKeyMap **r_keymap)
void WM_keymap_restore_to_default(wmKeyMap *keymap, wmWindowManager *wm)
static void wm_keymap_item_properties_update_ot(wmKeyMapItem *kmi, const bool keep_properties)
static void wm_keymap_item_properties_set(wmKeyMapItem *kmi)
wmKeyMapItem * WM_keymap_add_item_copy(wmKeyMap *keymap, wmKeyMapItem *kmi_src)
static wmKeyMap * wm_keymap_patch_update(ListBase *lb, wmKeyMap *defaultmap, wmKeyMap *addonmap, wmKeyMap *usermap)
wmKeyMap * WM_keymap_find_all_spaceid_or_empty(wmWindowManager *wm, const char *idname, int spaceid, int regionid)
wmKeyMap * WM_modalkeymap_ensure(wmKeyConfig *keyconf, const char *idname, const EnumPropertyItem *items)
@ WM_KEYMAP_UPDATE_POSTPONE
@ WM_KEYMAP_UPDATE_RECONFIGURE
@ WM_KEYMAP_UPDATE_OPERATORTYPE
wmKeyMap * WM_keymap_list_find_spaceid_or_empty(ListBase *lb, const char *idname, int spaceid, int regionid)
wmKeyMapItem * WM_key_event_operator_from_keymap(wmKeyMap *keymap, const char *opname, IDProperty *properties, const short include_mask, const short exclude_mask)
void WM_keyconfig_update(wmWindowManager *wm)
static wmKeyMapItem * wm_keymap_find_item_equals(wmKeyMap *km, wmKeyMapItem *needle)
wmKeyMapItem * WM_keymap_item_find_id(wmKeyMap *keymap, int id)
static wmKeyMapItem * wm_keymap_item_find_props(const bContext *C, const char *opname, wmOperatorCallContext opcontext, IDProperty *properties, const bool is_strict, const wmKeyMapItemFind_Params *params, wmKeyMap **r_keymap)
wmKeyMapItem * WM_modalkeymap_add_item(wmKeyMap *km, const KeyMapItem_Params *params, int value)
void WM_keymap_item_properties_reset(wmKeyMapItem *kmi, IDProperty *properties)
void WM_keyconfig_update_ex(wmWindowManager *wm, bool keep_properties)
void WM_modalkeymap_assign(wmKeyMap *km, const char *opname)
void WM_keymap_clear(wmKeyMap *keymap)
static void wm_keymap_addon_add(wmKeyMap *keymap, wmKeyMap *addonmap)
std::optional< std::string > WM_key_event_operator_string(const bContext *C, const char *opname, wmOperatorCallContext opcontext, IDProperty *properties, const bool is_strict)
static wmKeyMapItem * wm_keymap_item_copy(wmKeyMapItem *kmi)
const wmKeyMapItem * WM_modalkeymap_find_propvalue(const wmKeyMap *km, const int propvalue)
wmKeyMap * WM_keymap_find_all(wmWindowManager *wm, const char *idname, int spaceid, int regionid)
static wmKeyMap * wm_keymap_preset(wmWindowManager *wm, wmKeyMap *km)
static wmKeyMapItem * wm_keymap_item_find_handlers(const bContext *C, wmWindowManager *wm, wmWindow *win, ListBase *handlers, const char *opname, wmOperatorCallContext, IDProperty *properties, const bool is_strict, const wmKeyMapItemFind_Params *params, wmKeyMap **r_keymap)
static void wm_keymap_patch(wmKeyMap *km, wmKeyMap *diff_km)
static const char * key_event_glyph_or_text(const int font_id, const char *text, const char *single_glyph)
static wmKeyConfig * WM_keyconfig_active(wmWindowManager *wm)
wmKeyConfig * WM_keyconfig_ensure(wmWindowManager *wm, const char *idname, bool user_defined)
static bool wm_keymap_test_and_clear_update(wmKeyMap *km)
std::optional< std::string > WM_keymap_item_raw_to_string(const short shift, const short ctrl, const short alt, const short oskey, const short keymodifier, const short val, const short type, const bool compact)
int WM_keymap_item_map_type_get(const wmKeyMapItem *kmi)
static void wm_keymap_diff_item_free(wmKeyMapDiffItem *kmdi)
void WM_keyconfig_update_operatortype()
void WM_keyconfig_free(wmKeyConfig *keyconf)
bool WM_keymap_poll(bContext *C, wmKeyMap *keymap)
void WM_keyconfig_update_suppress_begin()
wmKeyMap * WM_keymap_active(const wmWindowManager *wm, wmKeyMap *keymap)
static void wm_keymap_diff_update(ListBase *lb, wmKeyMap *defaultmap, wmKeyMap *addonmap, wmKeyMap *km)
wmKeyMap * WM_modalkeymap_find(wmKeyConfig *keyconf, const char *idname)
void WM_keyconfig_update_postpone_end()
std::optional< std::string > WM_modalkeymap_items_to_string(const wmKeyMap *km, const int propvalue, const bool compact)
static wmKeyMapItem * wm_keymap_find_item_equals_result(wmKeyMap *km, wmKeyMapItem *needle)
void WM_keyconfig_update_suppress_end()
static bool kmi_filter_is_visible_type_mask(const wmKeyMap *km, const wmKeyMapItem *kmi, void *user_data)
wmKeyMapItem * WM_keymap_add_item(wmKeyMap *keymap, const char *idname, const KeyMapItem_Params *params)
static bool kmi_filter_is_visible(const wmKeyMap *, const wmKeyMapItem *kmi, void *)
static void wm_keymap_item_clear_runtime(wmKeyMapItem *kmi)
std::optional< std::string > WM_keymap_item_to_string(const wmKeyMapItem *kmi, const bool compact)
void WM_keyconfig_update_postpone_begin()
void WM_keyconfig_set_active(wmWindowManager *wm, const char *idname)
const char * WM_bool_as_string(bool test)
static void wm_keymap_item_free_data(wmKeyMapItem *kmi)
void WM_keymap_remove(wmKeyConfig *keyconf, wmKeyMap *keymap)
static wmKeyMap * wm_keymap_new(const char *idname, int spaceid, int regionid)
wmKeyMap * WM_keymap_ensure(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
static char wm_keymap_update_suppress_flag
static const wmKeyMapItem * wm_modalkeymap_find_propvalue_iter(const wmKeyMap *km, const wmKeyMapItem *kmi, const int propvalue)
static wmKeyMapDiffItem * wm_keymap_diff_item_copy(wmKeyMapDiffItem *kmdi)
static wmKeyMapItem * wm_keymap_item_find(const bContext *C, const char *opname, wmOperatorCallContext opcontext, IDProperty *properties, bool is_strict, const wmKeyMapItemFind_Params *params, wmKeyMap **r_keymap)
static void wm_keymap_diff(wmKeyMap *diff_km, wmKeyMap *from_km, wmKeyMap *to_km, wmKeyMap *orig_km, wmKeyMap *addon_km)
const char * WM_key_event_string(const short type, const bool compact)
wmKeyMap * WM_keymap_list_find(ListBase *lb, const char *idname, int spaceid, int regionid)
static bool wm_keymap_item_equals(wmKeyMapItem *a, wmKeyMapItem *b)
static wmKeyMapItem * wm_keymap_item_find_in_keymap(wmKeyMap *keymap, const char *opname, IDProperty *properties, const bool is_strict, const wmKeyMapItemFind_Params *params)
wmKeyMapItem * WM_modalkeymap_add_item_str(wmKeyMap *km, const KeyMapItem_Params *params, const char *value)
void WM_keyconfig_remove(wmWindowManager *wm, wmKeyConfig *keyconf)
void WM_keyconfig_update_tag(wmKeyMap *keymap, wmKeyMapItem *kmi)
void WM_keymap_remove_item(wmKeyMap *keymap, wmKeyMapItem *kmi)
bool WM_keymap_item_compare(const wmKeyMapItem *k1, const wmKeyMapItem *k2)
static bool wm_keymap_item_equals_result(wmKeyMapItem *a, wmKeyMapItem *b)
static void keymap_event_set(wmKeyMapItem *kmi, const KeyMapItem_Params *params)
static void wm_keymap_item_properties_update_ot_from_list(ListBase *km_lb, const bool keep_properties)
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
void WM_operator_properties_alloc(PointerRNA **ptr, IDProperty **properties, const char *opstring)
void WM_operator_properties_create_ptr(PointerRNA *ptr, wmOperatorType *ot)
bool WM_operator_properties_default(PointerRNA *ptr, const bool do_update)
void WM_operator_properties_create(PointerRNA *ptr, const char *opstring)
void WM_operator_properties_free(PointerRNA *ptr)
void WM_operator_properties_sanitize(PointerRNA *ptr, const bool no_context)
bScreen * WM_window_get_active_screen(const wmWindow *win)