12#include <fmt/format.h>
72 kmin->
ptr = MEM_new<PointerRNA>(
"UserKeyMapItemPtr");
130 if (kmi->
idname[0] == 0) {
135 if (kmi->
ptr ==
nullptr) {
159 if (keep_properties) {
170 const bool keep_properties)
178 if (kmdi->add_item) {
181 if (kmdi->remove_item) {
210 MEM_delete(kmi->
ptr);
258 kmdin->
next = kmdin->
prev =
nullptr;
311 if (keyconf == wm->
runtime->defaultconf) {
334 U.runtime.is_dirty =
true;
345 if (*kc_p == keyconf) {
379 return wm->
runtime->defaultconf;
391 U.runtime.is_dirty =
true;
484 if (!
U.app_template[0] &&
500 if (keymap->
poll !=
nullptr) {
501 return keymap->
poll(
C);
523 const int8_t
mod =
params->modifier & 0xff;
585 MEM_delete(kmi->
ptr);
661 if (!orig_kmi && addon_km) {
687 if (kmdi->remove_item) {
695 if (kmdi->add_item) {
716 if (kmi_add !=
nullptr && kmi_add == kmi_remove) {
717 kmi_remove =
nullptr;
720 else if (!kmi_add && (!kmdi->remove_item || kmi_remove)) {
727 kmi_add->
id = kmi_remove->
id;
776 kmi->id = orig_kmi->
id;
779 kmi->id = -(km->
kmi_id++);
869 if (km->spaceid == spaceid && km->regionid == regionid) {
885 if (
ELEM(km->spaceid, spaceid,
SPACE_EMPTY) && km->regionid == regionid) {
920 &wm->
runtime->userconf->keymaps, idname, spaceid, regionid);
941 if (wm->
runtime->defaultconf && wm->
runtime->defaultconf != keyconf) {
1008 const int propvalue)
1012 for (; kmi; kmi = kmi->
next) {
1035 ot->modalkeymap = km;
1048 if (wm->
runtime->defaultconf ==
nullptr) {
1064 if (kmi->propvalue_str[0]) {
1070 kmi->propvalue = propvalue;
1072 kmi->propvalue_str[0] =
'\0';
1087 const char *single_glyph)
1099 const char *single_glyph =
nullptr;
1107#if defined(__APPLE__)
1109#elif defined(_WIN32)
1119 if (platform == MACOS) {
1127 if (platform == MACOS) {
1133 if (platform == MACOS) {
1141 if (platform == MACOS) {
1145 if (platform == MSWIN) {
1157 if (platform == MACOS) {
1200 const short keymodifier,
1208 const char *space =
" ";
1214 result_array.
append(space);
1218 result_array.
append(space);
1222 result_array.
append(space);
1226 result_array.
append(space);
1230 result_array.
append(space);
1235 result_array.
append(space);
1248 if (!result_array.
is_empty() && (result_array.
last() == space)) {
1252 return fmt::to_string(fmt::join(result_array,
""));
1269 const int propvalue,
1274 return std::nullopt;
1291 const int propvalue,
1308 const bool is_strict,
1316 if (!
STREQ(kmi->idname, opname)) {
1320 bool kmi_match =
false;
1325 if (
STREQ(
"MESH_OT_rip_move", opname)) {
1335 properties,
static_cast<const IDProperty *
>(kmi->ptr->data), is_strict))
1341 if (is_strict && kmi->ptr) {
1346 static_cast<const IDProperty *
>(kmi->ptr->data));
1355 "%s: Some set values in menu entry match default op values, "
1356 "this might not be desired!\n",
1358 printf(
"\tkm: '%s', kmi: '%s'\n", keymap->
idname, kmi_str.c_str());
1395 const bool is_strict,
1405 for (
int km_index = 0; km_index < km_result.
keymaps_len; km_index++) {
1409 keymap, opname, properties, is_strict,
params);
1410 if (kmi !=
nullptr) {
1422 *r_keymap =
nullptr;
1431 const bool is_strict,
1453 if (found ==
nullptr) {
1455 C, wm, win, &win->
handlers, opname, opcontext, properties, is_strict,
params, r_keymap);
1459 if (area && found ==
nullptr) {
1461 C, wm, win, &area->
handlers, opname, opcontext, properties, is_strict,
params, r_keymap);
1464 if (found ==
nullptr) {
1488 else if (
ELEM(opcontext,
1509 else if (
ELEM(opcontext,
1567 C, opname, opcontext, properties, is_strict,
params, r_keymap);
1578 if (!found && properties) {
1579 if (
ot &&
ot->prop) {
1591 C, opname, opcontext, properties_temp, is_strict,
params, r_keymap);
1600 if (!found && is_strict && properties) {
1610 C, opname, opcontext, properties_default, is_strict,
params, &km);
1614 "%s: Some set values in keymap entry match default op values, "
1615 "this might not be desired!\n",
1617 printf(
"\tkm: '%s', kmi: '%s'\n", km->
idname, kmi_str.c_str());
1649 const bool is_strict)
1653 params.user_data =
nullptr;
1655 C, opname, opcontext, properties, is_strict, &
params,
nullptr);
1660 return std::nullopt;
1667 short *mask_pair =
static_cast<short int *
>(user_data);
1677 const short include_mask,
1678 const short exclude_mask,
1681 short user_data_mask[2] = {include_mask, exclude_mask};
1685 params.user_data = use_mask ? user_data_mask :
nullptr;
1692 const short include_mask,
1693 const short exclude_mask)
1695 short user_data_mask[2] = {include_mask, exclude_mask};
1699 params.user_data = use_mask ? user_data_mask :
nullptr;
1714 if (k1type !=
KM_ANY && k2type !=
KM_ANY && k1type != k2type) {
1726 if (k1->
val != k2->
val) {
1860 if (!keymap && wm->
runtime->defaultconf) {
1890 bool compat_update =
false;
1895 bool dropbox_update =
false;
1912 dropbox_update =
true;
1924 if (kmdi->add_item) {
1927 if (kmdi->remove_item) {
1945 &wm->
runtime->addonconf->keymaps, km->idname, km->spaceid, km->regionid);
1959 &wm->
runtime->addonconf->keymaps, km->idname, km->spaceid, km->regionid);
1961 &
U.user_keymaps, km->idname, km->spaceid, km->regionid);
1969 &wm->
runtime->userconf->keymaps, defaultmap, addonmap, usermap);
1973 kmn->
poll = km->poll;
1978 compat_update = compat_update || (usermap && !(usermap->
flag &
KEYMAP_DIFF));
1982 dropbox_update =
true;
1989 if (compat_update) {
1994 if (dropbox_update) {
2147 if (kmi->id ==
id) {
2173 "KeyMap item result may be incorrect since an update is pending, call "
2174 "`context.window_manager.keyconfigs.update()` to ensure matches can be found.");
2177 if (km_base == km_match) {
2184 const char *idname = km_base->
idname;
2185 const short spaceid = km_base->
spaceid;
2186 const short regionid = km_base->
regionid;
2190 reports,
RPT_ERROR,
"KeyMap \"%s\" does not match \"%s\"", idname, km_match->
idname);
2199 KM_TYPE_UNKNOWN = 0,
2204 } base_type = KM_TYPE_UNKNOWN,
2205 match_type = KM_TYPE_UNKNOWN;
2210 base_type = KM_TYPE_USER;
2218 match_type = KM_TYPE_ADDON;
2221 match_type = KM_TYPE_ACTIVE;
2225 if (base_type == KM_TYPE_UNKNOWN) {
2230 if (match_type == KM_TYPE_UNKNOWN) {
2232 reports,
RPT_ERROR,
"KeyMap \"%s\" (other) must be an add-on or active keymap", idname);
2237 if (kmi_index == -1) {
2243 if (match_type == KM_TYPE_ADDON) {
2253 if (defaultmap ==
nullptr) {
2258 kmi_id = defaultmap->
kmi_id + kmi_index + 1;
2261 kmi_id = kmi_match->
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)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_report(ReportList *reports, eReportType type, const char *message)
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)
int BLI_findindex(const ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(ListBase *lb)
void * BLI_findstring(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_addhead(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_insertlinkbefore(ListBase *listbase, void *vnextlink, void *vnewlink) ATTR_NONNULL(1)
char * STRNCPY(char(&dst)[N], const char *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,...)
#define WM_KEYCONFIG_ARRAY_P(wm)
@ KEYMAP_CHILDREN_EXPANDED
void ED_area_tag_redraw(ScrArea *area)
Read Guarded memory(de)allocation.
@ RNA_EQ_UNSET_MATCH_NONE
#define KMI_PARAMS_MOD_FROM_ANY(mod)
CLG_LogRef * WM_LOG_OPERATORS
CLG_LogRef * WM_LOG_EVENTS
void append(const T &value)
const T & last(const int64_t n=0) const
VecBase< float, D > constexpr mod(VecOp< float, D >, VecOp< float, D >) RET
void * MEM_callocN(size_t len, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(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_discrete(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[]
ARegionRuntimeHandle * runtime
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 *)
WindowManagerRuntimeHandle * runtime
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)
void WM_keyconfig_update_on_startup(wmWindowManager *wm)
wmKeyConfig * WM_keyconfig_new(wmWindowManager *wm, const char *idname, bool user_defined)
std::optional< std::string > WM_key_event_operator_string(const bContext *C, const char *opname, blender::wm::OpCallContext opcontext, IDProperty *properties, const bool is_strict)
std::optional< std::string > WM_keymap_item_raw_to_string(const int8_t shift, const int8_t ctrl, const int8_t alt, const int8_t oskey, const int8_t hyper, const short keymodifier, const short val, const short type, const bool compact)
void WM_keyconfig_update_operatortype_tag()
void WM_keymap_item_restore_to_default(wmWindowManager *wm, wmKeyMap *keymap, wmKeyMapItem *kmi)
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)
static wmKeyMapItem * wm_keymap_item_find_handlers(const bContext *C, wmWindowManager *wm, wmWindow *win, ListBase *handlers, const char *opname, blender::wm::OpCallContext, IDProperty *properties, const bool is_strict, const wmKeyMapItemFind_Params *params, wmKeyMap **r_keymap)
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)
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)
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)
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 void wm_keymap_patch(wmKeyMap *km, wmKeyMap *diff_km)
@ WM_KEYMAP_UPDATE_POSTPONE
@ WM_KEYMAP_UPDATE_RECONFIGURE
@ WM_KEYMAP_UPDATE_OPERATORTYPE
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)
static wmKeyMapItem * wm_keymap_item_find(const bContext *C, const char *opname, blender::wm::OpCallContext opcontext, IDProperty *properties, bool is_strict, const wmKeyMapItemFind_Params *params, wmKeyMap **r_keymap)
int WM_keymap_item_map_type_get(const wmKeyMapItem *kmi)
static bool wm_keymap_is_match(const wmKeyMap *km_a, const wmKeyMap *km_b)
static void wm_keymap_diff_item_free(wmKeyMapDiffItem *kmdi)
static wmKeyMap * wm_keymap_preset(wmWindowManager *wm, wmKeyConfig *keyconf, wmKeyMap *km)
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()
wmKeyMapItem * WM_keymap_item_find_match(wmKeyMap *km_base, wmKeyMap *km_match, wmKeyMapItem *kmi_match, ReportList *reports)
std::optional< std::string > WM_modalkeymap_items_to_string(const wmKeyMap *km, const int propvalue, const bool compact)
static wmKeyMapItem * wm_keymap_item_find_props(const bContext *C, const char *opname, blender::wm::OpCallContext opcontext, IDProperty *properties, const bool is_strict, const wmKeyMapItemFind_Params *params, wmKeyMap **r_keymap)
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 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)
wmKeyMapItem * WM_key_event_operator(const bContext *C, const char *opname, blender::wm::OpCallContext opcontext, IDProperty *properties, const short include_mask, const short exclude_mask, wmKeyMap **r_keymap)
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)