#include <config.h>
#include "lisp.h"
-#include "gui.h"
+#include "console-msw.h"
#include "redisplay.h"
+#include "gui.h"
+#include "glyphs.h"
#include "frame.h"
#include "elhash.h"
-#include "console-msw.h"
+#include "events.h"
#include "buffer.h"
/*
* command if we return nil
*/
Lisp_Object
-mswindows_handle_gui_wm_command (struct frame* f, HWND ctrl, DWORD id)
+mswindows_handle_gui_wm_command (struct frame* f, HWND ctrl, LPARAM id)
{
/* Try to map the command id through the proper hash table */
- Lisp_Object data, fn, arg, frame;
-
- /* #### make_int should assert that --kkm */
- assert (XINT (make_int (id)) == id);
+ Lisp_Object callback, callback_ex, image_instance, frame, event;
- data = Fgethash (make_int (id),
- FRAME_MSWINDOWS_WIDGET_HASH_TABLE (f), Qnil);
-
- if (NILP (data) || UNBOUNDP (data))
- return Qnil;
-
- MARK_SUBWINDOWS_STATE_CHANGED;
- /* Ok, this is our one. Enqueue it. */
- get_gui_callback (data, &fn, &arg);
XSETFRAME (frame, f);
- mswindows_enqueue_misc_user_event (frame, fn, arg);
-
- return Qt;
-}
-
-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);
- if (NILP (current_dir))
- current_dir = current_buffer->directory;
-
- GCPRO2 (current_dir, document);
+ /* #### make_int should assert that --kkm */
+ assert (XINT (make_int (id)) == id);
- /* Use mule and cygwin-safe APIs top get at file data. */
- if (STRINGP (current_dir))
+ image_instance = Fgethash (make_int (id),
+ FRAME_MSWINDOWS_WIDGET_HASH_TABLE1 (f), Qnil);
+ /* It is possible for a widget action to cause it to get out of sync
+ with its instantiator. Thus it is necessary to signal this
+ possibility. */
+ if (IMAGE_INSTANCEP (image_instance))
+ XIMAGE_INSTANCE_WIDGET_ACTION_OCCURRED (image_instance) = 1;
+ callback = Fgethash (make_int (id),
+ FRAME_MSWINDOWS_WIDGET_HASH_TABLE2 (f), Qnil);
+ callback_ex = Fgethash (make_int (id),
+ FRAME_MSWINDOWS_WIDGET_HASH_TABLE3 (f), Qnil);
+
+ if (!NILP (callback_ex) && !UNBOUNDP (callback_ex))
{
- TO_EXTERNAL_FORMAT (LISP_STRING, current_dir,
- C_STRING_ALLOCA, f,
- Qfile_name);
-#ifdef __CYGWIN32__
- CYGWIN_WIN32_PATH (f, path);
-#else
- path = f;
-#endif
+ event = Fmake_event (Qnil, Qnil);
+
+ XEVENT (event)->event_type = misc_user_event;
+ XEVENT (event)->channel = frame;
+ XEVENT (event)->timestamp = GetTickCount ();
+ XEVENT (event)->event.eval.function = Qeval;
+ XEVENT (event)->event.eval.object =
+ list4 (Qfuncall, callback_ex, image_instance, event);
}
-
- if (STRINGP (document))
+ else if (NILP (callback) || UNBOUNDP (callback))
+ return Qnil;
+ else
{
- TO_EXTERNAL_FORMAT (LISP_STRING, document,
- C_STRING_ALLOCA, f,
- Qfile_name);
-#ifdef __CYGWIN32__
- CYGWIN_WIN32_PATH (f, doc);
-#else
- doc = f;
-#endif
- }
+ Lisp_Object fn, arg;
- 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");
+ event = Fmake_event (Qnil, Qnil);
- return Qnil;
+ get_gui_callback (callback, &fn, &arg);
+ XEVENT (event)->event_type = misc_user_event;
+ XEVENT (event)->channel = frame;
+ XEVENT (event)->timestamp = GetTickCount ();
+ XEVENT (event)->event.eval.function = fn;
+ XEVENT (event)->event.eval.object = arg;
+ }
+
+ mswindows_enqueue_dispatch_event (event);
+ /* The result of this evaluation could cause other instances to change so
+ enqueue an update callback to check this. */
+ enqueue_magic_eval_event (update_widget_instances, frame);
+ return Qt;
}
void
syms_of_gui_mswindows (void)
{
- DEFSUBR (Fmswindows_shell_execute);
}