aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/GuiLua
diff options
context:
space:
mode:
authorDavid Walter Seikel2014-05-16 19:06:37 +1000
committerDavid Walter Seikel2014-05-16 19:06:37 +1000
commitf5475a9c4287a9d36306d2f5fac5931dd1c8da24 (patch)
tree936af739e3515a2c90b69ec4cea97a5ff8c11424 /src/GuiLua
parentFor llDialog(), add a simple implementation to LSLGuiMess, and call it badly ... (diff)
downloadSledjHamr-f5475a9c4287a9d36306d2f5fac5931dd1c8da24.zip
SledjHamr-f5475a9c4287a9d36306d2f5fac5931dd1c8da24.tar.gz
SledjHamr-f5475a9c4287a9d36306d2f5fac5931dd1c8da24.tar.bz2
SledjHamr-f5475a9c4287a9d36306d2f5fac5931dd1c8da24.tar.xz
Try to do actions in the environment of the window that owns the widget this is the action for.
Still failing somehow, but not getting any useful errors.
Diffstat (limited to 'src/GuiLua')
-rw-r--r--src/GuiLua/GuiLua.c80
1 files changed, 78 insertions, 2 deletions
diff --git a/src/GuiLua/GuiLua.c b/src/GuiLua/GuiLua.c
index 211f4e7..a3b5a58 100644
--- a/src/GuiLua/GuiLua.c
+++ b/src/GuiLua/GuiLua.c
@@ -155,6 +155,28 @@ win.quitter.colour.r = 5 -> direct access to the table, well "direct" via Th
155*/ 155*/
156 156
157 157
158static int traceBack(lua_State *L)
159{
160 const char *msg = "";
161 int top = lua_gettop(L);
162// int i;
163
164// printf("Stack is %d deep\n", top);
165// for (i = 1; i <= top; i++)
166// dumpStack(L, i);
167
168 if (top)
169 msg = lua_tostring(L, 1);
170 lua_getglobal(L, "debug");
171 push_lua(L, "@ ( )", lua_gettop(L), "traceback", 1);
172 lua_pushstring(L, "\n");
173 lua_pushstring(L, msg);
174 lua_concat(L, 3);
175
176 return 1;
177}
178
179
158// TODO - Should be able to open external and internal windows, and even switch between them on the fly. 180// TODO - Should be able to open external and internal windows, and even switch between them on the fly.
159static void _on_click(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) 181static void _on_click(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
160{ 182{
@@ -165,8 +187,62 @@ static void _on_click(void *data, Evas_Object *obj, void *event_info EINA_UNUSED
165 lua_State *L = wid->data; 187 lua_State *L = wid->data;
166 188
167 PD("Doing action %s", wid->action); 189 PD("Doing action %s", wid->action);
168 if (0 != luaL_dostring(L, wid->action)) 190
169 PE("Error running - %s", wid->action); 191/*
192get the table wid->win->module from C registry
193int lua_setfenv (lua_State *L, int index); // pop table from stack and set it as the environment for the value at index
194 // If the value at the given index is neither a function nor a thread nor a userdata, lua_setfenv returns 0. Otherwise it returns 1.
195
196lauL_doString -> (luaL_loadstring(L, str) || lua_pcall(L, 0, LUA_MULTRET, 0))
197 luaL_loadstring(L, str) -> lua_load -> pushes a function
198*/
199 if (wid->win->module)
200 {
201 int _M, _T;
202
203 lua_getfield(L, LUA_REGISTRYINDEX, wid->win->module);
204 _M = lua_gettop(L);
205 lua_pushcfunction(L, traceBack);
206 _T = lua_gettop(L);
207
208 // Consistancy would be good, just sayin'.
209 if (luaL_loadstring(L, wid->action))
210 {
211 const char *err = lua_tostring(L, 1);
212
213 PE("Error parsing - %s, ERROR %s", wid->action, err);
214 }
215 else
216 {
217 if (0 == lua_setfenv(L, _M))
218 {
219 int err;
220
221 if ((err = lua_pcall(L, 0, LUA_MULTRET, _T)))
222 {
223 const char *err_type;
224
225 switch (err)
226 {
227 case LUA_ERRRUN: err_type = "runtime"; break;
228 case LUA_ERRSYNTAX: err_type = "syntax"; break;
229 case LUA_ERRMEM: err_type = "memory allocation"; break;
230 case LUA_ERRERR: err_type = "error handler"; break;
231 default: err_type = "unknown"; break;
232 }
233 PE("Error running - %s, \n%s - %s", wid->action, err_type, lua_tostring(L, -1));
234 }
235 }
236 else
237 PE("Error setting environment for - %s", wid->action);
238 }
239
240 }
241 else
242 {
243 if (0 != luaL_dostring(L, wid->action))
244 PE("Error running - %s", wid->action);
245 }
170 } 246 }
171} 247}
172 248