Blender  V3.3
wm_uilist_type.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
9 #include <stdio.h>
10 #include <string.h>
11 
12 #include "BLI_listbase.h"
13 #include "BLI_sys_types.h"
14 
15 #include "DNA_space_types.h"
17 
18 #include "MEM_guardedalloc.h"
19 
20 #include "UI_interface.h"
21 
22 #include "BLI_ghash.h"
23 #include "BLI_string.h"
24 #include "BLI_utildefines.h"
25 
26 #include "BKE_main.h"
27 #include "BKE_screen.h"
28 
29 #include "WM_api.h"
30 #include "WM_types.h"
31 
33 
34 uiListType *WM_uilisttype_find(const char *idname, bool quiet)
35 {
36  if (idname[0]) {
38  if (ult) {
39  return ult;
40  }
41  }
42 
43  if (!quiet) {
44  printf("search for unknown uilisttype %s\n", idname);
45  }
46 
47  return NULL;
48 }
49 
51 {
53  return 1;
54 }
55 
56 static void wm_uilisttype_unlink_from_region(const uiListType *ult, ARegion *region)
57 {
58  LISTBASE_FOREACH (uiList *, list, &region->ui_lists) {
59  if (list->type == ult) {
60  /* Don't delete the list, it's not just runtime data but stored in files. Freeing would make
61  * that data get lost. */
62  list->type = NULL;
63  }
64  }
65 }
66 
68 {
69  LISTBASE_FOREACH (SpaceLink *, space_link, &area->spacedata) {
70  ListBase *regionbase = (space_link == area->spacedata.first) ? &area->regionbase :
71  &space_link->regionbase;
72  LISTBASE_FOREACH (ARegion *, region, regionbase) {
74  }
75  }
76 }
77 
88 static void wm_uilisttype_unlink(Main *bmain, const uiListType *ult)
89 {
90  for (wmWindowManager *wm = bmain->wm.first; wm != NULL; wm = wm->id.next) {
91  LISTBASE_FOREACH (wmWindow *, win, &wm->windows) {
92  LISTBASE_FOREACH (ScrArea *, global_area, &win->global_areas.areabase) {
93  wm_uilisttype_unlink_from_area(ult, global_area);
94  }
95  }
96  }
97 
98  for (bScreen *screen = bmain->screens.first; screen != NULL; screen = screen->id.next) {
99  LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
101  }
102 
103  LISTBASE_FOREACH (ARegion *, region, &screen->regionbase) {
105  }
106  }
107 }
108 
110 {
111  wm_uilisttype_unlink(bmain, ult);
112 
114 
115  BLI_assert(ok);
116  UNUSED_VARS_NDEBUG(ok);
117 }
118 
120 {
121  uilisttypes_hash = BLI_ghash_str_new_ex("uilisttypes_hash gh", 16);
122 }
123 
125 {
126  GHashIterator gh_iter;
127  GHASH_ITER (gh_iter, uilisttypes_hash) {
128  uiListType *ult = BLI_ghashIterator_getValue(&gh_iter);
129  if (ult->rna_ext.free) {
130  ult->rna_ext.free(ult->rna_ext.data);
131  }
132  }
133 
136 }
137 
139  const char *list_id,
140  char r_full_list_id[/*UI_MAX_NAME_STR*/])
141 {
142  /* We tag the list id with the list type... */
143  BLI_snprintf(r_full_list_id, UI_MAX_NAME_STR, "%s_%s", ult->idname, list_id ? list_id : "");
144 }
145 
146 const char *WM_uilisttype_list_id_get(const uiListType *ult, uiList *list)
147 {
148  /* Some sanity check for the assumed behavior of #WM_uilisttype_to_full_list_id(). */
149  BLI_assert((list->list_id + strlen(ult->idname))[0] == '_');
150  /* +1 to skip the '_' */
151  return list->list_id + strlen(ult->idname) + 1;
152 }
#define BLI_assert(a)
Definition: BLI_assert.h:46
GHash * BLI_ghash_str_new_ex(const char *info, unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
BLI_INLINE void * BLI_ghashIterator_getValue(GHashIterator *ghi) ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.h:302
#define GHASH_ITER(gh_iter_, ghash_)
Definition: BLI_ghash.h:321
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
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
#define UNUSED_VARS_NDEBUG(...)
Read Guarded memory(de)allocation.
#define UI_MAX_NAME_STR
Definition: UI_interface.h:92
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
static void area(int d1, int d2, int e1, int e2, float weights[2])
ListBase ui_lists
void * data
Definition: RNA_types.h:765
StructFreeFunc free
Definition: RNA_types.h:768
void * first
Definition: DNA_listBase.h:31
Definition: BKE_main.h:121
ListBase wm
Definition: BKE_main.h:197
ListBase screens
Definition: BKE_main.h:183
char idname[BKE_ST_MAXNAME]
Definition: BKE_screen.h:321
ExtensionRNA rna_ext
Definition: BKE_screen.h:331
char list_id[64]
static void wm_uilisttype_unlink_from_region(const uiListType *ult, ARegion *region)
bool WM_uilisttype_add(uiListType *ult)
static void wm_uilisttype_unlink(Main *bmain, const uiListType *ult)
void WM_uilisttype_to_full_list_id(const uiListType *ult, const char *list_id, char r_full_list_id[])
uiListType * WM_uilisttype_find(const char *idname, bool quiet)
static GHash * uilisttypes_hash
const char * WM_uilisttype_list_id_get(const uiListType *ult, uiList *list)
void WM_uilisttype_free(void)
static void wm_uilisttype_unlink_from_area(const uiListType *ult, ScrArea *area)
void WM_uilisttype_remove_ptr(Main *bmain, uiListType *ult)
void WM_uilisttype_init(void)