Module: wine Branch: master Commit: 0b3064215b0f61dcc00a1a31bd81848b415fc1a8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0b3064215b0f61dcc00a1a31bd...
Author: David Hedberg david.hedberg@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);