From 8e2f4cfb3110ca8840e80f63b98e18d23cf47ff3 Mon Sep 17 00:00:00 2001
From: Hanmac
Date: Tue, 31 Jan 2012 12:14:59 +0100
Subject: [PATCH 01/12] add setting an utf8 string to _NET_WM_NAME for x11
---
src/x11_window.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/x11_window.c b/src/x11_window.c
index 641b3c84..dd387e06 100644
--- a/src/x11_window.c
+++ b/src/x11_window.c
@@ -1512,6 +1512,12 @@ void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
// Set window & icon title
XStoreName(_glfwLibrary.X11.display, window->X11.handle, title);
XSetIconName(_glfwLibrary.X11.display, window->X11.handle, title);
+
+ XChangeProperty(_glfwLibrary.X11.display, window->X11.handle,
+ XInternAtom(_glfwLibrary.X11.display, "_NET_WM_NAME", False),
+ XInternAtom(_glfwLibrary.X11.display, "UTF8_STRING", False),
+ 8, PropModeReplace, (unsigned char *) title,
+ strlen(title));
}
From 1be6f17c668bd48d7d25e60b6606b5693e30c956 Mon Sep 17 00:00:00 2001
From: Hanmac
Date: Wed, 1 Feb 2012 00:10:17 +0100
Subject: [PATCH 02/12] add _NET_WM_NAME to the hasEWMGH check
---
src/x11_platform.h | 1 +
src/x11_window.c | 10 ++++++++--
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/x11_platform.h b/src/x11_platform.h
index 46f09f1a..3aef3cbf 100644
--- a/src/x11_platform.h
+++ b/src/x11_platform.h
@@ -141,6 +141,7 @@ typedef struct _GLFWwindowX11
Colormap colormap; // Window colormap
Window handle; // Window handle
Atom wmDeleteWindow; // WM_DELETE_WINDOW atom
+ Atom wmName; // _NET_WM_NAME atom
Atom wmPing; // _NET_WM_PING atom
Atom wmState; // _NET_WM_STATE atom
Atom wmStateFullscreen; // _NET_WM_STATE_FULLSCREEN atom
diff --git a/src/x11_window.c b/src/x11_window.c
index dd387e06..5ab1428c 100644
--- a/src/x11_window.c
+++ b/src/x11_window.c
@@ -195,6 +195,9 @@ static GLboolean hasEWMH(_GLFWwindow* window)
window->X11.wmStateFullscreen =
getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_STATE_FULLSCREEN");
+ window->X11.wmName =
+ getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_NAME");
+
window->X11.wmPing =
getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_PING");
@@ -1513,11 +1516,14 @@ void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
XStoreName(_glfwLibrary.X11.display, window->X11.handle, title);
XSetIconName(_glfwLibrary.X11.display, window->X11.handle, title);
- XChangeProperty(_glfwLibrary.X11.display, window->X11.handle,
- XInternAtom(_glfwLibrary.X11.display, "_NET_WM_NAME", False),
+ if(window->X11.wmName != None)
+ {
+ XChangeProperty(_glfwLibrary.X11.display, window->X11.handle,
+ window->X11.wmName,
XInternAtom(_glfwLibrary.X11.display, "UTF8_STRING", False),
8, PropModeReplace, (unsigned char *) title,
strlen(title));
+ }
}
From 87dfde34a9702aa09708478a41c96e9f6e3cbca5 Mon Sep 17 00:00:00 2001
From: Camilla Berglund
Date: Wed, 1 Feb 2012 14:43:42 +0100
Subject: [PATCH 03/12] Formatting.
---
src/x11_window.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/x11_window.c b/src/x11_window.c
index 5ab1428c..d3c950c9 100644
--- a/src/x11_window.c
+++ b/src/x11_window.c
@@ -1515,14 +1515,14 @@ void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
// Set window & icon title
XStoreName(_glfwLibrary.X11.display, window->X11.handle, title);
XSetIconName(_glfwLibrary.X11.display, window->X11.handle, title);
-
- if(window->X11.wmName != None)
+
+ if (window->X11.wmName != None)
{
+ Atom type = XInternAtom(_glfwLibrary.X11.display, "UTF8_STRING", False);
XChangeProperty(_glfwLibrary.X11.display, window->X11.handle,
- window->X11.wmName,
- XInternAtom(_glfwLibrary.X11.display, "UTF8_STRING", False),
- 8, PropModeReplace, (unsigned char *) title,
- strlen(title));
+ window->X11.wmName, type, 8,
+ PropModeReplace,
+ (unsigned char*) title, strlen(title));
}
}
From 0913b450c04d63b4ae551ca10f2b19234f2e2810 Mon Sep 17 00:00:00 2001
From: Camilla Berglund
Date: Wed, 1 Feb 2012 14:46:00 +0100
Subject: [PATCH 04/12] Added credit.
---
readme.html | 2 ++
1 file changed, 2 insertions(+)
diff --git a/readme.html b/readme.html
index 4d1f4c72..870a55b6 100644
--- a/readme.html
+++ b/readme.html
@@ -862,6 +862,8 @@ their skills. Special thanks go out to:
Tristam MacDonald, for his bug reports and feedback on the Cocoa port
+ Hans 'Hanmac' Mackowiak, for adding UTF-8 window title support on X11
+
David Medlock, for doing the initial Lua port
Kenneth Miller, for his many and detailed bug reports on Win32
From 4cffa3b185881e162cf1b04a775eefba03a8bf8a Mon Sep 17 00:00:00 2001
From: Camilla Berglund
Date: Thu, 2 Feb 2012 16:04:37 +0100
Subject: [PATCH 05/12] Added UTF-8 window title test.
---
tests/CMakeLists.txt | 5 +++-
tests/title.c | 70 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 74 insertions(+), 1 deletion(-)
create mode 100644 tests/title.c
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 5adbf351..d7ac0954 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -51,10 +51,13 @@ target_link_libraries(sharing ${STATIC_DEPS})
add_executable(tearing WIN32 MACOSX_BUNDLE tearing.c)
target_link_libraries(tearing ${STATIC_DEPS})
+add_executable(title WIN32 MACOSX_BUNDLE title.c)
+target_link_libraries(title ${STATIC_DEPS})
+
add_executable(windows WIN32 MACOSX_BUNDLE windows.c)
target_link_libraries(windows ${STATIC_DEPS})
-set(WINDOWS_BINARIES accuracy sharing tearing windows)
+set(WINDOWS_BINARIES accuracy sharing tearing title windows)
set(CONSOLE_BINARIES defaults events fsaa fsfocus gamma glfwinfo iconify
joysticks listmodes peter reopen)
diff --git a/tests/title.c b/tests/title.c
new file mode 100644
index 00000000..7b342d94
--- /dev/null
+++ b/tests/title.c
@@ -0,0 +1,70 @@
+//========================================================================
+// UTF-8 window title test
+// Copyright (c) Camilla Berglund
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would
+// be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such, and must not
+// be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source
+// distribution.
+//
+//========================================================================
+//
+// This test sets a UTF-8 window title
+//
+//========================================================================
+
+#include
+
+#include
+#include
+
+static void window_size_callback(GLFWwindow window, int width, int height)
+{
+ glViewport(0, 0, width, height);
+}
+
+int main(void)
+{
+ GLFWwindow window;
+
+ if (!glfwInit())
+ {
+ fprintf(stderr, "Failed to initialize GLFW: %s\n", glfwErrorString(glfwGetError()));
+ exit(EXIT_FAILURE);
+ }
+
+ window = glfwOpenWindow(0, 0, GLFW_WINDOWED, "English 日本語 русский язык 官話", NULL);
+ if (!window)
+ {
+ fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError()));
+ exit(EXIT_FAILURE);
+ }
+
+ glfwSwapInterval(1);
+
+ glfwSetWindowSizeCallback(window_size_callback);
+
+ while (glfwIsWindow(window) == GL_TRUE)
+ {
+ glClear(GL_COLOR_BUFFER_BIT);
+ glfwSwapBuffers();
+ glfwWaitEvents();
+ }
+
+ exit(EXIT_SUCCESS);
+}
+
From 797e93631163a895459fbc3a86243c639f082c76 Mon Sep 17 00:00:00 2001
From: Camilla Berglund
Date: Thu, 2 Feb 2012 17:01:11 +0100
Subject: [PATCH 06/12] Replaced XStoreName and XSetIconName with
X*SetWMProperties.
---
src/x11_window.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/src/x11_window.c b/src/x11_window.c
index d3c950c9..606512b9 100644
--- a/src/x11_window.c
+++ b/src/x11_window.c
@@ -1512,9 +1512,21 @@ void _glfwPlatformCloseWindow(_GLFWwindow* window)
void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
{
- // Set window & icon title
- XStoreName(_glfwLibrary.X11.display, window->X11.handle, title);
- XSetIconName(_glfwLibrary.X11.display, window->X11.handle, title);
+#if defined(X_HAVE_UTF8_STRING)
+ Xutf8SetWMProperties(_glfwLibrary.X11.display,
+ window->X11.handle,
+ title, title,
+ NULL, 0,
+ NULL, NULL, NULL);
+#else
+ // This may be a slightly better fallback than using XStoreName and
+ // XSetIconName, which always store their arguments using STRING
+ XmbSetWMProperties(_glfwLibrary.X11.display,
+ window->X11.handle,
+ title, title,
+ NULL, 0,
+ NULL, NULL, NULL);
+#endif
if (window->X11.wmName != None)
{
From 06074bc6988295ae427bb5266d4e3e529af5f33d Mon Sep 17 00:00:00 2001
From: Camilla Berglund
Date: Thu, 2 Feb 2012 17:20:14 +0100
Subject: [PATCH 07/12] Added support for _NET_WM_ICON_NAME.
---
src/x11_platform.h | 1 +
src/x11_window.c | 14 +++++++++++++-
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/src/x11_platform.h b/src/x11_platform.h
index 3aef3cbf..e837b2f1 100644
--- a/src/x11_platform.h
+++ b/src/x11_platform.h
@@ -142,6 +142,7 @@ typedef struct _GLFWwindowX11
Window handle; // Window handle
Atom wmDeleteWindow; // WM_DELETE_WINDOW atom
Atom wmName; // _NET_WM_NAME atom
+ Atom wmIconName; // _NET_WM_ICON_NAME atom
Atom wmPing; // _NET_WM_PING atom
Atom wmState; // _NET_WM_STATE atom
Atom wmStateFullscreen; // _NET_WM_STATE_FULLSCREEN atom
diff --git a/src/x11_window.c b/src/x11_window.c
index 606512b9..7ad34d05 100644
--- a/src/x11_window.c
+++ b/src/x11_window.c
@@ -198,6 +198,9 @@ static GLboolean hasEWMH(_GLFWwindow* window)
window->X11.wmName =
getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_NAME");
+ window->X11.wmIconName =
+ getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_ICON_NAME");
+
window->X11.wmPing =
getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_PING");
@@ -1512,6 +1515,8 @@ void _glfwPlatformCloseWindow(_GLFWwindow* window)
void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
{
+ Atom type = XInternAtom(_glfwLibrary.X11.display, "UTF8_STRING", False);
+
#if defined(X_HAVE_UTF8_STRING)
Xutf8SetWMProperties(_glfwLibrary.X11.display,
window->X11.handle,
@@ -1530,12 +1535,19 @@ void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
if (window->X11.wmName != None)
{
- Atom type = XInternAtom(_glfwLibrary.X11.display, "UTF8_STRING", False);
XChangeProperty(_glfwLibrary.X11.display, window->X11.handle,
window->X11.wmName, type, 8,
PropModeReplace,
(unsigned char*) title, strlen(title));
}
+
+ if (window->X11.wmIconName != None)
+ {
+ XChangeProperty(_glfwLibrary.X11.display, window->X11.handle,
+ window->X11.wmIconName, type, 8,
+ PropModeReplace,
+ (unsigned char*) title, strlen(title));
+ }
}
From 70bfdfb22e410c3a92715004503a7f6ca36fad57 Mon Sep 17 00:00:00 2001
From: Camilla Berglund
Date: Thu, 2 Feb 2012 17:33:08 +0100
Subject: [PATCH 08/12] Updated change log.
---
readme.html | 2 ++
1 file changed, 2 insertions(+)
diff --git a/readme.html b/readme.html
index 870a55b6..f0a89585 100644
--- a/readme.html
+++ b/readme.html
@@ -315,6 +315,8 @@ version of GLFW.
[X11] Added support for the GLX_EXT_swap_control extension as an alternative to GLX_SGI_swap_control
[X11] Added the POSIX CLOCK_MONOTONIC time source as the preferred method
[X11] Added dependency on libm, where present
+ [X11] Added support for the _NET_WM_NAME and _NET_WM_ICON_NAME EWMH window properties
+ [X11] Bugfix: Some window properties required by the ICCCM were not set
[X11] Bugfix: Calling glXCreateContextAttribsARB with an unavailable OpenGL version caused the application to terminate with a BadMatch Xlib error
[X11] Bugfix: A synchronization point necessary for jitter-free locked cursor mode was incorrectly removed
[Win32] Removed explicit support for versions of Windows older than Windows XP
From 9c0c2c6b08f83d2cf7b61fc833a16c5f99ef6650 Mon Sep 17 00:00:00 2001
From: Camilla Berglund
Date: Fri, 3 Feb 2012 20:34:24 +0100
Subject: [PATCH 09/12] Upgraded Win32 port to Unicode mode.
---
readme.html | 1 +
src/win32_init.c | 10 ++++----
src/win32_platform.h | 12 ++++++----
src/win32_window.c | 54 ++++++++++++++++++++++++++++++++++++++++----
4 files changed, 63 insertions(+), 14 deletions(-)
diff --git a/readme.html b/readme.html
index f0a89585..b007952d 100644
--- a/readme.html
+++ b/readme.html
@@ -319,6 +319,7 @@ version of GLFW.
[X11] Bugfix: Some window properties required by the ICCCM were not set
[X11] Bugfix: Calling glXCreateContextAttribsARB with an unavailable OpenGL version caused the application to terminate with a BadMatch Xlib error
[X11] Bugfix: A synchronization point necessary for jitter-free locked cursor mode was incorrectly removed
+ [Win32] Changed port to use Unicode mode only
[Win32] Removed explicit support for versions of Windows older than Windows XP
[Win32] Bugfix: Window activation and iconification did not work as expected
[Win32] Bugfix: Software rasterizer pixel formats were not discarded by the WGL_ARB_pixel_format code path
diff --git a/src/win32_init.c b/src/win32_init.c
index 0756b0f2..b23e7d57 100644
--- a/src/win32_init.c
+++ b/src/win32_init.c
@@ -47,7 +47,7 @@ static GLboolean initLibraries(void)
#ifndef _GLFW_NO_DLOAD_GDI32
// gdi32.dll (OpenGL pixel format functions & SwapBuffers)
- _glfwLibrary.Win32.gdi.instance = LoadLibrary("gdi32.dll");
+ _glfwLibrary.Win32.gdi.instance = LoadLibrary(L"gdi32.dll");
if (!_glfwLibrary.Win32.gdi.instance)
return GL_FALSE;
@@ -81,12 +81,12 @@ static GLboolean initLibraries(void)
#ifndef _GLFW_NO_DLOAD_WINMM
// winmm.dll (for joystick and timer support)
- _glfwLibrary.Win32.winmm.instance = LoadLibrary("winmm.dll");
+ _glfwLibrary.Win32.winmm.instance = LoadLibrary(L"winmm.dll");
if (!_glfwLibrary.Win32.winmm.instance)
return GL_FALSE;
- _glfwLibrary.Win32.winmm.joyGetDevCapsA = (JOYGETDEVCAPSA_T)
- GetProcAddress(_glfwLibrary.Win32.winmm.instance, "joyGetDevCapsA");
+ _glfwLibrary.Win32.winmm.joyGetDevCaps = (JOYGETDEVCAPS_T)
+ GetProcAddress(_glfwLibrary.Win32.winmm.instance, "joyGetDevCapsW");
_glfwLibrary.Win32.winmm.joyGetPos = (JOYGETPOS_T)
GetProcAddress(_glfwLibrary.Win32.winmm.instance, "joyGetPos");
_glfwLibrary.Win32.winmm.joyGetPosEx = (JOYGETPOSEX_T)
@@ -94,7 +94,7 @@ static GLboolean initLibraries(void)
_glfwLibrary.Win32.winmm.timeGetTime = (TIMEGETTIME_T)
GetProcAddress(_glfwLibrary.Win32.winmm.instance, "timeGetTime");
- if (!_glfwLibrary.Win32.winmm.joyGetDevCapsA ||
+ if (!_glfwLibrary.Win32.winmm.joyGetDevCaps ||
!_glfwLibrary.Win32.winmm.joyGetPos ||
!_glfwLibrary.Win32.winmm.joyGetPosEx ||
!_glfwLibrary.Win32.winmm.timeGetTime)
diff --git a/src/win32_platform.h b/src/win32_platform.h
index 074e28ba..0d63e09c 100644
--- a/src/win32_platform.h
+++ b/src/win32_platform.h
@@ -45,6 +45,8 @@
// thinks it is the only one that gets to do so
#undef APIENTRY
+#define UNICODE
+
#include
#include
@@ -162,7 +164,7 @@ typedef BOOL (WINAPI * SETDEVICEGAMMARAMP_T) (HDC,PVOID);
// winmm.dll function pointer typedefs
#ifndef _GLFW_NO_DLOAD_WINMM
-typedef MMRESULT (WINAPI * JOYGETDEVCAPSA_T) (UINT,LPJOYCAPSA,UINT);
+typedef MMRESULT (WINAPI * JOYGETDEVCAPS_T) (UINT,LPJOYCAPS,UINT);
typedef MMRESULT (WINAPI * JOYGETPOS_T) (UINT,LPJOYINFO);
typedef MMRESULT (WINAPI * JOYGETPOSEX_T) (UINT,LPJOYINFOEX);
typedef DWORD (WINAPI * TIMEGETTIME_T) (void);
@@ -190,12 +192,12 @@ typedef DWORD (WINAPI * TIMEGETTIME_T) (void);
// winmm.dll shortcuts
#ifndef _GLFW_NO_DLOAD_WINMM
-#define _glfw_joyGetDevCaps _glfwLibrary.Win32.winmm.joyGetDevCapsA
+#define _glfw_joyGetDevCaps _glfwLibrary.Win32.winmm.joyGetDevCaps
#define _glfw_joyGetPos _glfwLibrary.Win32.winmm.joyGetPos
#define _glfw_joyGetPosEx _glfwLibrary.Win32.winmm.joyGetPosEx
#define _glfw_timeGetTime _glfwLibrary.Win32.winmm.timeGetTime
#else
-#define _glfw_joyGetDevCaps joyGetDevCapsA
+#define _glfw_joyGetDevCaps joyGetDevCaps
#define _glfw_joyGetPos joyGetPos
#define _glfw_joyGetPosEx joyGetPosEx
#define _glfw_timeGetTime timeGetTime
@@ -204,7 +206,7 @@ typedef DWORD (WINAPI * TIMEGETTIME_T) (void);
// We use versioned window class names in order not to cause conflicts
// between applications using different versions of GLFW
-#define _GLFW_WNDCLASSNAME "GLFW30"
+#define _GLFW_WNDCLASSNAME L"GLFW30"
#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowWin32 Win32
@@ -309,7 +311,7 @@ typedef struct _GLFWlibraryWin32
// winmm.dll
struct {
HINSTANCE instance;
- JOYGETDEVCAPSA_T joyGetDevCapsA;
+ JOYGETDEVCAPS_T joyGetDevCaps;
JOYGETPOS_T joyGetPos;
JOYGETPOSEX_T joyGetPosEx;
TIMEGETTIME_T timeGetTime;
diff --git a/src/win32_window.c b/src/win32_window.c
index e2619acf..6ebe07b4 100644
--- a/src/win32_window.c
+++ b/src/win32_window.c
@@ -34,6 +34,31 @@
#include
+//========================================================================
+// Convert the specified UTF-8 string to a wide string
+//========================================================================
+
+static WCHAR* createWideStringFromUTF8(const char* source)
+{
+ WCHAR* target;
+ int length;
+
+ length = MultiByteToWideChar(CP_UTF8, 0, source, -1, NULL, 0);
+ if (!length)
+ return NULL;
+
+ target = (WCHAR*) _glfwMalloc(sizeof(WCHAR) * (length + 1));
+
+ if (!MultiByteToWideChar(CP_UTF8, 0, source, -1, target, length + 1))
+ {
+ _glfwFree(target);
+ return NULL;
+ }
+
+ return target;
+}
+
+
//========================================================================
// Convert BPP to RGB bits based on "best guess"
//========================================================================
@@ -1220,7 +1245,7 @@ static ATOM registerWindowClass(void)
wc.lpszClassName = _GLFW_WNDCLASSNAME; // Set class name
// Load user-provided icon if available
- wc.hIcon = LoadIcon(_glfwLibrary.Win32.instance, "GLFW_ICON");
+ wc.hIcon = LoadIcon(_glfwLibrary.Win32.instance, L"GLFW_ICON");
if (!wc.hIcon)
{
// Load default icon
@@ -1280,9 +1305,10 @@ static int createWindow(_GLFWwindow* window,
const _GLFWfbconfig* fbconfig)
{
DWORD dwStyle, dwExStyle;
- int pixelFormat, fullWidth, fullHeight;
+ int length, pixelFormat, fullWidth, fullHeight;
RECT wa;
POINT pos;
+ WCHAR* wideTitle;
// Set common window styles
dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE;
@@ -1331,9 +1357,17 @@ static int createWindow(_GLFWwindow* window,
else
SystemParametersInfo(SPI_GETWORKAREA, 0, &wa, 0);
+ wideTitle = createWideStringFromUTF8(wndconfig->title);
+ if (!wideTitle)
+ {
+ _glfwSetError(GLFW_PLATFORM_ERROR,
+ "glfwOpenWindow: Failed to convert title to wide string");
+ return;
+ }
+
window->Win32.handle = CreateWindowEx(window->Win32.dwExStyle,
_GLFW_WNDCLASSNAME,
- wndconfig->title,
+ wideTitle,
window->Win32.dwStyle,
wa.left, wa.top, // Window position
fullWidth, // Decorated window width
@@ -1349,6 +1383,8 @@ static int createWindow(_GLFWwindow* window,
return GL_FALSE;
}
+ _glfwFree(wideTitle);
+
window->WGL.DC = GetDC(window->Win32.handle);
if (!window->WGL.DC)
{
@@ -1568,7 +1604,17 @@ void _glfwPlatformCloseWindow(_GLFWwindow* window)
void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
{
- SetWindowText(window->Win32.handle, title);
+ WCHAR* wideTitle = createWideStringFromUTF8(title);
+ if (!wideTitle)
+ {
+ _glfwSetError(GLFW_PLATFORM_ERROR,
+ "glfwSetWindowTitle: Failed to convert title to wide string");
+ return;
+ }
+
+ SetWindowText(window->Win32.handle, wideTitle);
+
+ _glfwFree(wideTitle);
}
From ee4f2386e79af3d0442d35e2d5aa04cc1e7e4942 Mon Sep 17 00:00:00 2001
From: Camilla Berglund
Date: Sat, 4 Feb 2012 02:13:44 +0100
Subject: [PATCH 10/12] Updated to new API.
---
tests/title.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/title.c b/tests/title.c
index 7b342d94..35344a04 100644
--- a/tests/title.c
+++ b/tests/title.c
@@ -41,7 +41,7 @@ int main(void)
{
GLFWwindow window;
- if (!glfwInit())
+ if (!glfwInit(NULL))
{
fprintf(stderr, "Failed to initialize GLFW: %s\n", glfwErrorString(glfwGetError()));
exit(EXIT_FAILURE);
From e937c86893fbf9b0a37a90ac0549124296c15e05 Mon Sep 17 00:00:00 2001
From: Camilla Berglund
Date: Sat, 4 Feb 2012 02:15:17 +0100
Subject: [PATCH 11/12] Added UTF-8 window title support for Cocooa.
---
src/cocoa_window.m | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/src/cocoa_window.m b/src/cocoa_window.m
index 3e94f541..264ba6ef 100644
--- a/src/cocoa_window.m
+++ b/src/cocoa_window.m
@@ -476,9 +476,7 @@ static GLboolean createWindow(_GLFWwindow* window,
return GL_FALSE;
}
- [window->NS.window setTitle:[NSString stringWithCString:wndconfig->title
- encoding:NSISOLatin1StringEncoding]];
-
+ [window->NS.window setTitle:[NSString stringWithUTF8String:wndconfig->title]];
[window->NS.window setContentView:[[GLFWContentView alloc]
initWithGlfwWindow:window]];
[window->NS.window setDelegate:window->NS.delegate];
@@ -779,8 +777,7 @@ void _glfwPlatformCloseWindow(_GLFWwindow* window)
void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char *title)
{
- [window->NS.window setTitle:[NSString stringWithCString:title
- encoding:NSISOLatin1StringEncoding]];
+ [window->NS.window setTitle:[NSString stringWithUTF8String:title]];
}
//========================================================================
From afcc5f9e1d17827e7924dc6cf83e8d6e0147adbf Mon Sep 17 00:00:00 2001
From: Camilla Berglund
Date: Sat, 4 Feb 2012 02:16:45 +0100
Subject: [PATCH 12/12] UTF-8 window title all done.
---
readme.html | 1 +
1 file changed, 1 insertion(+)
diff --git a/readme.html b/readme.html
index 6879be35..e342a91d 100644
--- a/readme.html
+++ b/readme.html
@@ -285,6 +285,7 @@ version of GLFW.
Added initial window title parameter to glfwOpenWindow
Added glfwSetGamma, glfwSetGammaRamp and glfwGetGammaRamp functions and GLFWgammaramp type for monitor gamma ramp control
Changed buffer bit depth parameters of glfwOpenWindow to window hints
+ Changed glfwOpenWindow and glfwSetWindowTitle to use UTF-8 encoded strings
Renamed glfw.h to glfw3.h to avoid conflicts with 2.x series
Renamed GLFW_WINDOW token to GLFW_WINDOWED
Renamed GLFW_WINDOW_NO_RESIZE to GLFW_WINDOW_RESIZABLE