Blender V4.3
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
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#include "BLI_utildefines.h"
19
20#include "DNA_listBase.h"
21#include "DNA_userdef_types.h"
23
24#include "BKE_idprop.hh"
25#include "BKE_keyconfig.h" /* own include */
26
27#include "MEM_guardedalloc.h"
28
29/* -------------------------------------------------------------------- */
35wmKeyConfigPref *BKE_keyconfig_pref_ensure(UserDef *userdef, const char *kc_idname)
36{
38 &userdef->user_keyconfig_prefs, kc_idname, offsetof(wmKeyConfigPref, idname)));
39 if (kpt == nullptr) {
40 kpt = static_cast<wmKeyConfigPref *>(MEM_callocN(sizeof(*kpt), __func__));
41 STRNCPY(kpt->idname, kc_idname);
42 BLI_addtail(&userdef->user_keyconfig_prefs, kpt);
43 }
44 if (kpt->prop == nullptr) {
45 /* name is unimportant. */
46 kpt->prop = blender::bke::idprop::create_group(kc_idname).release();
47 }
48 return kpt;
49}
50
53/* -------------------------------------------------------------------- */
60
62{
63 if (idname[0]) {
65
66 kpt_rt = static_cast<wmKeyConfigPrefType_Runtime *>(
68 if (kpt_rt) {
69 return kpt_rt;
70 }
71
72 if (!quiet) {
73 printf("search for unknown keyconfig-pref '%s'\n", idname);
74 }
75 }
76 else {
77 if (!quiet) {
78 printf("search for empty keyconfig-pref\n");
79 }
80 }
81
82 return nullptr;
83}
84
89
94
100
106
109/* -------------------------------------------------------------------- */
113void BKE_keyconfig_pref_set_select_mouse(UserDef *userdef, int value, bool override)
114{
116 IDProperty *idprop = IDP_GetPropertyFromGroup(kpt->prop, "select_mouse");
117 if (!idprop) {
118 IDP_AddToGroup(kpt->prop, blender::bke::idprop::create("select_mouse", value).release());
119 }
120 else if (override) {
121 IDP_Int(idprop) = value;
122 }
123}
124
126{
128 if (kmi->ptr) {
129 MEM_delete(kmi->ptr);
130 }
131 MEM_freeN(kmi);
132}
133
135{
136 if (kmdi->add_item) {
138 }
139 if (kmdi->remove_item) {
141 }
142 MEM_freeN(kmdi);
143}
144
147 bool (*filter_fn)(wmKeyMapItem *kmi, void *user_data),
148 void *user_data)
149{
150 if (params->check_diff_item_add || params->check_diff_item_remove) {
151 for (wmKeyMapDiffItem *kmdi = static_cast<wmKeyMapDiffItem *>(keymap->diff_items.first),
152 *kmdi_next;
153 kmdi;
154 kmdi = kmdi_next)
155 {
156 kmdi_next = kmdi->next;
157 bool remove = false;
158
159 if (params->check_diff_item_add) {
160 if (kmdi->add_item) {
161 if (filter_fn(kmdi->add_item, user_data)) {
162 remove = true;
163 }
164 }
165 }
166
167 if (!remove && params->check_diff_item_remove) {
168 if (kmdi->remove_item) {
169 if (filter_fn(kmdi->remove_item, user_data)) {
170 remove = true;
171 }
172 }
173 }
174
175 if (remove) {
176 BLI_remlink(&keymap->diff_items, kmdi);
178 }
179 }
180 }
181
182 if (params->check_item) {
183 for (wmKeyMapItem *kmi = static_cast<wmKeyMapItem *>(keymap->items.first), *kmi_next; kmi;
184 kmi = kmi_next)
185 {
186 kmi_next = kmi->next;
187 if (filter_fn(kmi, user_data)) {
188 BLI_remlink(&keymap->items, kmi);
189 keymap_item_free(kmi);
190 }
191 }
192 }
193}
194
197 bool (*filter_fn)(wmKeyMapItem *kmi, void *user_data),
198 void *user_data)
199{
200 LISTBASE_FOREACH (wmKeyMap *, keymap, &userdef->user_keymaps) {
201 BKE_keyconfig_keymap_filter_item(keymap, params, filter_fn, user_data);
202 }
203}
204
#define IDP_Int(prop)
IDProperty * IDP_GetPropertyFromGroup(const IDProperty *prop, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition idprop.cc:763
void IDP_FreeProperty(IDProperty *prop)
Definition idprop.cc:1227
bool IDP_AddToGroup(IDProperty *group, IDProperty *prop) ATTR_NONNULL()
Definition idprop.cc:722
struct wmKeyConfigPrefType_Runtime wmKeyConfigPrefType_Runtime
#define BLI_assert(a)
Definition BLI_assert.h:50
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.c:787
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
Definition BLI_ghash.c:731
void BLI_ghash_insert(GHash *gh, void *key, void *val)
Definition BLI_ghash.c:707
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
Definition BLI_ghash.c:860
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:110
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:130
#define STRNCPY(dst, src)
Definition BLI_string.h:593
These structs are the foundation for all linked lists in the library system.
#define WM_KEYCONFIG_STR_DEFAULT
Read Guarded memory(de)allocation.
#define printf
#define offsetof(t, d)
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:195
wmKeyConfigPref * BKE_keyconfig_pref_ensure(UserDef *userdef, const char *kc_idname)
Definition keyconfig.cc:35
wmKeyConfigPrefType_Runtime * BKE_keyconfig_pref_type_find(const char *idname, bool quiet)
Definition keyconfig.cc:61
void BKE_keyconfig_pref_type_remove(const wmKeyConfigPrefType_Runtime *kpt_rt)
Definition keyconfig.cc:90
void BKE_keyconfig_pref_type_init()
Definition keyconfig.cc:95
void BKE_keyconfig_pref_set_select_mouse(UserDef *userdef, int value, bool override)
Definition keyconfig.cc:113
void BKE_keyconfig_pref_type_free()
Definition keyconfig.cc:101
static void keymap_diff_item_free(wmKeyMapDiffItem *kmdi)
Definition keyconfig.cc:134
static GHash * global_keyconfigpreftype_hash
Definition keyconfig.cc:59
static void keymap_item_free(wmKeyMapItem *kmi)
Definition keyconfig.cc:125
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:145
void BKE_keyconfig_pref_type_add(wmKeyConfigPrefType_Runtime *kpt_rt)
Definition keyconfig.cc:85
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRefNull 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(StringRefNull 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