Blender  V3.3
versioning_userdef.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
8 #define DNA_DEPRECATED_ALLOW
9 #include <string.h>
10 
11 #include "BLI_listbase.h"
12 #include "BLI_math.h"
13 #include "BLI_string.h"
14 #include "BLI_utildefines.h"
15 
16 #include "DNA_anim_types.h"
17 #include "DNA_collection_types.h"
18 #include "DNA_curve_types.h"
19 #include "DNA_scene_types.h"
20 #include "DNA_space_types.h"
21 #include "DNA_userdef_types.h"
23 
24 #include "BKE_addon.h"
25 #include "BKE_blender_version.h"
26 #include "BKE_colorband.h"
27 #include "BKE_idprop.h"
28 #include "BKE_keyconfig.h"
29 #include "BKE_main.h"
30 #include "BKE_preferences.h"
31 
32 #include "BLO_readfile.h"
33 
34 #include "readfile.h" /* Own include. */
35 
36 #include "WM_types.h"
37 #include "wm_event_types.h"
38 
39 /* Don't use translation strings in versioning!
40  * These depend on the preferences already being read.
41  * If this is important we can set the translations as part of versioning preferences,
42  * however that should only be done if there are important use-cases. */
43 #if 0
44 # include "BLT_translation.h"
45 #else
46 # define N_(msgid) msgid
47 #endif
48 
49 /* For versioning we only ever want to manipulate preferences passed in. */
50 #define U BLI_STATIC_ASSERT(false, "Global 'U' not allowed, only use arguments passed in!")
51 
52 static void do_versions_theme(const UserDef *userdef, bTheme *btheme)
53 {
54 
55 #define USER_VERSION_ATLEAST(ver, subver) MAIN_VERSION_ATLEAST(userdef, ver, subver)
56 #define FROM_DEFAULT_V4_UCHAR(member) copy_v4_v4_uchar(btheme->member, U_theme_default.member)
57 
58  if (!USER_VERSION_ATLEAST(300, 41)) {
59  memcpy(btheme, &U_theme_default, sizeof(*btheme));
60  }
61 
62  /* Again reset the theme, but only if stored with an early 3.1 alpha version. Some changes were
63  * done in the release branch and then merged into the 3.1 branch (master). So the previous reset
64  * wouldn't work for people who saved their preferences with a 3.1 build meanwhile. But we still
65  * don't want to reset theme changes stored in the eventual 3.0 release once opened in a 3.1
66  * build. */
67  if (userdef->versionfile > 300 && !USER_VERSION_ATLEAST(301, 1)) {
68  memcpy(btheme, &U_theme_default, sizeof(*btheme));
69  }
70 
71  if (!USER_VERSION_ATLEAST(301, 2)) {
72  FROM_DEFAULT_V4_UCHAR(space_sequencer.mask);
73  }
74 
75  if (!USER_VERSION_ATLEAST(302, 8)) {
77  }
78 
79  if (!USER_VERSION_ATLEAST(302, 9)) {
80  FROM_DEFAULT_V4_UCHAR(space_sequencer.list);
81  FROM_DEFAULT_V4_UCHAR(space_sequencer.list_title);
82  FROM_DEFAULT_V4_UCHAR(space_sequencer.list_text);
83  FROM_DEFAULT_V4_UCHAR(space_sequencer.list_text_hi);
84  }
85 
86  if (!USER_VERSION_ATLEAST(303, 6)) {
88  }
89 
99  {
100  /* Keep this block, even when empty. */
101  }
102 
103 #undef FROM_DEFAULT_V4_UCHAR
104 
105 #undef USER_VERSION_ATLEAST
106 }
107 
109 #define USER_LMOUSESELECT (1 << 14) /* deprecated */
110 
111 static void do_version_select_mouse(UserDef *userdef, wmKeyMapItem *kmi)
112 {
113  /* Remove select/action mouse from user defined keymaps. */
114  enum {
115  ACTIONMOUSE = 0x0005,
116  SELECTMOUSE = 0x0006,
117  EVT_TWEAK_A = 0x5005,
118  EVT_TWEAK_S = 0x5006,
119  };
120  const bool left = (userdef->flag & USER_LMOUSESELECT) != 0;
121 
122  switch (kmi->type) {
123  case SELECTMOUSE:
124  kmi->type = (left) ? LEFTMOUSE : RIGHTMOUSE;
125  break;
126  case ACTIONMOUSE:
127  kmi->type = (left) ? RIGHTMOUSE : LEFTMOUSE;
128  break;
129  case EVT_TWEAK_S:
130  kmi->type = (left) ? LEFTMOUSE : RIGHTMOUSE;
131  kmi->val = KM_CLICK_DRAG;
132  break;
133  case EVT_TWEAK_A:
134  kmi->type = (left) ? RIGHTMOUSE : LEFTMOUSE;
135  kmi->val = KM_CLICK_DRAG;
136  break;
137  default:
138  break;
139  }
140 }
141 
143  void *UNUSED(user_data))
144 {
145  if (STRPREFIX(kmi->idname, "WM_OT_context_") && kmi->properties) {
146  IDProperty *idprop = IDP_GetPropertyFromGroup(kmi->properties, "data_path");
147  if (idprop && (idprop->type == IDP_STRING) && STRPREFIX(idprop->data.pointer, "(null)")) {
148  return true;
149  }
150  }
151  return false;
152 }
153 
156 {
157  /* Tweak events for L M R mouse-buttons. */
158  enum {
159  EVT_TWEAK_L = 0x5002,
160  EVT_TWEAK_M = 0x5003,
161  EVT_TWEAK_R = 0x5004,
162  };
163  switch (kmi->type) {
164  case EVT_TWEAK_L:
165  kmi->type = LEFTMOUSE;
166  break;
167  case EVT_TWEAK_M:
168  kmi->type = MIDDLEMOUSE;
169  break;
170  case EVT_TWEAK_R:
171  kmi->type = RIGHTMOUSE;
172  break;
173  default:
174  kmi->direction = KM_ANY;
175  return false;
176  }
177 
178  if (kmi->val >= KM_DIRECTION_N && kmi->val <= KM_DIRECTION_NW) {
179  kmi->direction = kmi->val;
180  }
181  else {
182  kmi->direction = KM_ANY;
183  }
184  kmi->val = KM_CLICK_DRAG;
185  return false;
186 }
187 
189 {
190  /* #UserDef & #Main happen to have the same struct member. */
191 #define USER_VERSION_ATLEAST(ver, subver) MAIN_VERSION_ATLEAST(userdef, ver, subver)
192 
193  /* the UserDef struct is not corrected with do_versions() .... ugh! */
194  if (userdef->menuthreshold1 == 0) {
195  userdef->menuthreshold1 = 5;
196  userdef->menuthreshold2 = 2;
197  }
198  if (userdef->mixbufsize == 0) {
199  userdef->mixbufsize = 2048;
200  }
201  if (userdef->autokey_mode == 0) {
202  /* 'add/replace' but not on */
203  userdef->autokey_mode = 2;
204  }
205  if (userdef->savetime <= 0) {
206  userdef->savetime = 1;
207  // XXX error(STRINGIFY(BLENDER_STARTUP_FILE)" is buggy, please consider removing it.\n");
208  }
209  if (userdef->gizmo_size == 0) {
210  userdef->gizmo_size = 75;
211  userdef->gizmo_flag |= USER_GIZMO_DRAW;
212  }
213  if (userdef->pad_rot_angle == 0.0f) {
214  userdef->pad_rot_angle = 15.0f;
215  }
216 
217  /* graph editor - unselected F-Curve visibility */
218  if (userdef->fcu_inactive_alpha == 0) {
219  userdef->fcu_inactive_alpha = 0.25f;
220  }
221 
222  if (!USER_VERSION_ATLEAST(192, 0)) {
223  strcpy(userdef->sounddir, "/");
224  }
225 
226  /* patch to set Dupli Armature */
227  if (!USER_VERSION_ATLEAST(220, 0)) {
228  userdef->dupflag |= USER_DUP_ARM;
229  }
230 
231  /* added seam, normal color, undo */
232  if (!USER_VERSION_ATLEAST(235, 0)) {
233  userdef->uiflag |= USER_GLOBALUNDO;
234  if (userdef->undosteps == 0) {
235  userdef->undosteps = 32;
236  }
237  }
238  if (!USER_VERSION_ATLEAST(236, 0)) {
239  /* illegal combo... */
240  if (userdef->flag & USER_LMOUSESELECT) {
241  userdef->flag &= ~USER_TWOBUTTONMOUSE;
242  }
243  }
244  if (!USER_VERSION_ATLEAST(240, 0)) {
245  userdef->uiflag |= USER_PLAINMENUS;
246  }
247  if (!USER_VERSION_ATLEAST(242, 0)) {
248  /* set defaults for 3D View rotating axis indicator */
249  /* since size can't be set to 0, this indicates it's not saved in startup.blend */
250  if (userdef->rvisize == 0) {
251  userdef->rvisize = 15;
252  userdef->rvibright = 8;
253  userdef->uiflag |= USER_SHOW_GIZMO_NAVIGATE;
254  }
255  }
256  if (!USER_VERSION_ATLEAST(244, 0)) {
257  /* set default number of recently-used files (if not set) */
258  if (userdef->recent_files == 0) {
259  userdef->recent_files = 10;
260  }
261  }
262  if (!USER_VERSION_ATLEAST(245, 3)) {
263  if (userdef->coba_weight.tot == 0) {
264  BKE_colorband_init(&userdef->coba_weight, true);
265  }
266  }
267  if (!USER_VERSION_ATLEAST(245, 3)) {
269  }
270  if (!USER_VERSION_ATLEAST(250, 0)) {
271  /* adjust grease-pencil distances */
272  userdef->gp_manhattandist = 1;
273  userdef->gp_euclideandist = 2;
274 
275  /* adjust default interpolation for new IPO-curves */
276  userdef->ipo_new = BEZT_IPO_BEZ;
277  }
278 
279  if (!USER_VERSION_ATLEAST(250, 3)) {
280  /* new audio system */
281  if (userdef->audiochannels == 0) {
282  userdef->audiochannels = 2;
283  }
284  if (userdef->audioformat == 0) {
285  userdef->audioformat = 0x24;
286  }
287  if (userdef->audiorate == 0) {
288  userdef->audiorate = 48000;
289  }
290  }
291 
292  if (!USER_VERSION_ATLEAST(250, 8)) {
293  wmKeyMap *km;
294 
295  for (km = userdef->user_keymaps.first; km; km = km->next) {
296  if (STREQ(km->idname, "Armature_Sketch")) {
297  strcpy(km->idname, "Armature Sketch");
298  }
299  else if (STREQ(km->idname, "View3D")) {
300  strcpy(km->idname, "3D View");
301  }
302  else if (STREQ(km->idname, "View3D Generic")) {
303  strcpy(km->idname, "3D View Generic");
304  }
305  else if (STREQ(km->idname, "EditMesh")) {
306  strcpy(km->idname, "Mesh");
307  }
308  else if (STREQ(km->idname, "UVEdit")) {
309  strcpy(km->idname, "UV Editor");
310  }
311  else if (STREQ(km->idname, "Animation_Channels")) {
312  strcpy(km->idname, "Animation Channels");
313  }
314  else if (STREQ(km->idname, "GraphEdit Keys")) {
315  strcpy(km->idname, "Graph Editor");
316  }
317  else if (STREQ(km->idname, "GraphEdit Generic")) {
318  strcpy(km->idname, "Graph Editor Generic");
319  }
320  else if (STREQ(km->idname, "Action_Keys")) {
321  strcpy(km->idname, "Dopesheet");
322  }
323  else if (STREQ(km->idname, "NLA Data")) {
324  strcpy(km->idname, "NLA Editor");
325  }
326  else if (STREQ(km->idname, "Node Generic")) {
327  strcpy(km->idname, "Node Editor");
328  }
329  else if (STREQ(km->idname, "Logic Generic")) {
330  strcpy(km->idname, "Logic Editor");
331  }
332  else if (STREQ(km->idname, "File")) {
333  strcpy(km->idname, "File Browser");
334  }
335  else if (STREQ(km->idname, "FileMain")) {
336  strcpy(km->idname, "File Browser Main");
337  }
338  else if (STREQ(km->idname, "FileButtons")) {
339  strcpy(km->idname, "File Browser Buttons");
340  }
341  else if (STREQ(km->idname, "Buttons Generic")) {
342  strcpy(km->idname, "Property Editor");
343  }
344  }
345  }
346 
347  if (!USER_VERSION_ATLEAST(252, 3)) {
348  if (userdef->flag & USER_LMOUSESELECT) {
349  userdef->flag &= ~USER_TWOBUTTONMOUSE;
350  }
351  }
352  if (!USER_VERSION_ATLEAST(252, 4)) {
353  /* default new handle type is auto handles */
354  userdef->keyhandles_new = HD_AUTO;
355  }
356 
357  if (!USER_VERSION_ATLEAST(257, 0)) {
358  /* Clear #AUTOKEY_FLAG_ONLYKEYINGSET flag from user-preferences,
359  * so that it doesn't linger around from old configurations like a ghost. */
361  }
362 
363  if (!USER_VERSION_ATLEAST(260, 3)) {
364  /* if new keyframes handle default is stuff "auto", make it "auto-clamped" instead
365  * was changed in 260 as part of GSoC11, but version patch was wrong
366  */
367  if (userdef->keyhandles_new == HD_AUTO) {
368  userdef->keyhandles_new = HD_AUTO_ANIM;
369  }
370  }
371 
372  if (!USER_VERSION_ATLEAST(267, 0)) {
373 
374  /* GL Texture Garbage Collection */
375  if (userdef->textimeout == 0) {
376  userdef->texcollectrate = 60;
377  userdef->textimeout = 120;
378  }
379  if (userdef->memcachelimit <= 0) {
380  userdef->memcachelimit = 32;
381  }
382  if (userdef->dbl_click_time == 0) {
383  userdef->dbl_click_time = 350;
384  }
385  if (userdef->v2d_min_gridsize == 0) {
386  userdef->v2d_min_gridsize = 35;
387  }
388  if (userdef->widget_unit == 0) {
389  userdef->widget_unit = 20;
390  }
391  if (userdef->anisotropic_filter <= 0) {
392  userdef->anisotropic_filter = 1;
393  }
394 
395  if (userdef->ndof_sensitivity == 0.0f) {
396  userdef->ndof_sensitivity = 1.0f;
399  }
400 
401  if (userdef->ndof_orbit_sensitivity == 0.0f) {
402  userdef->ndof_orbit_sensitivity = userdef->ndof_sensitivity;
403 
404  if (!(userdef->flag & USER_TRACKBALL)) {
405  userdef->ndof_flag |= NDOF_TURNTABLE;
406  }
407  }
408  }
409 
410  if (!USER_VERSION_ATLEAST(269, 4)) {
411  userdef->walk_navigation.mouse_speed = 1.0f;
412  userdef->walk_navigation.walk_speed = 2.5f; /* m/s */
413  userdef->walk_navigation.walk_speed_factor = 5.0f;
414  userdef->walk_navigation.view_height = 1.6f; /* m */
415  userdef->walk_navigation.jump_height = 0.4f; /* m */
416  userdef->walk_navigation.teleport_time = 0.2f; /* s */
417  }
418 
419  if (!USER_VERSION_ATLEAST(271, 5)) {
420  userdef->pie_menu_radius = 100;
421  userdef->pie_menu_threshold = 12;
422  userdef->pie_animation_timeout = 6;
423  }
424 
425  if (!USER_VERSION_ATLEAST(275, 2)) {
426  userdef->ndof_deadzone = 0.1;
427  }
428 
429  if (!USER_VERSION_ATLEAST(275, 4)) {
430  userdef->node_margin = 80;
431  }
432 
433  if (!USER_VERSION_ATLEAST(278, 6)) {
434  /* Clear preference flags for re-use. */
438  userdef->uiflag &= ~(USER_HEADER_BOTTOM);
441 
442  userdef->uiflag |= USER_LOCK_CURSOR_ADJUST;
443  }
444 
445  if (!USER_VERSION_ATLEAST(280, 20)) {
446  userdef->gpu_viewport_quality = 0.6f;
447 
448  /* Reset theme, old themes will not be compatible with minor version updates from now on. */
449  LISTBASE_FOREACH (bTheme *, btheme, &userdef->themes) {
450  memcpy(btheme, &U_theme_default, sizeof(*btheme));
451  }
452 
453  /* Annotations - new layer color
454  * Replace anything that used to be set if it looks like was left
455  * on the old default (i.e. black), which most users used
456  */
457  if ((userdef->gpencil_new_layer_col[3] < 0.1f) || (userdef->gpencil_new_layer_col[0] < 0.1f)) {
458  /* - New color matches the annotation pencil icon
459  * - Non-full alpha looks better!
460  */
461  ARRAY_SET_ITEMS(userdef->gpencil_new_layer_col, 0.38f, 0.61f, 0.78f, 0.9f);
462  }
463  }
464 
465  if (!USER_VERSION_ATLEAST(280, 31)) {
466  /* Remove select/action mouse from user defined keymaps. */
467  LISTBASE_FOREACH (wmKeyMap *, keymap, &userdef->user_keymaps) {
468  LISTBASE_FOREACH (wmKeyMapDiffItem *, kmdi, &keymap->diff_items) {
469  if (kmdi->remove_item) {
470  do_version_select_mouse(userdef, kmdi->remove_item);
471  }
472  if (kmdi->add_item) {
473  do_version_select_mouse(userdef, kmdi->add_item);
474  }
475  }
476 
477  LISTBASE_FOREACH (wmKeyMapItem *, kmi, &keymap->items) {
478  do_version_select_mouse(userdef, kmi);
479  }
480  }
481  }
482 
483  if (!USER_VERSION_ATLEAST(280, 33)) {
484  /* Enable GLTF addon by default. */
485  BKE_addon_ensure(&userdef->addons, "io_scene_gltf2");
486 
487  userdef->pressure_threshold_max = 1.0f;
488  }
489 
490  if (!USER_VERSION_ATLEAST(280, 35)) {
491  /* Preserve RMB select setting after moving to Python and changing default value. */
492  if (USER_VERSION_ATLEAST(280, 32) || !(userdef->flag & USER_LMOUSESELECT)) {
493  BKE_keyconfig_pref_set_select_mouse(userdef, 1, false);
494  }
495 
496  userdef->flag &= ~USER_LMOUSESELECT;
497  }
498 
499  if (!USER_VERSION_ATLEAST(280, 38)) {
500  copy_v4_fl4(userdef->light_param[0].vec, -0.580952, 0.228571, 0.781185, 0.0);
501  copy_v4_fl4(userdef->light_param[0].col, 0.900000, 0.900000, 0.900000, 1.000000);
502  copy_v4_fl4(userdef->light_param[0].spec, 0.318547, 0.318547, 0.318547, 1.000000);
503  userdef->light_param[0].flag = 1;
504  userdef->light_param[0].smooth = 0.1;
505 
506  copy_v4_fl4(userdef->light_param[1].vec, 0.788218, 0.593482, -0.162765, 0.0);
507  copy_v4_fl4(userdef->light_param[1].col, 0.267115, 0.269928, 0.358840, 1.000000);
508  copy_v4_fl4(userdef->light_param[1].spec, 0.090838, 0.090838, 0.090838, 1.000000);
509  userdef->light_param[1].flag = 1;
510  userdef->light_param[1].smooth = 0.25;
511 
512  copy_v4_fl4(userdef->light_param[2].vec, 0.696472, -0.696472, -0.172785, 0.0);
513  copy_v4_fl4(userdef->light_param[2].col, 0.293216, 0.304662, 0.401968, 1.000000);
514  copy_v4_fl4(userdef->light_param[2].spec, 0.069399, 0.020331, 0.020331, 1.000000);
515  userdef->light_param[2].flag = 1;
516  userdef->light_param[2].smooth = 0.4;
517 
518  copy_v4_fl4(userdef->light_param[3].vec, 0.021053, -0.989474, 0.143173, 0.0);
519  copy_v4_fl4(userdef->light_param[3].col, 0.0, 0.0, 0.0, 1.0);
520  copy_v4_fl4(userdef->light_param[3].spec, 0.072234, 0.082253, 0.162642, 1.000000);
521  userdef->light_param[3].flag = 1;
522  userdef->light_param[3].smooth = 0.7;
523 
524  copy_v3_fl3(userdef->light_ambient, 0.025000, 0.025000, 0.025000);
525 
526  userdef->flag &= ~(USER_FLAG_UNUSED_4);
527 
529  }
530 
531  if (!USER_VERSION_ATLEAST(280, 41)) {
532  if (userdef->pie_tap_timeout == 0) {
533  userdef->pie_tap_timeout = 20;
534  }
535  }
536 
537  if (!USER_VERSION_ATLEAST(280, 44)) {
539  userdef->uiflag2 &= ~(USER_UIFLAG2_UNUSED_0);
540  userdef->gp_settings &= ~(GP_PAINT_UNUSED_0);
541  }
542 
543  if (!USER_VERSION_ATLEAST(280, 50)) {
544  /* 3ds is no longer enabled by default and not ported yet. */
545  BKE_addon_remove_safe(&userdef->addons, "io_scene_3ds");
546  }
547 
548  if (!USER_VERSION_ATLEAST(280, 51)) {
549  userdef->move_threshold = 2;
550  }
551 
552  if (!USER_VERSION_ATLEAST(280, 58)) {
553  if (userdef->image_draw_method != IMAGE_DRAW_METHOD_GLSL) {
555  }
556  }
557 
558  /* Patch to set dupli light-probes and grease-pencil. */
559  if (!USER_VERSION_ATLEAST(280, 58)) {
560  userdef->dupflag |= USER_DUP_LIGHTPROBE;
561  userdef->dupflag |= USER_DUP_GPENCIL;
562  }
563 
564  if (!USER_VERSION_ATLEAST(280, 60)) {
565  const float GPU_VIEWPORT_QUALITY_FXAA = 0.10f;
566  const float GPU_VIEWPORT_QUALITY_TAA8 = 0.25f;
567  const float GPU_VIEWPORT_QUALITY_TAA16 = 0.6f;
568  const float GPU_VIEWPORT_QUALITY_TAA32 = 0.8f;
569 
570  if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_FXAA) {
571  userdef->viewport_aa = SCE_DISPLAY_AA_OFF;
572  }
573  else if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_TAA8) {
574  userdef->viewport_aa = SCE_DISPLAY_AA_FXAA;
575  }
576  else if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_TAA16) {
578  }
579  else if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_TAA32) {
581  }
582  else {
584  }
585  }
586 
587  if (!USER_VERSION_ATLEAST(280, 62)) {
588  if (userdef->vbotimeout == 0) {
589  userdef->vbocollectrate = 60;
590  userdef->vbotimeout = 120;
591  }
592 
593  if (userdef->lookdev_sphere_size == 0) {
594  userdef->lookdev_sphere_size = 150;
595  }
596 
597  userdef->pref_flag |= USER_PREF_FLAG_SAVE;
598  }
599 
600  if (!USER_VERSION_ATLEAST(280, 73)) {
601  userdef->drag_threshold = 30;
602  userdef->drag_threshold_mouse = 3;
603  userdef->drag_threshold_tablet = 10;
604  }
605 
606  if (!USER_VERSION_ATLEAST(281, 9)) {
607  /* X3D is no longer enabled by default. */
608  BKE_addon_remove_safe(&userdef->addons, "io_scene_x3d");
609  }
610 
611  if (!USER_VERSION_ATLEAST(281, 12)) {
614  }
615 
616  if (!USER_VERSION_ATLEAST(281, 13)) {
618 
620  memcpy(
621  &userdef->file_space_data, &U_default.file_space_data, sizeof(userdef->file_space_data));
622  }
623  }
624 
625  if (!USER_VERSION_ATLEAST(281, 16)) {
627  &((struct wmKeyConfigFilterItemParams){
628  .check_item = true,
629  .check_diff_item_add = true,
630  }),
632  NULL);
633  }
634 
635  if (!USER_VERSION_ATLEAST(282, 1)) {
637  }
638 
639  if (!USER_VERSION_ATLEAST(282, 4)) {
640  if (userdef->view_rotate_sensitivity_turntable == 0.0f) {
642  userdef->view_rotate_sensitivity_trackball = 1.0f;
643  }
644  if (userdef->scrollback == 0) {
645  userdef->scrollback = U_default.scrollback;
646  }
647 
648  /* Enable Overlay Engine Smooth Wire by default */
650  }
651 
652  if (!USER_VERSION_ATLEAST(283, 13)) {
653  /* If Translations is off then language should default to English. */
654  if ((userdef->transopts & USER_DOTRANSLATE_DEPRECATED) == 0) {
655  userdef->language = ULANGUAGE_ENGLISH;
656  }
657  /* Clear this deprecated flag. */
659  }
660 
661  if (!USER_VERSION_ATLEAST(290, 7)) {
663  }
664 
665  if (!USER_VERSION_ATLEAST(291, 1)) {
666  if (userdef->collection_instance_empty_size == 0) {
667  userdef->collection_instance_empty_size = 1.0f;
668  }
669  }
670 
671  if (!USER_VERSION_ATLEAST(292, 3)) {
672  if (userdef->pixelsize == 0.0f) {
673  userdef->pixelsize = 1.0f;
674  }
675  /* Clear old userdef flag for "Camera Parent Lock". */
676  userdef->uiflag &= ~USER_UIFLAG_UNUSED_3;
677  }
678 
679  if (!USER_VERSION_ATLEAST(292, 9)) {
680  if (BLI_listbase_is_empty(&userdef->asset_libraries)) {
682  }
683  }
684 
685  if (!USER_VERSION_ATLEAST(293, 1)) {
686  /* This rename was made after 2.93.0, harmless to run when it's not needed. */
687  const char *replace_table[][2] = {
688  {"blender", "Blender"},
689  {"blender_27x", "Blender_27x"},
690  {"industry_compatible", "Industry_Compatible"},
691  };
692  const int replace_table_len = ARRAY_SIZE(replace_table);
693 
695  userdef->keyconfigstr, sizeof(userdef->keyconfigstr), replace_table, replace_table_len);
698  kpt->idname, sizeof(kpt->idname), replace_table, replace_table_len);
699  }
700  }
701 
702  if (!USER_VERSION_ATLEAST(293, 12)) {
703  if (userdef->gizmo_size_navigate_v3d == 0) {
704  userdef->gizmo_size_navigate_v3d = 80;
705  }
706 
708  }
709 
710  if (!USER_VERSION_ATLEAST(293, 13)) {
711  BKE_addon_ensure(&userdef->addons, "pose_library");
712  }
713 
714  if (!USER_VERSION_ATLEAST(300, 21)) {
715  /* Deprecated userdef->flag USER_SAVE_PREVIEWS */
718  /* Clear for reuse. */
719  userdef->flag &= ~USER_FLAG_UNUSED_5;
720  }
721 
722  if (!USER_VERSION_ATLEAST(300, 38)) {
723  /* Patch to set Dupli Lattice/Camera/Speaker. */
724  userdef->dupflag |= USER_DUP_LATTICE;
725  userdef->dupflag |= USER_DUP_CAMERA;
726  userdef->dupflag |= USER_DUP_SPEAKER;
727  }
728 
729  if (!USER_VERSION_ATLEAST(300, 40)) {
730  /* Rename the default asset library from "Default" to "User Library". This isn't bullet proof
731  * since it doesn't handle translations and ignores user changes. But this was an alpha build
732  * (experimental) feature and the name is just for display in the UI anyway. So it doesn't have
733  * to work perfectly at all. */
734  LISTBASE_FOREACH (bUserAssetLibrary *, asset_library, &userdef->asset_libraries) {
735  /* Ignores translations, since that would depend on the current preferences (global `U`). */
736  if (STREQ(asset_library->name, "Default")) {
738  userdef, asset_library, BKE_PREFS_ASSET_LIBRARY_DEFAULT_NAME);
739  }
740  }
741  }
742 
743  if (!USER_VERSION_ATLEAST(300, 40)) {
744  LISTBASE_FOREACH (uiStyle *, style, &userdef->uistyles) {
745  const int default_title_points = 11; /* UI_DEFAULT_TITLE_POINTS */
746  style->paneltitle.points = default_title_points;
747  style->grouplabel.points = default_title_points;
748  }
749  }
750 
751  if (!USER_VERSION_ATLEAST(300, 43)) {
752  userdef->ndof_flag |= NDOF_CAMERA_PAN_ZOOM;
753  }
754 
755  if (!USER_VERSION_ATLEAST(302, 5)) {
757  &((struct wmKeyConfigFilterItemParams){
758  .check_item = true,
759  .check_diff_item_add = true,
760  }),
762  NULL);
763  }
764 
765  if (!USER_VERSION_ATLEAST(302, 11)) {
767  }
768 
778  {
779  /* Keep this block, even when empty. */
780  }
781 
782  LISTBASE_FOREACH (bTheme *, btheme, &userdef->themes) {
783  do_versions_theme(userdef, btheme);
784  }
785 #undef USER_VERSION_ATLEAST
786 }
787 
789 {
790  /* User preference experimental settings are only supported in alpha builds.
791  * This prevents users corrupting data and relying on API that may change.
792  *
793  * If user preferences are saved this will be stored in disk as expected.
794  * This only starts to take effect when there is a release branch (on beta).
795  *
796  * At that time master already has its version bumped so its user preferences
797  * are not touched by these settings. */
798 
800  return;
801  }
802 
803  MEMSET_STRUCT_AFTER(&userdef->experimental, 0, SANITIZE_AFTER_HERE);
804 }
805 
806 #undef USER_LMOUSESELECT
struct bAddon * BKE_addon_ensure(struct ListBase *addon_list, const char *module)
Definition: addon.c:44
bool BKE_addon_remove_safe(struct ListBase *addon_list, const char *module)
Definition: addon.c:55
bool BKE_blender_version_is_alpha(void)
Definition: blender.c:149
void BKE_colorband_init(struct ColorBand *coba, bool rangetype)
Definition: colorband.c:22
struct IDProperty * IDP_GetPropertyFromGroup(const struct IDProperty *prop, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
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.c:110
void BKE_preferences_asset_library_default_add(struct UserDef *userdef) ATTR_NONNULL()
Definition: preferences.c:105
#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()
Definition: preferences.c:56
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
Definition: BLI_listbase.h:269
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:336
#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)
bool BLI_str_replace_table_exact(char *string, size_t string_len, const char *replace_table[][2], int replace_table_len)
Definition: string.c:513
#define STRPREFIX(a, b)
#define ARRAY_SIZE(arr)
#define ARRAY_SET_ITEMS(...)
#define UNUSED(x)
#define MEMSET_STRUCT_AFTER(struct_var, value, member)
#define STREQ(a, b)
external readfile function prototypes.
const struct UserDef U_default
const struct bTheme U_theme_default
@ IDP_STRING
Definition: DNA_ID.h:136
@ FCURVE_SMOOTH_CONT_ACCEL
Object groups, one object can be in many groups at once.
@ 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
@ USER_TR_UNUSED_4
@ USER_DOTRANSLATE_DEPRECATED
@ USER_TR_UNUSED_3
@ USER_TR_UNUSED_6
@ USER_TR_UNUSED_7
@ USER_TR_UNUSED_2
@ USER_UIFLAG_UNUSED_3
@ USER_UIFLAG_UNUSED_22
@ USER_LOCK_CURSOR_ADJUST
@ USER_SHOW_GIZMO_NAVIGATE
@ USER_HEADER_FROM_PREF
@ USER_HEADER_BOTTOM
@ USER_GLOBALUNDO
@ USER_UIFLAG_UNUSED_12
@ USER_PLAINMENUS
@ USER_NO_MULTITOUCH_GESTURES
@ USER_UIFLAG_UNUSED_1
@ IMAGE_DRAW_METHOD_AUTO
@ IMAGE_DRAW_METHOD_GLSL
@ USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE
@ USER_SEQ_PROXY_SETUP_AUTOMATIC
@ USER_ADD_VIEWALIGNED
@ USER_FLAG_UNUSED_9
@ 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_2
@ USER_FLAG_UNUSED_3
@ USER_TWOBUTTONMOUSE
@ STATUSBAR_SHOW_VERSION
@ 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_CAMERA_PAN_ZOOM
@ AUTOKEY_FLAG_ONLYKEYINGSET
@ USER_GIZMO_DRAW
@ ULANGUAGE_ENGLISH
@ USER_PREF_FLAG_SAVE
@ USER_TEMP_SPACE_DISPLAY_WINDOW
@ KM_ANY
Definition: WM_types.h:265
@ KM_CLICK_DRAG
Definition: WM_types.h:275
@ KM_DIRECTION_NW
Definition: WM_types.h:291
@ KM_DIRECTION_N
Definition: WM_types.h:284
void * user_data
static int left
void * pointer
Definition: DNA_ID.h:100
IDPropertyData data
Definition: DNA_ID.h:117
char type
Definition: DNA_ID.h:108
void * first
Definition: DNA_listBase.h:31
unsigned char grid_levels
uiWidgetColors wcol_view_item
struct WalkNavigation walk_navigation
short autokey_mode
float pressure_threshold_max
short texcollectrate
short dbl_click_time
short gp_settings
struct ListBase addons
short menuthreshold2
short anisotropic_filter
short vbocollectrate
float pad_rot_angle
char drag_threshold
struct ListBase uistyles
float view_rotate_sensitivity_trackball
float ndof_sensitivity
short pie_animation_timeout
float ndof_orbit_sensitivity
float light_ambient[3]
char statusbar_flag
float view_rotate_sensitivity_turntable
UserDef_FileSpaceData file_space_data
short textimeout
UserDef_Experimental experimental
short v2d_min_gridsize
char keyhandles_new
struct ListBase user_keymaps
char drag_threshold_mouse
float gpencil_new_layer_col[4]
short vbotimeout
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 recent_files
short gp_euclideandist
short image_draw_method
short menuthreshold1
char auto_smoothing_new
short pie_menu_threshold
struct ListBase user_keyconfig_prefs
short autokey_flag
char drag_threshold_tablet
short gp_manhattandist
struct SolidLight light_param[4]
char filebrowser_display_type
char move_threshold
unsigned int dupflag
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]
short widget_unit
ThemeUI tui
ThemeSpace space_node
struct wmKeyMap * next
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 bool keymap_item_has_invalid_wm_context_data_path(wmKeyMapItem *kmi, void *UNUSED(user_data))
static void do_version_select_mouse(UserDef *userdef, wmKeyMapItem *kmi)
static void do_versions_theme(const UserDef *userdef, bTheme *btheme)
static bool keymap_item_update_tweak_event(wmKeyMapItem *kmi, void *UNUSED(user_data))
@ RIGHTMOUSE
@ LEFTMOUSE
@ MIDDLEMOUSE