88#include < QMimeData>
99
1010#include < cstring>
11+ #include < string>
1112
1213namespace {
1314OBSDataAutoRelease CloneData (obs_data_t *data)
@@ -37,7 +38,23 @@ OBSSourceAutoRelease ResolveReferencedSource(obs_data_t *sourceData)
3738bool CanLoadDuplicateSource (obs_data_t *sourceData)
3839{
3940 const char *id = obs_data_get_string (sourceData, " id" );
40- return id && *id && strcmp (id, " group" ) != 0 ;
41+ return id && *id;
42+ }
43+
44+ std::string GetUniqueFilterName (obs_source_t *destination, const char *name)
45+ {
46+ std::string uniqueName = name;
47+ int suffix = 1 ;
48+
49+ for (;;) {
50+ OBSSourceAutoRelease existing = obs_source_get_filter_by_name (destination, uniqueName.c_str ());
51+ if (!existing) {
52+ break ;
53+ }
54+ uniqueName = std::string (name) + " " + std::to_string (++suffix);
55+ }
56+
57+ return uniqueName;
4158}
4259
4360void PrepareRootSceneItem (obs_data_array_t *items, obs_source_t *source = nullptr )
@@ -234,7 +251,22 @@ void OBSClipboardService::pasteFilters(OBSSource destination)
234251 if (!OBSClipboardSerializer::DeserializeFilters (payload, filters)) {
235252 return ;
236253 }
237- obs_source_restore_filters (destination, filters);
254+
255+ for (size_t i = obs_data_array_count (filters); i > 0 ; i--) {
256+ OBSDataAutoRelease serializedFilter = obs_data_array_item (filters, i - 1 );
257+ OBSDataAutoRelease filterData = CloneData (serializedFilter);
258+ if (!filterData) {
259+ continue ;
260+ }
261+
262+ const std::string name = GetUniqueFilterName (destination, obs_data_get_string (filterData, " name" ));
263+ obs_data_set_string (filterData, " name" , name.c_str ());
264+ obs_data_erase (filterData, " uuid" );
265+ OBSSourceAutoRelease filter = obs_load_private_source (filterData);
266+ if (filter) {
267+ obs_source_filter_add (destination, filter);
268+ }
269+ }
238270}
239271
240272void OBSClipboardService::pasteTransform (const std::vector<OBSSceneItem> &items)
@@ -244,8 +276,8 @@ void OBSClipboardService::pasteTransform(const std::vector<OBSSceneItem> &items)
244276 return ;
245277 }
246278
247- obs_transform_info transform;
248- obs_sceneitem_crop crop;
279+ obs_transform_info transform = {} ;
280+ obs_sceneitem_crop crop = {} ;
249281
250282 if (!OBSClipboardSerializer::DeserializeTransform (payload, transform, crop))
251283 return ;
0 commit comments