1 /* mswindows GUI code. (menubars, scrollbars, toolbars, dialogs)
2 Copyright (C) 1998 Andy Piper.
4 This file is part of XEmacs.
6 XEmacs is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with XEmacs; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
21 /* Synched up with: Not in FSF. */
26 #include "redisplay.h"
29 #include "console-msw.h"
33 * Return value is Qt if we have dispatched the command,
34 * or Qnil if id has not been mapped to a callback.
35 * Window procedure may try other targets to route the
36 * command if we return nil
39 mswindows_handle_gui_wm_command (struct frame* f, HWND ctrl, DWORD id)
41 /* Try to map the command id through the proper hash table */
42 Lisp_Object data, fn, arg, frame;
44 /* #### make_int should assert that --kkm */
45 assert (XINT (make_int (id)) == id);
47 data = Fgethash (make_int (id),
48 FRAME_MSWINDOWS_WIDGET_HASH_TABLE (f), Qnil);
50 if (NILP (data) || UNBOUNDP (data))
53 MARK_SUBWINDOWS_STATE_CHANGED;
54 /* Ok, this is our one. Enqueue it. */
55 get_gui_callback (data, &fn, &arg);
57 mswindows_enqueue_misc_user_event (frame, fn, arg);
62 DEFUN ("mswindows-shell-execute", Fmswindows_shell_execute, 2, 4, 0, /*
63 Get Windows to perform OPERATION on DOCUMENT.
64 This is a wrapper around the ShellExecute system function, which
65 invokes the application registered to handle OPERATION for DOCUMENT.
66 OPERATION is typically \"open\", \"print\" or \"explore\" (but can be
67 nil for the default action), and DOCUMENT is typically the name of a
68 document file or URL, but can also be a program executable to run or
69 a directory to open in the Windows Explorer.
71 If DOCUMENT is a program executable, PARAMETERS can be a string
72 containing command line parameters, but otherwise should be nil.
74 SHOW-FLAG can be used to control whether the invoked application is hidden
75 or minimized. If SHOW-FLAG is nil, the application is displayed normally,
76 otherwise it is an integer representing a ShowWindow flag:
83 (operation, document, parameters, show_flag))
85 /* Encode filename and current directory. */
86 Lisp_Object current_dir = Ffile_name_directory (document);
91 struct gcpro gcpro1, gcpro2;
93 CHECK_STRING (document);
95 /* Just get the filename if we were given it. */
96 document = Ffile_name_nondirectory (document);
98 if (NILP (current_dir))
99 current_dir = current_buffer->directory;
101 GCPRO2 (current_dir, document);
103 /* Use mule and cygwin-safe APIs top get at file data. */
104 if (STRINGP (current_dir))
106 TO_EXTERNAL_FORMAT (LISP_STRING, current_dir,
110 CYGWIN_WIN32_PATH (f, path);
116 if (STRINGP (document))
118 TO_EXTERNAL_FORMAT (LISP_STRING, document,
126 ret = (int) ShellExecute (NULL,
127 (STRINGP (operation) ?
128 XSTRING_DATA (operation) : NULL),
130 (STRINGP (parameters) ?
131 XSTRING_DATA (parameters) : NULL),
134 XINT (show_flag) : SW_SHOWDEFAULT));
139 if (ret == ERROR_FILE_NOT_FOUND || ret == SE_ERR_FNF)
140 signal_simple_error ("file not found", document);
141 else if (ret == ERROR_PATH_NOT_FOUND || ret == SE_ERR_PNF)
142 signal_simple_error ("path not found", current_dir);
143 else if (ret == ERROR_BAD_FORMAT)
144 signal_simple_error ("bad executable format", document);
146 error ("internal error");
152 syms_of_gui_mswindows (void)
154 DEFSUBR (Fmswindows_shell_execute);