patch 9.1.1347: small problems with gui_w32.c

Commit: 
https://github.com/vim/vim/commit/411ae580a9149072be29756d3a654b78c96add0b
Author: John Marriott <basil...@internode.on.net>
Date:   Sun Apr 27 15:05:06 2025 +0200

    patch 9.1.1347: small problems with gui_w32.c
    
    Problem:  small problems with gui_w32.c
    Solution: fix compile warnings and refactor code (John Marriott)
    
    Compiler (clang v20.1.3) warnings on `_OnMenuSelect()` and
    `_OnGetDpiScaledSize()`:
    ```
    clang -c -I. -Iproto -DWIN32 -DWINVER=0x0601 -D_WIN32_WINNT=0x0601
    -DHAVE_PATHDEF -DFEAT_HUGE -DHAVE_STDINT_H -D__USE_MINGW_ANSI_STDIO
    -pipe -Wall -Wno-deprecated-declarations -D_REENTRANT -U_FORTIFY_SOURCE
    -D_FORTIFY_SOURCE=1 -Wall -Wextra -Wshadow -Wstrict-prototypes
    -Wmissing-prototypes -Wno-deprecated-declarations
    -Wno-error=missing-field-initializers -Werror=uninitialized
    -Wunused-but-set-variable -DEXITFREE -DFEAT_GUI_MSWIN -DFEAT_CLIPBOARD
    gui_w32.c -o gobjx86-64/gui_w32.o
    gui_w32.c:5038:55: warning: comparison of integers of different signs:
    'UINT' (aka 'unsigned int') and 'int' [-Wsign-compare]
     5038 |                 && GetMenuState(s_menuBar, pMenu->id, MF_BYCOMMAND) 
!= -1)
          | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~~
    gui_w32.c:5054:26: warning: unused parameter 'hwnd' [-Wunused-parameter]
     5054 | _OnGetDpiScaledSize(HWND hwnd, UINT dpi, SIZE *size)
          |                          ^
    2 warnings generated.
    ```
    
    This commit contains the following changes:
    - Fixes Warning 1:
      The prototype of `GetMenuState()` says that it returns a UINT, but
      returns -1 on failure. Huh?!?
    
      Also, Microsoft says that this function has been superseded (see
      
https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getmenustate)
      and replaced by `GetMenuItemInfo()`. Both of these functions have a
      minimum support of Windows 2000.
      Therefore in `_OnMenuSelect()`, replace the call to `GetMenuState()`
      with `GetMenuItemInfo()`.
    
    - Fixes Warning 2:
      Add `UNUSED` to the definition of `_OnGetDpiScaledSize()`.
    
    - Simplify `logfont2name()`.
    - Add small optimisations in `_OnNotify()` and `gui_mch_do_spawn()`.
    - Add out-of-memory check in `gui_mch_do_spawn()`.
    - Code cosmetics (see definitions of `process_message_usual_key_classic()`
      and `process_message()`).
    
    closes: #17208
    
    Signed-off-by: John Marriott <basil...@internode.on.net>
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/gui_w32.c b/src/gui_w32.c
index 0debae9bf..4e6eca897 100644
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -2157,7 +2157,8 @@ static void process_message_usual_key(UINT vk, const MSG 
*pmsg)
  * Experimental implementation, introduced in v8.2.4807
  * "processing key event in Win32 GUI is not ideal"
  */
