|
@@ -716,9 +716,11 @@ X11_GetWindowTitle(_THIS, Window xwindow)
|
|
|
0L, 8192L, False, XA_STRING, &real_type, &real_format,
|
|
|
&items_read, &items_left, &propdata);
|
|
|
if (status == Success && propdata) {
|
|
|
+ SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "Failed to convert _WM_NAME title expecting UTF8! Title: %s", title);
|
|
|
title = SDL_iconv_string("UTF-8", "", SDL_static_cast(char*, propdata), items_read+1);
|
|
|
X11_XFree(propdata);
|
|
|
} else {
|
|
|
+ SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "Could not get any window title response from Xorg, returning empty string!");
|
|
|
title = SDL_strdup("");
|
|
|
}
|
|
|
}
|
|
@@ -729,30 +731,11 @@ void
|
|
|
X11_SetWindowTitle(_THIS, SDL_Window * window)
|
|
|
{
|
|
|
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
+ Window xwindow = data->xwindow;
|
|
|
Display *display = data->videodata->display;
|
|
|
- Status status;
|
|
|
- const char *title = window->title ? window->title : "";
|
|
|
-
|
|
|
- Atom UTF8_STRING = data->videodata->UTF8_STRING;
|
|
|
- Atom _NET_WM_NAME = data->videodata->_NET_WM_NAME;
|
|
|
- Atom WM_NAME = data->videodata->WM_NAME;
|
|
|
-
|
|
|
- X11_XChangeProperty(display, data->xwindow, WM_NAME, UTF8_STRING, 8, 0, (const unsigned char *) title, SDL_strlen(title));
|
|
|
+ char *title = window->title ? window->title : "";
|
|
|
|
|
|
- status = X11_XChangeProperty(display, data->xwindow, _NET_WM_NAME, UTF8_STRING, 8, 0, (const unsigned char *) title, SDL_strlen(title));
|
|
|
-
|
|
|
- if (status != 1) {
|
|
|
- char *x11_error = NULL;
|
|
|
- char x11_error_locale[256];
|
|
|
- if (X11_XGetErrorText(display, status, x11_error_locale, sizeof(x11_error_locale)) == Success)
|
|
|
- {
|
|
|
- x11_error = SDL_iconv_string("UTF-8", "", x11_error_locale, SDL_strlen(x11_error_locale)+1);
|
|
|
- SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "Error when setting X11 window title to %s: %s\n", title, x11_error);
|
|
|
- SDL_free(x11_error);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- X11_XFlush(display);
|
|
|
+ SDL_X11_SetWindowTitle(display, xwindow, title);
|
|
|
}
|
|
|
|
|
|
void
|
|
@@ -1888,6 +1871,39 @@ X11_FlashWindow(_THIS, SDL_Window * window, SDL_FlashOperation operation)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+bool SDL_X11_SetWindowTitle(Display* display, Window xwindow, char* title) {
|
|
|
+ Atom _NET_WM_NAME = X11_XInternAtom(display, "_NET_WM_NAME", False);
|
|
|
+ XTextProperty titleprop;
|
|
|
+ int conv = X11_XmbTextListToTextProperty(display, (char**) &title, 1, XStdICCTextStyle, &titleprop);
|
|
|
+ Status status;
|
|
|
+
|
|
|
+ if (conv == 0) {
|
|
|
+ X11_XSetTextProperty(display, xwindow, &titleprop, XA_WM_NAME);
|
|
|
+ X11_XFree(titleprop.value);
|
|
|
+ // we know this can't be a locale error as we checked X locale validity in X11_VideoInit
|
|
|
+ } else if (conv <= 0) {
|
|
|
+ SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "X11 reporting it's out of memory");
|
|
|
+ return EXIT_FAILURE;
|
|
|
+ } else { // conv >= 0
|
|
|
+ SDL_LogWarn(SDL_LOG_CATEGORY_VIDEO, "%d characters were not convertable to the current locale!", conv);
|
|
|
+ return EXIT_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+#ifdef X_HAVE_UTF8_STRING
|
|
|
+ status = X11_Xutf8TextListToTextProperty(display, (char **) &title, 1, XUTF8StringStyle, &titleprop);
|
|
|
+ if (status == Success) {
|
|
|
+ X11_XSetTextProperty(display, xwindow, &titleprop, _NET_WM_NAME);
|
|
|
+ X11_XFree(titleprop.value);
|
|
|
+ } else {
|
|
|
+ SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "Failed to convert title to UTF8! Bad encoding, or bad Xorg encoding? Window title: «%s»", title);
|
|
|
+ return EXIT_FAILURE;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
+ X11_XFlush(display);
|
|
|
+ return EXIT_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
#endif /* SDL_VIDEO_DRIVER_X11 */
|
|
|
|
|
|
/* vi: set ts=4 sw=4 expandtab: */
|