Blender V5.0
keyconfig.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
8
9#include <cstddef>
10#include <cstdio>
11#include <cstdlib>
12
13#include "RNA_types.hh"
14
15#include "BLI_ghash.h"
16#include "BLI_listbase.h"
17#include "BLI_string.h"
18
19#include "DNA_listBase.h"
20#include "DNA_userdef_types.h"
22
23#include "BKE_idprop.hh"
24#include "BKE_keyconfig.h" /* own include */
25
26#include "MEM_guardedalloc.h"
27
28/* -------------------------------------------------------------------- */
33
34wmKeyConfigPref *BKE_keyconfig_pref_ensure(UserDef *userdef, const char *kc_idname)
35{
37 &userdef->user_keyconfig_prefs, kc_idname, offsetof(wmKeyConfigPref, idname)));
38 if (kpt == nullptr) {
39 kpt = MEM_callocN<wmKeyConfigPref>(__func__);
40 STRNCPY(kpt->idname, kc_idname);
41 BLI_addtail(&userdef->user_keyconfig_prefs, kpt);
42 }
43 if (kpt->prop == nullptr) {
44 /* name is unimportant. */
45 kpt->prop = blender::bke::idprop::create_group(kc_idname).release();
46 }
47 return kpt;
48}
49
51
52/* -------------------------------------------------------------------- */
57
59
61{
62 if (idname[0]) {
64
65 kpt_rt = static_cast<wmKeyConfigPrefType_Runtime *>(
67 if (kpt_rt) {
68 return kpt_rt;
69 }
70
71 if (!quiet) {
72 printf("search for unknown keyconfig-pref '%s'\n", idname);
73 }
74 }
75 else {
76 if (!quiet) {
77 printf("search for empty keyconfig-pref\n");
78 }
79 }
80
81 return nullptr;
82}
83
88
93
99
105
107
108/* -------------------------------------------------------------------- */
111
112void BKE_keyconfig_pref_set_select_mouse(UserDef *userdef, int value, bool override)
113{
115 IDProperty *idprop = IDP_GetPropertyFromGroup(kpt->prop, "select_mouse");
116 if (!idprop) {
117 IDP_AddToGroup(kpt->prop, blender::bke::idprop::create("select_mouse", value).release());
118 }
119 else if (override) {
120 IDP_int_set(idprop, value);
121 }
122}
123
125{
127 if (kmi->ptr) {
128 MEM_delete(kmi->ptr);
129 }
130 MEM_freeN(kmi);
131}
132
134{
135 if (kmdi->add_item) {
137 }
138 if (kmdi->remove_item) {
140 }
141 MEM_freeN(kmdi);
142}
143
146 bool (*filter_fn)(wmKeyMapItem *kmi, void *user_data),
147 void *user_data)
148{
149 if (params->check_diff_item_add || params->check_diff_item_remove) {
150 for (wmKeyMapDiffItem *kmdi = static_cast<wmKeyMapDiffItem *>(keymap->diff_items.first),
151 *kmdi_next;
152 kmdi;
153 kmdi = kmdi_next)
154 {
155 kmdi_next = kmdi->next;
156 bool remove = false;
157
158 if (params->check_diff_item_add) {
159 if (kmdi->add_item) {
160 if (filter_fn(kmdi->add_item, user_data)) {
161 remove = true;
162 }
163 }
164 }
165
166 if (!remove && params->check_diff_item_remove) {
167 if (kmdi->remove_item) {
168 if (filter_fn(kmdi->remove_item, user_data)) {
169 remove = true;
170 }
171 }
172 }
173
174 if (remove) {
175 BLI_remlink(&keymap->diff_items, kmdi);
177 }
178 }
179 }
180
181 if (params->check_item) {
182 for (wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(keymap->items.first), *kmi_next; kmi;
183 kmi = kmi_next)
184 {
185 kmi_next = kmi->next;
186 if (filter_fn(kmi, user_data)) {
187 BLI_remlink(&keymap->items, kmi);
188 keymap_item_free(kmi);
189 }
190 }
191 }
192}
193
196 bool (*filter_fn)(wmKeyMapItem *kmi, void *user_data),
197 void *user_data)
198{
199 LISTBASE_FOREACH (wmKeyMap *, keymap, &userdef->user_keymaps) {
200 BKE_keyconfig_keymap_filter_item(keymap, params, filter_fn, user_data);
201 }
202}
203
IDProperty * IDP_GetPropertyFromGroup(const IDProperty *prop, blender::StringRef name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition idprop.cc:747
void IDP_FreeProperty(IDProperty *prop)
Definition idprop.cc:1251
#define IDP_int_set(prop, value)
bool IDP_AddToGroup(IDProperty *group, IDProperty *prop) ATTR_NONNULL()
Definition idprop.cc:717
struct wmKeyConfigPrefType_Runtime wmKeyConfigPrefType_Runtime
#define BLI_assert(a)
Definition BLI_assert.h:46
GHash * BLI_ghash_str_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
bool BLI_ghash_remove(GHash *gh, const void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
Definition BLI_ghash.cc:787
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
Definition BLI_ghash.cc:731
void BLI_ghash_insert(GHash *gh, void *key, void *val)
Definition BLI_ghash.cc:707
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
Definition BLI_ghash.cc:860
#define LISTBASE_FOREACH(type, var, list)
void * BLI_findstring(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:608
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:111
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:131
char * STRNCPY(char(&dst)[N], const char *src)
Definition BLI_string.h:693
These structs are the foundation for all linked lists in the library system.
#define WM_KEYCONFIG_STR_DEFAULT
Read Guarded memory(de)allocation.
#define offsetof(t, d)
#define printf(...)
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void BKE_keyconfig_pref_filter_items(UserDef *userdef, const wmKeyConfigFilterItemParams *params, bool(*filter_fn)(wmKeyMapItem *kmi, void *user_data), void *user_data)
Definition keyconfig.cc:194
wmKeyConfigPref * BKE_keyconfig_pref_ensure(UserDef *userdef, const char *kc_idname)
Definition keyconfig.cc:34
wmKeyConfigPrefType_Runtime * BKE_keyconfig_pref_type_find(const char *idname, bool quiet)
Definition keyconfig.cc:60
void BKE_keyconfig_pref_type_remove(const wmKeyConfigPrefType_Runtime *kpt_rt)
Definition keyconfig.cc:89
void BKE_keyconfig_pref_type_init()
Definition keyconfig.cc:94
void BKE_keyconfig_pref_set_select_mouse(UserDef *userdef, int value, bool override)
Definition keyconfig.cc:112
void BKE_keyconfig_pref_type_free()
Definition keyconfig.cc:100
static void keymap_diff_item_free(wmKeyMapDiffItem *kmdi)
Definition keyconfig.cc:133
static GHash * global_keyconfigpreftype_hash
Definition keyconfig.cc:58
static void keymap_item_free(wmKeyMapItem *kmi)
Definition keyconfig.cc:124
void BKE_keyconfig_keymap_filter_item(wmKeyMap *keymap, const wmKeyConfigFilterItemParams *params, bool(*filter_fn)(wmKeyMapItem *kmi, void *user_data), void *user_data)
Definition keyconfig.cc:144
void BKE_keyconfig_pref_type_add(wmKeyConfigPrefType_Runtime *kpt_rt)
Definition keyconfig.cc:84
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRef prop_name, int32_t value, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_INT, set its name and value.
std::unique_ptr< IDProperty, IDPropertyDeleter > create_group(StringRef prop_name, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_GROUP.
void * first
struct ListBase user_keymaps
struct ListBase user_keyconfig_prefs
struct PointerRNA * ptr
struct wmKeyMapItem * next