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