Blender  V3.3
keyconfig.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
7 #include <stddef.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 
11 #include "RNA_types.h"
12 
13 #include "BLI_ghash.h"
14 #include "BLI_listbase.h"
15 #include "BLI_string.h"
16 #include "BLI_utildefines.h"
17 
18 #include "DNA_listBase.h"
19 #include "DNA_userdef_types.h"
21 
22 #include "BKE_idprop.h"
23 #include "BKE_keyconfig.h" /* own include */
24 
25 #include "MEM_guardedalloc.h"
26 
27 /* -------------------------------------------------------------------- */
33 wmKeyConfigPref *BKE_keyconfig_pref_ensure(UserDef *userdef, const char *kc_idname)
34 {
36  &userdef->user_keyconfig_prefs, kc_idname, offsetof(wmKeyConfigPref, idname));
37  if (kpt == NULL) {
38  kpt = MEM_callocN(sizeof(*kpt), __func__);
39  STRNCPY(kpt->idname, kc_idname);
40  BLI_addtail(&userdef->user_keyconfig_prefs, kpt);
41  }
42  if (kpt->prop == NULL) {
43  IDPropertyTemplate val = {0};
44  kpt->prop = IDP_New(IDP_GROUP, &val, kc_idname); /* name is unimportant. */
45  }
46  return kpt;
47 }
48 
51 /* -------------------------------------------------------------------- */
58 
60 {
61  if (idname[0]) {
63 
65  if (kpt_rt) {
66  return kpt_rt;
67  }
68 
69  if (!quiet) {
70  printf("search for unknown keyconfig-pref '%s'\n", idname);
71  }
72  }
73  else {
74  if (!quiet) {
75  printf("search for empty keyconfig-pref\n");
76  }
77  }
78 
79  return NULL;
80 }
81 
83 {
84  BLI_ghash_insert(global_keyconfigpreftype_hash, kpt_rt->idname, kpt_rt);
85 }
86 
88 {
90 }
91 
93 {
96 }
97 
99 {
102 }
103 
106 /* -------------------------------------------------------------------- */
110 void BKE_keyconfig_pref_set_select_mouse(UserDef *userdef, int value, bool override)
111 {
113  IDProperty *idprop = IDP_GetPropertyFromGroup(kpt->prop, "select_mouse");
114  if (!idprop) {
115  IDPropertyTemplate tmp = {
116  .i = value,
117  };
118  IDP_AddToGroup(kpt->prop, IDP_New(IDP_INT, &tmp, "select_mouse"));
119  }
120  else if (override) {
121  IDP_Int(idprop) = value;
122  }
123 }
124 
126 {
128  if (kmi->ptr) {
129  MEM_freeN(kmi->ptr);
130  }
131  MEM_freeN(kmi);
132 }
133 
135 {
136  if (kmdi->add_item) {
137  keymap_item_free(kmdi->add_item);
138  }
139  if (kmdi->remove_item) {
141  }
142  MEM_freeN(kmdi);
143 }
144 
146  const struct wmKeyConfigFilterItemParams *params,
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 = keymap->diff_items.first, *kmdi_next; kmdi; kmdi = kmdi_next) {
152  kmdi_next = kmdi->next;
153  bool remove = false;
154 
155  if (params->check_diff_item_add) {
156  if (kmdi->add_item) {
157  if (filter_fn(kmdi->add_item, user_data)) {
158  remove = true;
159  }
160  }
161  }
162 
163  if (!remove && params->check_diff_item_remove) {
164  if (kmdi->remove_item) {
165  if (filter_fn(kmdi->remove_item, user_data)) {
166  remove = true;
167  }
168  }
169  }
170 
171  if (remove) {
172  BLI_remlink(&keymap->diff_items, kmdi);
173  keymap_diff_item_free(kmdi);
174  }
175  }
176  }
177 
178  if (params->check_item) {
179  for (wmKeyMapItem *kmi = keymap->items.first, *kmi_next; kmi; kmi = kmi_next) {
180  kmi_next = kmi->next;
181  if (filter_fn(kmi, user_data)) {
182  BLI_remlink(&keymap->items, kmi);
183  keymap_item_free(kmi);
184  }
185  }
186  }
187 }
188 
190  const struct wmKeyConfigFilterItemParams *params,
191  bool (*filter_fn)(wmKeyMapItem *kmi, void *user_data),
192  void *user_data)
193 {
194  LISTBASE_FOREACH (wmKeyMap *, keymap, &userdef->user_keymaps) {
196  }
197 }
198 
#define IDP_Int(prop)
Definition: BKE_idprop.h:244
struct IDProperty * IDP_New(char type, const IDPropertyTemplate *val, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition: idprop.c:887
void IDP_FreeProperty(struct IDProperty *prop)
Definition: idprop.c:1093
bool IDP_AddToGroup(struct IDProperty *group, struct IDProperty *prop) ATTR_NONNULL()
Definition: idprop.c:631
struct IDProperty * IDP_GetPropertyFromGroup(const struct IDProperty *prop, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
struct wmKeyConfigPrefType_Runtime wmKeyConfigPrefType_Runtime
Definition: BKE_keyconfig.h:29
#define BLI_assert(a)
Definition: BLI_assert.h:46
GHash * BLI_ghash_str_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:734
bool BLI_ghash_remove(GHash *gh, const void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
Definition: BLI_ghash.c:790
void BLI_ghash_insert(GHash *gh, void *key, void *val)
Definition: BLI_ghash.c:710
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
Definition: BLI_ghash.c:863
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:336
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:80
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:100
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define STRNCPY(dst, src)
Definition: BLI_string.h:483
@ IDP_INT
Definition: DNA_ID.h:137
@ IDP_GROUP
Definition: DNA_ID.h:141
These structs are the foundation for all linked lists in the library system.
#define WM_KEYCONFIG_STR_DEFAULT
Read Guarded memory(de)allocation.
void * user_data
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void BKE_keyconfig_pref_type_init(void)
Definition: keyconfig.c:92
void BKE_keyconfig_pref_type_free(void)
Definition: keyconfig.c:98
void BKE_keyconfig_keymap_filter_item(wmKeyMap *keymap, const struct wmKeyConfigFilterItemParams *params, bool(*filter_fn)(wmKeyMapItem *kmi, void *user_data), void *user_data)
Definition: keyconfig.c:145
void BKE_keyconfig_pref_filter_items(struct UserDef *userdef, const struct wmKeyConfigFilterItemParams *params, bool(*filter_fn)(wmKeyMapItem *kmi, void *user_data), void *user_data)
Definition: keyconfig.c:189
wmKeyConfigPref * BKE_keyconfig_pref_ensure(UserDef *userdef, const char *kc_idname)
Definition: keyconfig.c:33
void BKE_keyconfig_pref_type_remove(const wmKeyConfigPrefType_Runtime *kpt_rt)
Definition: keyconfig.c:87
void BKE_keyconfig_pref_set_select_mouse(UserDef *userdef, int value, bool override)
Definition: keyconfig.c:110
static void keymap_diff_item_free(wmKeyMapDiffItem *kmdi)
Definition: keyconfig.c:134
static GHash * global_keyconfigpreftype_hash
Definition: keyconfig.c:57
static void keymap_item_free(wmKeyMapItem *kmi)
Definition: keyconfig.c:125
wmKeyConfigPrefType_Runtime * BKE_keyconfig_pref_type_find(const char *idname, bool quiet)
Definition: keyconfig.c:59
void BKE_keyconfig_pref_type_add(wmKeyConfigPrefType_Runtime *kpt_rt)
Definition: keyconfig.c:82
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:31
bool remove(void *owner, const AttributeIDRef &attribute_id)
void * first
Definition: DNA_listBase.h:31
struct ListBase user_keymaps
struct ListBase user_keyconfig_prefs
struct PointerRNA * ptr
struct wmKeyMapItem * next