xpra icon
Bug tracker and wiki

Ticket #526: win32-utf16-title-MultiByteToWideChar.patch

File win32-utf16-title-MultiByteToWideChar.patch, 2.9 KB (added by Antoine Martin, 6 years ago)

alternative patch using MultiByteToWideChar? instead of encode to utf-16-le

  • xpra/client/client_window_base.py

     
    2626        return x
    2727
    2828
     29#ugly workaround for buggy gtk set_title:
     30try:
     31    import ctypes
     32    from ctypes.wintypes import BOOL, HANDLE, LPCSTR, LPWSTR, LPCWSTR, UINT, DWORD
     33    kernel32 = ctypes.windll.kernel32
     34    user32 = ctypes.windll.user32
     35    IsWindowUnicode = user32.IsWindowUnicode
     36    IsWindowUnicode.restype = BOOL
     37    IsWindowUnicode.argtypes = [HANDLE]
     38    SetWindowTextW = user32.SetWindowTextW
     39    SetWindowTextW.restype = BOOL
     40    SetWindowTextW.argtypes = [HANDLE, LPCWSTR]
     41    MultiByteToWideChar = kernel32.MultiByteToWideChar
     42    MultiByteToWideChar.argtypes = [UINT, DWORD,
     43                                    LPCSTR, ctypes.c_int,
     44                                    LPWSTR, ctypes.c_int]
     45    MultiByteToWideChar.restype = ctypes.c_int
     46except:
     47    SetWindowTextW, IsWindowUnicode = None, None
     48
     49
    2950class ClientWindowBase(ClientWidgetBase):
    3051
    3152    def __init__(self, client, group_leader, wid, x, y, w, h, metadata, override_redirect, client_properties, auto_refresh_delay, border):
     
    139160                            value = value.decode("utf-8")
    140161                        return value
    141162                    title = re.sub("@[\w\-]*@", metadata_replace, title)
    142                 utf8_title = title.encode("utf-8")
    143163            except Exception, e:
    144164                log.error("error parsing window title: %s", e)
    145                 utf8_title = ""
    146             self.set_title(utf8_title)
     165            try:
     166                log.info("user32=%s", user32)
     167                if SetWindowTextW and IsWindowUnicode:
     168                    if not self.is_realized():
     169                        self.realize()
     170                    log.info("user32.IsWindowUnicode=%s", IsWindowUnicode(self.window.handle))
     171                    log.info("user32.SetWindowTextW=%s, hwnd=%s", SetWindowTextW, self.window.handle)
     172                    #http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx
     173                    #not found in win32con:
     174                    CP_UTF8 = 65001
     175                    self.title_wide = ctypes.create_unicode_buffer(len(title)*4)
     176                    utf8_title = title.encode("utf-8")
     177                    ret = MultiByteToWideChar(CP_UTF8, 0, utf8_title, len(utf8_title), self.title_wide, len(self.title_wide))
     178                    log.info("ret=%s, title_wide=%s", ret, self.title_wide)
     179                    SetWindowTextW(self.window.handle, self.title_wide)
     180                else:
     181                    self.set_title(title.encode("utf-8"))
     182            except Exception, e:
     183                log.error("error setting window title: %s", e, exc_info=True)
    147184
    148185        if "icon-title" in metadata:
    149186            icon_title = metadata["icon-title"]