From c001c1b19cf46b5db0c7abfe3d92aad0f49282b0 Mon Sep 17 00:00:00 2001 From: Martin Peach Date: Tue, 31 Jan 2012 22:21:16 +0000 Subject: Right-click opens .pdlua script in an editor. .pdluax still doesn't work unless script is in same directory Pd was started from. svn path=/trunk/externals/loaders/pdlua/; revision=15930 --- src/pd.lua | 10 ++++++++++ src/pdlua.c | 42 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/pd.lua b/src/pd.lua index 36ba28d..311330d 100644 --- a/src/pd.lua +++ b/src/pd.lua @@ -83,6 +83,13 @@ pd._whoami = function (object) end end +--class method dispatcher +pd._get_class = function (object) + if nil ~= pd._objects[object] then + return pd._objects[object]:get_class() + end +end + -- prototypical OO system pd.Prototype = { } function pd.Prototype:new(o) @@ -288,6 +295,9 @@ end function pd.Class:whoami() return self._scriptname or self._name end +function pd.Class:get_class() -- accessor for t_class* + return self._class or nil +end local lua = pd.Class:new():register("pdlua") -- global controls (the [pdlua] object only) function lua:initialize(sel, atoms) diff --git a/src/pdlua.c b/src/pdlua.c index bfd99eb..09e264c 100644 --- a/src/pdlua.c +++ b/src/pdlua.c @@ -395,6 +395,9 @@ static void pdlua_free( t_pdlua *o /**< The object to destruct. */) static void pdlua_menu_open(t_pdlua *o) { const char *name; + const char *path; + char pathname[FILENAME_MAX]; + t_class *class; #ifdef PDLUA_DEBUG post("pdlua_menu_open"); @@ -412,7 +415,34 @@ static void pdlua_menu_open(t_pdlua *o) #ifdef PDLUA_DEBUG post("pdlua_menu_open: L is %p, name is %s", L, name); #endif // PDLUA_DEBUG - if (name) sys_vgui("::pd_menucommands::menu_openfile {%s}\n", name); + if (name) + { + if (name[strlen(name)-1] == 'x') + { + /* pdluax is a class, the particular file should loadable by name alone, we hope */ + sprintf(pathname, "%s", name); + } + else + { + lua_getglobal(L, "pd"); + lua_getfield(L, -1, "_get_class"); + lua_pushlightuserdata(L, o); + if (lua_pcall(L, 1, 1, 0)) + { + error("lua: error in get_class:\n%s", lua_tostring(L, -1)); + return; + } + class = (t_class *)lua_touserdata(L, -1); + path = class->c_externdir->s_name; + sprintf(pathname, "%s/%s", path, name); + } +#if PD_MAJOR_VERSION==0 && PD_MINOR_VERSION<43 + post("Opening %s for editing", pathname); +#else + logpost(NULL, 3, "Opening %s for editing", pathname); +#endif + sys_vgui("::pd_menucommands::menu_openfile {%s}\n", pathname); + } } /** Lua class registration. This is equivalent to the "setup" method for an ordinary Pd class */ @@ -459,6 +489,10 @@ static int pdlua_object_new(lua_State *L) t_class *c = lua_touserdata(L, 1); if (c) { +#ifdef PDLUA_DEBUG + char *path = c->c_externdir->s_name; + post("pdlua_object_new: path is %s", path); +#endif // PDLUA_DEBUG t_pdlua *o = (t_pdlua *) pd_new(c); if (o) { @@ -1121,6 +1155,7 @@ static int pdlua_error(lua_State *L) { t_pdlua *o; + const char *s; if (lua_islightuserdata(L, 1)) @@ -1203,6 +1238,9 @@ static int pdlua_dofile(lua_State *L) fd = canvas_open(o->canvas, filename, "", buf, &ptr, MAXPDSTRING, 1); if (fd >= 0) { +#ifdef PDLUA_DEBUG + post("pdlua_dofile path is %s", buf); +#endif // PDLUA_DEBUG pdlua_setrequirepath(L, buf); reader.fd = fd; if (lua_load(L, pdlua_reader, &reader, filename)) @@ -1370,7 +1408,7 @@ void pdlua_setup(void) t_pdlua_readerdata reader; int fd; int result; - char* pdluaver = "pdlua 0.6 (GPL) 2011 Martin Peach, based on"; + char* pdluaver = "pdlua 0.7 (GPL) 2012 Martin Peach, based on"; char* luaver = "lua 0.6~svn (GPL) 2008 Claude Heiland-Allen "; char compiled[MAXPDSTRING]; -- cgit v1.2.1