int dt_lua_gtk_wrap(lua_State*L) { lua_pushvalue(L,lua_upvalueindex(1)); lua_insert(L,1); if(pthread_equal(darktable.control->gui_thread, pthread_self())) { return dt_lua_do_chunk_raise(L,lua_gettop(L)-1,LUA_MULTRET); } else { dt_lua_unlock(); gtk_wrap_communication communication; g_mutex_init(&communication.end_mutex); g_cond_init(&communication.end_cond); communication.L = L; g_mutex_lock(&communication.end_mutex); g_main_context_invoke(NULL,dt_lua_gtk_wrap_callback,&communication); g_cond_wait(&communication.end_cond,&communication.end_mutex); g_mutex_unlock(&communication.end_mutex); g_mutex_clear(&communication.end_mutex); dt_lua_lock(); if(communication.retval == LUA_OK) { return lua_gettop(L); } else { return lua_error(L); } } }
static int container_reset(lua_State* L) { lua_container container; luaA_to(L,lua_container,&container,1); lua_getuservalue(L,1); GList*children = gtk_container_get_children(GTK_CONTAINER(container->widget)); GList*curelt = children; while(curelt) { lua_pushcfunction(L,dt_lua_widget_trigger_callback); GtkWidget* cur_widget = curelt->data; luaA_push(L,lua_widget,&cur_widget); lua_pushstring(L,"reset"); dt_lua_do_chunk_raise(L,2,0); curelt = g_list_next(curelt); } lua_pop(L,1); g_list_free(children); return 0; }
static int lua_button_clicked_cb(lua_State* L) { lua_callback_data * data = lua_touserdata(L,1); dt_lua_module_entry_push(L,"lib",data->self->plugin_name); lua_getuservalue(L,-1); lua_getfield(L,-1,"callbacks"); lua_getfield(L,-1,data->key); lua_pushstring(L,data->key); GList *image = dt_collection_get_selected(darktable.collection, -1); lua_newtable(L); while(image) { luaA_push(L, dt_lua_image_t, &image->data); luaL_ref(L, -2); image = g_list_delete_link(image, image); } dt_lua_do_chunk_raise(L,2,0); return 0; }
static int lua_button_clicked_cb(lua_State* L) { lua_callback_data * data = lua_touserdata(L,1); dt_lua_module_entry_push(L,"lib",data->self->plugin_name); lua_getuservalue(L,-1); lua_getfield(L,-1,"callbacks"); lua_getfield(L,-1,data->key); lua_pushstring(L,data->key); GList *image = dt_collection_get_all(darktable.collection, -1); lua_newtable(L); while(image) { luaA_push(L, dt_lua_image_t, &image->data); luaL_ref(L, -2); image = g_list_delete_link(image, image); } dt_lua_do_chunk_raise(L,2,1); GList *new_selection = NULL; luaL_checktype(L, -1, LUA_TTABLE); lua_pushnil(L); while(lua_next(L, -2) != 0) { /* uses 'key' (at index -2) and 'value' (at index -1) */ int imgid; luaA_to(L, dt_lua_image_t, &imgid, -1); new_selection = g_list_prepend(new_selection, GINT_TO_POINTER(imgid)); lua_pop(L, 1); } new_selection = g_list_reverse(new_selection); dt_selection_clear(darktable.selection); dt_selection_select_list(darktable.selection, new_selection); g_list_free(new_selection); return 0; }