X-Git-Url: http://git.chise.org/gitweb/?p=chise%2Fxemacs-chise.git.1;a=blobdiff_plain;f=src%2Fgui-msw.c;h=029d616f583b9f7114a5abf072e37f7294cae87f;hp=67c84b09b23a101133b2e08de1293e51ac23777d;hb=3e447015251ce6dcde843cbed10d9033d5538622;hpb=716cfba952c1dc0d2cf5c968971f3780ba728a89 diff --git a/src/gui-msw.c b/src/gui-msw.c index 67c84b0..029d616 100644 --- a/src/gui-msw.c +++ b/src/gui-msw.c @@ -82,25 +82,69 @@ otherwise it is an integer representing a ShowWindow flag: */ (operation, document, parameters, show_flag)) { - Lisp_Object current_dir; + /* Encode filename and current directory. */ + Lisp_Object current_dir = Ffile_name_directory (document); + char* path = NULL; + char* doc = NULL; + Extbyte* f=0; + int ret; + struct gcpro gcpro1, gcpro2; CHECK_STRING (document); - /* Encode filename and current directory. */ - current_dir = current_buffer->directory; - if ((int) ShellExecute (NULL, - (STRINGP (operation) ? - XSTRING (operation)->data : NULL), - XSTRING (document)->data, - (STRINGP (parameters) ? - XSTRING (parameters)->data : NULL), - XSTRING (current_dir)->data, - (INTP (show_flag) ? - XINT (show_flag) : SW_SHOWDEFAULT)) - > 32) + /* Just get the filename if we were given it. */ + document = Ffile_name_nondirectory (document); + + if (NILP (current_dir)) + current_dir = current_buffer->directory; + + GCPRO2 (current_dir, document); + + /* Use mule and cygwin-safe APIs top get at file data. */ + if (STRINGP (current_dir)) + { + TO_EXTERNAL_FORMAT (LISP_STRING, current_dir, + C_STRING_ALLOCA, f, + Qfile_name); +#ifdef __CYGWIN32__ + CYGWIN_WIN32_PATH (f, path); +#else + path = f; +#endif + } + + if (STRINGP (document)) + { + TO_EXTERNAL_FORMAT (LISP_STRING, document, + C_STRING_ALLOCA, f, + Qfile_name); + doc = f; + } + + UNGCPRO; + + ret = (int) ShellExecute (NULL, + (STRINGP (operation) ? + XSTRING_DATA (operation) : NULL), + doc, + (STRINGP (parameters) ? + XSTRING_DATA (parameters) : NULL), + path, + (INTP (show_flag) ? + XINT (show_flag) : SW_SHOWDEFAULT)); + + if (ret > 32) return Qt; + + if (ret == ERROR_FILE_NOT_FOUND || ret == SE_ERR_FNF) + signal_simple_error ("file not found", document); + else if (ret == ERROR_PATH_NOT_FOUND || ret == SE_ERR_PNF) + signal_simple_error ("path not found", current_dir); + else if (ret == ERROR_BAD_FORMAT) + signal_simple_error ("bad executable format", document); + else + error ("internal error"); - error ("ShellExecute failed"); return Qnil; }