-static void process_message_usual_key_experimental(UINT vk, const MSG *pmsg)
+    static void
+process_message_usual_key_experimental(UINT vk, const MSG *pmsg)
 {
     WCHAR      ch[8];
     int                len;
@@ -2237,7 +2238,8 @@ static void process_message_usual_key_experimental(UINT 
vk, const MSG *pmsg)
 /*
  * "Classic" implementation, existing prior to v8.2.4807
  */
-static void process_message_usual_key_classic(UINT vk, const MSG *pmsg)
+    static void
+process_message_usual_key_classic(UINT vk, const MSG *pmsg)
 {
     char_u     string[40];
 
@@ -3673,12 +3675,11 @@ gui_mch_exit(int rc UNUSED)
     static char_u *
 logfont2name(LOGFONTW lf)
 {
-    char       *p;
-    char       *res;
     char       *charset_name;
     char       *quality_name;
     char       *font_name;
-    int                points;
+    size_t     res_size;
+    char       *res;
 
     font_name = (char *)utf16_to_enc(lf.lfFaceName, NULL);
     if (font_name == NULL)
@@ -3686,43 +3687,48 @@ logfont2name(LOGFONTW lf)
     charset_name = charset_id2name((int)lf.lfCharSet);
     quality_name = quality_id2name((int)lf.lfQuality);
 
-    res = alloc(strlen(font_name) + 30
-                   + (charset_name == NULL ? 0 : strlen(charset_name) + 2)
-                   + (quality_name == NULL ? 0 : strlen(quality_name) + 2));
+    res_size = STRLEN(font_name) + 30
+                   + (charset_name == NULL ? 0 : STRLEN(charset_name) + 2)
+                   + (quality_name == NULL ? 0 : STRLEN(quality_name) + 2);
+    res = alloc(res_size);
     if (res != NULL)
     {
-       p = res;
+       char    *p;
+       int     points;
+       size_t  res_len;
+
+       // replace spaces in font_name with underscores.
+       for (p = font_name; *p != NUL; ++p)
+       {
+           if (isspace(*p))
+               *p = '_';
+       }
+
        // make a normal font string out of the lf thing:
        points = pixels_to_points(
                         lf.lfHeight < 0 ? -lf.lfHeight : lf.lfHeight, TRUE);
        if (lf.lfWeight == FW_NORMAL || lf.lfWeight == FW_BOLD)
-           sprintf((char *)p, "%s:h%d", font_name, points);
+           res_len = vim_snprintf_safelen(
+               (char *)res, res_size, "%s:h%d", font_name, points);
        else
-           sprintf((char *)p, "%s:h%d:W%ld", font_name, points, lf.lfWeight);
-       while (*p)
-       {
-           if (*p == ' ')
-               *p = '_';
-           ++p;
-       }
-       if (lf.lfItalic)
-           STRCAT(p, ":i");
-       if (lf.lfWeight == FW_BOLD)
-           STRCAT(p, ":b");
-       if (lf.lfUnderline)
-           STRCAT(p, ":u");
-       if (lf.lfStrikeOut)
-           STRCAT(p, ":s");
+           res_len = vim_snprintf_safelen(
+               (char *)res, res_size, "%s:h%d:W%ld", font_name, points, 
lf.lfWeight);
+
+       res_len += vim_snprintf_safelen(
+           (char *)res + res_len,
+           res_size - res_len,
+           "%s%s%s%s",
+           lf.lfItalic ? ":i" : "",
+           lf.lfWeight ? ":b" : "",
+           lf.lfUnderline ? ":u" : "",
+           lf.lfStrikeOut ? ":s" : "");
+
        if (charset_name != NULL)
-       {
-           STRCAT(p, ":c");
-           STRCAT(p, charset_name);
-       }
+           res_len += vim_snprintf_safelen((char *)res + res_len,
+               res_size - res_len, ":c%s", charset_name);
        if (quality_name != NULL)
-       {
-           STRCAT(p, ":q");
-           STRCAT(p, quality_name);
-       }
+           vim_snprintf((char *)res + res_len,
+               res_size - res_len, ":q%s", quality_name);
     }
 
     vim_free(font_name);
@@ -4975,9 +4981,10 @@ _OnNotify(HWND hwnd, UINT id, NMHDR *hdr)
                else
                {
                    LPNMTTDISPINFO      lpdi = (LPNMTTDISPINFO)hdr;
+                   size_t              len = STRLEN(str);
 
-                   if (STRLEN(str) < sizeof(lpdi->szText)
-                           || ((tt_text = vim_strsave(str)) == NULL))
+                   if (len < sizeof(lpdi->szText)
+                           || ((tt_text = vim_strnsave(str, len)) == NULL))
                        vim_strncpy((char_u *)lpdi->szText, str,
                                sizeof(lpdi->szText) - 1);
                    else
@@ -5020,7 +5027,6 @@ _OnMenuSelect(HWND hwnd, WPARAM wParam, LPARAM lParam)
            == MF_HILITE
            && (State & MODE_CMDLINE) == 0)
     {
-       UINT        idButton;
        vimmenu_T   *pMenu;
        static int  did_menu_tip = FALSE;
 
@@ -5032,17 +5038,23 @@ _OnMenuSelect(HWND hwnd, WPARAM wParam, LPARAM lParam)
            did_menu_tip = FALSE;
        }
 
-       idButton = (UINT)LOWORD(wParam);
-       pMenu = gui_mswin_find_menu(root_menu, idButton);
-       if (pMenu != NULL && pMenu->strings[MENU_INDEX_TIP] != 0
-               && GetMenuState(s_menuBar, pMenu->id, MF_BYCOMMAND) != -1)
+       pMenu = gui_mswin_find_menu(root_menu, (UINT)LOWORD(wParam));
+       if (pMenu != NULL && pMenu->strings[MENU_INDEX_TIP] != NULL)
        {
-           ++msg_hist_off;
-           msg((char *)pMenu->strings[MENU_INDEX_TIP]);
-           --msg_hist_off;
-           setcursor();
-           out_flush();
-           did_menu_tip = TRUE;
+           MENUITEMINFO menuinfo;
+
+           menuinfo.cbSize = sizeof(MENUITEMINFO);
+           menuinfo.fMask = MIIM_ID;               // We only want to check if 
the menu item exists,
+                                                   // so retrieve something 
simple.
+           if (GetMenuItemInfo(s_menuBar, pMenu->id, FALSE, &menuinfo))
+           {
+               ++msg_hist_off;
+               msg((char *)pMenu->strings[MENU_INDEX_TIP]);
+               --msg_hist_off;
+               setcursor();
+               out_flush();
+               did_menu_tip = TRUE;
+           }
        }
        return 0L;
     }
@@ -5051,7 +5063,7 @@ _OnMenuSelect(HWND hwnd, WPARAM wParam, LPARAM lParam)
 #endif
 
     static BOOL
-_OnGetDpiScaledSize(HWND hwnd, UINT dpi, SIZE *size)
+_OnGetDpiScaledSize(HWND hwnd UNUSED, UINT dpi, SIZE *size)
 {
     int                old_width, old_height;
     int                new_width, new_height;
@@ -5394,7 +5406,12 @@ gui_mch_do_spawn(char_u *arg)
        if (session == NULL)
            goto error;
        savebg = p_bg;
-       p_bg = vim_strsave((char_u *)"light");  // Set 'bg' to "light".
+       p_bg = vim_strnsave((char_u *)"light", 5);      // Set 'bg' to "light".
+       if (p_bg == NULL)
+       {
+           p_bg = savebg;
+           goto error;
+       }
        ret = write_session_file(session);
        vim_free(p_bg);
        p_bg = savebg;
diff --git a/src/version.c b/src/version.c
index c4db34af8..b805d70cf 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1347,
 /**/
     1346,
 /**/

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/E1u91qZ-00B4fD-6p%40256bit.org.

Raspunde prin e-mail lui