浏览代码

obs-scripting: Add Python functions for frontend events

Scratch 5 年之前
父节点
当前提交
41fcb9ae08
共有 1 个文件被更改,包括 73 次插入0 次删除
  1. 73 0
      deps/obs-scripting/obs-scripting-python-frontend.c

+ 73 - 0
deps/obs-scripting/obs-scripting-python-frontend.c

@@ -331,6 +331,77 @@ static PyObject *add_save_callback(PyObject *self, PyObject *args)
 	return python_none();
 }
 
+static void frontend_event_callback(enum obs_frontend_event *event_data,
+				    void *priv)
+{
+	struct python_obs_callback *cb = priv;
+
+	if (cb->base.removed) {
+		obs_frontend_remove_event_callback(frontend_event_callback, cb);
+		return;
+	}
+
+	lock_python();
+
+	PyObject *args = Py_BuildValue("(i)", event_data);
+
+	struct python_obs_callback *last_cb = cur_python_cb;
+	cur_python_cb = cb;
+	cur_python_script = (struct obs_python_script *)cb->base.script;
+
+	PyObject *py_ret = PyObject_CallObject(cb->func, args);
+	Py_XDECREF(py_ret);
+	py_error();
+
+	cur_python_script = NULL;
+	cur_python_cb = last_cb;
+
+	Py_XDECREF(args);
+
+	unlock_python();
+}
+
+static PyObject *remove_event_callback(PyObject *self, PyObject *args)
+{
+	struct obs_python_script *script = cur_python_script;
+	PyObject *py_cb = NULL;
+
+	UNUSED_PARAMETER(self);
+
+	if (!parse_args(args, "O", &py_cb))
+		return python_none();
+	if (!py_cb || !PyFunction_Check(py_cb))
+		return python_none();
+
+	struct python_obs_callback *cb =
+		find_python_obs_callback(script, py_cb);
+	if (cb)
+		remove_python_obs_callback(cb);
+	return python_none();
+}
+
+static void add_event_callback_defer(void *cb)
+{
+	obs_frontend_add_event_callback(frontend_event_callback, cb);
+}
+
+static PyObject *add_event_callback(PyObject *self, PyObject *args)
+{
+	struct obs_python_script *script = cur_python_script;
+	PyObject *py_cb = NULL;
+
+	UNUSED_PARAMETER(self);
+
+	if (!parse_args(args, "O", &py_cb))
+		return python_none();
+	if (!py_cb || !PyFunction_Check(py_cb))
+		return python_none();
+
+	struct python_obs_callback *cb = add_python_obs_callback(script, py_cb);
+	defer_call_post(add_event_callback_defer, cb);
+	return python_none();
+}
+
 /* ----------------------------------- */
 
 void add_python_frontend_funcs(PyObject *module)
@@ -353,6 +424,8 @@ void add_python_frontend_funcs(PyObject *module)
 		DEF_FUNC(set_current_profile),
 		DEF_FUNC(remove_save_callback),
 		DEF_FUNC(add_save_callback),
+		DEF_FUNC(remove_event_callback),
+		DEF_FUNC(add_event_callback),
 
 #undef DEF_FUNC
 		{0}};