tImproved Win32 Unicode support; menu items, clists and GetWindowText are now Unicode-aware. Work-around for the apparent API change in Windows XP common controls of LB_INSERTSTRING and LB_ADDSTRING so that GtkCLists work again. - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 5840ac9f9788cc197aa9ddc02411d03bc96906ab
 (DIR) parent 1dc52b6615f65f064246b23e9bc1633c9f5c9866
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Fri, 23 Aug 2002 16:16:34 +0000
       
       Improved Win32 Unicode support; menu items, clists and GetWindowText
       are now Unicode-aware. Work-around for the apparent API change in
       Windows XP common controls of LB_INSERTSTRING and LB_ADDSTRING so
       tthat GtkCLists work again.
       
       
       Diffstat:
         M src/gtkport/clist.c                 |      38 +++++++++++++++++--------------
         M src/gtkport/gtkport.c               |      28 +++++++++++++---------------
         M src/gtkport/gtkport.h               |       3 +--
         M src/gtkport/unicodewrap.c           |     220 +++++++++++++++++++++++++++++--
         M src/gtkport/unicodewrap.h           |      17 ++++++++++++++---
       
       5 files changed, 259 insertions(+), 47 deletions(-)
       ---
 (DIR) diff --git a/src/gtkport/clist.c b/src/gtkport/clist.c
       t@@ -31,6 +31,8 @@
        #include <windows.h>
        #include <commctrl.h>
        
       +#include "unicodewrap.h"
       +
        #define LISTITEMHPACK  3
        #define LISTHEADERPACK 6
        
       t@@ -167,11 +169,11 @@ void gtk_clist_realize(GtkWidget *widget)
          GTK_WIDGET_SET_FLAGS(widget, GTK_CAN_FOCUS);
          rcParent.left = rcParent.top = 0;
          rcParent.right = rcParent.bottom = 800;
       -  header = CreateWindowEx(0, WC_HEADER, NULL,
       -                          WS_CHILD | WS_BORDER | HDS_HORZ
       -                          | (GTK_CLIST(widget)->coldata[0].button_passive ?
       -                             0 : HDS_BUTTONS),
       -                          0, 0, 0, 0, Parent, NULL, hInst, NULL);
       +  header = myCreateWindowEx(0, WC_HEADER, NULL,
       +                            WS_CHILD | WS_BORDER | HDS_HORZ
       +                            | (GTK_CLIST(widget)->coldata[0].button_passive ?
       +                               0 : HDS_BUTTONS),
       +                            0, 0, 0, 0, Parent, NULL, hInst, NULL);
          SetWindowLong(header, GWL_USERDATA, (LONG)widget);
          GTK_CLIST(widget)->header = header;
          gtk_set_default_font(header);
       t@@ -179,18 +181,19 @@ void gtk_clist_realize(GtkWidget *widget)
          hdl.pwpos = &wp;
          SendMessage(header, HDM_LAYOUT, 0, (LPARAM)&hdl);
          clist->header_size = wp.cy;
       -  widget->hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", "",
       -                                WS_CHILD | WS_TABSTOP | WS_VSCROLL
       -                                | WS_HSCROLL | LBS_OWNERDRAWFIXED
       -                                | LBS_NOTIFY, 0, 0, 0, 0, Parent, NULL,
       -                                hInst, NULL);
       +  widget->hWnd = myCreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", "",
       +                                  WS_CHILD | WS_TABSTOP | WS_VSCROLL
       +                                  | WS_HSCROLL | LBS_OWNERDRAWFIXED
       +                                  | LBS_NOTIFY, 0, 0, 0, 0, Parent, NULL,
       +                                  hInst, NULL);
          gtk_set_default_font(widget->hWnd);
        
          gtk_clist_update_all_widths(clist);
          for (rows = clist->rowdata; rows; rows = g_slist_next(rows)) {
            row = (GtkCListRow *)rows->data;
       -    if (row)
       +    if (row) {
              SendMessage(widget->hWnd, LB_ADDSTRING, 0, (LPARAM)row->data);
       +    }
          }
        
          for (i = 0; i < clist->cols; i++) {
       t@@ -203,7 +206,7 @@ void gtk_clist_realize(GtkWidget *widget)
                hdi.cxy = clist->coldata[i].width;
              hdi.cchTextMax = strlen(hdi.pszText);
              hdi.fmt = HDF_LEFT | HDF_STRING;
       -      SendMessage(header, HDM_INSERTITEM, i + 1, (LPARAM)&hdi);
       +      myHeader_InsertItem(header, i + 1, &hdi);
            }
          }
        }
       t@@ -258,8 +261,8 @@ void gtk_clist_draw_row(GtkCList *clist, LPDRAWITEMSTRUCT lpdis)
                if (i == clist->cols - 1)
                  rcCol.right = lpdis->rcItem.right;
                if (row->text[i]) {
       -          DrawText(lpdis->hDC, row->text[i], -1, &rcCol,
       -                   DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS);
       +          myDrawText(lpdis->hDC, row->text[i], -1, &rcCol,
       +                     DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS);
                }
              }
          }
       t@@ -357,6 +360,7 @@ gint gtk_clist_insert(GtkCList *clist, gint row, gchar *text[])
        
          new_row = g_new0(GtkCListRow, 1);
          new_row->text = g_new0(gchar *, clist->cols);
       +  new_row->data = GINT_TO_POINTER(1);
        
          for (i = 0; i < clist->cols; i++) {
            new_row->text[i] = g_strdup(text[i]);
       t@@ -368,7 +372,7 @@ gint gtk_clist_insert(GtkCList *clist, gint row, gchar *text[])
        
          if (GTK_WIDGET_REALIZED(widget)) {
            hWnd = widget->hWnd;
       -    SendMessage(hWnd, LB_INSERTSTRING, (WPARAM)row, (LPARAM)NULL);
       +    SendMessage(hWnd, LB_INSERTSTRING, (WPARAM)row, (LPARAM)new_row->data);
          }
        
          return row;
       t@@ -630,7 +634,7 @@ void gtk_clist_set_row_data(GtkCList *clist, gint row, gpointer data)
          if (row >= 0 && row < clist->rows) {
            list_row = (GtkCListRow *)g_slist_nth_data(clist->rowdata, row);
            if (list_row)
       -      list_row->data = data;
       +      list_row->data = data + 1;
          }
        }
        
       t@@ -641,7 +645,7 @@ gpointer gtk_clist_get_row_data(GtkCList *clist, gint row)
          if (row >= 0 && row < clist->rows) {
            list_row = (GtkCListRow *)g_slist_nth_data(clist->rowdata, row);
            if (list_row)
       -      return list_row->data;
       +      return list_row->data - 1;
          }
          return NULL;
        }
 (DIR) diff --git a/src/gtkport/gtkport.c b/src/gtkport/gtkport.c
       t@@ -1142,7 +1142,7 @@ void win32_init(HINSTANCE hInstance, HINSTANCE hPrevInstance,
            wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
            wc.lpszMenuName = NULL;
            wc.lpszClassName = "mainwin";
       -    RegisterClass(&wc);
       +    myRegisterClass(&wc);
        
            wc.style = 0;
            wc.lpfnWndProc = MainWndProc;
       t@@ -1154,7 +1154,7 @@ void win32_init(HINSTANCE hInstance, HINSTANCE hPrevInstance,
            wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
            wc.lpszMenuName = NULL;
            wc.lpszClassName = WC_GTKDIALOG;
       -    RegisterClass(&wc);
       +    myRegisterClass(&wc);
        
            wc.style = 0;
            wc.lpfnWndProc = GtkPanedProc;
       t@@ -1166,7 +1166,7 @@ void win32_init(HINSTANCE hInstance, HINSTANCE hPrevInstance,
            wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
            wc.lpszMenuName = NULL;
            wc.lpszClassName = WC_GTKHPANED;
       -    RegisterClass(&wc);
       +    myRegisterClass(&wc);
        
            wc.style = 0;
            wc.lpfnWndProc = GtkPanedProc;
       t@@ -1178,7 +1178,7 @@ void win32_init(HINSTANCE hInstance, HINSTANCE hPrevInstance,
            wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
            wc.lpszMenuName = NULL;
            wc.lpszClassName = WC_GTKVPANED;
       -    RegisterClass(&wc);
       +    myRegisterClass(&wc);
        
            wc.style = 0;
            wc.lpfnWndProc = GtkSepProc;
       t@@ -1190,7 +1190,7 @@ void win32_init(HINSTANCE hInstance, HINSTANCE hPrevInstance,
            wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
            wc.lpszMenuName = NULL;
            wc.lpszClassName = WC_GTKSEP;
       -    RegisterClass(&wc);
       +    myRegisterClass(&wc);
        
            wc.style = 0;
            wc.lpfnWndProc = GtkUrlProc;
       t@@ -1202,7 +1202,7 @@ void win32_init(HINSTANCE hInstance, HINSTANCE hPrevInstance,
            wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
            wc.lpszMenuName = NULL;
            wc.lpszClassName = WC_GTKURL;
       -    RegisterClass(&wc);
       +    myRegisterClass(&wc);
          }
        
          InitCommonControls();
       t@@ -1886,16 +1886,14 @@ GSList *gtk_radio_button_group(GtkRadioButton *radio_button)
        static void gtk_editable_sync_text(GtkEditable *editable)
        {
          HWND hWnd;
       -  gint textlen;
          gchar *buffer;
        
          hWnd = GTK_WIDGET(editable)->hWnd;
       -  if (!hWnd)
       +  if (!hWnd) {
            return;
       +  }
        
       -  textlen = SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0);
       -  buffer = g_new(gchar, textlen + 1);
       -  SendMessage(hWnd, WM_GETTEXT, (WPARAM)(textlen + 1), (LPARAM)buffer);
       +  buffer = myGetWindowText(hWnd);
          g_string_assign(editable->text, buffer);
          g_free(buffer);
        }
       t@@ -2326,7 +2324,7 @@ void gtk_window_realize(GtkWidget *widget)
        
          Parent = gtk_get_parent_hwnd(widget->parent);
          if (Parent) {
       -    widget->hWnd = CreateDialog(hInst, "gtkdialog", Parent, MainDlgProc);
       +    widget->hWnd = myCreateDialog(hInst, "gtkdialog", Parent, MainDlgProc);
            mySetWindowText(widget->hWnd, win->title);
          } else {
            widget->hWnd = myCreateWindow("mainwin", win->title,
       t@@ -3734,7 +3732,7 @@ void gtk_check_menu_item_set_active(GtkMenuItem *menu_item, gboolean active)
            mii.cbSize = sizeof(MENUITEMINFO);
            mii.fMask = MIIM_STATE;
            mii.fState = active ? MFS_CHECKED : MFS_UNCHECKED;
       -    SetMenuItemInfo(parent_menu, menu_item->ID, FALSE, &mii);
       +    mySetMenuItemInfo(parent_menu, menu_item->ID, FALSE, &mii);
          }
        }
        
       t@@ -3827,7 +3825,7 @@ void gtk_menu_item_realize(GtkWidget *widget)
          mii.wID = menu_item->ID;
          mii.dwTypeData = (LPTSTR)menu_item->text;
          mii.cch = strlen(menu_item->text);
       -  InsertMenuItem(parent_menu, pos, TRUE, &mii);
       +  myInsertMenuItem(parent_menu, pos, TRUE, &mii);
        }
        
        void gtk_menu_realize(GtkWidget *widget)
       t@@ -4777,7 +4775,7 @@ static void gtk_menu_item_set_text(GtkMenuItem *menuitem, gchar *text)
            mii.fType = MFT_STRING;
            mii.dwTypeData = (LPTSTR)menuitem->text;
            mii.cch = strlen(menuitem->text);
       -    SetMenuItemInfo(parent_menu, menuitem->ID, FALSE, &mii);
       +    mySetMenuItemInfo(parent_menu, menuitem->ID, FALSE, &mii);
          }
        }
        
 (DIR) diff --git a/src/gtkport/gtkport.h b/src/gtkport/gtkport.h
       t@@ -751,8 +751,6 @@ struct _GtkUrl {
          gchar *target, *bin;
        };
        
       -gboolean HaveUnicodeSupport(void);
       -
        #endif /* CYGWIN */
        
        #if CYGWIN || !HAVE_GLIB2
       t@@ -794,5 +792,6 @@ GtkWidget *NewStockButton(const gchar *label, GtkAccelGroup *accel_group);
        gchar *GtkGetFile(const GtkWidget *parent, const gchar *oldname,
                          const gchar *title);
        void DisplayHTML(GtkWidget *parent, const gchar *bin, const gchar *target);
       +gboolean HaveUnicodeSupport(void);
        
        #endif /* __GTKPORT_H__ */
 (DIR) diff --git a/src/gtkport/unicodewrap.c b/src/gtkport/unicodewrap.c
       t@@ -59,13 +59,30 @@ gboolean HaveUnicodeSupport(void)
         * suitable for Windows Unicode-aware functions (i.e. UTF-16). This
         * returned string must be g_free'd when no longer needed.
         */
       -static gunichar2 *strtow32(const char *instr)
       +static gunichar2 *strtow32(const char *instr, int len)
        {
          gunichar2 *outstr;
       -  outstr = g_utf8_to_utf16(instr, -1, NULL, NULL, NULL);
       +  if (!instr) {
       +    return NULL;
       +  }
       +  outstr = g_utf8_to_utf16(instr, len, NULL, NULL, NULL);
          if (!outstr) {
       -    outstr = g_utf8_to_utf16("[?]", -1, NULL, NULL, NULL);
       +    outstr = g_utf8_to_utf16("[?]", len, NULL, NULL, NULL);
          }
       +  return outstr;
       +}
       +
       +static gchar *w32tostr(const gunichar2 *instr, int len)
       +{
       +  gchar *outstr;
       +  if (!instr) {
       +    return NULL;
       +  }
       +  outstr = g_utf16_to_utf8(instr, len, NULL, NULL, NULL);
       +  if (!outstr) {
       +    outstr = g_strdup("[?]");
       +  }
       +  return outstr;
        }
        
        BOOL mySetWindowText(HWND hWnd, LPCTSTR lpString)
       t@@ -74,7 +91,7 @@ BOOL mySetWindowText(HWND hWnd, LPCTSTR lpString)
        
          if (unicode_support) {
            gunichar2 *text;
       -    text = strtow32(lpString);
       +    text = strtow32(lpString, -1);
            retval = SetWindowTextW(hWnd, text);
            g_free(text);
          } else {
       t@@ -84,7 +101,7 @@ BOOL mySetWindowText(HWND hWnd, LPCTSTR lpString)
          return retval;
        }
        
       -HWND myCreateWindow(LPCTSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle,
       +HWND myCreateWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle,
                            int x, int y, int nWidth, int nHeight, HWND hwndParent,
                            HMENU hMenu, HANDLE hInstance, LPVOID lpParam)
        {
       t@@ -92,8 +109,8 @@ HWND myCreateWindow(LPCTSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle,
        
          if (unicode_support) {
            gunichar2 *classname, *winname;
       -    classname = strtow32(lpClassName);
       -    winname = strtow32(lpWindowName);
       +    classname = strtow32(lpClassName, -1);
       +    winname = strtow32(lpWindowName, -1);
            retval = CreateWindowW(classname, winname, dwStyle, x, y, nWidth,
                                   nHeight, hwndParent, hMenu, hInstance, lpParam);
            g_free(classname);
       t@@ -106,7 +123,7 @@ HWND myCreateWindow(LPCTSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle,
        }
        
        HWND myCreateWindowEx(DWORD dwExStyle, LPCTSTR lpClassName,
       -                      LPCSTR lpWindowName, DWORD dwStyle, int x, int y,
       +                      LPCTSTR lpWindowName, DWORD dwStyle, int x, int y,
                              int nWidth, int nHeight, HWND hwndParent, HMENU hMenu,
                              HANDLE hInstance, LPVOID lpParam)
        {
       t@@ -114,8 +131,8 @@ HWND myCreateWindowEx(DWORD dwExStyle, LPCTSTR lpClassName,
        
          if (unicode_support) {
            gunichar2 *classname, *winname;
       -    classname = strtow32(lpClassName);
       -    winname = strtow32(lpWindowName);
       +    classname = strtow32(lpClassName, -1);
       +    winname = strtow32(lpWindowName, -1);
            retval = CreateWindowExW(dwExStyle, classname, winname, dwStyle, x, y,
                                     nWidth, nHeight, hwndParent, hMenu, hInstance,
                                     lpParam);
       t@@ -129,4 +146,187 @@ HWND myCreateWindowEx(DWORD dwExStyle, LPCTSTR lpClassName,
          return retval;
        }
        
       +gchar *myGetWindowText(HWND hWnd)
       +{
       +  gint textlen;
       +
       +  textlen = SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0);
       +  if (unicode_support) {
       +    gunichar2 *buffer;
       +    gchar *retstr;
       +
       +    buffer = g_new0(gunichar2, textlen + 1);
       +    GetWindowTextW(hWnd, buffer, textlen + 1);
       +    buffer[textlen] = '\0';
       +    retstr = w32tostr(buffer, textlen);
       +    g_free(buffer);
       +    return retstr;
       +  } else {
       +    gchar *buffer;
       +
       +    buffer = g_new0(gchar, textlen + 1);
       +    GetWindowTextA(hWnd, buffer, textlen + 1);
       +    buffer[textlen] = '\0';
       +    return buffer;
       +  }
       +}
       +
       +int myDrawText(HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect,
       +               UINT uFormat)
       +{
       +  int retval;
       +
       +  if (unicode_support) {
       +    gunichar2 *text;
       +
       +    text = strtow32(lpString, nCount);
       +    retval = DrawTextW(hDC, text, -1, lpRect, uFormat);
       +    g_free(text);
       +  } else {
       +    retval = DrawTextA(hDC, lpString, nCount, lpRect, uFormat);
       +  }
       +  return retval;
       +}
       +
       +static BOOL makeMenuItemInfoW(LPMENUITEMINFOW lpmiiw, LPMENUITEMINFO lpmii)
       +{
       +  BOOL strdata;
       +  strdata = (lpmii->fMask & MIIM_TYPE)
       +            && !(lpmii->fType & (MFT_BITMAP | MFT_SEPARATOR));
       +
       +  lpmiiw->cbSize = sizeof(MENUITEMINFOW);
       +  lpmiiw->fMask = lpmii->fMask;
       +  lpmiiw->fType = lpmii->fType;
       +  lpmiiw->fState = lpmii->fState;
       +  lpmiiw->wID = lpmii->wID;
       +  lpmiiw->hSubMenu = lpmii->hSubMenu;
       +  lpmiiw->hbmpChecked = lpmii->hbmpChecked;
       +  lpmiiw->hbmpUnchecked = lpmii->hbmpUnchecked;
       +  lpmiiw->dwItemData = lpmii->dwItemData;
       +  lpmiiw->dwTypeData = strdata ? strtow32(lpmii->dwTypeData, -1)
       +                               : (LPWSTR)lpmii->dwTypeData;
       +  lpmiiw->cch = lpmii->cch;
       +  return strdata;
       +}
       +
       +BOOL WINAPI mySetMenuItemInfo(HMENU hMenu, UINT uItem, BOOL fByPosition,
       +                              LPMENUITEMINFO lpmii)
       +{
       +  BOOL retval;
       +
       +  if (unicode_support) {
       +    MENUITEMINFOW miiw;
       +    BOOL strdata;
       +
       +    strdata = makeMenuItemInfoW(&miiw, lpmii);
       +    retval = SetMenuItemInfoW(hMenu, uItem, fByPosition, &miiw);
       +    if (strdata) {
       +      g_free(miiw.dwTypeData);
       +    }
       +  } else {
       +    retval = SetMenuItemInfoA(hMenu, uItem, fByPosition, lpmii);
       +  }
       +  return retval;
       +}
       +
       +BOOL WINAPI myInsertMenuItem(HMENU hMenu, UINT uItem, BOOL fByPosition,
       +                             LPMENUITEMINFO lpmii)
       +{
       +  BOOL retval;
       +
       +  if (unicode_support) {
       +    MENUITEMINFOW miiw;
       +    BOOL strdata;
       +
       +    strdata = makeMenuItemInfoW(&miiw, lpmii);
       +    retval = InsertMenuItemW(hMenu, uItem, fByPosition, &miiw);
       +    if (strdata) {
       +      g_free(miiw.dwTypeData);
       +    }
       +  } else {
       +    retval = InsertMenuItemA(hMenu, uItem, fByPosition, lpmii);
       +  }
       +  return retval;
       +}
       +
       +static BOOL makeHeaderItemW(HD_ITEMW *phdiw, const HD_ITEM *phdi)
       +{
       +  BOOL strdata;
       +
       +//strdata = phdi->mask & HDI_TEXT;
       +  strdata = FALSE;
       +
       +  phdiw->mask = phdi->mask;
       +  phdiw->cxy = phdi->cxy;
       +  phdiw->pszText = strdata ? strtow32(phdi->pszText, -1)
       +                           : (LPWSTR)phdi->pszText;
       +  phdiw->hbm = phdi->hbm;
       +  phdiw->cchTextMax = phdi->cchTextMax;
       +  phdiw->fmt = phdi->fmt;
       +  phdiw->lParam = phdi->lParam;
       +  return strdata;
       +}
       +
       +int myHeader_InsertItem(HWND hWnd, int index, const HD_ITEM *phdi)
       +{
       +  int retval;
       +  if (unicode_support && IsWindowUnicode(hWnd)) {
       +    HD_ITEMW hdiw;
       +    BOOL strdata;
       +
       +    strdata = makeHeaderItemW(&hdiw, phdi);
       +    retval = (int)SendMessage(hWnd, HDM_INSERTITEM, (WPARAM)index,
       +                              (LPARAM)&hdiw);
       +    if (strdata) {
       +      g_free(hdiw.pszText);
       +    }
       +  } else {
       +    retval = (int)SendMessage(hWnd, HDM_INSERTITEM, (WPARAM)index,
       +                              (LPARAM)phdi);
       +  }
       +  return retval;
       +}
       +
       +ATOM myRegisterClass(CONST WNDCLASS *lpWndClass)
       +{
       +  ATOM retval;
       +
       +  if (0 && unicode_support) {
       +    WNDCLASSW wcw;
       +
       +    wcw.style = lpWndClass->style;
       +    wcw.lpfnWndProc = lpWndClass->lpfnWndProc;
       +    wcw.cbClsExtra = lpWndClass->cbClsExtra;
       +    wcw.cbWndExtra = lpWndClass->cbWndExtra;
       +    wcw.hInstance = lpWndClass->hInstance;
       +    wcw.hIcon = lpWndClass->hIcon;
       +    wcw.hCursor = lpWndClass->hCursor;
       +    wcw.hbrBackground = lpWndClass->hbrBackground;
       +    wcw.lpszMenuName = strtow32(lpWndClass->lpszMenuName, -1);
       +    wcw.lpszClassName = strtow32(lpWndClass->lpszClassName, -1);
       +    retval = RegisterClassW(&wcw);
       +    g_free((LPWSTR)wcw.lpszMenuName);
       +    g_free((LPWSTR)wcw.lpszClassName);
       +  } else {
       +    retval = RegisterClassA(lpWndClass);
       +  }
       +  return retval;
       +}
       +
       +HWND myCreateDialog(HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent,
       +                    DLGPROC lpDialogFunc)
       +{
       +  HWND retval;
       +
       +  if (unicode_support) {
       +    gunichar2 *text;
       +    text = strtow32(lpTemplate, -1);
       +    retval = CreateDialogW(hInstance, text, hWndParent, lpDialogFunc);
       +    g_free(text);
       +  } else {
       +    retval = CreateDialogA(hInstance, lpTemplate, hWndParent, lpDialogFunc);
       +  }
       +  return retval;
       +}
       +
        #endif /* CYGWIN */
 (DIR) diff --git a/src/gtkport/unicodewrap.h b/src/gtkport/unicodewrap.h
       t@@ -29,18 +29,29 @@
        
        #ifdef CYGWIN
        #include <windows.h>
       +#include <commctrl.h>
        
        void InitUnicodeSupport(void);
       -void HaveUnicodeSupport(void);
        
        BOOL mySetWindowText(HWND hWnd, LPCTSTR lpString);
       -HWND myCreateWindow(LPCTSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle,
       +HWND myCreateWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle,
                            int x, int y, int nWidth, int nHeight, HWND hwndParent,
                            HMENU hMenu, HANDLE hInstance, LPVOID lpParam);
        HWND myCreateWindowEx(DWORD dwExStyle, LPCTSTR lpClassName,
       -                      LPCSTR lpWindowName, DWORD dwStyle, int x, int y,
       +                      LPCTSTR lpWindowName, DWORD dwStyle, int x, int y,
                              int nWidth, int nHeight, HWND hwndParent, HMENU hMenu,
                              HANDLE hInstance, LPVOID lpParam);
       +gchar *myGetWindowText(HWND hWnd);
       +int myDrawText(HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect,
       +               UINT uFormat);
       +BOOL WINAPI mySetMenuItemInfo(HMENU hMenu, UINT uItem, BOOL fByPosition,
       +                              LPMENUITEMINFO lpmii);
       +BOOL WINAPI myInsertMenuItem(HMENU hMenu, UINT uItem, BOOL fByPosition,
       +                             LPMENUITEMINFO lpmii);
       +int myHeader_InsertItem(HWND hWnd, int index, const HD_ITEM *phdi);
       +ATOM myRegisterClass(CONST WNDCLASS *lpWndClass);
       +HWND myCreateDialog(HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent,
       +                    DLGPROC lpDialogFunc);
        
        #endif /* CYGWIN */