From 55dcfc158861268dcc1bb2c524d6612f5aa86192 Mon Sep 17 00:00:00 2001 From: Andrew Innes Date: Sun, 2 May 1999 10:23:06 +0000 Subject: [PATCH] [andrewi] (w32_list_bdf_fonts): Initialize n_fonts. (Fw32_shell_execute): New function; used to support browse-url. (syms_of_w32fns): Register it. (w32_load_system_font): Force max width to be average char width for fixed-pitch fonts, to avoid unnecessary redisplay slowdown. (x_to_w32_charset): Define VIETNAMESE_CHARSET if not already defined. (syms_of_w32fns): Set Vw32_phantom_key_code to 255. [jasonr] (w32_wnd_proc) [WM_PAINT]: Use rectangle from GetUpdateRect rather than BeginPaint. (w32_wnd_proc): Attach to current foreground thread when grabbing focus; necessary on NT 5.0. (w32_wnd_proc) [W32_DEBUG_DISPLAY]: Add output for debugging display messages. (w32_to_x_charset): Put wildcard last in unknown charsets to avoid false matching. --- src/w32fns.c | 111 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 95 insertions(+), 16 deletions(-) diff --git a/src/w32fns.c b/src/w32fns.c index e11cf2c9e9b..6c58227f63b 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -3719,18 +3719,38 @@ w32_wnd_proc (hwnd, msg, wParam, lParam) } return 0; case WM_PAINT: - { - PAINTSTRUCT paintStruct; - - enter_crit (); - BeginPaint (hwnd, &paintStruct); - wmsg.rect = paintStruct.rcPaint; - EndPaint (hwnd, &paintStruct); - leave_crit (); - - my_post_msg (&wmsg, hwnd, msg, wParam, lParam); - - return (0); + { + PAINTSTRUCT paintStruct; + RECT update_rect; + + /* MSDN Docs say not to call BeginPaint if GetUpdateRect + fails. Apparently this can happen under some + circumstances. */ + if (GetUpdateRect (hwnd, &update_rect, FALSE)) + { + enter_crit (); + BeginPaint (hwnd, &paintStruct); + + /* The rectangles returned by GetUpdateRect and BeginPaint + do not always match. GetUpdateRect seems to be the + more reliable of the two. */ + wmsg.rect = update_rect; + +#if defined (W32_DEBUG_DISPLAY) + DebPrint (("WM_PAINT: painting %d,%d-%d,%d\n", wmsg.rect.left, + wmsg.rect.top, wmsg.rect.right, wmsg.rect.bottom)); + DebPrint (("WM_PAINT: update region is %d,%d-%d,%d\n", + update_rect.left, update_rect.top, + update_rect.right, update_rect.bottom)); +#endif + EndPaint (hwnd, &paintStruct); + leave_crit (); + + my_post_msg (&wmsg, hwnd, msg, wParam, lParam); + + return 0; + } + return 1; } case WM_INPUTLANGCHANGE: @@ -4960,9 +4980,9 @@ struct font_info *w32_load_bdf_font (struct frame *f, char *fontname, struct font_info * w32_load_system_font (f,fontname,size) -struct frame *f; -char * fontname; -int size; + struct frame *f; + char * fontname; + int size; { struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (f); Lisp_Object font_names; @@ -5046,6 +5066,21 @@ int size; ok = GetTextMetrics (hdc, &font->tm); SelectObject (hdc, oldobj); ReleaseDC (dpyinfo->root_window, hdc); + + /* [andrewi, 25-Apr-99] A number of fixed pitch fonts, + eg. Courier New and perhaps others, report a max width which + is larger than the average character width, at least on some + NT systems (I don't understand why - my best guess is that it + results from installing the CJK language packs for NT4). + Unfortunately, this forces the redisplay code in dumpglyphs + to draw text character by character. + + I don't like this hack, but it seems better to force the max + width to match the average width if the font is marked as + fixed pitch, for the sake of redisplay performance. */ + + if ((font->tm.tmPitchAndFamily & TMPF_FIXED_PITCH) == 0) + font->tm.tmMaxCharWidth = font->tm.tmAveCharWidth; } UNBLOCK_INPUT; @@ -5799,7 +5834,7 @@ Lisp_Object w32_list_bdf_fonts (Lisp_Object pattern, int max_names) { char *fontname, *ptnstr; Lisp_Object list, tem, newlist = Qnil; - int n_fonts; + int n_fonts = 0; list = Vw32_bdf_filename_alist; ptnstr = XSTRING (pattern)->data; @@ -6957,6 +6992,49 @@ If optional parameter FRAME is not specified, use selected frame.") return Qnil; } +DEFUN ("w32-shell-execute", Fw32_shell_execute, Sw32_shell_execute, 2, 4, 0, + "Get Windows to perform OPERATION on DOCUMENT.\n\ +This is a wrapper around the ShellExecute system function, which\n\ +invokes the application registered to handle OPERATION for DOCUMENT.\n\ +OPERATION is typically \"open\", \"print\" or \"explore\", and DOCUMENT\n\ +is typically the name of a document file or URL, but can also be a\n\ +program executable to run or a directory to open in the Windows Explorer.\n\ +\n\ +If DOCUMENT is a program executable, PARAMETERS can be a list of command\n\ +line parameters, but otherwise should be nil.\n\ +\n\ +SHOW-FLAG can be used to control whether the invoked application is hidden\n\ +or minimized. If SHOw-FLAG is nil, the application is displayed normally,\n\ +otherwise it is an integer representing a ShowWindow flag:\n\ +\n\ + 0 - start hidden\n\ + 1 - start normally\n\ + 3 - start maximized\n\ + 6 - start minimized") + (operation, document, parameters, show_flag) + Lisp_Object operation, document, parameters, show_flag; +{ + Lisp_Object current_dir; + + CHECK_STRING (operation, 0); + CHECK_STRING (document, 0); + + /* Encode filename and current directory. */ + current_dir = ENCODE_FILE (current_buffer->directory); + document = ENCODE_FILE (document); + if ((int) ShellExecute (NULL, + XSTRING (operation)->data, + XSTRING (document)->data, + (STRINGP (parameters) ? + XSTRING (parameters)->data : NULL), + XSTRING (current_dir)->data, + (INTEGERP (show_flag) ? + XINT (show_flag) : SW_SHOWDEFAULT)) + > 32) + return Qt; + error ("ShellExecute failed"); +} + /* Lookup virtual keycode from string representing the name of a non-ascii keystroke into the corresponding virtual key, using lispy_function_keys. */ @@ -7501,6 +7579,7 @@ fontsets are automatically created."); defsubr (&Sw32_default_color_map); defsubr (&Sw32_load_color_file); defsubr (&Sw32_send_sys_command); + defsubr (&Sw32_shell_execute); defsubr (&Sw32_register_hot_key); defsubr (&Sw32_unregister_hot_key); defsubr (&Sw32_registered_hot_keys); -- 2.39.2