浏览代码

libobs: Fix apply_settings & remove_by_name for groups

'obs_properties_apply_settings' and 'obs_properties_remove_by_name'
would incorrectly ignore property groups and not call the callbacks
or remove the property, resulting in quite glitchy UI.

This fix works by splitting the internal logic of ...apply_settings
into an extra function to call, while keeping the API the same. The
change to ...remove_by_name is to simply recursively going into the
group content with the same function call.
Michael Fabian 'Xaymar' Dirks 6 年之前
父节点
当前提交
a1cc453996
共有 1 个文件被更改,包括 24 次插入7 次删除
  1. 24 7
      libobs/obs-properties.c

+ 24 - 7
libobs/obs-properties.c

@@ -336,29 +336,46 @@ void obs_properties_remove_by_name(obs_properties_t *props, const char *name)
 			break;
 		}
 
+		if (cur->type == OBS_PROPERTY_GROUP) {
+			obs_properties_remove_by_name(
+				obs_property_group_content(cur), name);
+		}
+
 		prev = cur;
 		cur = cur->next;
 	}
 }
 
-void obs_properties_apply_settings(obs_properties_t *props,
-				   obs_data_t *settings)
+void obs_properties_apply_settings_internal(obs_properties_t *props,
+					    obs_data_t *settings,
+					    obs_properties_t *realprops)
 {
 	struct obs_property *p;
 
-	if (!props)
-		return;
-
 	p = props->first_property;
 	while (p) {
+		if (p->type == OBS_PROPERTY_GROUP) {
+			obs_properties_apply_settings_internal(
+				obs_property_group_content(p), settings,
+				realprops);
+		}
 		if (p->modified)
-			p->modified(props, p, settings);
+			p->modified(realprops, p, settings);
 		else if (p->modified2)
-			p->modified2(p->priv, props, p, settings);
+			p->modified2(p->priv, realprops, p, settings);
 		p = p->next;
 	}
 }
 
+void obs_properties_apply_settings(obs_properties_t *props,
+				   obs_data_t *settings)
+{
+	if (!props)
+		return;
+
+	obs_properties_apply_settings_internal(props, settings, props);
+}
+
 /* ------------------------------------------------------------------------- */
 
 static inline void propertes_add(struct obs_properties *props,