Mercurial > hg > xemacs-beta
diff src/console-msw.c @ 412:697ef44129c6 r21-2-14
Import from CVS: tag r21-2-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:20:41 +0200 |
parents | de805c49cfc1 |
children | 11054d720c21 |
line wrap: on
line diff
--- a/src/console-msw.c Mon Aug 13 11:19:22 2007 +0200 +++ b/src/console-msw.c Mon Aug 13 11:20:41 2007 +0200 @@ -1,5 +1,5 @@ /* Console functions for mswindows. - Copyright (C) 1996, 2000 Ben Wing. + Copyright (C) 1996 Ben Wing. This file is part of XEmacs. @@ -29,53 +29,11 @@ #include <config.h> #include "lisp.h" -#include "buffer.h" #include "console-msw.h" -#include "events.h" -#include "opaque.h" + DEFINE_CONSOLE_TYPE (mswindows); -DEFINE_CONSOLE_TYPE (msprinter); -Lisp_Object Qabortretryignore; -Lisp_Object Qapplmodal; -Lisp_Object Qdefault_desktop_only; -Lisp_Object Qdefbutton1; -Lisp_Object Qdefbutton2; -Lisp_Object Qdefbutton3; -Lisp_Object Qdefbutton4; -/* Lisp_Object Qhelp; */ -Lisp_Object Qiconasterisk; -Lisp_Object Qiconexclamation; -Lisp_Object Qiconhand; -Lisp_Object Qiconinformation; -Lisp_Object Qiconquestion; -Lisp_Object Qiconstop; -/* Lisp_Object Qok; */ -Lisp_Object Qokcancel; -Lisp_Object Qretrycancel; -/* Lisp_Object Qright; */ -Lisp_Object Qrtlreading; -Lisp_Object Qservice_notification; -Lisp_Object Qsetforeground; -Lisp_Object Qsystemmodal; -Lisp_Object Qtaskmodal; -Lisp_Object Qtopmost; -Lisp_Object Qyesno; -Lisp_Object Qyesnocancel; - -/* Lisp_Object Qabort; */ -/* Lisp_Object Qcancel; */ -/* Lisp_Object Qignore; */ -/* Lisp_Object Qno; */ -/* Lisp_Object Qok; */ -/* Lisp_Object Qretry; */ -/* Lisp_Object Qyes; */ - - -/************************************************************************/ -/* mswindows console methods */ -/************************************************************************/ static int mswindows_initially_selected_for_input (struct console *con) @@ -83,469 +41,7 @@ return 1; } -static HWND mswindows_console_hwnd = 0; -#define KLUDGE_BUFSIZE 1024 /* buffer size for console window titles */ - -/* Direct from the horse's mouth: Microsoft KB article Q124103 */ -static HWND -GetConsoleHwnd (void) -{ - HWND hwndFound; /* this is what is returned to the caller */ - char pszNewWindowTitle[KLUDGE_BUFSIZE]; /* contains fabricated WindowTitle */ - char pszOldWindowTitle[KLUDGE_BUFSIZE]; /* contains original WindowTitle */ - - /* fetch current window title */ - - GetConsoleTitle(pszOldWindowTitle, KLUDGE_BUFSIZE); - - /* format a "unique" NewWindowTitle */ - - wsprintf(pszNewWindowTitle,"%d/%d", - GetTickCount(), - GetCurrentProcessId()); - - /* change current window title */ - - SetConsoleTitle(pszNewWindowTitle); - - /* ensure window title has been updated */ - - Sleep(40); - - /* look for NewWindowTitle */ - - hwndFound=FindWindow(NULL, pszNewWindowTitle); - - /* restore original window title */ - - SetConsoleTitle(pszOldWindowTitle); - - return(hwndFound); -} - -HWND -mswindows_get_console_hwnd (void) -{ - if (!mswindows_console_hwnd) - mswindows_console_hwnd = GetConsoleHwnd (); - return mswindows_console_hwnd; -} - -static int -mswindows_ensure_console_allocated (void) -{ - HWND fgwin = GetForegroundWindow (); - /* stupid mswin api won't let you create the console window - hidden! creating it changes the focus! fuck me! */ - if (AllocConsole ()) - { - SetForegroundWindow (fgwin); - return 1; - } - return 0; -} - -static Lisp_Object -mswindows_canonicalize_console_connection (Lisp_Object connection, - Error_behavior errb) -{ - /* Do not allow more than one mswindows device, by explicitly - requiring that CONNECTION is nil, the only allowed connection in - Windows. */ - if (!NILP (connection)) - { - if (ERRB_EQ (errb, ERROR_ME)) - signal_simple_error - ("Invalid (non-nil) connection for mswindows device/console", - connection); - else - return Qunbound; - } - - return Qnil; -} - -static Lisp_Object -mswindows_canonicalize_device_connection (Lisp_Object connection, - Error_behavior errb) -{ - return mswindows_canonicalize_console_connection (connection, errb); -} - -void -mswindows_hide_console (void) -{ - ShowWindow (mswindows_get_console_hwnd (), SW_HIDE); -} - -void -mswindows_show_console (void) -{ - HWND hwnd = mswindows_get_console_hwnd (); - ShowWindow (hwnd, SW_SHOWNA); - - /* I tried to raise the window to the top without activating - it, but this fails. Apparently Windows just doesn't like - having the active window not be on top. So instead, we - at least put it just below our own window, where part of it - will likely be seen. */ - SetWindowPos (hwnd, GetForegroundWindow (), 0, 0, 0, 0, - SWP_NOSIZE | SWP_NOMOVE | SWP_NOSENDCHANGING | - SWP_NOACTIVATE); -} - -static int mswindows_console_buffered = 0; -HANDLE mswindows_console_buffer; - -static void -mswindows_ensure_console_buffered (void) -{ - if (!mswindows_console_buffered) - { - COORD new_size; - - new_size.X = 80; - new_size.Y = 1000; - mswindows_ensure_console_allocated (); - mswindows_console_buffer = - CreateConsoleScreenBuffer (GENERIC_WRITE, 0, NULL, - CONSOLE_TEXTMODE_BUFFER, NULL); - SetConsoleScreenBufferSize (mswindows_console_buffer, new_size); - SetConsoleActiveScreenBuffer (mswindows_console_buffer); - mswindows_console_buffered = 1; - } -} - -int mswindows_message_outputted; - -int -mswindows_output_console_string (CONST Extbyte *str, Extcount len) -{ - DWORD num_written; - - mswindows_message_outputted = 1; - mswindows_ensure_console_buffered (); - mswindows_show_console (); - return WriteConsole (mswindows_console_buffer, str, len, &num_written, NULL); -} - -/* Determine if running on Windows 9x and not NT */ -int -mswindows_windows9x_p (void) -{ - return GetVersion () & 0x80000000; -} - - -#ifdef DEBUG_XEMACS - -/* - * Random helper functions for debugging. - * Intended for use in the MSVC "Watch" window which doesn't like - * the aborts that the error_check_foo() functions can make. - */ -struct lrecord_header *DHEADER (Lisp_Object obj); -struct lrecord_header * -DHEADER (Lisp_Object obj) -{ - return LRECORDP (obj) ? XRECORD_LHEADER (obj) : NULL; -} - -void *DOPAQUE_DATA (Lisp_Object obj); -void * -DOPAQUE_DATA (Lisp_Object obj) -{ - return OPAQUEP (obj) ? OPAQUE_DATA (XOPAQUE (obj)) : NULL; -} - -Lisp_Event *DEVENT (Lisp_Object obj); -Lisp_Event * -DEVENT (Lisp_Object obj) -{ - return EVENTP (obj) ? XEVENT (obj) : NULL; -} - -Lisp_Cons *DCONS (Lisp_Object obj); -Lisp_Cons * -DCONS (Lisp_Object obj) -{ - return CONSP (obj) ? XCONS (obj) : NULL; -} - -Lisp_Cons *DCONSCDR (Lisp_Object obj); -Lisp_Cons * -DCONSCDR (Lisp_Object obj) -{ - return (CONSP (obj) && CONSP (XCDR (obj))) ? XCONS (XCDR (obj)) : 0; -} - -Bufbyte *DSTRING (Lisp_Object obj); -Bufbyte * -DSTRING (Lisp_Object obj) -{ - return STRINGP (obj) ? XSTRING_DATA (obj) : NULL; -} - -Lisp_Vector *DVECTOR (Lisp_Object obj); -Lisp_Vector * -DVECTOR (Lisp_Object obj) -{ - return VECTORP (obj) ? XVECTOR (obj) : NULL; -} - -Lisp_Symbol *DSYMBOL (Lisp_Object obj); -Lisp_Symbol * -DSYMBOL (Lisp_Object obj) -{ - return SYMBOLP (obj) ? XSYMBOL (obj) : NULL; -} - -Bufbyte *DSYMNAME (Lisp_Object obj); -Bufbyte * -DSYMNAME (Lisp_Object obj) -{ - return SYMBOLP (obj) ? string_data (XSYMBOL (obj)->name) : NULL; -} - -#endif /* DEBUG_XEMACS */ - -DEFUN ("mswindows-message-box", Fmswindows_message_box, 1, 3, 0, /* -Pop up an MS Windows message box. -MESSAGE is the string to display. Optional argument FLAG controls -what appears in the box and how it behaves; it is a symbol or list of -symbols, described below. Second optional argument TITLE controls the -title bar; if omitted, a standard title bar will be used, probably -displaying "XEmacs". - -Possible flags are - - --- To specify the buttons in the message box: - -abortretryignore - The message box contains three push buttons: Abort, Retry, and Ignore. -ok - The message box contains one push button: OK. This is the default. -okcancel - The message box contains two push buttons: OK and Cancel. -retrycancel - The message box contains two push buttons: Retry and Cancel. -yesno - The message box contains two push buttons: Yes and No. -yesnocancel - The message box contains three push buttons: Yes, No, and Cancel. - - --- To display an icon in the message box: - -iconexclamation, iconwarning - An exclamation-point icon appears in the message box. -iconinformation, iconasterisk - An icon consisting of a lowercase letter i in a circle appears in - the message box. -iconquestion - A question-mark icon appears in the message box. -iconstop, iconerror, iconhand - A stop-sign icon appears in the message box. - - --- To indicate the default button: - -defbutton1 - The first button is the default button. This is the default. -defbutton2 - The second button is the default button. -defbutton3 - The third button is the default button. -defbutton4 - The fourth button is the default button. - - --- To indicate the modality of the dialog box: - -applmodal - The user must respond to the message box before continuing work in - the window identified by the hWnd parameter. However, the user can - move to the windows of other applications and work in those windows. - Depending on the hierarchy of windows in the application, the user - may be able to move to other windows within the application. All - child windows of the parent of the message box are automatically - disabled, but popup windows are not. This is the default. -systemmodal - Same as applmodal except that the message box has the WS_EX_TOPMOST - style. Use system-modal message boxes to notify the user of serious, - potentially damaging errors that require immediate attention (for - example, running out of memory). This flag has no effect on the - user's ability to interact with windows other than those associated - with hWnd. -taskmodal - Same as applmodal except that all the top-level windows belonging to - the current task are disabled if the hWnd parameter is NULL. Use - this flag when the calling application or library does not have a - window handle available but still needs to prevent input to other - windows in the current application without suspending other - applications. - - -In addition, you can specify the following flags: - -default-desktop-only - The desktop currently receiving input must be a default desktop; - otherwise, the function fails. A default desktop is one an - application runs on after the user has logged on. -help - Adds a Help button to the message box. Choosing the Help button or - pressing F1 generates a Help event. -right - The text is right-justified. -rtlreading - Displays message and caption text using right-to-left reading order - on Hebrew and Arabic systems. -setforeground - The message box becomes the foreground window. Internally, Windows - calls the SetForegroundWindow function for the message box. -topmost - The message box is created with the WS_EX_TOPMOST window style. -service-notification - Windows NT only: The caller is a service notifying the user of an - event. The function displays a message box on the current active - desktop, even if there is no user logged on to the computer. If - this flag is set, the hWnd parameter must be NULL. This is so the - message box can appear on a desktop other than the desktop - corresponding to the hWnd. - - - -The return value is one of the following menu-item values returned by -the dialog box: - -abort - Abort button was selected. -cancel - Cancel button was selected. -ignore - Ignore button was selected. -no - No button was selected. -ok - OK button was selected. -retry - Retry button was selected. -yes - Yes button was selected. - -If a message box has a Cancel button, the function returns the -`cancel' value if either the ESC key is pressed or the Cancel button -is selected. If the message box has no Cancel button, pressing ESC has -no effect. */ - (message_, flags, title)) -{ - Lisp_Object tail; - Extbyte *msgout; - Extbyte *titleout = 0; - UINT sty = 0; - - if (noninteractive) - return Qcancel; - - if (!CONSP (flags)) - { - CHECK_SYMBOL (flags); - flags = list1 (flags); - } - - CHECK_STRING (message_); - TO_EXTERNAL_FORMAT (LISP_STRING, message_, - C_STRING_ALLOCA, msgout, - Qmswindows_tstr); - - if (!NILP (title)) - { - CHECK_STRING (title); - TO_EXTERNAL_FORMAT (LISP_STRING, title, - C_STRING_ALLOCA, titleout, - Qmswindows_tstr); - } - - EXTERNAL_LIST_LOOP (tail, flags) - { - Lisp_Object st = XCAR (tail); - CHECK_SYMBOL (st); - if (0) - ; -#define FROB(sym, val) else if (EQ (st, sym)) sty |= val - FROB (Qabortretryignore, MB_ABORTRETRYIGNORE); - FROB (Qapplmodal, MB_APPLMODAL); - FROB (Qdefault_desktop_only, MB_DEFAULT_DESKTOP_ONLY); - FROB (Qdefbutton1, MB_DEFBUTTON1); - FROB (Qdefbutton2, MB_DEFBUTTON2); - FROB (Qdefbutton3, MB_DEFBUTTON3); - FROB (Qdefbutton4, MB_DEFBUTTON4); - FROB (Qhelp, MB_HELP); - FROB (Qiconasterisk, MB_ICONASTERISK); - FROB (Qiconexclamation, MB_ICONEXCLAMATION); - FROB (Qiconhand, MB_ICONHAND); - FROB (Qiconinformation, MB_ICONINFORMATION); - FROB (Qiconquestion, MB_ICONQUESTION); - FROB (Qiconstop, MB_ICONSTOP); - FROB (Qok, MB_OK); - FROB (Qokcancel, MB_OKCANCEL); - FROB (Qretrycancel, MB_RETRYCANCEL); - FROB (Qright, MB_RIGHT); - FROB (Qrtlreading, MB_RTLREADING); - FROB (Qservice_notification, MB_SERVICE_NOTIFICATION); - FROB (Qsetforeground, MB_SETFOREGROUND); - FROB (Qsystemmodal, MB_SYSTEMMODAL); - FROB (Qtaskmodal, MB_TASKMODAL); - FROB (Qtopmost, MB_TOPMOST); - FROB (Qyesno, MB_YESNO); - FROB (Qyesnocancel, MB_YESNOCANCEL); -#undef FROB - - else - signal_simple_error ("Unrecognized flag", st); - } - - { - int retval = MessageBox (NULL, msgout, titleout, sty); - - if (retval == 0) - error ("Out of memory when calling `mswindows-message-box'"); - -#define FROB(sym, val) if (retval == val) return sym - FROB (Qabort, IDABORT); - FROB (Qcancel, IDCANCEL); - FROB (Qignore, IDIGNORE); - FROB (Qno, IDNO); - FROB (Qok, IDOK); - FROB (Qretry, IDRETRY); - FROB (Qyes, IDYES); -#undef FROB - - signal_simple_error ("Unknown return value from MessageBox()", - make_int (retval)); - } - - return Qnil; -} - -void -mswindows_output_last_error (char *frob) -{ - LPVOID lpMsgBuf; - int errval = GetLastError(); - - FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER - | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, errval, - MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &lpMsgBuf, - 0, - NULL); - stderr_out ("last error during %s is %d: %s\n", - frob, errval, (char*)lpMsgBuf); -} /************************************************************************/ @@ -555,42 +51,6 @@ void syms_of_console_mswindows (void) { - defsymbol (&Qabortretryignore, "abortretryignore"); - defsymbol (&Qapplmodal, "applmodal"); - defsymbol (&Qdefault_desktop_only, "default-desktop-only"); - defsymbol (&Qdefbutton1, "defbutton1"); - defsymbol (&Qdefbutton2, "defbutton2"); - defsymbol (&Qdefbutton3, "defbutton3"); - defsymbol (&Qdefbutton4, "defbutton4"); - /* defsymbol (&Qhelp, "help"); */ - defsymbol (&Qiconasterisk, "iconasterisk"); - defsymbol (&Qiconexclamation, "iconexclamation"); - defsymbol (&Qiconhand, "iconhand"); - defsymbol (&Qiconinformation, "iconinformation"); - defsymbol (&Qiconquestion, "iconquestion"); - defsymbol (&Qiconstop, "iconstop"); - /* defsymbol (&Qok, "ok"); */ - defsymbol (&Qokcancel, "okcancel"); - defsymbol (&Qretrycancel, "retrycancel"); - /* defsymbol (&Qright, "right"); */ - defsymbol (&Qrtlreading, "rtlreading"); - defsymbol (&Qservice_notification, "service-notification"); - defsymbol (&Qsetforeground, "setforeground"); - defsymbol (&Qsystemmodal, "systemmodal"); - defsymbol (&Qtaskmodal, "taskmodal"); - defsymbol (&Qtopmost, "topmost"); - defsymbol (&Qyesno, "yesno"); - defsymbol (&Qyesnocancel, "yesnocancel"); - - /* defsymbol (&Qabort, "abort"); */ - /* defsymbol (&Qcancel, "cancel"); */ - /* defsymbol (&Qignore, "ignore"); */ - /* defsymbol (&Qno, "no"); */ - /* defsymbol (&Qok, "ok"); */ - /* defsymbol (&Qretry, "retry"); */ - /* defsymbol (&Qyes, "yes"); */ - - DEFSUBR (Fmswindows_message_box); } void @@ -603,19 +63,10 @@ /* CONSOLE_HAS_METHOD (mswindows, mark_console); */ CONSOLE_HAS_METHOD (mswindows, initially_selected_for_input); /* CONSOLE_HAS_METHOD (mswindows, delete_console); */ - CONSOLE_HAS_METHOD (mswindows, canonicalize_console_connection); - CONSOLE_HAS_METHOD (mswindows, canonicalize_device_connection); +/* CONSOLE_HAS_METHOD (mswindows, canonicalize_console_connection); */ +/* CONSOLE_HAS_METHOD (mswindows, canonicalize_device_connection); */ /* CONSOLE_HAS_METHOD (mswindows, semi_canonicalize_console_connection); */ /* CONSOLE_HAS_METHOD (mswindows, semi_canonicalize_device_connection); */ - - INITIALIZE_CONSOLE_TYPE (msprinter, "msprinter", "console-msprinter-p"); -} - -void -reinit_console_type_create_mswindows (void) -{ - REINITIALIZE_CONSOLE_TYPE (mswindows); - REINITIALIZE_CONSOLE_TYPE (msprinter); } void @@ -623,3 +74,68 @@ { Fprovide (Qmswindows); } + + +#ifdef DEBUG_XEMACS +#include "events.h" +#include "opaque.h" +/* + * Random helper functions for debugging. + * Intended for use in the MSVC "Watch" window which doesn't like + * the aborts that the error_check_foo() functions can make. + */ +struct lrecord_header * +DHEADER (Lisp_Object obj) +{ + return LRECORDP (obj) ? XRECORD_LHEADER (obj) : NULL; +} + +void * +DOPAQUE_DATA (Lisp_Object obj) +{ + return OPAQUEP (obj) ? OPAQUE_DATA (XOPAQUE (obj)) : NULL; +} + +struct Lisp_Event * +DEVENT (Lisp_Object obj) +{ + return EVENTP (obj) ? XEVENT (obj) : NULL; +} + +struct Lisp_Cons * +DCONS (Lisp_Object obj) +{ + return CONSP (obj) ? XCONS (obj) : NULL; +} + +struct Lisp_Cons * +DCONSCDR (Lisp_Object obj) +{ + return (CONSP (obj) && CONSP (XCDR (obj))) ? XCONS (XCDR (obj)) : 0; +} + +Bufbyte * +DSTRING (Lisp_Object obj) +{ + return STRINGP (obj) ? XSTRING_DATA (obj) : NULL; +} + +struct Lisp_Vector * +DVECTOR (Lisp_Object obj) +{ + return VECTORP (obj) ? XVECTOR (obj) : NULL; +} + +struct Lisp_Symbol * +DSYMBOL (Lisp_Object obj) +{ + return SYMBOLP (obj) ? XSYMBOL (obj) : NULL; +} + +Bufbyte * +DSYMNAME (Lisp_Object obj) +{ + return SYMBOLP (obj) ? string_data (XSYMBOL (obj)->name) : NULL; +} + +#endif