David Hedberg : winecfg: Fix for paths containing utf-8.
Alexandre Julliard
julliard at winehq.org
Mon Feb 9 10:29:54 CST 2009
Module: wine
Branch: master
Commit: 0b3064215b0f61dcc00a1a31bd81848b415fc1a8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0b3064215b0f61dcc00a1a31bd81848b415fc1a8
Author: David Hedberg <david.hedberg at gmail.com>
Date: Sat Feb 7 00:37:32 2009 +0100
winecfg: Fix for paths containing utf-8.
---
programs/winecfg/driveui.c | 62 +++++++++++++++++++++++++++++---------------
programs/winecfg/theme.c | 13 ---------
programs/winecfg/winecfg.h | 13 +++++++++
3 files changed, 54 insertions(+), 34 deletions(-)
diff --git a/programs/winecfg/driveui.c b/programs/winecfg/driveui.c
index b9bcd2d..acad07a 100644
--- a/programs/winecfg/driveui.c
+++ b/programs/winecfg/driveui.c
@@ -86,34 +86,34 @@ static int lv_get_curr_select(HWND dialog)
}
/* sets the item in the listview at item->iIndex */
-static void lv_set_item(HWND dialog, LVITEM *item)
+static void lv_set_item(HWND dialog, LVITEMW *item)
{
- SendDlgItemMessage(dialog, IDC_LIST_DRIVES, LVM_SETITEM, 0, (LPARAM) item);
+ SendDlgItemMessageW(dialog, IDC_LIST_DRIVES, LVM_SETITEMW, 0, (LPARAM) item);
}
/* sets specified item's text */
-static void lv_set_item_text(HWND dialog, int item, int subItem, char *text)
+static void lv_set_item_text(HWND dialog, int item, int subItem, WCHAR *text)
{
- LVITEM lvItem;
+ LVITEMW lvItem;
if (item < 0 || subItem < 0) return;
lvItem.mask = LVIF_TEXT;
lvItem.iItem = item;
lvItem.iSubItem = subItem;
lvItem.pszText = text;
- lvItem.cchTextMax = lstrlen(lvItem.pszText);
+ lvItem.cchTextMax = lstrlenW(lvItem.pszText);
lv_set_item(dialog, &lvItem);
}
/* inserts an item into the listview */
-static void lv_insert_item(HWND dialog, LVITEM *item)
+static void lv_insert_item(HWND dialog, LVITEMW *item)
{
- SendDlgItemMessage(dialog, IDC_LIST_DRIVES, LVM_INSERTITEM, 0, (LPARAM) item);
+ SendDlgItemMessageW(dialog, IDC_LIST_DRIVES, LVM_INSERTITEMW, 0, (LPARAM) item);
}
/* retrieve the item at index item->iIndex */
-static void lv_get_item(HWND dialog, LVITEM *item)
+static void lv_get_item(HWND dialog, LVITEMW *item)
{
- SendDlgItemMessage(dialog, IDC_LIST_DRIVES, LVM_GETITEM, 0, (LPARAM) item);
+ SendDlgItemMessageW(dialog, IDC_LIST_DRIVES, LVM_GETITEMW, 0, (LPARAM) item);
}
static void set_advanced(HWND dialog)
@@ -235,7 +235,8 @@ static int fill_drives_list(HWND dialog)
for(i = 0; i < 26; i++)
{
- LVITEM item;
+ LVITEMW item;
+ WCHAR *path;
char letter[4];
/* skip over any unused drives */
@@ -252,12 +253,16 @@ static int fill_drives_list(HWND dialog)
item.mask = LVIF_TEXT | LVIF_PARAM;
item.iItem = count;
item.iSubItem = 0;
- item.pszText = letter;
- item.cchTextMax = lstrlen(item.pszText);
+ item.pszText = strdupU2W(letter);
+ item.cchTextMax = lstrlenW(item.pszText);
item.lParam = (LPARAM) &drives[i];
lv_insert_item(dialog, &item);
- lv_set_item_text(dialog, count, 1, drives[i].unixpath);
+ HeapFree(GetProcessHeap(), 0, item.pszText);
+
+ path = strdupU2W(drives[i].unixpath);
+ lv_set_item_text(dialog, count, 1, path);
+ HeapFree(GetProcessHeap(), 0, path);
count++;
}
@@ -341,7 +346,7 @@ static void on_remove_click(HWND dialog)
{
int itemIndex;
struct drive *drive;
- LVITEM item;
+ LVITEMW item;
itemIndex = lv_get_curr_select(dialog);
if (itemIndex == -1) return; /* no selection */
@@ -379,12 +384,12 @@ static void on_remove_click(HWND dialog)
static void update_controls(HWND dialog)
{
static const WCHAR emptyW[1];
- char *path;
+ WCHAR *path;
unsigned int type;
char serial[16];
const char *device;
int i, selection = -1;
- LVITEM item;
+ LVITEMW item;
updating_ui = TRUE;
@@ -406,9 +411,10 @@ static void update_controls(HWND dialog)
WINE_TRACE("Updating sheet for drive %c\n", current_drive->letter);
/* path */
- path = current_drive->unixpath;
- WINE_TRACE("set path control text to '%s'\n", path);
- set_text(dialog, IDC_EDIT_PATH, path);
+ WINE_TRACE("set path control text to '%s'\n", current_drive->unixpath);
+ path = strdupU2W(current_drive->unixpath);
+ set_textW(dialog, IDC_EDIT_PATH, path);
+ HeapFree(GetProcessHeap(), 0, path);
/* drive type */
type = current_drive->type;
@@ -498,9 +504,22 @@ static void on_edit_changed(HWND dialog, WORD id)
case IDC_EDIT_PATH:
{
+ WCHAR *wpath;
char *path;
+ int lenW;
+
+ wpath = get_textW(dialog, id);
+ if( (lenW = WideCharToMultiByte(CP_UNIXCP, 0, wpath, -1, NULL, 0, NULL, NULL)) )
+ {
+ path = HeapAlloc(GetProcessHeap(), 0, lenW);
+ WideCharToMultiByte(CP_UNIXCP, 0, wpath, -1, path, lenW, NULL, NULL);
+ }
+ else
+ {
+ path = NULL;
+ wpath = strdupU2W("drive_c");
+ }
- path = get_text(dialog, id);
HeapFree(GetProcessHeap(), 0, current_drive->unixpath);
current_drive->unixpath = path ? path : strdupA("drive_c");
current_drive->modified = TRUE;
@@ -508,7 +527,8 @@ static void on_edit_changed(HWND dialog, WORD id)
WINE_TRACE("set path to %s\n", current_drive->unixpath);
lv_set_item_text(dialog, lv_get_curr_select(dialog), 1,
- current_drive->unixpath);
+ wpath);
+ HeapFree(GetProcessHeap(), 0, wpath);
/* enable the apply button */
SendMessage(GetParent(dialog), PSM_CHANGED, (WPARAM) dialog, 0);
diff --git a/programs/winecfg/theme.c b/programs/winecfg/theme.c
index 6b67b4e..537a113 100644
--- a/programs/winecfg/theme.c
+++ b/programs/winecfg/theme.c
@@ -732,19 +732,6 @@ static struct ShellFolderInfo *psfiSelected = NULL;
#define NUM_ELEMS(x) (sizeof(x)/sizeof(*(x)))
-/* create a unicode string from a string in Unix locale */
-static WCHAR *strdupU2W(const char *unix_str)
-{
- WCHAR *unicode_str;
- int lenW;
-
- lenW = MultiByteToWideChar(CP_UNIXCP, 0, unix_str, -1, NULL, 0);
- unicode_str = HeapAlloc(GetProcessHeap(), 0, lenW * sizeof(WCHAR));
- if (unicode_str)
- MultiByteToWideChar(CP_UNIXCP, 0, unix_str, -1, unicode_str, lenW);
- return unicode_str;
-}
-
static void init_shell_folder_listview_headers(HWND dialog) {
LVCOLUMN listColumn;
RECT viewRect;
diff --git a/programs/winecfg/winecfg.h b/programs/winecfg/winecfg.h
index f929500..dcfb64d 100644
--- a/programs/winecfg/winecfg.h
+++ b/programs/winecfg/winecfg.h
@@ -135,6 +135,19 @@ static inline WCHAR *strdupW(const WCHAR *s)
return lstrcpyW(r, s);
}
+/* create a unicode string from a string in Unix locale */
+static inline WCHAR *strdupU2W(const char *unix_str)
+{
+ WCHAR *unicode_str;
+ int lenW;
+
+ lenW = MultiByteToWideChar(CP_UNIXCP, 0, unix_str, -1, NULL, 0);
+ unicode_str = HeapAlloc(GetProcessHeap(), 0, lenW * sizeof(WCHAR));
+ if (unicode_str)
+ MultiByteToWideChar(CP_UNIXCP, 0, unix_str, -1, unicode_str, lenW);
+ return unicode_str;
+}
+
static inline char *get_text(HWND dialog, WORD id)
{
HWND item = GetDlgItem(dialog, id);
More information about the wine-cvs
mailing list