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