X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fgui-msw.c;h=dd858d0c71b2b6d8fa6b9cac1823bc1759e42a9b;hb=506a27d9690049e121fccf1a8947ec57e62055aa;hp=9fd0b3779fa4b67eb047c0cd7ee650dd32fdfc78;hpb=a1655b870904de973c366d85ebdc8adde4ef5e1e;p=chise%2Fxemacs-chise.git.1 diff --git a/src/gui-msw.c b/src/gui-msw.c index 9fd0b37..dd858d0 100644 --- a/src/gui-msw.c +++ b/src/gui-msw.c @@ -22,13 +22,13 @@ Boston, MA 02111-1307, USA. */ #include #include "lisp.h" +#include "console-msw.h" #include "redisplay.h" #include "gui.h" #include "glyphs.h" #include "frame.h" -#include "events.h" #include "elhash.h" -#include "console-msw.h" +#include "events.h" #include "buffer.h" /* @@ -50,6 +50,11 @@ mswindows_handle_gui_wm_command (struct frame* f, HWND ctrl, LPARAM id) 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), @@ -84,110 +89,12 @@ mswindows_handle_gui_wm_command (struct frame* f, HWND ctrl, LPARAM id) mswindows_enqueue_dispatch_event (event); /* The result of this evaluation could cause other instances to change so - enqueue an update callback to check this. We also have to make sure that - the function does not appear in the command history. - #### I'm sure someone can tell me how to optimize this. */ - mswindows_enqueue_misc_user_event - (frame, Qeval, - list3 (Qlet, - list2 (Qthis_command, - Qlast_command), - list2 (Qupdate_widget_instances, frame))); + enqueue an update callback to check this. */ + enqueue_magic_eval_event (update_widget_instances, frame); 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); - - /* 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); -#ifdef __CYGWIN32__ - CYGWIN_WIN32_PATH (f, doc); -#else - doc = f; -#endif - } - - 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) - signal_simple_error ("file not found", document); - else if (ret == ERROR_PATH_NOT_FOUND) - 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; -} - void syms_of_gui_mswindows (void) { - DEFSUBR (Fmswindows_shell_execute); }