Blender V4.5
versioning_userdef.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
10#define DNA_DEPRECATED_ALLOW
11#include <cstring>
12
13#include <fmt/format.h>
14
15#include "BLI_listbase.h"
16#include "BLI_map.hh"
17#include "BLI_math_rotation.h"
18#include "BLI_math_vector.h"
19#include "BLI_string.h"
20#include "BLI_string_utf8.h"
21#include "BLI_string_utils.hh"
22#include "BLI_utildefines.h"
23
24#include "DNA_anim_types.h"
25#include "DNA_curve_types.h"
26#include "DNA_scene_types.h"
27#include "DNA_space_types.h"
28#include "DNA_userdef_types.h"
30
31#include "BKE_addon.h"
32#include "BKE_blender_version.h"
33#include "BKE_colorband.hh"
34#include "BKE_idprop.hh"
35#include "BKE_keyconfig.h"
36#include "BKE_main.hh"
37#include "BKE_preferences.h"
38
39#include "BLO_readfile.hh"
40#include "BLO_userdef_default.h"
41
42#include "BLT_translation.hh"
43
44#include "DNA_brush_enums.h"
45
46#include "GPU_platform.hh"
47
48#include "MEM_guardedalloc.h"
49
50#include "readfile.hh" /* Own include. */
51
52#include "WM_keymap.hh"
53#include "WM_types.hh"
54#include "wm_event_types.hh"
55
56/* Don't use translation strings in versioning!
57 * These depend on the preferences already being read.
58 * If this is important we can set the translations as part of versioning preferences,
59 * however that should only be done if there are important use-cases. */
60#if 0
61# include "BLT_translation.hh"
62#else
63# define N_(msgid) msgid
64#endif
65
66/* For versioning we only ever want to manipulate preferences passed in. */
67#define U BLI_STATIC_ASSERT(false, "Global 'U' not allowed, only use arguments passed in!")
68
69static void do_versions_theme(const UserDef *userdef, bTheme *btheme)
70{
71
72#define USER_VERSION_ATLEAST(ver, subver) MAIN_VERSION_FILE_ATLEAST(userdef, ver, subver)
73#define FROM_DEFAULT_V4_UCHAR(member) copy_v4_v4_uchar(btheme->member, U_theme_default.member)
74
75 if (!USER_VERSION_ATLEAST(300, 41)) {
77 }
78
79 /* Again reset the theme, but only if stored with an early 3.1 alpha version. Some changes were
80 * done in the release branch and then merged into the 3.1 branch (master). So the previous reset
81 * wouldn't work for people who saved their preferences with a 3.1 build meanwhile. But we still
82 * don't want to reset theme changes stored in the eventual 3.0 release once opened in a 3.1
83 * build. */
84 if (userdef->versionfile > 300 && !USER_VERSION_ATLEAST(301, 1)) {
86 }
87
88 if (!USER_VERSION_ATLEAST(301, 2)) {
89 FROM_DEFAULT_V4_UCHAR(space_sequencer.mask);
90 }
91
92 if (!USER_VERSION_ATLEAST(302, 8)) {
93 btheme->space_node.grid_levels = U_theme_default.space_node.grid_levels;
94 }
95
96 if (!USER_VERSION_ATLEAST(302, 9)) {
97 FROM_DEFAULT_V4_UCHAR(space_sequencer.list);
98 FROM_DEFAULT_V4_UCHAR(space_sequencer.list_title);
99 FROM_DEFAULT_V4_UCHAR(space_sequencer.list_text);
100 FROM_DEFAULT_V4_UCHAR(space_sequencer.list_text_hi);
101 }
102
103 if (!USER_VERSION_ATLEAST(306, 3)) {
104 FROM_DEFAULT_V4_UCHAR(space_view3d.face_retopology);
105 }
106
107 if (!USER_VERSION_ATLEAST(306, 8)) {
108 FROM_DEFAULT_V4_UCHAR(space_node.node_zone_simulation);
109 FROM_DEFAULT_V4_UCHAR(space_action.simulated_frames);
110 }
111
112 if (!USER_VERSION_ATLEAST(400, 12)) {
113 FROM_DEFAULT_V4_UCHAR(space_node.node_zone_repeat);
114 }
115
116 if (!USER_VERSION_ATLEAST(400, 14)) {
117 FROM_DEFAULT_V4_UCHAR(space_view3d.asset_shelf.back);
118 FROM_DEFAULT_V4_UCHAR(space_view3d.asset_shelf.header_back);
119 }
120
121 if (!USER_VERSION_ATLEAST(400, 24)) {
122 FROM_DEFAULT_V4_UCHAR(tui.wcol_list_item.inner_sel);
123 FROM_DEFAULT_V4_UCHAR(space_sequencer.transition);
124 }
125
126 if (!USER_VERSION_ATLEAST(400, 27)) {
127 FROM_DEFAULT_V4_UCHAR(space_sequencer.keytype_keyframe);
128 FROM_DEFAULT_V4_UCHAR(space_sequencer.keytype_breakdown);
129 FROM_DEFAULT_V4_UCHAR(space_sequencer.keytype_movehold);
130 FROM_DEFAULT_V4_UCHAR(space_sequencer.keytype_keyframe_select);
131 FROM_DEFAULT_V4_UCHAR(space_sequencer.keytype_breakdown_select);
132 FROM_DEFAULT_V4_UCHAR(space_sequencer.keytype_movehold_select);
133 FROM_DEFAULT_V4_UCHAR(space_sequencer.keyborder);
134 FROM_DEFAULT_V4_UCHAR(space_sequencer.keyborder_select);
135 FROM_DEFAULT_V4_UCHAR(space_sequencer.transition);
136 }
137
138 if (!USER_VERSION_ATLEAST(400, 35)) {
139 FROM_DEFAULT_V4_UCHAR(tui.wcol_list_item.item);
140 }
141
142 if (!USER_VERSION_ATLEAST(401, 4)) {
143 FROM_DEFAULT_V4_UCHAR(space_view3d.edge_select);
144 FROM_DEFAULT_V4_UCHAR(space_view3d.edge_mode_select);
145 FROM_DEFAULT_V4_UCHAR(space_view3d.face_select);
146 FROM_DEFAULT_V4_UCHAR(space_view3d.face_mode_select);
147 }
148
149 if (!USER_VERSION_ATLEAST(402, 13)) {
150 FROM_DEFAULT_V4_UCHAR(space_text.hilite);
151 FROM_DEFAULT_V4_UCHAR(space_console.console_cursor);
152 }
153
154 if (!USER_VERSION_ATLEAST(402, 16)) {
156 &userdef->themes, btheme, "Theme", '.', offsetof(bTheme, name), sizeof(btheme->name));
157 }
158
159 if (!USER_VERSION_ATLEAST(402, 17)) {
160 FROM_DEFAULT_V4_UCHAR(space_action.keytype_generated);
161 FROM_DEFAULT_V4_UCHAR(space_action.keytype_generated_select);
162 }
163
164 if (!USER_VERSION_ATLEAST(402, 21)) {
165 FROM_DEFAULT_V4_UCHAR(space_image.asset_shelf.back);
166 FROM_DEFAULT_V4_UCHAR(space_image.asset_shelf.header_back);
167 }
168
169 if (!USER_VERSION_ATLEAST(402, 47)) {
170 FROM_DEFAULT_V4_UCHAR(space_view3d.time_gp_keyframe);
171 }
172
173 if (!USER_VERSION_ATLEAST(403, 1)) {
174 FROM_DEFAULT_V4_UCHAR(space_sequencer.keytype_generated);
175 FROM_DEFAULT_V4_UCHAR(space_sequencer.keytype_generated_select);
176 }
177
178 if (!USER_VERSION_ATLEAST(402, 62)) {
179 FROM_DEFAULT_V4_UCHAR(space_sequencer.audio);
180 FROM_DEFAULT_V4_UCHAR(space_sequencer.color_strip);
181 FROM_DEFAULT_V4_UCHAR(space_sequencer.effect);
182 FROM_DEFAULT_V4_UCHAR(space_sequencer.image);
183 FROM_DEFAULT_V4_UCHAR(space_sequencer.mask);
184 FROM_DEFAULT_V4_UCHAR(space_sequencer.meta);
185 FROM_DEFAULT_V4_UCHAR(space_sequencer.movie);
186 FROM_DEFAULT_V4_UCHAR(space_sequencer.movieclip);
187 FROM_DEFAULT_V4_UCHAR(space_sequencer.scene);
188 FROM_DEFAULT_V4_UCHAR(space_sequencer.text_strip);
189 FROM_DEFAULT_V4_UCHAR(space_sequencer.transition);
190 }
191
192 if (!USER_VERSION_ATLEAST(403, 5)) {
193 FROM_DEFAULT_V4_UCHAR(space_view3d.before_current_frame);
194 FROM_DEFAULT_V4_UCHAR(space_view3d.after_current_frame);
195 FROM_DEFAULT_V4_UCHAR(space_sequencer.before_current_frame);
196 FROM_DEFAULT_V4_UCHAR(space_sequencer.after_current_frame);
197 }
198
199 if (!USER_VERSION_ATLEAST(403, 18)) {
200 FROM_DEFAULT_V4_UCHAR(tui.icon_autokey);
201 }
202
203 if (!USER_VERSION_ATLEAST(403, 25)) {
204 FROM_DEFAULT_V4_UCHAR(space_node.node_zone_foreach_geometry_element);
205 }
206
207 if (!USER_VERSION_ATLEAST(403, 27)) {
208 FROM_DEFAULT_V4_UCHAR(tui.editor_border);
209 FROM_DEFAULT_V4_UCHAR(tui.editor_outline);
210 FROM_DEFAULT_V4_UCHAR(tui.editor_outline_active);
211 }
212
213 if (!USER_VERSION_ATLEAST(404, 7)) {
214 if (btheme->space_view3d.face_front[0] == 0 && btheme->space_view3d.face_front[1] == 0 &&
215 btheme->space_view3d.face_front[2] == 0xFF && btheme->space_view3d.face_front[3] == 0xB3)
216 {
217 /* Use new default value only if currently set to the old default value. */
218 FROM_DEFAULT_V4_UCHAR(space_view3d.face_front);
219 }
220 }
221
222 if (!USER_VERSION_ATLEAST(404, 12)) {
223 FROM_DEFAULT_V4_UCHAR(space_sequencer.text_strip_cursor);
224 FROM_DEFAULT_V4_UCHAR(space_sequencer.selected_text);
225 }
226
227 if (!USER_VERSION_ATLEAST(405, 3)) {
228 FROM_DEFAULT_V4_UCHAR(tui.wcol_state.error);
229 FROM_DEFAULT_V4_UCHAR(tui.wcol_state.warning);
230 FROM_DEFAULT_V4_UCHAR(tui.wcol_state.info);
231 FROM_DEFAULT_V4_UCHAR(tui.wcol_state.success);
232 }
233
234 if (!USER_VERSION_ATLEAST(405, 14)) {
235 FROM_DEFAULT_V4_UCHAR(space_node.node_zone_closure);
236 }
237
238 if (!USER_VERSION_ATLEAST(405, 82)) {
239 FROM_DEFAULT_V4_UCHAR(space_clip.anim_preview_range);
240 }
241
248
249#undef FROM_DEFAULT_V4_UCHAR
250
251#undef USER_VERSION_ATLEAST
252}
253
255#define USER_LMOUSESELECT (1 << 14) /* deprecated */
256
257static void do_version_select_mouse(const UserDef *userdef, wmKeyMapItem *kmi)
258{
259 /* Remove select/action mouse from user defined keymaps. */
260 enum {
261 ACTIONMOUSE = 0x0005,
262 SELECTMOUSE = 0x0006,
263 EVT_TWEAK_A = 0x5005,
264 EVT_TWEAK_S = 0x5006,
265 };
266 const bool left = (userdef->flag & USER_LMOUSESELECT) != 0;
267
268 switch (kmi->type) {
269 case SELECTMOUSE:
270 kmi->type = (left) ? LEFTMOUSE : RIGHTMOUSE;
271 break;
272 case ACTIONMOUSE:
273 kmi->type = (left) ? RIGHTMOUSE : LEFTMOUSE;
274 break;
275 case EVT_TWEAK_S:
276 kmi->type = (left) ? LEFTMOUSE : RIGHTMOUSE;
277 kmi->val = KM_CLICK_DRAG;
278 break;
279 case EVT_TWEAK_A:
280 kmi->type = (left) ? RIGHTMOUSE : LEFTMOUSE;
281 kmi->val = KM_CLICK_DRAG;
282 break;
283 default:
284 break;
285 }
286}
287
289{
290 if (STREQ(kmi->idname, "GRAPH_OT_keyframe_jump")) {
291 STRNCPY(kmi->idname, "SCREEN_OT_keyframe_jump");
292 }
293}
294
295static bool keymap_item_has_invalid_wm_context_data_path(wmKeyMapItem *kmi, void * /*user_data*/)
296{
297 if (STRPREFIX(kmi->idname, "WM_OT_context_") && kmi->properties) {
298 IDProperty *idprop = IDP_GetPropertyFromGroup(kmi->properties, "data_path");
299 if (idprop && (idprop->type == IDP_STRING) &&
300 STRPREFIX(static_cast<const char *>(idprop->data.pointer), "(null)"))
301 {
302 return true;
303 }
304 }
305 return false;
306}
307
309static bool keymap_item_update_tweak_event(wmKeyMapItem *kmi, void * /*user_data*/)
310{
311 /* Tweak events for L M R mouse-buttons. */
312 enum {
313 EVT_TWEAK_L = 0x5002,
314 EVT_TWEAK_M = 0x5003,
315 EVT_TWEAK_R = 0x5004,
316 };
317 switch (kmi->type) {
318 case EVT_TWEAK_L:
319 kmi->type = LEFTMOUSE;
320 break;
321 case EVT_TWEAK_M:
322 kmi->type = MIDDLEMOUSE;
323 break;
324 case EVT_TWEAK_R:
325 kmi->type = RIGHTMOUSE;
326 break;
327 default:
328 kmi->direction = KM_ANY;
329 return false;
330 }
331
332 if (kmi->val >= KM_DIRECTION_N && kmi->val <= KM_DIRECTION_NW) {
333 kmi->direction = kmi->val;
334 }
335 else {
336 kmi->direction = KM_ANY;
337 }
338 kmi->val = KM_CLICK_DRAG;
339 return false;
340}
341
343 const blender::StringRef asset_prefix,
344 const blender::StringRef tool_property,
347 const blender::Map<int, blender::StringRef> &id_asset_map,
348 wmKeyMapItem *kmi)
349{
350 std::optional<blender::StringRef> asset_id = {};
351 std::optional<blender::StringRefNull> tool_id = {};
352 if (STREQ(kmi->idname, "WM_OT_tool_set_by_id")) {
353 IDProperty *idprop = IDP_GetPropertyFromGroup(kmi->properties, "name");
354 if (idprop && (idprop->type == IDP_STRING)) {
355 const blender::StringRef prop_val = IDP_String(idprop);
356 if (!prop_val.startswith("builtin_brush.")) {
357 return;
358 }
359 if (tool_asset_map.contains(prop_val)) {
360 asset_id = tool_asset_map.lookup(prop_val);
361 }
362 else if (tool_tool_map.contains(prop_val)) {
363 tool_id = tool_tool_map.lookup(prop_val);
364 }
365 }
366 }
367 else if (STREQ(kmi->idname, "PAINT_OT_brush_select")) {
368 IDProperty *idprop = IDP_GetPropertyFromGroup(kmi->properties, tool_property);
369 if (idprop && (idprop->type == IDP_INT)) {
370 const int prop_val = IDP_Int(idprop);
371 if (id_asset_map.contains(prop_val)) {
372 asset_id = id_asset_map.lookup(prop_val);
373 }
374 }
375 }
376
377 if (asset_id) {
378 const std::string full_path = fmt::format("{}{}", asset_prefix, *asset_id);
379
381 STRNCPY(kmi->idname, "BRUSH_OT_asset_activate");
383 kmi->properties,
384 blender::bke::idprop::create("asset_library_type", ASSET_LIBRARY_ESSENTIALS).release());
386 blender::bke::idprop::create("relative_asset_identifier", full_path).release());
387 }
388 else if (tool_id) {
390 IDP_AddToGroup(kmi->properties, blender::bke::idprop::create("name", *tool_id).release());
391 }
392}
393
395 const blender::StringRef asset_prefix,
396 const blender::StringRef tool_property,
397 const blender::Map<int, blender::StringRef> &id_asset_map,
398 wmKeyMapItem *kmi)
399{
400 std::optional<blender::StringRef> asset_id = {};
401 /* Only the paint.brush_select operator is stored in the default keymap & applicable to be
402 * updated if the user removed it in a previous version. */
403 if (STREQ(kmi->idname, "PAINT_OT_brush_select")) {
404 IDProperty *idprop = IDP_GetPropertyFromGroup(kmi->properties, tool_property);
405 if (idprop && (idprop->type == IDP_INT)) {
406 const int prop_val = IDP_Int(idprop);
407 if (id_asset_map.contains(prop_val)) {
408 asset_id = id_asset_map.lookup(prop_val);
409 }
410 }
411 }
412
413 if (asset_id) {
414 const std::string full_path = fmt::format("{}{}", asset_prefix, *asset_id);
415
417 STRNCPY(kmi->idname, "BRUSH_OT_asset_activate");
419 kmi->properties,
420 blender::bke::idprop::create("asset_library_type", ASSET_LIBRARY_ESSENTIALS).release());
422 blender::bke::idprop::create("relative_asset_identifier", full_path).release());
423 }
424}
425
427 wmKeyMap *keymap,
428 const blender::StringRef asset_prefix,
429 const blender::StringRef tool_property,
432 const blender::Map<int, blender::StringRef> &id_asset_map)
433{
434 LISTBASE_FOREACH (wmKeyMapDiffItem *, kmid, &keymap->diff_items) {
435 if (kmid->add_item) {
437 tool_property,
438 tool_tool_map,
439 tool_asset_map,
440 id_asset_map,
441 kmid->add_item);
442 }
443 if (kmid->remove_item) {
445 asset_prefix, tool_property, id_asset_map, kmid->remove_item);
446 }
447 }
448}
449
451{
452 constexpr blender::StringRef asset_prefix =
453 "brushes/essentials_brushes-mesh_sculpt.blend/Brush/";
454 constexpr blender::StringRef tool_property = "sculpt_tool";
455
456 const auto tool_asset_map = []() {
458 map.add_new("builtin_brush.Draw Sharp", "Draw Sharp");
459 map.add_new("builtin_brush.Clay", "Clay");
460 map.add_new("builtin_brush.Clay Strips", "Clay Strips");
461 map.add_new("builtin_brush.Clay Thumb", "Clay Thumb");
462 map.add_new("builtin_brush.Layer", "Layer");
463 map.add_new("builtin_brush.Inflate", "Inflate/Deflate");
464 map.add_new("builtin_brush.Blob", "Blob");
465 map.add_new("builtin_brush.Crease", "Crease Polish");
466 map.add_new("builtin_brush.Smooth", "Smooth");
467 map.add_new("builtin_brush.Flatten", "Flatten/Contrast");
468 map.add_new("builtin_brush.Fill", "Fill/Deepen");
469 map.add_new("builtin_brush.Scrape", "Scrape/Fill");
470 map.add_new("builtin_brush.Multi-plane Scrape", "Scrape Multiplane");
471 map.add_new("builtin_brush.Pinch", "Pinch/Magnify");
472 map.add_new("builtin_brush.Grab", "Grab");
473 map.add_new("builtin_brush.Elastic Deform", "Elastic Grab");
474 map.add_new("builtin_brush.Snake Hook", "Snake Hook");
475 map.add_new("builtin_brush.Thumb", "Thumb");
476 map.add_new("builtin_brush.Pose", "Pose");
477 map.add_new("builtin_brush.Nudge", "Nudge");
478 map.add_new("builtin_brush.Rotate", "Twist");
479 map.add_new("builtin_brush.Slide Relax", "Relax Slide");
480 map.add_new("builtin_brush.Boundary", "Boundary");
481 map.add_new("builtin_brush.Cloth", "Drag Cloth");
482 map.add_new("builtin_brush.Simplify", "Density");
483 map.add_new("builtin_brush.Multires Displacement Eraser", "Erase Multires Displacement");
484 map.add_new("builtin_brush.Multires Displacement Smear", "Smear Multires Displacement");
485 map.add_new("builtin_brush.Smear", "Smear");
486
487 return map;
488 }();
489
490 const auto tool_tool_map = []() {
492 map.add_new("builtin_brush.Draw", "builtin.brush");
493 map.add_new("builtin_brush.Paint", "builtin_brush.paint");
494 map.add_new("builtin_brush.Mask", "builtin_brush.mask");
495 map.add_new("builtin_brush.Draw Face Sets", "builtin_brush.draw_face_sets");
496 return map;
497 }();
498
499 const auto id_asset_map = []() {
501 map.add_new(SCULPT_BRUSH_TYPE_DRAW, "Draw");
502 map.add_new(SCULPT_BRUSH_TYPE_DRAW_SHARP, "Draw Sharp");
503 map.add_new(SCULPT_BRUSH_TYPE_CLAY, "Clay");
504 map.add_new(SCULPT_BRUSH_TYPE_CLAY_STRIPS, "Clay Strips");
505 map.add_new(SCULPT_BRUSH_TYPE_CLAY_THUMB, "Clay Thumb");
506 map.add_new(SCULPT_BRUSH_TYPE_LAYER, "Layer");
507 map.add_new(SCULPT_BRUSH_TYPE_INFLATE, "Inflate/Deflate");
508 map.add_new(SCULPT_BRUSH_TYPE_BLOB, "Blob");
509 map.add_new(SCULPT_BRUSH_TYPE_CREASE, "Crease Polish");
510 map.add_new(SCULPT_BRUSH_TYPE_SMOOTH, "Smooth");
511 map.add_new(SCULPT_BRUSH_TYPE_FLATTEN, "Flatten/Contrast");
512 map.add_new(SCULPT_BRUSH_TYPE_FILL, "Fill/Deepen");
513 map.add_new(SCULPT_BRUSH_TYPE_SCRAPE, "Scrape/Fill");
514 map.add_new(SCULPT_BRUSH_TYPE_MULTIPLANE_SCRAPE, "Scrape Multiplane");
515 map.add_new(SCULPT_BRUSH_TYPE_PINCH, "Pinch/Magnify");
516 map.add_new(SCULPT_BRUSH_TYPE_GRAB, "Grab");
517 map.add_new(SCULPT_BRUSH_TYPE_ELASTIC_DEFORM, "Elastic Grab");
518 map.add_new(SCULPT_BRUSH_TYPE_SNAKE_HOOK, "Snake Hook");
519 map.add_new(SCULPT_BRUSH_TYPE_THUMB, "Thumb");
520 map.add_new(SCULPT_BRUSH_TYPE_POSE, "Pose");
521 map.add_new(SCULPT_BRUSH_TYPE_NUDGE, "Nudge");
522 map.add_new(SCULPT_BRUSH_TYPE_ROTATE, "Twist");
523 map.add_new(SCULPT_BRUSH_TYPE_SLIDE_RELAX, "Relax Slide");
524 map.add_new(SCULPT_BRUSH_TYPE_BOUNDARY, "Boundary");
525 map.add_new(SCULPT_BRUSH_TYPE_CLOTH, "Drag Cloth");
526 map.add_new(SCULPT_BRUSH_TYPE_SIMPLIFY, "Density");
527 map.add_new(SCULPT_BRUSH_TYPE_MASK, "Mask");
528 map.add_new(SCULPT_BRUSH_TYPE_DRAW_FACE_SETS, "Face Set Paint");
529 map.add_new(SCULPT_BRUSH_TYPE_DISPLACEMENT_ERASER, "Erase Multires Displacement");
530 map.add_new(SCULPT_BRUSH_TYPE_DISPLACEMENT_SMEAR, "Smear Multires Displacement");
531 map.add_new(SCULPT_BRUSH_TYPE_PAINT, "Paint Hard");
532 map.add_new(SCULPT_BRUSH_TYPE_SMEAR, "Smear");
533 return map;
534 }();
535
537 keymap, asset_prefix, tool_property, tool_tool_map, tool_asset_map, id_asset_map);
538}
539
541{
542 constexpr blender::StringRef asset_prefix =
543 "brushes/essentials_brushes-mesh_vertex.blend/Brush/";
544 constexpr blender::StringRef tool_property = "vertex_tool";
545
546 const auto tool_tool_map = []() {
548 map.add_new("builtin_brush.Draw", "builtin.brush");
549 map.add_new("builtin_brush.Blur", "builtin_brush.blur");
550 map.add_new("builtin_brush.Average", "builtin_brush.average");
551 map.add_new("builtin_brush.Smear", "builtin_brush.smear");
552 return map;
553 }();
554
555 const auto id_asset_map = []() {
557 map.add_new(VPAINT_BRUSH_TYPE_DRAW, "Paint Hard");
558 map.add_new(VPAINT_BRUSH_TYPE_BLUR, "Blur");
559 map.add_new(VPAINT_BRUSH_TYPE_AVERAGE, "Average");
560 map.add_new(VPAINT_BRUSH_TYPE_SMEAR, "Smear");
561 return map;
562 }();
563
564 keymap_update_brushes(keymap, asset_prefix, tool_property, tool_tool_map, {}, id_asset_map);
565}
566
568{
569 constexpr blender::StringRef asset_prefix =
570 "brushes/essentials_brushes-mesh_weight.blend/Brush/";
571 constexpr blender::StringRef tool_property = "weight_tool";
572
573 const auto tool_tool_map = []() {
575 map.add_new("builtin_brush.Draw", "builtin.brush");
576 map.add_new("builtin_brush.Blur", "builtin_brush.blur");
577 map.add_new("builtin_brush.Average", "builtin_brush.average");
578 map.add_new("builtin_brush.Smear", "builtin_brush.smear");
579 return map;
580 }();
581
582 const auto asset_id_map = []() {
584 map.add_new(WPAINT_BRUSH_TYPE_DRAW, "Paint");
585 map.add_new(WPAINT_BRUSH_TYPE_BLUR, "Blur");
586 map.add_new(WPAINT_BRUSH_TYPE_AVERAGE, "Average");
587 map.add_new(WPAINT_BRUSH_TYPE_SMEAR, "Smear");
588 return map;
589 }();
590
591 keymap_update_brushes(keymap, asset_prefix, tool_property, tool_tool_map, {}, asset_id_map);
592}
593
595{
596 constexpr blender::StringRef asset_prefix =
597 "brushes/essentials_brushes-mesh_texture.blend/Brush/";
598 constexpr blender::StringRef tool_property = "image_tool";
599
600 const auto tool_tool_map = []() {
602 map.add_new("builtin_brush.Draw", "builtin.brush");
603 map.add_new("builtin_brush.Soften", "builtin_brush.soften");
604 map.add_new("builtin_brush.Smear", "builtin_brush.smear");
605 map.add_new("builtin_brush.Clone", "builtin_brush.clone");
606 map.add_new("builtin_brush.Fill", "builtin_brush.fill");
607 map.add_new("builtin_brush.Mask", "builtin_brush.mask");
608 return map;
609 }();
610
611 const auto id_asset_map = []() {
613 map.add_new(IMAGE_PAINT_BRUSH_TYPE_DRAW, "Paint Hard");
619 return map;
620 }();
621
622 keymap_update_brushes(keymap, asset_prefix, tool_property, tool_tool_map, {}, id_asset_map);
623}
624
626{
627/* #UserDef & #Main happen to have the same struct member. */
628#define USER_VERSION_ATLEAST(ver, subver) MAIN_VERSION_FILE_ATLEAST(userdef, ver, subver)
629
630 /* the UserDef struct is not corrected with do_versions() .... ugh! */
631 if (userdef->menuthreshold1 == 0) {
632 userdef->menuthreshold1 = 5;
633 userdef->menuthreshold2 = 2;
634 }
635 if (userdef->mixbufsize == 0) {
636 userdef->mixbufsize = 2048;
637 }
638 if (userdef->autokey_mode == 0) {
639 /* 'add/replace' but not on */
640 userdef->autokey_mode = 2;
641 }
642 if (userdef->savetime <= 0) {
643 userdef->savetime = 1;
644 // XXX error(STRINGIFY(BLENDER_STARTUP_FILE)" is buggy, please consider removing it.\n");
645 }
646 if (userdef->gizmo_size == 0) {
647 userdef->gizmo_size = 75;
648 userdef->gizmo_flag |= USER_GIZMO_DRAW;
649 }
650 if (userdef->pad_rot_angle == 0.0f) {
651 userdef->pad_rot_angle = 15.0f;
652 }
653
654 /* If the userdef was created on a different platform, it may have an
655 * unsupported GPU backend selected. If so, pick a supported default. */
656#ifdef __APPLE__
657 if (userdef->gpu_backend == GPU_BACKEND_OPENGL || userdef->gpu_backend == GPU_BACKEND_VULKAN) {
659 }
660#else
661 if (userdef->gpu_backend == GPU_BACKEND_METAL) {
663 }
664#endif
665
666 /* graph editor - unselected F-Curve visibility */
667 if (userdef->fcu_inactive_alpha == 0) {
668 userdef->fcu_inactive_alpha = 0.25f;
669 }
670
671 if (!USER_VERSION_ATLEAST(192, 0)) {
672 STRNCPY(userdef->sounddir, "/");
673 }
674
675 /* patch to set Dupli Armature */
676 if (!USER_VERSION_ATLEAST(220, 0)) {
677 userdef->dupflag |= USER_DUP_ARM;
678 }
679
680 /* added seam, normal color, undo */
681 if (!USER_VERSION_ATLEAST(235, 0)) {
682 userdef->uiflag |= USER_GLOBALUNDO;
683 if (userdef->undosteps == 0) {
684 userdef->undosteps = 32;
685 }
686 }
687 if (!USER_VERSION_ATLEAST(236, 0)) {
688 /* illegal combo... */
689 if (userdef->flag & USER_LMOUSESELECT) {
690 userdef->flag &= ~USER_TWOBUTTONMOUSE;
691 }
692 }
693 if (!USER_VERSION_ATLEAST(240, 0)) {
694 userdef->uiflag |= USER_PLAINMENUS;
695 }
696 if (!USER_VERSION_ATLEAST(242, 0)) {
697 /* set defaults for 3D View rotating axis indicator */
698 /* since size can't be set to 0, this indicates it's not saved in startup.blend */
699 if (userdef->rvisize == 0) {
700 userdef->rvisize = 15;
701 userdef->rvibright = 8;
703 }
704 }
705 if (!USER_VERSION_ATLEAST(244, 0)) {
706 /* set default number of recently-used files (if not set) */
707 if (userdef->recent_files == 0) {
708 userdef->recent_files = 10;
709 }
710 }
711 if (!USER_VERSION_ATLEAST(245, 3)) {
712 if (userdef->coba_weight.tot == 0) {
713 BKE_colorband_init(&userdef->coba_weight, true);
714 }
715 }
716 if (!USER_VERSION_ATLEAST(245, 3)) {
718 }
719 if (!USER_VERSION_ATLEAST(250, 0)) {
720 /* adjust grease-pencil distances */
721 userdef->gp_manhattandist = 1;
722 userdef->gp_euclideandist = 2;
723
724 /* adjust default interpolation for new IPO-curves */
725 userdef->ipo_new = BEZT_IPO_BEZ;
726 }
727
728 if (!USER_VERSION_ATLEAST(250, 3)) {
729 /* new audio system */
730 if (userdef->audiochannels == 0) {
731 userdef->audiochannels = 2;
732 }
733 if (userdef->audioformat == 0) {
734 userdef->audioformat = 0x24;
735 }
736 if (userdef->audiorate == 0) {
737 userdef->audiorate = 48000;
738 }
739 }
740
741 if (!USER_VERSION_ATLEAST(250, 8)) {
742 LISTBASE_FOREACH (wmKeyMap *, km, &userdef->user_keymaps) {
743 if (STREQ(km->idname, "Armature_Sketch")) {
744 STRNCPY(km->idname, "Armature Sketch");
745 }
746 else if (STREQ(km->idname, "View3D")) {
747 STRNCPY(km->idname, "3D View");
748 }
749 else if (STREQ(km->idname, "View3D Generic")) {
750 STRNCPY(km->idname, "3D View Generic");
751 }
752 else if (STREQ(km->idname, "EditMesh")) {
753 STRNCPY(km->idname, "Mesh");
754 }
755 else if (STREQ(km->idname, "UVEdit")) {
756 STRNCPY(km->idname, "UV Editor");
757 }
758 else if (STREQ(km->idname, "Animation_Channels")) {
759 STRNCPY(km->idname, "Animation Channels");
760 }
761 else if (STREQ(km->idname, "GraphEdit Keys")) {
762 STRNCPY(km->idname, "Graph Editor");
763 }
764 else if (STREQ(km->idname, "GraphEdit Generic")) {
765 STRNCPY(km->idname, "Graph Editor Generic");
766 }
767 else if (STREQ(km->idname, "Action_Keys")) {
768 STRNCPY(km->idname, "Dopesheet");
769 }
770 else if (STREQ(km->idname, "NLA Data")) {
771 STRNCPY(km->idname, "NLA Editor");
772 }
773 else if (STREQ(km->idname, "Node Generic")) {
774 STRNCPY(km->idname, "Node Editor");
775 }
776 else if (STREQ(km->idname, "Logic Generic")) {
777 STRNCPY(km->idname, "Logic Editor");
778 }
779 else if (STREQ(km->idname, "File")) {
780 STRNCPY(km->idname, "File Browser");
781 }
782 else if (STREQ(km->idname, "FileMain")) {
783 STRNCPY(km->idname, "File Browser Main");
784 }
785 else if (STREQ(km->idname, "FileButtons")) {
786 STRNCPY(km->idname, "File Browser Buttons");
787 }
788 else if (STREQ(km->idname, "Buttons Generic")) {
789 STRNCPY(km->idname, "Property Editor");
790 }
791 }
792 }
793
794 if (!USER_VERSION_ATLEAST(252, 3)) {
795 if (userdef->flag & USER_LMOUSESELECT) {
796 userdef->flag &= ~USER_TWOBUTTONMOUSE;
797 }
798 }
799 if (!USER_VERSION_ATLEAST(252, 4)) {
800 /* default new handle type is auto handles */
801 userdef->keyhandles_new = HD_AUTO;
802 }
803
804 if (!USER_VERSION_ATLEAST(257, 0)) {
805 /* Clear #AUTOKEY_FLAG_ONLYKEYINGSET flag from user-preferences,
806 * so that it doesn't linger around from old configurations like a ghost. */
808 }
809
810 if (!USER_VERSION_ATLEAST(260, 3)) {
811 /* if new keyframes handle default is stuff "auto", make it "auto-clamped" instead
812 * was changed in 260 as part of GSoC11, but version patch was wrong
813 */
814 if (userdef->keyhandles_new == HD_AUTO) {
815 userdef->keyhandles_new = HD_AUTO_ANIM;
816 }
817 }
818
819 if (!USER_VERSION_ATLEAST(267, 0)) {
820
821 /* GL Texture Garbage Collection */
822 if (userdef->textimeout == 0) {
823 userdef->texcollectrate = 60;
824 userdef->textimeout = 120;
825 }
826 if (userdef->memcachelimit <= 0) {
827 userdef->memcachelimit = 32;
828 }
829 if (userdef->dbl_click_time == 0) {
830 userdef->dbl_click_time = 350;
831 }
832 if (userdef->v2d_min_gridsize == 0) {
833 userdef->v2d_min_gridsize = 35;
834 }
835 if (userdef->widget_unit == 0) {
836 userdef->widget_unit = 20;
837 }
838 if (userdef->anisotropic_filter <= 0) {
839 userdef->anisotropic_filter = 1;
840 }
841
842 if (userdef->ndof_sensitivity == 0.0f) {
843 userdef->ndof_sensitivity = 1.0f;
846 }
847
848 if (userdef->ndof_orbit_sensitivity == 0.0f) {
849 userdef->ndof_orbit_sensitivity = userdef->ndof_sensitivity;
850
851 if (!(userdef->flag & USER_TRACKBALL)) {
852 userdef->ndof_flag |= NDOF_TURNTABLE;
853 }
854 }
855 }
856
857 if (!USER_VERSION_ATLEAST(269, 4)) {
858 userdef->walk_navigation.mouse_speed = 1.0f;
859 userdef->walk_navigation.walk_speed = 2.5f; /* m/s */
860 userdef->walk_navigation.walk_speed_factor = 5.0f;
861 userdef->walk_navigation.view_height = 1.6f; /* m */
862 userdef->walk_navigation.jump_height = 0.4f; /* m */
863 userdef->walk_navigation.teleport_time = 0.2f; /* s */
864 }
865
866 if (!USER_VERSION_ATLEAST(271, 5)) {
867 userdef->pie_menu_radius = 100;
868 userdef->pie_menu_threshold = 12;
869 userdef->pie_animation_timeout = 6;
870 }
871
872 if (!USER_VERSION_ATLEAST(275, 2)) {
873 userdef->ndof_deadzone = 0.0;
874 }
875
876 if (!USER_VERSION_ATLEAST(275, 4)) {
877 userdef->node_margin = 80;
878 }
879
880 if (!USER_VERSION_ATLEAST(278, 6)) {
881 /* Clear preference flags for re-use. */
882 userdef->flag &= ~(USER_FLAG_NUMINPUT_ADVANCED | (1 << 2) | USER_FLAG_UNUSED_3 |
885 userdef->uiflag &= ~USER_HEADER_BOTTOM;
888
890 }
891
892 if (!USER_VERSION_ATLEAST(280, 20)) {
893 userdef->gpu_viewport_quality = 0.6f;
894
895 /* Reset theme, old themes will not be compatible with minor version updates from now on. */
896 LISTBASE_FOREACH (bTheme *, btheme, &userdef->themes) {
897 MEMCPY_STRUCT_AFTER(btheme, &U_theme_default, name);
898 }
899
900 /* Annotations - new layer color
901 * Replace anything that used to be set if it looks like was left
902 * on the old default (i.e. black), which most users used
903 */
904 if ((userdef->gpencil_new_layer_col[3] < 0.1f) || (userdef->gpencil_new_layer_col[0] < 0.1f)) {
905 /* - New color matches the annotation pencil icon
906 * - Non-full alpha looks better!
907 */
908 ARRAY_SET_ITEMS(userdef->gpencil_new_layer_col, 0.38f, 0.61f, 0.78f, 0.9f);
909 }
910 }
911
912 if (!USER_VERSION_ATLEAST(280, 31)) {
913 /* Remove select/action mouse from user defined keymaps. */
914 LISTBASE_FOREACH (wmKeyMap *, keymap, &userdef->user_keymaps) {
915 LISTBASE_FOREACH (wmKeyMapDiffItem *, kmdi, &keymap->diff_items) {
916 if (kmdi->remove_item) {
917 do_version_select_mouse(userdef, kmdi->remove_item);
918 }
919 if (kmdi->add_item) {
920 do_version_select_mouse(userdef, kmdi->add_item);
921 }
922 }
923
924 LISTBASE_FOREACH (wmKeyMapItem *, kmi, &keymap->items) {
925 do_version_select_mouse(userdef, kmi);
926 }
927 }
928 }
929
930 if (!USER_VERSION_ATLEAST(280, 33)) {
931 /* Enable GLTF addon by default. */
932 BKE_addon_ensure(&userdef->addons, "io_scene_gltf2");
933
934 userdef->pressure_threshold_max = 1.0f;
935 }
936
937 if (!USER_VERSION_ATLEAST(280, 35)) {
938 /* Preserve RMB select setting after moving to Python and changing default value. */
939 if (USER_VERSION_ATLEAST(280, 32) || !(userdef->flag & USER_LMOUSESELECT)) {
940 BKE_keyconfig_pref_set_select_mouse(userdef, 1, false);
941 }
942
943 userdef->flag &= ~USER_LMOUSESELECT;
944 }
945
946 if (!USER_VERSION_ATLEAST(280, 38)) {
947 copy_v4_fl4(userdef->light_param[0].vec, -0.580952, 0.228571, 0.781185, 0.0);
948 copy_v4_fl4(userdef->light_param[0].col, 0.900000, 0.900000, 0.900000, 1.000000);
949 copy_v4_fl4(userdef->light_param[0].spec, 0.318547, 0.318547, 0.318547, 1.000000);
950 userdef->light_param[0].flag = 1;
951 userdef->light_param[0].smooth = 0.1;
952
953 copy_v4_fl4(userdef->light_param[1].vec, 0.788218, 0.593482, -0.162765, 0.0);
954 copy_v4_fl4(userdef->light_param[1].col, 0.267115, 0.269928, 0.358840, 1.000000);
955 copy_v4_fl4(userdef->light_param[1].spec, 0.090838, 0.090838, 0.090838, 1.000000);
956 userdef->light_param[1].flag = 1;
957 userdef->light_param[1].smooth = 0.25;
958
959 copy_v4_fl4(userdef->light_param[2].vec, 0.696472, -0.696472, -0.172785, 0.0);
960 copy_v4_fl4(userdef->light_param[2].col, 0.293216, 0.304662, 0.401968, 1.000000);
961 copy_v4_fl4(userdef->light_param[2].spec, 0.069399, 0.020331, 0.020331, 1.000000);
962 userdef->light_param[2].flag = 1;
963 userdef->light_param[2].smooth = 0.4;
964
965 copy_v4_fl4(userdef->light_param[3].vec, 0.021053, -0.989474, 0.143173, 0.0);
966 copy_v4_fl4(userdef->light_param[3].col, 0.0, 0.0, 0.0, 1.0);
967 copy_v4_fl4(userdef->light_param[3].spec, 0.072234, 0.082253, 0.162642, 1.000000);
968 userdef->light_param[3].flag = 1;
969 userdef->light_param[3].smooth = 0.7;
970
971 copy_v3_fl3(userdef->light_ambient, 0.025000, 0.025000, 0.025000);
972
973 userdef->flag &= ~USER_FLAG_UNUSED_4;
974
976 }
977
978 if (!USER_VERSION_ATLEAST(280, 41)) {
979 if (userdef->pie_tap_timeout == 0) {
980 userdef->pie_tap_timeout = 20;
981 }
982 }
983
984 if (!USER_VERSION_ATLEAST(280, 44)) {
988 }
989
990 if (!USER_VERSION_ATLEAST(280, 50)) {
991 /* 3ds is no longer enabled by default and not ported yet. */
992 BKE_addon_remove_safe(&userdef->addons, "io_scene_3ds");
993 }
994
995 if (!USER_VERSION_ATLEAST(280, 51)) {
996 userdef->move_threshold = 2;
997 }
998
999 if (!USER_VERSION_ATLEAST(280, 58)) {
1000 if (userdef->image_draw_method != IMAGE_DRAW_METHOD_GLSL) {
1002 }
1003 }
1004
1005 /* Patch to set dupli light-probes and grease-pencil. */
1006 if (!USER_VERSION_ATLEAST(280, 58)) {
1007 userdef->dupflag |= USER_DUP_LIGHTPROBE;
1008 userdef->dupflag |= USER_DUP_GPENCIL;
1009 }
1010
1011 if (!USER_VERSION_ATLEAST(280, 60)) {
1012 const float GPU_VIEWPORT_QUALITY_FXAA = 0.10f;
1013 const float GPU_VIEWPORT_QUALITY_TAA8 = 0.25f;
1014 const float GPU_VIEWPORT_QUALITY_TAA16 = 0.6f;
1015 const float GPU_VIEWPORT_QUALITY_TAA32 = 0.8f;
1016
1017 if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_FXAA) {
1019 }
1020 else if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_TAA8) {
1022 }
1023 else if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_TAA16) {
1025 }
1026 else if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_TAA32) {
1028 }
1029 else {
1031 }
1032 }
1033
1034 if (!USER_VERSION_ATLEAST(280, 62)) {
1035 if (userdef->vbotimeout == 0) {
1036 userdef->vbocollectrate = 60;
1037 userdef->vbotimeout = 120;
1038 }
1039
1040 if (userdef->lookdev_sphere_size == 0) {
1041 userdef->lookdev_sphere_size = 150;
1042 }
1043
1044 userdef->pref_flag |= USER_PREF_FLAG_SAVE;
1045 }
1046
1047 if (!USER_VERSION_ATLEAST(280, 73)) {
1048 userdef->drag_threshold = 30;
1049 userdef->drag_threshold_mouse = 3;
1050 userdef->drag_threshold_tablet = 10;
1051 }
1052
1053 if (!USER_VERSION_ATLEAST(281, 9)) {
1054 /* X3D is no longer enabled by default. */
1055 BKE_addon_remove_safe(&userdef->addons, "io_scene_x3d");
1056 }
1057
1058 if (!USER_VERSION_ATLEAST(281, 12)) {
1061 }
1062
1063 if (!USER_VERSION_ATLEAST(281, 13)) {
1065
1067 memcpy(
1068 &userdef->file_space_data, &U_default.file_space_data, sizeof(userdef->file_space_data));
1069 }
1070 }
1071
1072 if (!USER_VERSION_ATLEAST(281, 16)) {
1074 params.check_item = true;
1075 params.check_diff_item_add = true;
1078 }
1079
1080 if (!USER_VERSION_ATLEAST(282, 1)) {
1081 userdef->file_space_data.filter_id = U_default.file_space_data.filter_id;
1082 }
1083
1084 if (!USER_VERSION_ATLEAST(282, 4)) {
1085 if (userdef->view_rotate_sensitivity_turntable == 0.0f) {
1087 userdef->view_rotate_sensitivity_trackball = 1.0f;
1088 }
1089 if (userdef->scrollback == 0) {
1090 userdef->scrollback = U_default.scrollback;
1091 }
1092
1093 /* Enable Overlay Engine Smooth Wire by default */
1095 }
1096
1097 if (!USER_VERSION_ATLEAST(283, 13)) {
1098 /* If Translations is off then language should default to English. */
1099 if ((userdef->transopts & USER_DOTRANSLATE_DEPRECATED) == 0) {
1100 userdef->language = ULANGUAGE_ENGLISH;
1101 }
1102 /* Clear this deprecated flag. */
1104 }
1105
1106 if (!USER_VERSION_ATLEAST(290, 7)) {
1108 }
1109
1110 if (!USER_VERSION_ATLEAST(291, 1)) {
1111 if (userdef->collection_instance_empty_size == 0) {
1112 userdef->collection_instance_empty_size = 1.0f;
1113 }
1114 }
1115
1116 if (!USER_VERSION_ATLEAST(292, 3)) {
1117 if (userdef->pixelsize == 0.0f) {
1118 userdef->pixelsize = 1.0f;
1119 }
1120 /* Clear old userdef flag for "Camera Parent Lock". */
1121 userdef->uiflag &= ~USER_UIFLAG_UNUSED_3;
1122 }
1123
1124 if (!USER_VERSION_ATLEAST(292, 9)) {
1125 if (BLI_listbase_is_empty(&userdef->asset_libraries)) {
1127 }
1128 }
1129
1130 if (!USER_VERSION_ATLEAST(293, 1)) {
1131 /* This rename was made after 2.93.0, harmless to run when it's not needed. */
1132 const char *replace_table[][2] = {
1133 {"blender", "Blender"},
1134 {"blender_27x", "Blender_27x"},
1135 {"industry_compatible", "Industry_Compatible"},
1136 };
1137 const int replace_table_len = ARRAY_SIZE(replace_table);
1138
1140 userdef->keyconfigstr, sizeof(userdef->keyconfigstr), replace_table, replace_table_len);
1143 kpt->idname, sizeof(kpt->idname), replace_table, replace_table_len);
1144 }
1145 }
1146
1147 if (!USER_VERSION_ATLEAST(293, 12)) {
1148 if (userdef->gizmo_size_navigate_v3d == 0) {
1149 userdef->gizmo_size_navigate_v3d = 80;
1150 }
1151
1153 }
1154
1155 if (!USER_VERSION_ATLEAST(293, 13)) {
1156 BKE_addon_ensure(&userdef->addons, "pose_library");
1157 }
1158
1159 if (!USER_VERSION_ATLEAST(300, 21)) {
1160 /* Deprecated userdef->flag USER_SAVE_PREVIEWS */
1163 /* Clear for reuse. */
1164 userdef->flag &= ~USER_FLAG_UNUSED_5;
1165 }
1166
1167 if (!USER_VERSION_ATLEAST(300, 38)) {
1168 /* Patch to set Dupli Lattice/Camera/Speaker. */
1169 userdef->dupflag |= USER_DUP_LATTICE;
1170 userdef->dupflag |= USER_DUP_CAMERA;
1171 userdef->dupflag |= USER_DUP_SPEAKER;
1172 }
1173
1174 if (!USER_VERSION_ATLEAST(300, 40)) {
1175 /* Rename the default asset library from "Default" to "User Library". This isn't bullet proof
1176 * since it doesn't handle translations and ignores user changes. But this was an alpha build
1177 * (experimental) feature and the name is just for display in the UI anyway. So it doesn't have
1178 * to work perfectly at all. */
1179 LISTBASE_FOREACH (bUserAssetLibrary *, asset_library, &userdef->asset_libraries) {
1180 /* Ignores translations, since that would depend on the current preferences (global `U`). */
1181 if (STREQ(asset_library->name, "Default")) {
1183 userdef, asset_library, BKE_PREFS_ASSET_LIBRARY_DEFAULT_NAME);
1184 }
1185 }
1186 }
1187
1188 if (!USER_VERSION_ATLEAST(300, 40)) {
1189 LISTBASE_FOREACH (uiStyle *, style, &userdef->uistyles) {
1190 const int default_title_points = 11; /* UI_DEFAULT_TITLE_POINTS */
1191 style->paneltitle.points = default_title_points;
1192 style->grouplabel.points = default_title_points;
1193 }
1194 }
1195
1196 if (!USER_VERSION_ATLEAST(300, 43)) {
1197 userdef->ndof_flag |= NDOF_CAMERA_PAN_ZOOM;
1198 }
1199
1200 if (!USER_VERSION_ATLEAST(302, 5)) {
1203 }
1204
1205 if (!USER_VERSION_ATLEAST(302, 11)) {
1207 }
1208
1209 /* Set GPU backend to OpenGL. */
1210 if (!USER_VERSION_ATLEAST(305, 5)) {
1211#ifdef __APPLE__
1212 userdef->gpu_backend = GPU_BACKEND_METAL;
1213#else
1215#endif
1216 }
1217
1218 if (!USER_VERSION_ATLEAST(305, 10)) {
1219 LISTBASE_FOREACH (bUserAssetLibrary *, asset_library, &userdef->asset_libraries) {
1220 asset_library->import_method = ASSET_IMPORT_APPEND_REUSE;
1221 }
1222 }
1223
1224 if (!USER_VERSION_ATLEAST(306, 2)) {
1226 }
1227
1228 if (!USER_VERSION_ATLEAST(306, 4)) {
1229 /* Increase the number of recently-used files if using the old default value. */
1230 if (userdef->recent_files == 10) {
1231 userdef->recent_files = 20;
1232 }
1233 }
1234
1235 if (!USER_VERSION_ATLEAST(306, 5)) {
1236 if (userdef->pythondir_legacy[0]) {
1238 "Versioning user script path");
1239
1240 STRNCPY(script_dir->dir_path, userdef->pythondir_legacy);
1241 STRNCPY_UTF8(script_dir->name, DATA_("Untitled"));
1242 BLI_addhead(&userdef->script_directories, script_dir);
1243 }
1244 }
1245
1246 if (!USER_VERSION_ATLEAST(306, 6)) {
1247 LISTBASE_FOREACH (bUserAssetLibrary *, asset_library, &userdef->asset_libraries) {
1248 asset_library->flag |= ASSET_LIBRARY_RELATIVE_PATH;
1249 }
1250 }
1251
1252 if (!USER_VERSION_ATLEAST(400, 4)) {
1253 /* obj and ply python addons were removed. */
1254 BKE_addon_remove_safe(&userdef->addons, "io_mesh_ply");
1255 BKE_addon_remove_safe(&userdef->addons, "io_scene_obj");
1256 }
1257
1258 if (!USER_VERSION_ATLEAST(400, 15)) {
1259 userdef->node_preview_res = 120;
1260 }
1261
1262 if (!USER_VERSION_ATLEAST(400, 18)) {
1263 userdef->playback_fps_samples = 8;
1264 }
1265
1266 if (!USER_VERSION_ATLEAST(400, 19)) {
1267 userdef->uiflag |= USER_NODE_AUTO_OFFSET;
1268 }
1269
1270 if (!USER_VERSION_ATLEAST(400, 24)) {
1271 /* Clear deprecated USER_MENUFIXEDORDER user flag for reuse. */
1272 userdef->uiflag &= ~(1 << 23);
1273 }
1274
1275 if (!USER_VERSION_ATLEAST(400, 26)) {
1277 }
1278
1279 if (!USER_VERSION_ATLEAST(400, 32)) {
1281 }
1282
1283 if (!USER_VERSION_ATLEAST(401, 3)) {
1284 LISTBASE_FOREACH (uiStyle *, style, &userdef->uistyles) {
1285 style->paneltitle.character_weight = 400;
1286 style->grouplabel.character_weight = 400;
1287 style->widget.character_weight = 400;
1288 }
1289 }
1290
1291 if (!USER_VERSION_ATLEAST(401, 9)) {
1295 }
1296
1297 if (!USER_VERSION_ATLEAST(401, 13)) {
1298 if (userdef->keying_flag & AUTOKEY_FLAG_INSERTNEEDED) {
1300 }
1302 }
1303
1304 if (!USER_VERSION_ATLEAST(401, 21)) {
1305 LISTBASE_FOREACH (wmKeyMap *, km, &userdef->user_keymaps) {
1306 if (STREQ(km->idname, "NLA Channels")) {
1307 STRNCPY(km->idname, "NLA Tracks");
1308 }
1309 }
1310 }
1311
1312 if (!USER_VERSION_ATLEAST(402, 36)) {
1313 /* Reset repositories. */
1314 while (!BLI_listbase_is_empty(&userdef->extension_repos)) {
1316 userdef, static_cast<bUserExtensionRepo *>(userdef->extension_repos.first));
1317 }
1318
1321 }
1322
1323 if (!USER_VERSION_ATLEAST(402, 42)) {
1324 /* 80 was the old default. */
1325 if (userdef->node_margin == 80) {
1326 userdef->node_margin = 40;
1327 }
1328 }
1329
1330 if (!USER_VERSION_ATLEAST(402, 51)) {
1332 }
1333
1334 if (!USER_VERSION_ATLEAST(402, 56)) {
1336 }
1337
1338 if (!USER_VERSION_ATLEAST(402, 58)) {
1339 /* Remove add-ons which are no longer bundled by default
1340 * and have no upgrade path to extensions in the UI. */
1341 const char *addon_modules[] = {
1342 "depsgraph_debug",
1343 "io_coat3D",
1344 "io_import_images_as_planes",
1345 "io_mesh_stl",
1346 "io_scene_x3d",
1347 };
1348 for (int i = 0; i < ARRAY_SIZE(addon_modules); i++) {
1349 BKE_addon_remove_safe(&userdef->addons, addon_modules[i]);
1350 }
1351 }
1352
1353 if (!USER_VERSION_ATLEAST(402, 59)) {
1354 userdef->network_timeout = 10;
1355 userdef->network_connection_limit = 5;
1356 }
1357
1358 if (!USER_VERSION_ATLEAST(402, 63)) {
1360 }
1361
1362 if (!USER_VERSION_ATLEAST(402, 65)) {
1363 /* Bone Selection Sets is no longer an add-on, but core functionality. */
1364 BKE_addon_remove_safe(&userdef->addons, "bone_selection_sets");
1365 }
1366
1367 if (!USER_VERSION_ATLEAST(403, 3)) {
1369 userdef, "VIEW3D_AST_brush_sculpt", "Brushes/Mesh Sculpt/Cloth");
1371 userdef, "VIEW3D_AST_brush_sculpt", "Brushes/Mesh Sculpt/General");
1373 userdef, "VIEW3D_AST_brush_sculpt", "Brushes/Mesh Sculpt/Paint");
1374 }
1375
1376 if (!USER_VERSION_ATLEAST(403, 12)) {
1377 LISTBASE_FOREACH (uiStyle *, style, &userdef->uistyles) {
1378 style->tooltip.points = 11.0f; /* UI_DEFAULT_TOOLTIP_POINTS */
1379 style->tooltip.character_weight = 400;
1380 style->tooltip.shadow = 0;
1381 style->tooltip.shady = -1;
1382 style->tooltip.shadowalpha = 0.5f;
1383 style->tooltip.shadowcolor = 0.0f;
1384 }
1385 }
1386 if (!USER_VERSION_ATLEAST(403, 19)) {
1388 }
1389
1390 if (!USER_VERSION_ATLEAST(404, 3)) {
1392
1394 userdef, "VIEW3D_AST_brush_gpencil_paint", "Brushes/Grease Pencil Draw/Draw");
1396 userdef, "VIEW3D_AST_brush_gpencil_paint", "Brushes/Grease Pencil Draw/Erase");
1398 userdef, "VIEW3D_AST_brush_gpencil_paint", "Brushes/Grease Pencil Draw/Utilities");
1399
1401 userdef, "VIEW3D_AST_brush_gpencil_sculpt", "Brushes/Grease Pencil Sculpt/Contrast");
1403 userdef, "VIEW3D_AST_brush_gpencil_sculpt", "Brushes/Grease Pencil Sculpt/Transform");
1405 userdef, "VIEW3D_AST_brush_gpencil_sculpt", "Brushes/Grease Pencil Sculpt/Utilities");
1406 }
1407
1408 if (!USER_VERSION_ATLEAST(404, 9)) {
1409 LISTBASE_FOREACH (wmKeyMap *, keymap, &userdef->user_keymaps) {
1410 if (STREQ("Sculpt", keymap->idname)) {
1412 }
1413 else if (STREQ("Vertex Paint", keymap->idname)) {
1415 }
1416 else if (STREQ("Weight Paint", keymap->idname)) {
1418 }
1419 else if (STREQ("Image Paint", keymap->idname)) {
1421 }
1422 }
1423 }
1424
1425 if (!USER_VERSION_ATLEAST(404, 28)) {
1427 }
1428
1429 if (userdef->border_width == 0) {
1430 userdef->border_width = 2;
1431 }
1432
1433 if (!USER_VERSION_ATLEAST(405, 10)) {
1434 static const blender::Map<std::string, std::string> keymap_renames = {
1435 {"SequencerCommon", "Video Sequence Editor"},
1436 {"SequencerPreview", "Preview"},
1437
1438 {"Sequencer Tool: Cursor", "Preview Tool: Cursor"},
1439 {"Sequencer Tool: Sample", "Preview Tool: Sample"},
1440 {"Sequencer Tool: Move", "Preview Tool: Move"},
1441 {"Sequencer Tool: Rotate", "Preview Tool: Rotate"},
1442 {"Sequencer Tool: Scale", "Preview Tool: Scale"},
1443
1444 {"Sequencer Timeline Tool: Select Box", "Sequencer Tool: Select Box"},
1445 {"Sequencer Timeline Tool: Select Box (fallback)",
1446 "Sequencer Tool: Select Box (fallback)"},
1447
1448 {"Sequencer Preview Tool: Tweak", "Preview Tool: Tweak"},
1449 {"Sequencer Preview Tool: Tweak (fallback)", "Preview Tool: Tweak (fallback)"},
1450 {"Sequencer Preview Tool: Select Box", "Preview Tool: Select Box"},
1451 {"Sequencer Preview Tool: Select Box (fallback)", "Preview Tool: Select Box (fallback)"},
1452 };
1453
1454 LISTBASE_FOREACH (wmKeyMap *, keymap, &userdef->user_keymaps) {
1455 std::string old_name(keymap->idname);
1456 if (const std::string *new_name = keymap_renames.lookup_ptr(old_name)) {
1457 STRNCPY(keymap->idname, new_name->c_str());
1458 }
1459 }
1460 }
1461
1462 if (!USER_VERSION_ATLEAST(405, 11)) {
1465 userdef,
1466 &params,
1467 [](wmKeyMapItem *kmi, void * /*user_data*/) -> bool {
1468 if (kmi->shift == KM_ANY && kmi->ctrl == KM_ANY && kmi->alt == KM_ANY &&
1469 kmi->oskey == KM_ANY)
1470 {
1471 kmi->hyper = KM_ANY;
1472 }
1473 return false;
1474 },
1475 nullptr);
1476 }
1477
1478 if (!USER_VERSION_ATLEAST(405, 50)) {
1479 LISTBASE_FOREACH (wmKeyMap *, keymap, &userdef->user_keymaps) {
1480 LISTBASE_FOREACH (wmKeyMapDiffItem *, kmdi, &keymap->diff_items) {
1481 if (kmdi->remove_item) {
1482 do_version_keyframe_jump(kmdi->remove_item);
1483 }
1484 if (kmdi->add_item) {
1485 do_version_keyframe_jump(kmdi->add_item);
1486 }
1487 }
1488
1489 LISTBASE_FOREACH (wmKeyMapItem *, kmi, &keymap->items) {
1491 }
1492 }
1493 }
1494
1495 if (!USER_VERSION_ATLEAST(405, 86)) {
1496 if (userdef->gpu_shader_workers > 0) {
1498 }
1499 }
1500
1507
1508 LISTBASE_FOREACH (bTheme *, btheme, &userdef->themes) {
1509 do_versions_theme(userdef, btheme);
1510 }
1511#undef USER_VERSION_ATLEAST
1512}
1513
1515{
1516 /* User preference experimental settings are only supported in alpha builds.
1517 * This prevents users corrupting data and relying on API that may change.
1518 *
1519 * If user preferences are saved this will be stored in disk as expected.
1520 * This only starts to take effect when there is a release branch (on beta).
1521 *
1522 * At that time master already has its version bumped so its user preferences
1523 * are not touched by these settings. */
1524#ifdef WITH_EXPERIMENTAL_FEATURES
1526 return;
1527 }
1528#endif
1529
1530 MEMSET_STRUCT_AFTER(&userdef->experimental, 0, SANITIZE_AFTER_HERE);
1531}
1532
1533#undef USER_LMOUSESELECT
struct bAddon * BKE_addon_ensure(struct ListBase *addon_list, const char *module)
Definition addon.cc:45
bool BKE_addon_remove_safe(struct ListBase *addon_list, const char *module)
Definition addon.cc:56
bool BKE_blender_version_is_alpha(void)
Definition blender.cc:173
void BKE_colorband_init(ColorBand *coba, bool rangetype)
Definition colorband.cc:22
IDProperty * IDP_GetPropertyFromGroup(const IDProperty *prop, blender::StringRef name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition idprop.cc:766
#define IDP_Int(prop)
#define IDP_String(prop)
bool IDP_AddToGroup(IDProperty *group, IDProperty *prop) ATTR_NONNULL()
Definition idprop.cc:725
void BKE_keyconfig_pref_filter_items(struct UserDef *userdef, const struct wmKeyConfigFilterItemParams *params, bool(*filter_fn)(struct wmKeyMapItem *kmi, void *user_data), void *user_data)
void BKE_keyconfig_pref_set_select_mouse(struct UserDef *userdef, int value, bool override)
Definition keyconfig.cc:112
#define WM_KEY_CONFIG_FILTER_ITEM_ALL
void BKE_preferences_asset_library_default_add(struct UserDef *userdef) ATTR_NONNULL()
void BKE_preferences_extension_repo_remove(UserDef *userdef, bUserExtensionRepo *repo)
bUserExtensionRepo * BKE_preferences_extension_repo_add_default_user(UserDef *userdef)
#define BKE_PREFS_ASSET_LIBRARY_DEFAULT_NAME
void BKE_preferences_asset_library_name_set(struct UserDef *userdef, struct bUserAssetLibrary *library, const char *name) ATTR_NONNULL()
bUserExtensionRepo * BKE_preferences_extension_repo_add_default_system(UserDef *userdef)
bUserExtensionRepo * BKE_preferences_extension_repo_add_default_remote(UserDef *userdef)
bool BKE_preferences_asset_shelf_settings_ensure_catalog_path_enabled(UserDef *userdef, const char *shelf_idname, const char *catalog_path)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BLI_addhead(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:91
#define DEG2RADF(_deg)
MINLINE void copy_v4_fl4(float v[4], float x, float y, float z, float w)
MINLINE void copy_v3_fl3(float v[3], float x, float y, float z)
char * STRNCPY(char(&dst)[N], const char *src)
Definition BLI_string.h:688
#define STRNCPY_UTF8(dst, src)
void BLI_uniquename(const struct ListBase *list, void *vlink, const char *defname, char delim, int name_offset, size_t name_maxncpy) ATTR_NONNULL(1
bool BLI_string_replace_table_exact(char *string, size_t string_len, const char *replace_table[][2], int replace_table_len)
#define STRPREFIX(a, b)
#define ARRAY_SIZE(arr)
#define ARRAY_SET_ITEMS(...)
#define MEMSET_STRUCT_AFTER(struct_var, value, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define STREQ(a, b)
external readfile function prototypes.
const UserDef U_default
const bTheme U_theme_default
#define DATA_(msgid)
@ IDP_STRING
@ IDP_INT
@ FCURVE_SMOOTH_CONT_ACCEL
@ ASSET_IMPORT_APPEND_REUSE
@ ASSET_LIBRARY_RELATIVE_PATH
@ ASSET_LIBRARY_ESSENTIALS
@ WPAINT_BRUSH_TYPE_BLUR
@ WPAINT_BRUSH_TYPE_AVERAGE
@ WPAINT_BRUSH_TYPE_DRAW
@ WPAINT_BRUSH_TYPE_SMEAR
@ SCULPT_BRUSH_TYPE_DRAW_SHARP
@ SCULPT_BRUSH_TYPE_THUMB
@ SCULPT_BRUSH_TYPE_GRAB
@ SCULPT_BRUSH_TYPE_BOUNDARY
@ SCULPT_BRUSH_TYPE_DISPLACEMENT_SMEAR
@ SCULPT_BRUSH_TYPE_MASK
@ SCULPT_BRUSH_TYPE_DRAW_FACE_SETS
@ SCULPT_BRUSH_TYPE_DRAW
@ SCULPT_BRUSH_TYPE_NUDGE
@ SCULPT_BRUSH_TYPE_CLAY
@ SCULPT_BRUSH_TYPE_CLOTH
@ SCULPT_BRUSH_TYPE_PINCH
@ SCULPT_BRUSH_TYPE_SMEAR
@ SCULPT_BRUSH_TYPE_POSE
@ SCULPT_BRUSH_TYPE_CLAY_THUMB
@ SCULPT_BRUSH_TYPE_MULTIPLANE_SCRAPE
@ SCULPT_BRUSH_TYPE_SIMPLIFY
@ SCULPT_BRUSH_TYPE_SNAKE_HOOK
@ SCULPT_BRUSH_TYPE_CREASE
@ SCULPT_BRUSH_TYPE_LAYER
@ SCULPT_BRUSH_TYPE_SLIDE_RELAX
@ SCULPT_BRUSH_TYPE_ELASTIC_DEFORM
@ SCULPT_BRUSH_TYPE_SMOOTH
@ SCULPT_BRUSH_TYPE_PAINT
@ SCULPT_BRUSH_TYPE_DISPLACEMENT_ERASER
@ SCULPT_BRUSH_TYPE_INFLATE
@ SCULPT_BRUSH_TYPE_BLOB
@ SCULPT_BRUSH_TYPE_ROTATE
@ SCULPT_BRUSH_TYPE_CLAY_STRIPS
@ IMAGE_PAINT_BRUSH_TYPE_MASK
@ IMAGE_PAINT_BRUSH_TYPE_FILL
@ IMAGE_PAINT_BRUSH_TYPE_DRAW
@ IMAGE_PAINT_BRUSH_TYPE_CLONE
@ IMAGE_PAINT_BRUSH_TYPE_SOFTEN
@ IMAGE_PAINT_BRUSH_TYPE_SMEAR
@ VPAINT_BRUSH_TYPE_AVERAGE
@ VPAINT_BRUSH_TYPE_DRAW
@ VPAINT_BRUSH_TYPE_SMEAR
@ VPAINT_BRUSH_TYPE_BLUR
@ HD_AUTO_ANIM
@ HD_AUTO
@ BEZT_IPO_BEZ
@ SCE_DISPLAY_AA_OFF
@ SCE_DISPLAY_AA_SAMPLES_32
@ SCE_DISPLAY_AA_SAMPLES_8
@ SCE_DISPLAY_AA_SAMPLES_16
@ SCE_DISPLAY_AA_FXAA
@ FILE_DEFAULTDISPLAY
@ USER_DUP_LIGHTPROBE
@ USER_DUP_CAMERA
@ USER_DUP_SPEAKER
@ USER_DUP_GPENCIL
@ USER_DUP_CURVES
@ USER_DUP_ARM
@ USER_DUP_POINTCLOUD
@ USER_DUP_LATTICE
@ ULANGUAGE_ENGLISH
@ AUTOKEY_FLAG_INSERTNEEDED
@ MANUALKEY_FLAG_INSERTNEEDED
@ AUTOKEY_FLAG_ONLYKEYINGSET
@ USER_TR_UNUSED_4
@ USER_DOTRANSLATE_DEPRECATED
@ USER_TR_UNUSED_3
@ USER_TR_UNUSED_6
@ USER_TR_UNUSED_7
@ USER_UIFLAG_UNUSED_3
@ USER_FILTER_BRUSHES_BY_TOOL
@ USER_LOCK_CURSOR_ADJUST
@ USER_REGISTER_ALL_USERS
@ USER_SHOW_GIZMO_NAVIGATE
@ USER_HEADER_FROM_PREF
@ USER_HEADER_BOTTOM
@ USER_GLOBALUNDO
@ USER_PLAINMENUS
@ USER_NO_MULTITOUCH_GESTURES
@ USER_NODE_AUTO_OFFSET
@ USER_UIFLAG_UNUSED_1
@ IMAGE_DRAW_METHOD_AUTO
@ IMAGE_DRAW_METHOD_GLSL
@ USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE
@ USER_GIZMO_DRAW
@ USER_SEQ_PROXY_SETUP_AUTOMATIC
@ USER_ADD_VIEWALIGNED
@ USER_INTERNET_ALLOW
@ USER_ADD_EDITMODE
@ USER_TRACKBALL
@ USER_FLAG_UNUSED_5
@ USER_FLAG_UNUSED_4
@ USER_FLAG_UNUSED_6
@ USER_FLAG_UNUSED_7
@ USER_FLAG_NUMINPUT_ADVANCED
@ USER_DEVELOPER_UI
@ USER_FLAG_UNUSED_3
@ USER_TWOBUTTONMOUSE
@ STATUSBAR_SHOW_VERSION
@ STATUSBAR_SHOW_EXTENSIONS_UPDATES
@ USER_ANIM_HIGH_QUALITY_DRAWING
@ USER_ANIM_SHOW_CHANNEL_GROUP_COLORS
@ USER_UIFLAG2_UNUSED_0
@ USER_RENDER_DISPLAY_WINDOW
@ USER_FILE_PREVIEW_NONE
@ USER_FILE_PREVIEW_AUTO
@ GP_PAINT_UNUSED_0
@ NDOF_LOCK_HORIZON
@ NDOF_SHOULD_PAN
@ NDOF_SHOULD_ZOOM
@ NDOF_SHOULD_ROTATE
@ NDOF_TURNTABLE
@ NDOF_ORBIT_CENTER_AUTO
@ NDOF_SHOW_GUIDE_ORBIT_CENTER
@ NDOF_CAMERA_PAN_ZOOM
@ USER_ANIM_KEY_CHANNEL_SCALE
@ USER_ANIM_KEY_CHANNEL_ROTATION
@ USER_ANIM_KEY_CHANNEL_LOCATION
@ USER_ANIM_KEY_CHANNEL_CUSTOM_PROPERTIES
@ USER_TEXT_RENDER_SUBPIXELAA
@ USER_SHADER_COMPILE_SUBPROCESS
@ USER_SEQ_ED_CONNECT_STRIPS_BY_DEFAULT
@ USER_SEQ_ED_SIMPLE_TWEAKING
@ USER_PREF_FLAG_SAVE
@ USER_TEMP_SPACE_DISPLAY_WINDOW
Read Guarded memory(de)allocation.
@ KM_DIRECTION_NW
Definition WM_types.hh:338
@ KM_DIRECTION_N
Definition WM_types.hh:331
@ KM_ANY
Definition WM_types.hh:306
@ KM_CLICK_DRAG
Definition WM_types.hh:316
const Value * lookup_ptr(const Key &key) const
Definition BLI_map.hh:508
const Value & lookup(const Key &key) const
Definition BLI_map.hh:545
void add_new(const Key &key, const Value &value)
Definition BLI_map.hh:265
bool contains(const Key &key) const
Definition BLI_map.hh:353
constexpr bool startswith(StringRef prefix) const
#define offsetof(t, d)
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
static int left
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.
void * pointer
Definition DNA_ID.h:137
IDPropertyData data
Definition DNA_ID.h:159
char type
Definition DNA_ID.h:146
void * first
unsigned char grid_levels
unsigned char face_front[4]
struct WalkNavigation walk_navigation
float pressure_threshold_max
short texcollectrate
short dbl_click_time
struct ListBase addons
short menuthreshold2
short key_insert_channels
short anisotropic_filter
short vbocollectrate
float pad_rot_angle
ListBase script_directories
struct ListBase uistyles
short playback_fps_samples
uint8_t network_timeout
float view_rotate_sensitivity_trackball
float ndof_sensitivity
short pie_animation_timeout
float ndof_orbit_sensitivity
float light_ambient[3]
float view_rotate_sensitivity_turntable
UserDef_FileSpaceData file_space_data
UserDef_Experimental experimental
short v2d_min_gridsize
uint8_t network_connection_limit
struct ListBase user_keymaps
char drag_threshold_mouse
float gpencil_new_layer_col[4]
short animation_flag
short lookdev_sphere_size
float fcu_inactive_alpha
struct ListBase themes
char file_preview_type
char gizmo_size_navigate_v3d
short sequencer_proxy_setup
short pie_menu_radius
short gp_euclideandist
short gpu_shader_workers
short image_draw_method
short menuthreshold1
char auto_smoothing_new
short pie_menu_threshold
struct ListBase user_keyconfig_prefs
char drag_threshold_tablet
short shader_compilation_method
struct ListBase extension_repos
short gp_manhattandist
struct SolidLight light_param[4]
char filebrowser_display_type
int sequencer_editor_flag
unsigned int dupflag
char node_preview_res
short pie_tap_timeout
char keyconfigstr[64]
float collection_instance_empty_size
struct ListBase asset_libraries
char render_display_type
struct ColorBand coba_weight
float ndof_deadzone
char sounddir[768]
ThemeSpace space_view3d
ThemeSpace space_node
char name[64]
i
Definition text_draw.cc:230
static void keymap_update_brushes_handle_add_item(const blender::StringRef asset_prefix, const blender::StringRef tool_property, const blender::Map< blender::StringRef, blender::StringRefNull > &tool_tool_map, const blender::Map< blender::StringRef, blender::StringRef > &tool_asset_map, const blender::Map< int, blender::StringRef > &id_asset_map, wmKeyMapItem *kmi)
static bool keymap_item_update_tweak_event(wmKeyMapItem *kmi, void *)
static void do_version_select_mouse(const UserDef *userdef, wmKeyMapItem *kmi)
static bool keymap_item_has_invalid_wm_context_data_path(wmKeyMapItem *kmi, void *)
void BLO_sanitize_experimental_features_userpref_blend(UserDef *userdef)
#define USER_VERSION_ATLEAST(ver, subver)
#define FROM_DEFAULT_V4_UCHAR(member)
#define USER_LMOUSESELECT
void blo_do_versions_userdef(UserDef *userdef)
static void keymap_update_brushes_handle_remove_item(const blender::StringRef asset_prefix, const blender::StringRef tool_property, const blender::Map< int, blender::StringRef > &id_asset_map, wmKeyMapItem *kmi)
static void do_version_keyframe_jump(wmKeyMapItem *kmi)
static void keymap_update_mesh_texture_paint_brushes(wmKeyMap *keymap)
static void keymap_update_mesh_weight_paint_brushes(wmKeyMap *keymap)
static void keymap_update_brushes(wmKeyMap *keymap, const blender::StringRef asset_prefix, const blender::StringRef tool_property, const blender::Map< blender::StringRef, blender::StringRefNull > &tool_tool_map, const blender::Map< blender::StringRef, blender::StringRef > &tool_asset_map, const blender::Map< int, blender::StringRef > &id_asset_map)
static void keymap_update_mesh_vertex_paint_brushes(wmKeyMap *keymap)
static void keymap_update_mesh_sculpt_brushes(wmKeyMap *keymap)
static void do_versions_theme(const UserDef *userdef, bTheme *btheme)
@ RIGHTMOUSE
@ LEFTMOUSE
@ MIDDLEMOUSE
void WM_keymap_item_properties_reset(wmKeyMapItem *kmi, IDProperty *properties)
Definition wm_keymap.cc:206