Mercurial > hg > xemacs-beta
diff src/objects-msw.c @ 359:8e84bee8ddd0 r21-1-9
Import from CVS: tag r21-1-9
author | cvs |
---|---|
date | Mon, 13 Aug 2007 10:57:55 +0200 |
parents | 4711e16a8e49 |
children | 7347b34c275b |
line wrap: on
line diff
--- a/src/objects-msw.c Mon Aug 13 10:57:07 2007 +0200 +++ b/src/objects-msw.c Mon Aug 13 10:57:55 2007 +0200 @@ -1464,6 +1464,91 @@ #endif /* MULE */ +DEFUN ("mswindows-shell-execute", Fmswindows_shell_execute, 2, 4, 0, /* +Get Windows to perform OPERATION on DOCUMENT. +This is a wrapper around the ShellExecute system function, which +invokes the application registered to handle OPERATION for DOCUMENT. +OPERATION is typically \"open\", \"print\" or \"explore\" (but can be +nil for the default action), and DOCUMENT is typically the name of a +document file or URL, but can also be a program executable to run or +a directory to open in the Windows Explorer. + +If DOCUMENT is a program executable, PARAMETERS can be a string +containing command line parameters, but otherwise should be nil. + +SHOW-FLAG can be used to control whether the invoked application is hidden +or minimized. If SHOW-FLAG is nil, the application is displayed normally, +otherwise it is an integer representing a ShowWindow flag: + + 0 - start hidden + 1 - start normally + 3 - start maximized + 6 - start minimized +*/ + (operation, document, parameters, show_flag)) +{ + /* 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); + + /* 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)) + { + GET_C_STRING_FILENAME_DATA_ALLOCA (current_dir, f); +#ifdef __CYGWIN32__ + CYGWIN_WIN32_PATH (f, path); +#else + path = f; +#endif + } + + if (STRINGP (document)) + { + GET_C_STRING_FILENAME_DATA_ALLOCA (document, f); + 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"); + + return Qnil; +} + /************************************************************************/ /* non-methods */ @@ -1493,6 +1578,7 @@ syms_of_objects_mswindows (void) { DEFSUBR (Fmswindows_color_list); + DEFSUBR (Fmswindows_shell_execute); } void