{"record":{"id":"05296910a41777bd","repo":"rocksdanister/lively","slug":"customisation-not-supported","errorCode":null,"errorMessage":"Customisation not supported.","messagePattern":"Customisation not supported\\.","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"warning","filePath":"src/Lively/Lively.UI.Shared/ViewModels/CustomiseWallpaperViewModel.cs","lineNumber":262,"sourceCode":"                        desktopCore.SendMessageWallpaper(currentScreen, Model, msg);\n                        break;\n                    case WallpaperArrangement.span:\n                    case WallpaperArrangement.duplicate:\n                        desktopCore.SendMessageWallpaper(Model, msg);\n                        break;\n                }\n            });\n        }\n\n        /// <summary>\n        /// Get LivelyProperties.json copy filepath and corresponding screen logic.\n        /// </summary>\n        /// <param name=\"obj\">LibraryModel object</param>\n        /// <returns></returns>\n        private (string filePath, DisplayMonitor screen) CreatePropertyCopy(LibraryModel obj, WallpaperArrangement arrangement, DisplayMonitor selectedScreen)\n        {\n            if (obj.LivelyPropertyPath == null)\n                throw new ArgumentException(\"Customisation not supported.\");\n\n            string propertyCopyPath = null;\n            DisplayMonitor wallpaperScreen = null;\n            var items = desktopCore.Wallpapers.Where(x => x.LivelyInfoFolderPath == obj.LivelyInfoFolderPath);\n            if (!items.Any())\n            {\n                // We create the files only when wallpaper is not running, when launching the wallpaper the Core will create the file for us.\n                wallpaperScreen = selectedScreen;\n                var dataFolder = Path.Combine(userSettings.Settings.WallpaperDir, Constants.CommonPartialPaths.WallpaperSettingsDir);\n                //Create a directory with the wallpaper foldername in SaveData/wpdata/, copy livelyproperties.json into this.\n                //Further modifications are done to the copy file.\n                string wallpaperDataDirectoryPath = null;\n                switch (arrangement)\n                {\n                    case WallpaperArrangement.per:\n                        wallpaperDataDirectoryPath = Path.Combine(dataFolder, new DirectoryInfo(obj.LivelyInfoFolderPath).Name, wallpaperScreen.Index.ToString());\n                        break;\n                    case WallpaperArrangement.span:","sourceCodeStart":244,"sourceCodeEnd":280,"githubUrl":"https://github.com/rocksdanister/lively/blob/c1036feb664960722e34bf4309042c247d6a909d/src/Lively/Lively.UI.Shared/ViewModels/CustomiseWallpaperViewModel.cs#L244-L280","documentation":"Thrown by CustomiseWallpaperViewModel.CreatePropertyCopy when obj.LivelyPropertyPath is null — the wallpaper has no LivelyProperties.json, so there is nothing to customise. ArgumentException signals a bad argument rather than a runtime fault.","triggerScenarios":"CreatePropertyCopy(obj, arrangement, selectedScreen) for a wallpaper whose LivelyPropertyPath is null — typical for plain video/online wallpapers that ship no property schema.","commonSituations":"User opens 'customise' on a video wallpaper or a web wallpaper with no LivelyProperties.json; the wallpaper was imported in a way that skipped/removed the property file.","solutions":["Guard the UI: disable/hide 'Customise' when LivelyPropertyPath is null.","If properties are expected, re-import the wallpaper ensuring LivelyProperties.json is present.","Catch ArgumentException in the customise flow and show 'This wallpaper has no customisable settings.'"],"exampleFix":"// before\nif (obj.LivelyPropertyPath == null)\n    throw new ArgumentException(\"Customisation not supported.\");\n\n// caller-side guard (preferred)\nif (string.IsNullOrEmpty(obj.LivelyPropertyPath))\n{\n    CanCustomise = false;\n    return;\n}","handlingStrategy":"validation","validationCode":"if (string.IsNullOrEmpty(obj.LivelyPropertyPath))\n{\n    CanCustomise = false;\n    return;\n}","typeGuard":"static bool IsCustomisable(LibraryModel obj) => !string.IsNullOrEmpty(obj.LivelyPropertyPath);","tryCatchPattern":"try { (var path, var screen) = CreatePropertyCopy(obj, arrangement, selectedScreen); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"Customisation not supported\"))\n{ ShowInfo(\"This wallpaper has no customisable settings.\"); }","preventionTips":["Bind the 'Customise' affordance's enabled-state to LivelyPropertyPath != null.","Skip wallpapers without LivelyProperties.json in batch customise loops.","Re-import wallpapers that should have properties but don't."],"tags":["customization","wallpaper","properties","validation"],"backgroundTag":null,"analyzedSha":"c1036feb664960722e34bf4309042c247d6a909d","analyzedAt":"2026-08-13T13:03:12.648Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}