static void run_async_thread_main(gpointer data,gpointer user_data) { // lua lock ownership transfered from parent thread int thread_num = GPOINTER_TO_INT(data); lua_State*L = darktable.lua_state.state; lua_State* thread = get_thread(L,thread_num); if(!thread) { dt_print(DT_DEBUG_LUA, "LUA ERROR : no thread found, this should never happen\n"); return; } dt_lua_finish_callback cb = lua_touserdata(thread,1); void * cb_data = lua_touserdata(thread,2); int nresults = lua_tointeger(thread, 3); lua_pushcfunction(thread,create_backtrace); lua_insert(thread,4); int thread_result = lua_pcall(thread, lua_gettop(thread)-5,nresults,4); if(cb) { cb(thread,thread_result,cb_data); } else { dt_lua_check_print_error(thread,thread_result); } drop_thread(L,thread_num); dt_lua_unlock(); return; }
int dt_lua_treated_pcall(lua_State*L, int nargs, int nresults) { lua_pushcfunction(L,create_backtrace); lua_insert(L,1); int result = dt_lua_check_print_error(L,lua_pcall(L,nargs,nresults,1)); lua_remove(L,1); return result; }
static int run_early_script(lua_State* L) { char tmp_path[PATH_MAX] = { 0 }; // run global init script dt_loc_get_datadir(tmp_path, sizeof(tmp_path)); g_strlcat(tmp_path, "/luarc", sizeof(tmp_path)); dt_lua_check_print_error(L,luaL_dofile(L,tmp_path)); if(darktable.gui != NULL) { // run user init script dt_loc_get_user_config_dir(tmp_path, sizeof(tmp_path)); g_strlcat(tmp_path, "/luarc", sizeof(tmp_path)); dt_lua_check_print_error(L,luaL_dofile(L,tmp_path)); } if(!lua_isnil(L,1)){ const char *lua_command = lua_tostring(L, 1); dt_lua_check_print_error(L,luaL_dostring(L,lua_command)); } dt_lua_redraw_screen(); return 0; }
static int run_early_script(lua_State* L) { char basedir[PATH_MAX] = { 0 }; // run global init script dt_loc_get_datadir(basedir, sizeof(basedir)); char *luarc = g_build_filename(basedir, "luarc", NULL); dt_lua_check_print_error(L, luaL_dofile(L, luarc)); g_free(luarc); if(darktable.gui != NULL) { // run user init script dt_loc_get_user_config_dir(basedir, sizeof(basedir)); luarc = g_build_filename(basedir, "luarc", NULL); dt_lua_check_print_error(L, luaL_dofile(L, luarc)); g_free(luarc); } if(!lua_isnil(L,1)){ const char *lua_command = lua_tostring(L, 1); dt_lua_check_print_error(L,luaL_dostring(L,lua_command)); } dt_lua_redraw_screen(); return 0; }
static void dbus_lua_call_finished(lua_State* L,int result,void* data) { GDBusMethodInvocation *invocation = (GDBusMethodInvocation*)data; if(result == LUA_OK) { if(lua_isnil(L, -1)) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(s)", "")); } else { const char *checkres = luaL_checkstring(L, -1); g_dbus_method_invocation_return_value(invocation, g_variant_new("(s)", checkres)); } } else { const char *msg = luaL_checkstring(L, -1); g_dbus_method_invocation_return_dbus_error(invocation, "org.darktable.Error.LuaError", msg); dt_lua_check_print_error(L,result); } }
static gboolean string_job_dispatch (GSource* source, GSourceFunc callback, gpointer user_data) { gpointer message; message = g_async_queue_try_pop (darktable.lua_state.string_job_queue); if (message == NULL) { return TRUE; } string_call_data* data = (string_call_data*)message; dt_lua_lock(); lua_State* L= darktable.lua_state.state; lua_State *new_thread = lua_newthread(L); int reference = save_thread(L); lua_pushlightuserdata(new_thread,data->cb); lua_pushlightuserdata(new_thread,data->cb_data); lua_pushinteger(new_thread,data->nresults); int load_result = luaL_loadstring(new_thread, data->function); if(load_result != LUA_OK) { if(data->cb) { data->cb(new_thread,load_result,data->cb_data); } else { dt_lua_check_print_error(new_thread,load_result); } drop_thread(L,reference); dt_lua_unlock(); string_data_destroy(data); return G_SOURCE_CONTINUE; } run_async_thread(L,reference); dt_lua_unlock(); string_data_destroy(data); return G_SOURCE_CONTINUE; }