From 485d16a180fbe0d105d92aa8a0d452120f36cae3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E8=88=AA=E5=AE=87?= <3364451258@qq.com> Date: Fri, 1 May 2026 23:45:58 +0800 Subject: [PATCH] =?UTF-8?q?feat(tooltip):=20=E6=B7=BB=E5=8A=A0=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=8F=98=E9=87=8F=E5=B1=95=E5=BC=80=E9=A2=84=E8=A7=88?= =?UTF-8?q?=E6=82=AC=E5=81=9C=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 expand_env_vars 函数,调用 ExpandEnvironmentStringsA 展开 %VAR% - sync_string_list_to_ui 中对含 % 的路径设置 ITEMTIP 属性 - 鼠标悬停时显示展开后的完整路径 Co-Authored-By: Claude Opus 4.7 --- include/utils/string_ext.h | 4 ++++ src/ui/ui_utils.c | 16 +++++++++++++++- src/utils/string_ext.c | 23 +++++++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/include/utils/string_ext.h b/include/utils/string_ext.h index 6f6df2e..62a8a45 100644 --- a/include/utils/string_ext.h +++ b/include/utils/string_ext.h @@ -30,4 +30,8 @@ char *stristr(const char *haystack, const char *needle); // 检查字符串列表中是否存在指定路径(不区分大小写) int string_list_contains(const StringList *list, const char *str); +// 展开环境变量(如 %JAVA_HOME%\bin → C:\Java\bin) +// 返回 malloc 分配的字符串,调用者负责释放;无变量返回 NULL +char *expand_env_vars(const char *path); + #endif // STRING_EXT_H diff --git a/src/ui/ui_utils.c b/src/ui/ui_utils.c index 8ec9dfc..91a13c9 100644 --- a/src/ui/ui_utils.c +++ b/src/ui/ui_utils.c @@ -1,7 +1,9 @@ #include "ui/ui_utils.h" #include "utils/os_env.h" +#include "utils/string_ext.h" #include #include +#include // 刷新列表样式(斑马纹 + 有效性检查) void refresh_single_list_style(Ihandle *list) @@ -61,7 +63,19 @@ void sync_string_list_to_ui(Ihandle *list_ui, const StringList *str_list) for (int i = 0; i < str_list->count; i++) { - IupSetAttributeId(list_ui, "", i + 1, string_list_get(str_list, i)); + const char *item = string_list_get(str_list, i); + IupSetAttributeId(list_ui, "", i + 1, item); + + // 对含环境变量的路径设置悬停提示 + if (item && strchr(item, '%')) + { + char *expanded = expand_env_vars(item); + if (expanded) + { + IupSetAttributeId(list_ui, "ITEMTIP", i + 1, expanded); + free(expanded); + } + } } IupSetInt(list_ui, "COUNT", str_list->count); diff --git a/src/utils/string_ext.c b/src/utils/string_ext.c index fd8a096..7065f5e 100644 --- a/src/utils/string_ext.c +++ b/src/utils/string_ext.c @@ -139,4 +139,27 @@ int string_list_contains(const StringList *list, const char *str) return 1; } return 0; +} + +// 展开环境变量(如 %JAVA_HOME%\bin → C:\Java\bin) +char *expand_env_vars(const char *path) +{ + if (!path || !strchr(path, '%')) + return NULL; + + DWORD size = ExpandEnvironmentStringsA(path, NULL, 0); + if (size == 0) + return NULL; + + char *expanded = (char *)malloc(size); + if (!expanded) + return NULL; + + if (ExpandEnvironmentStringsA(path, expanded, size) == 0) + { + free(expanded); + return NULL; + } + + return expanded; } \ No newline at end of file