From 15b2643791d8b6efe6075bba78acea812f368ff0 Mon Sep 17 00:00:00 2001 From: Thomas Grill Date: Mon, 1 Aug 2005 11:58:01 +0000 Subject: path setting based on new flext functionality open editor for module file on "edit" message (or click) open editor for script under OS X svn path=/trunk/; revision=3399 --- externals/grill/py/readme.txt | 1 + externals/grill/py/source/py.cpp | 4 +++ externals/grill/py/source/pyargs.cpp | 1 - externals/grill/py/source/pybase.cpp | 63 +++++++++++++++++++++++++++++++++++- externals/grill/py/source/pybase.h | 2 +- externals/grill/py/source/pyext.cpp | 4 ++- externals/grill/py/source/pyext.h | 2 ++ externals/grill/py/source/pymeth.cpp | 3 -- externals/grill/py/source/pyprefix.h | 4 +++ 9 files changed, 77 insertions(+), 7 deletions(-) (limited to 'externals/grill') diff --git a/externals/grill/py/readme.txt b/externals/grill/py/readme.txt index 0c4bc0f4..da012af9 100644 --- a/externals/grill/py/readme.txt +++ b/externals/grill/py/readme.txt @@ -99,6 +99,7 @@ Version history: - FIX: better exception handling (no longer leaves reference to function object) and cleared misleading error message - FIX: better definition of output values for atoms, lists and anythings - FIX: much better detached method handling (one thread for all object instances!) +- ADD: open module file in editor on "edit" message (or alt-click (PD) or double click (Max)) 0.2.0: - ADD: handling of Python threads diff --git a/externals/grill/py/source/py.cpp b/externals/grill/py/source/py.cpp index 4e1057e2..c7111faa 100644 --- a/externals/grill/py/source/py.cpp +++ b/externals/grill/py/source/py.cpp @@ -74,6 +74,8 @@ private: FLEXT_CALLGET_V(mg_dir) FLEXT_CALLBACK(m_doc) + FLEXT_CALLBACK(CbClick) + #ifdef FLEXT_THREADS FLEXT_CALLBACK_T(tick) #endif @@ -99,6 +101,8 @@ void pyobj::Setup(t_classid c) FLEXT_CADDMETHOD_(c,0,"set",m_set); + FLEXT_CADDMETHOD_(c,0,"edit",CbClick); + FLEXT_CADDATTR_VAR1(c,"py",pymsg); FLEXT_CADDATTR_VAR1(c,"respond",respond); } diff --git a/externals/grill/py/source/pyargs.cpp b/externals/grill/py/source/pyargs.cpp index 511baf2f..d9a91e10 100644 --- a/externals/grill/py/source/pyargs.cpp +++ b/externals/grill/py/source/pyargs.cpp @@ -175,7 +175,6 @@ const t_symbol *pybase::GetPyArgs(AtomList &lst,PyObject *pValue,int offs) if(pValue == Py_None) return sym_bang; // analyze return value or tuple - int rargc = 0; const t_symbol *sym = NULL; if(isseq(pValue)) { diff --git a/externals/grill/py/source/pybase.cpp b/externals/grill/py/source/pybase.cpp index 2457974f..69bead28 100644 --- a/externals/grill/py/source/pybase.cpp +++ b/externals/grill/py/source/pybase.cpp @@ -11,6 +11,12 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include "pybase.h" #include +#if FLEXT_OS == FLEXT_OS_WIN +#include +#elif FLEXT_OS == FLEXT_OS_MAC +#include +#endif + static PyMethodDef StdOut_Methods[] = { { "write", pybase::StdOut_Write, 1 }, @@ -295,7 +301,62 @@ void pybase::m__doc(PyObject *obj) void pybase::OpenEditor() { - // this should once open the editor.... + if(!module) return; + const char *mname = PyModule_GetFilename(module); + if(!mname) { + PyErr_Clear(); + return; + } + + char fname[1024]; + strcpy(fname,mname); + + // replacing .pyc or .pyo for source file name + char *dt = strrchr(fname,'.'); + if(dt && !strncmp(dt,".py",2)) strcpy(dt,".py"); + + // this should open the editor.... +#if FLEXT_OS == FLEXT_OS_WIN + int err = (int)ShellExecute(NULL,"edit",fname,NULL,NULL,SW_SHOW); + if(err == SE_ERR_NOASSOC) { + // no association found - try notepad + err = (int)ShellExecute(NULL,NULL,"notepad.exe",fname,NULL,SW_SHOW); + } + else if(err == ERROR_FILE_NOT_FOUND || err == SE_ERR_FNF) + post("py/pyext - File not %s found",fname); + else if(err <= 32) + post("py/pyext - Unknown error opening %s",fname); + +#elif FLEXT_OS == FLEXT_OS_MAC + FSRef ref; + OSStatus err = FSPathMakeRef(fname,&ref,NULL); + if(err) + post("py/pyext - Error interpreting path %s",fname); + else { + FSRef editor; + err = LSGetApplicationForItem(&ref,kLSRolesEditor,&editor,NULL); + if(err) { + // Can't find associated application... try Textedit + err = FSPathMakeRef("/Applications/TextEdit.app",&editor,NULL); + if(err) + post("py/pyext - Can't find Textedit application"); + } + + if(!err) { + LSLaunchFSRefSpec lspec; + lspec.appRef = &editor; + lspec.numDocs = 1; + lspec.itemRefs = &ref; + lspec.passThruParams = NULL; + lspec.launchFlags = kLSLaunchDefaults; + lspec.asyncRefCon = NULL; + err = LSOpenFromRefSpec(&lspec,NULL); + if(err) + post("py/pyext - Couldn't launch editor"); + } + } +#elif FLEXT_OS == FLEXT_OS_LINUX +#endif } void pybase::SetArgs() diff --git a/externals/grill/py/source/pybase.h b/externals/grill/py/source/pybase.h index 0da6d8fa..f0ec5640 100644 --- a/externals/grill/py/source/pybase.h +++ b/externals/grill/py/source/pybase.h @@ -124,8 +124,8 @@ protected: bool respond; #ifdef FLEXT_THREADS - bool shouldexit; int thrcount; + bool shouldexit; int stoptick; Timer stoptmr; diff --git a/externals/grill/py/source/pyext.cpp b/externals/grill/py/source/pyext.cpp index 00ff0cc4..dd4b5a67 100644 --- a/externals/grill/py/source/pyext.cpp +++ b/externals/grill/py/source/pyext.cpp @@ -41,6 +41,8 @@ void pyext::Setup(t_classid c) FLEXT_CADDMETHOD_(c,0,"get",m_get); FLEXT_CADDMETHOD_(c,0,"set",m_set); + FLEXT_CADDMETHOD_(c,0,"edit",CbClick); + FLEXT_CADDATTR_VAR1(c,"py",pymsg); FLEXT_CADDATTR_VAR1(c,"respond",respond); @@ -99,7 +101,7 @@ void pyext::SetThis() { // remember the this pointer PyObject *th = PyLong_FromVoidPtr(this); - /*int ret =*/ PyObject_SetAttrString(pyobj,"_this",th); // ref is taken + PyObject_SetAttrString(pyobj,"_this",th); // ref is taken } void pyext::ClearThis() diff --git a/externals/grill/py/source/pyext.h b/externals/grill/py/source/pyext.h index 3aaf62bf..4a4e79f1 100644 --- a/externals/grill/py/source/pyext.h +++ b/externals/grill/py/source/pyext.h @@ -145,6 +145,8 @@ private: FLEXT_CALLGET_V(mg_dir) FLEXT_CALLBACK(m_doc) + FLEXT_CALLBACK(CbClick) + #ifdef FLEXT_THREADS FLEXT_CALLBACK_T(tick) #endif diff --git a/externals/grill/py/source/pymeth.cpp b/externals/grill/py/source/pymeth.cpp index 177802b7..91ca2146 100644 --- a/externals/grill/py/source/pymeth.cpp +++ b/externals/grill/py/source/pymeth.cpp @@ -102,7 +102,6 @@ protected: virtual void Exit(); virtual bool CbMethodResort(int n,const t_symbol *s,int argc,const t_atom *argv); - virtual void CbClick(); void m_help(); @@ -423,8 +422,6 @@ bool pymeth::CbMethodResort(int n,const t_symbol *s,int argc,const t_atom *argv) return ret; } -void pymeth::CbClick() { pybase::OpenEditor(); } - void pymeth::DumpOut(const t_symbol *sym,int argc,const t_atom *argv) { ToOutAnything(GetOutAttr(),sym?sym:thisTag(),argc,argv); diff --git a/externals/grill/py/source/pyprefix.h b/externals/grill/py/source/pyprefix.h index ac97cbde..de74ca42 100644 --- a/externals/grill/py/source/pyprefix.h +++ b/externals/grill/py/source/pyprefix.h @@ -14,6 +14,10 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define FLEXT_ATTRIBUTES 1 #include +// hack: must include math.h before Python.h (at least on OSX) +// otherwise some functions don't get defined +#include + #if FLEXT_OS == FLEXT_OS_MAC #include #else -- cgit v1.2.1