mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-01-22 12:50:44 +00:00
Merged default into iOS-improvements
This commit is contained in:
@@ -479,8 +479,10 @@ SDL_IBus_Init(void)
|
||||
inotify_wd = inotify_add_watch(inotify_fd, addr_file, IN_CREATE | IN_MODIFY);
|
||||
SDL_free(addr_file);
|
||||
|
||||
result = IBus_SetupConnection(dbus, addr);
|
||||
SDL_free(addr);
|
||||
if (addr) {
|
||||
result = IBus_SetupConnection(dbus, addr);
|
||||
SDL_free(addr);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
@@ -340,6 +340,11 @@ EnumJoysticksCallback(const DIDEVICEINSTANCE * pdidInstance, VOID * pContext)
|
||||
{
|
||||
JoyStick_DeviceData *pNewJoystick;
|
||||
JoyStick_DeviceData *pPrevJoystick = NULL;
|
||||
const DWORD devtype = (pdidInstance->dwDevType & 0xFF);
|
||||
|
||||
if ((devtype != DI8DEVTYPE_JOYSTICK) && (devtype != DI8DEVTYPE_GAMEPAD)) {
|
||||
return DIENUM_CONTINUE; /* Ignore touchpads, etc. */
|
||||
}
|
||||
|
||||
if (SDL_IsXInputDevice(&pdidInstance->guidProduct)) {
|
||||
return DIENUM_CONTINUE; /* ignore XInput devices here, keep going. */
|
||||
|
||||
@@ -1265,6 +1265,12 @@ SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)
|
||||
h = 1;
|
||||
}
|
||||
|
||||
/* Some platforms blow up if the windows are too large. Raise it later? */
|
||||
if ((w > 16384) || (h > 16384)) {
|
||||
SDL_SetError("Window is too large.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Some platforms have OpenGL enabled by default */
|
||||
#if (SDL_VIDEO_OPENGL && __MACOSX__) || __IPHONEOS__ || __ANDROID__ || __NACL__
|
||||
flags |= SDL_WINDOW_OPENGL;
|
||||
@@ -1501,11 +1507,8 @@ SDL_SetWindowTitle(SDL_Window * window, const char *title)
|
||||
return;
|
||||
}
|
||||
SDL_free(window->title);
|
||||
if (title && *title) {
|
||||
window->title = SDL_strdup(title);
|
||||
} else {
|
||||
window->title = NULL;
|
||||
}
|
||||
|
||||
window->title = SDL_strdup(title ? title : "");
|
||||
|
||||
if (_this->SetWindowTitle) {
|
||||
_this->SetWindowTitle(_this, window);
|
||||
|
||||
@@ -1189,16 +1189,9 @@ Cocoa_SetWindowTitle(_THIS, SDL_Window * window)
|
||||
{
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
|
||||
NSString *string;
|
||||
|
||||
if(window->title) {
|
||||
string = [[NSString alloc] initWithUTF8String:window->title];
|
||||
} else {
|
||||
string = [[NSString alloc] init];
|
||||
}
|
||||
NSString *string = [[NSString alloc] initWithUTF8String:window->title];
|
||||
[nswindow setTitle:string];
|
||||
[string release];
|
||||
|
||||
[pool release];
|
||||
}
|
||||
|
||||
|
||||
@@ -161,7 +161,7 @@ DirectFB_WM_RedrawLayout(_THIS, SDL_Window * window)
|
||||
y, w - 2 * d);
|
||||
|
||||
/* Caption */
|
||||
if (window->title) {
|
||||
if (*window->title) {
|
||||
s->SetColor(s, COLOR_EXPAND(t->font_color));
|
||||
DrawCraption(_this, s, (x - w) / 2, t->top_size + d, window->title);
|
||||
}
|
||||
|
||||
@@ -222,11 +222,7 @@ UIKit_SetWindowTitle(_THIS, SDL_Window * window)
|
||||
{
|
||||
@autoreleasepool {
|
||||
SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata;
|
||||
if (window->title) {
|
||||
data.viewcontroller.title = @(window->title);
|
||||
} else {
|
||||
data.viewcontroller.title = nil;
|
||||
}
|
||||
data.viewcontroller.title = @(window->title);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -356,8 +356,7 @@ Wayland_WarpMouseGlobal(int x, int y)
|
||||
static int
|
||||
Wayland_SetRelativeMouseMode(SDL_bool enabled)
|
||||
{
|
||||
SDL_Unsupported();
|
||||
return -1;
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -43,11 +43,6 @@
|
||||
|
||||
#define WAYLANDVID_DRIVER_NAME "wayland"
|
||||
|
||||
struct wayland_mode {
|
||||
SDL_DisplayMode mode;
|
||||
struct wl_list link;
|
||||
};
|
||||
|
||||
/* Initialization/Query functions */
|
||||
static int
|
||||
Wayland_VideoInit(_THIS);
|
||||
@@ -87,7 +82,7 @@ static SDL_VideoDevice *
|
||||
Wayland_CreateDevice(int devindex)
|
||||
{
|
||||
SDL_VideoDevice *device;
|
||||
|
||||
|
||||
if (!SDL_WAYLAND_LoadSymbols()) {
|
||||
return NULL;
|
||||
}
|
||||
@@ -135,27 +130,6 @@ VideoBootStrap Wayland_bootstrap = {
|
||||
Wayland_Available, Wayland_CreateDevice
|
||||
};
|
||||
|
||||
static void
|
||||
wayland_add_mode(SDL_VideoData *d, SDL_DisplayMode m)
|
||||
{
|
||||
struct wayland_mode *mode;
|
||||
|
||||
/* Check for duplicate mode */
|
||||
wl_list_for_each(mode, &d->modes_list, link)
|
||||
if (mode->mode.w == m.w && mode->mode.h == m.h &&
|
||||
mode->mode.refresh_rate == m.refresh_rate)
|
||||
return;
|
||||
|
||||
/* Add new mode to the list */
|
||||
mode = (struct wayland_mode *) SDL_calloc(1, sizeof *mode);
|
||||
|
||||
if (!mode)
|
||||
return;
|
||||
|
||||
mode->mode = m;
|
||||
WAYLAND_wl_list_insert(&d->modes_list, &mode->link);
|
||||
}
|
||||
|
||||
static void
|
||||
display_handle_geometry(void *data,
|
||||
struct wl_output *output,
|
||||
@@ -168,55 +142,80 @@ display_handle_geometry(void *data,
|
||||
int transform)
|
||||
|
||||
{
|
||||
SDL_VideoData *d = data;
|
||||
SDL_VideoDisplay *display = data;
|
||||
|
||||
d->screen_allocation.x = x;
|
||||
d->screen_allocation.y = y;
|
||||
display->name = strdup(model);
|
||||
display->driverdata = output;
|
||||
}
|
||||
|
||||
static void
|
||||
display_handle_mode(void *data,
|
||||
struct wl_output *wl_output,
|
||||
struct wl_output *output,
|
||||
uint32_t flags,
|
||||
int width,
|
||||
int height,
|
||||
int refresh)
|
||||
{
|
||||
SDL_VideoData *d = data;
|
||||
SDL_VideoDisplay *display = data;
|
||||
SDL_DisplayMode mode;
|
||||
|
||||
SDL_zero(mode);
|
||||
mode.w = width;
|
||||
mode.h = height;
|
||||
mode.refresh_rate = refresh / 1000;
|
||||
|
||||
wayland_add_mode(d, mode);
|
||||
mode.refresh_rate = refresh / 1000; // mHz to Hz
|
||||
SDL_AddDisplayMode(display, &mode);
|
||||
|
||||
if (flags & WL_OUTPUT_MODE_CURRENT) {
|
||||
d->screen_allocation.width = width;
|
||||
d->screen_allocation.height = height;
|
||||
display->current_mode = mode;
|
||||
display->desktop_mode = mode;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
display_handle_done(void *data,
|
||||
struct wl_output *output)
|
||||
{
|
||||
SDL_VideoDisplay *display = data;
|
||||
SDL_AddVideoDisplay(display);
|
||||
SDL_free(display->name);
|
||||
SDL_free(display);
|
||||
}
|
||||
|
||||
static void
|
||||
display_handle_scale(void *data,
|
||||
struct wl_output *output,
|
||||
int32_t factor)
|
||||
{
|
||||
// TODO: do HiDPI stuff.
|
||||
}
|
||||
|
||||
static const struct wl_output_listener output_listener = {
|
||||
display_handle_geometry,
|
||||
display_handle_mode
|
||||
display_handle_mode,
|
||||
display_handle_done,
|
||||
display_handle_scale
|
||||
};
|
||||
|
||||
static void
|
||||
shm_handle_format(void *data,
|
||||
struct wl_shm *shm,
|
||||
uint32_t format)
|
||||
Wayland_add_display(SDL_VideoData *d, uint32_t id)
|
||||
{
|
||||
SDL_VideoData *d = data;
|
||||
struct wl_output *output;
|
||||
SDL_VideoDisplay *display = SDL_malloc(sizeof *display);
|
||||
if (!display) {
|
||||
SDL_OutOfMemory();
|
||||
return;
|
||||
}
|
||||
SDL_zero(*display);
|
||||
|
||||
d->shm_formats |= (1 << format);
|
||||
output = wl_registry_bind(d->registry, id, &wl_output_interface, 2);
|
||||
if (!output) {
|
||||
SDL_SetError("Failed to retrieve output.");
|
||||
return;
|
||||
}
|
||||
|
||||
wl_output_add_listener(output, &output_listener, display);
|
||||
}
|
||||
|
||||
static const struct wl_shm_listener shm_listener = {
|
||||
shm_handle_format
|
||||
};
|
||||
|
||||
#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
|
||||
static void
|
||||
windowmanager_hints(void *data, struct qt_windowmanager *qt_windowmanager,
|
||||
@@ -238,15 +237,14 @@ static const struct qt_windowmanager_listener windowmanager_listener = {
|
||||
|
||||
static void
|
||||
display_handle_global(void *data, struct wl_registry *registry, uint32_t id,
|
||||
const char *interface, uint32_t version)
|
||||
const char *interface, uint32_t version)
|
||||
{
|
||||
SDL_VideoData *d = data;
|
||||
|
||||
|
||||
if (strcmp(interface, "wl_compositor") == 0) {
|
||||
d->compositor = wl_registry_bind(d->registry, id, &wl_compositor_interface, 1);
|
||||
} else if (strcmp(interface, "wl_output") == 0) {
|
||||
d->output = wl_registry_bind(d->registry, id, &wl_output_interface, 1);
|
||||
wl_output_add_listener(d->output, &output_listener, d);
|
||||
Wayland_add_display(d, id);
|
||||
} else if (strcmp(interface, "wl_seat") == 0) {
|
||||
Wayland_display_add_input(d, id);
|
||||
} else if (strcmp(interface, "wl_shell") == 0) {
|
||||
@@ -255,8 +253,7 @@ display_handle_global(void *data, struct wl_registry *registry, uint32_t id,
|
||||
d->shm = wl_registry_bind(registry, id, &wl_shm_interface, 1);
|
||||
d->cursor_theme = WAYLAND_wl_cursor_theme_load(NULL, 32, d->shm);
|
||||
d->default_cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "left_ptr");
|
||||
wl_shm_add_listener(d->shm, &shm_listener, d);
|
||||
|
||||
|
||||
#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
|
||||
} else if (strcmp(interface, "qt_touch_extension") == 0) {
|
||||
Wayland_touch_create(d, id);
|
||||
@@ -272,26 +269,19 @@ display_handle_global(void *data, struct wl_registry *registry, uint32_t id,
|
||||
}
|
||||
|
||||
static const struct wl_registry_listener registry_listener = {
|
||||
display_handle_global
|
||||
display_handle_global
|
||||
};
|
||||
|
||||
int
|
||||
Wayland_VideoInit(_THIS)
|
||||
{
|
||||
SDL_VideoData *data;
|
||||
SDL_VideoDisplay display;
|
||||
SDL_DisplayMode mode;
|
||||
int i;
|
||||
|
||||
data = malloc(sizeof *data);
|
||||
SDL_VideoData *data = SDL_malloc(sizeof *data);
|
||||
if (data == NULL)
|
||||
return 0;
|
||||
memset(data, 0, sizeof *data);
|
||||
|
||||
_this->driverdata = data;
|
||||
|
||||
WAYLAND_wl_list_init(&data->modes_list);
|
||||
|
||||
data->display = WAYLAND_wl_display_connect(NULL);
|
||||
if (data->display == NULL) {
|
||||
SDL_SetError("Failed to connect to a Wayland display");
|
||||
@@ -299,25 +289,18 @@ Wayland_VideoInit(_THIS)
|
||||
}
|
||||
|
||||
data->registry = wl_display_get_registry(data->display);
|
||||
|
||||
if ( data->registry == NULL) {
|
||||
if (data->registry == NULL) {
|
||||
SDL_SetError("Failed to get the Wayland registry");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
wl_registry_add_listener(data->registry, ®istry_listener, data);
|
||||
|
||||
for (i=0; i < 100; i++) {
|
||||
if (data->screen_allocation.width != 0 || WAYLAND_wl_display_get_error(data->display) != 0) {
|
||||
break;
|
||||
}
|
||||
WAYLAND_wl_display_dispatch(data->display);
|
||||
}
|
||||
|
||||
if (data->screen_allocation.width == 0) {
|
||||
SDL_SetError("Failed while waiting for screen allocation: %d ", WAYLAND_wl_display_get_error(data->display));
|
||||
return 0;
|
||||
}
|
||||
// First roundtrip to receive all registry objects.
|
||||
WAYLAND_wl_display_roundtrip(data->display);
|
||||
|
||||
// Second roundtrip to receive all output events.
|
||||
WAYLAND_wl_display_roundtrip(data->display);
|
||||
|
||||
data->xkb_context = WAYLAND_xkb_context_new(0);
|
||||
if (!data->xkb_context) {
|
||||
@@ -325,20 +308,7 @@ Wayland_VideoInit(_THIS)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Use a fake 32-bpp desktop mode */
|
||||
mode.format = SDL_PIXELFORMAT_RGB888;
|
||||
mode.w = data->screen_allocation.width;
|
||||
mode.h = data->screen_allocation.height;
|
||||
mode.refresh_rate = 0;
|
||||
mode.driverdata = NULL;
|
||||
wayland_add_mode(data, mode);
|
||||
SDL_zero(display);
|
||||
display.desktop_mode = mode;
|
||||
display.current_mode = mode;
|
||||
display.driverdata = NULL;
|
||||
SDL_AddVideoDisplay(&display);
|
||||
|
||||
Wayland_InitMouse ();
|
||||
Wayland_InitMouse();
|
||||
|
||||
WAYLAND_wl_display_flush(data->display);
|
||||
|
||||
@@ -348,46 +318,29 @@ Wayland_VideoInit(_THIS)
|
||||
static void
|
||||
Wayland_GetDisplayModes(_THIS, SDL_VideoDisplay *sdl_display)
|
||||
{
|
||||
SDL_VideoData *data = _this->driverdata;
|
||||
SDL_DisplayMode mode;
|
||||
struct wayland_mode *m;
|
||||
|
||||
Wayland_PumpEvents(_this);
|
||||
|
||||
wl_list_for_each(m, &data->modes_list, link) {
|
||||
m->mode.format = SDL_PIXELFORMAT_RGB888;
|
||||
SDL_AddDisplayMode(sdl_display, &m->mode);
|
||||
m->mode.format = SDL_PIXELFORMAT_RGBA8888;
|
||||
SDL_AddDisplayMode(sdl_display, &m->mode);
|
||||
}
|
||||
|
||||
mode.w = data->screen_allocation.width;
|
||||
mode.h = data->screen_allocation.height;
|
||||
mode.refresh_rate = 0;
|
||||
mode.driverdata = NULL;
|
||||
|
||||
mode.format = SDL_PIXELFORMAT_RGB888;
|
||||
SDL_AddDisplayMode(sdl_display, &mode);
|
||||
mode.format = SDL_PIXELFORMAT_RGBA8888;
|
||||
SDL_AddDisplayMode(sdl_display, &mode);
|
||||
// Nothing to do here, everything was already done in the wl_output
|
||||
// callbacks.
|
||||
}
|
||||
|
||||
static int
|
||||
Wayland_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode)
|
||||
{
|
||||
return 0;
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
void
|
||||
Wayland_VideoQuit(_THIS)
|
||||
{
|
||||
SDL_VideoData *data = _this->driverdata;
|
||||
struct wayland_mode *t, *m;
|
||||
int i;
|
||||
|
||||
Wayland_FiniMouse ();
|
||||
|
||||
if (data->output)
|
||||
wl_output_destroy(data->output);
|
||||
for (i = 0; i < _this->num_displays; ++i) {
|
||||
SDL_VideoDisplay *display = &_this->displays[i];
|
||||
wl_output_destroy(display->driverdata);
|
||||
display->driverdata = NULL;
|
||||
}
|
||||
|
||||
Wayland_display_destroy_input(data);
|
||||
|
||||
@@ -417,16 +370,13 @@ Wayland_VideoQuit(_THIS)
|
||||
if (data->compositor)
|
||||
wl_compositor_destroy(data->compositor);
|
||||
|
||||
if (data->registry)
|
||||
wl_registry_destroy(data->registry);
|
||||
|
||||
if (data->display) {
|
||||
WAYLAND_wl_display_flush(data->display);
|
||||
WAYLAND_wl_display_disconnect(data->display);
|
||||
}
|
||||
|
||||
wl_list_for_each_safe(m, t, &data->modes_list, link) {
|
||||
WAYLAND_wl_list_remove(&m->link);
|
||||
free(m);
|
||||
}
|
||||
|
||||
|
||||
free(data);
|
||||
_this->driverdata = NULL;
|
||||
|
||||
@@ -40,33 +40,24 @@ typedef struct {
|
||||
struct wl_display *display;
|
||||
struct wl_registry *registry;
|
||||
struct wl_compositor *compositor;
|
||||
struct wl_output *output;
|
||||
struct wl_shm *shm;
|
||||
struct wl_cursor_theme *cursor_theme;
|
||||
struct wl_cursor *default_cursor;
|
||||
struct wl_pointer *pointer;
|
||||
struct wl_shell *shell;
|
||||
|
||||
struct {
|
||||
int32_t x, y, width, height;
|
||||
} screen_allocation;
|
||||
|
||||
struct wl_list modes_list;
|
||||
|
||||
EGLDisplay edpy;
|
||||
EGLContext context;
|
||||
EGLConfig econf;
|
||||
|
||||
struct xkb_context *xkb_context;
|
||||
struct SDL_WaylandInput *input;
|
||||
|
||||
#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
|
||||
|
||||
#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
|
||||
struct SDL_WaylandTouch *touch;
|
||||
struct qt_surface_extension *surface_extension;
|
||||
struct qt_windowmanager *windowmanager;
|
||||
#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */
|
||||
|
||||
uint32_t shm_formats;
|
||||
} SDL_VideoData;
|
||||
|
||||
#endif /* _SDL_waylandvideo_h */
|
||||
|
||||
@@ -116,7 +116,7 @@ void Wayland_ShowWindow(_THIS, SDL_Window *window)
|
||||
if (window->flags & SDL_WINDOW_FULLSCREEN)
|
||||
wl_shell_surface_set_fullscreen(wind->shell_surface,
|
||||
WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT,
|
||||
0, NULL);
|
||||
0, (struct wl_output *)window->fullscreen_mode.driverdata);
|
||||
else
|
||||
wl_shell_surface_set_toplevel(wind->shell_surface);
|
||||
|
||||
@@ -132,7 +132,7 @@ Wayland_SetWindowFullscreen(_THIS, SDL_Window * window,
|
||||
if (fullscreen)
|
||||
wl_shell_surface_set_fullscreen(wind->shell_surface,
|
||||
WL_SHELL_SURFACE_FULLSCREEN_METHOD_SCALE,
|
||||
0, NULL);
|
||||
0, (struct wl_output *)_display->driverdata);
|
||||
else
|
||||
wl_shell_surface_set_toplevel(wind->shell_surface);
|
||||
|
||||
@@ -179,17 +179,6 @@ int Wayland_CreateWindow(_THIS, SDL_Window *window)
|
||||
}
|
||||
#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */
|
||||
|
||||
/**
|
||||
* If the user specified 0x0 as the size (turned to 1x1 by SDL_CreateWindow
|
||||
* in SDL_video.c), we want to make the window fill the whole screen
|
||||
**/
|
||||
if (window->w == 1) {
|
||||
window->w = c->screen_allocation.width;
|
||||
}
|
||||
if (window->h == 1) {
|
||||
window->h = c->screen_allocation.height;
|
||||
}
|
||||
|
||||
data->egl_window = WAYLAND_wl_egl_window_create(data->surface,
|
||||
window->w, window->h);
|
||||
|
||||
@@ -197,8 +186,7 @@ int Wayland_CreateWindow(_THIS, SDL_Window *window)
|
||||
data->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) data->egl_window);
|
||||
|
||||
if (data->egl_surface == EGL_NO_SURFACE) {
|
||||
SDL_SetError("failed to create a window surface");
|
||||
return -1;
|
||||
return SDL_SetError("failed to create a window surface");;
|
||||
}
|
||||
|
||||
if (data->shell_surface) {
|
||||
|
||||
@@ -371,14 +371,8 @@ void
|
||||
WIN_SetWindowTitle(_THIS, SDL_Window * window)
|
||||
{
|
||||
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
|
||||
LPTSTR title;
|
||||
|
||||
if (window->title) {
|
||||
title = WIN_UTF8ToString(window->title);
|
||||
} else {
|
||||
title = NULL;
|
||||
}
|
||||
SetWindowText(hwnd, title ? title : TEXT(""));
|
||||
LPTSTR title = WIN_UTF8ToString(window->title);
|
||||
SetWindowText(hwnd, title);
|
||||
SDL_free(title);
|
||||
}
|
||||
|
||||
|
||||
@@ -333,7 +333,7 @@ SetWindowBordered(Display *display, int screen, Window window, SDL_bool border)
|
||||
|
||||
X11_XChangeProperty(display, window, WM_HINTS, WM_HINTS, 32,
|
||||
PropModeReplace, (unsigned char *) &MWMHints,
|
||||
sizeof(MWMHints) / 4);
|
||||
sizeof(MWMHints) / sizeof(long));
|
||||
} else { /* set the transient hints instead, if necessary */
|
||||
X11_XSetTransientForHint(display, window, RootWindow(display, screen));
|
||||
}
|
||||
@@ -656,67 +656,39 @@ X11_SetWindowTitle(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
||||
Display *display = data->videodata->display;
|
||||
XTextProperty titleprop, iconprop;
|
||||
XTextProperty titleprop;
|
||||
Status status;
|
||||
const char *title = window->title;
|
||||
const char *icon = NULL;
|
||||
const char *title = window->title ? window->title : "";
|
||||
char *title_locale = NULL;
|
||||
|
||||
#ifdef X_HAVE_UTF8_STRING
|
||||
Atom _NET_WM_NAME = data->videodata->_NET_WM_NAME;
|
||||
Atom _NET_WM_ICON_NAME = data->videodata->_NET_WM_ICON_NAME;
|
||||
#endif
|
||||
|
||||
if (title != NULL) {
|
||||
char *title_locale = SDL_iconv_utf8_locale(title);
|
||||
if (!title_locale) {
|
||||
SDL_OutOfMemory();
|
||||
return;
|
||||
}
|
||||
status = X11_XStringListToTextProperty(&title_locale, 1, &titleprop);
|
||||
SDL_free(title_locale);
|
||||
if (status) {
|
||||
X11_XSetTextProperty(display, data->xwindow, &titleprop, XA_WM_NAME);
|
||||
title_locale = SDL_iconv_utf8_locale(title);
|
||||
if (!title_locale) {
|
||||
SDL_OutOfMemory();
|
||||
return;
|
||||
}
|
||||
|
||||
status = X11_XStringListToTextProperty(&title_locale, 1, &titleprop);
|
||||
SDL_free(title_locale);
|
||||
if (status) {
|
||||
X11_XSetTextProperty(display, data->xwindow, &titleprop, XA_WM_NAME);
|
||||
X11_XFree(titleprop.value);
|
||||
}
|
||||
#ifdef X_HAVE_UTF8_STRING
|
||||
if (SDL_X11_HAVE_UTF8) {
|
||||
status = X11_Xutf8TextListToTextProperty(display, (char **) &title, 1,
|
||||
XUTF8StringStyle, &titleprop);
|
||||
if (status == Success) {
|
||||
X11_XSetTextProperty(display, data->xwindow, &titleprop,
|
||||
_NET_WM_NAME);
|
||||
X11_XFree(titleprop.value);
|
||||
}
|
||||
#ifdef X_HAVE_UTF8_STRING
|
||||
if (SDL_X11_HAVE_UTF8) {
|
||||
status =
|
||||
X11_Xutf8TextListToTextProperty(display, (char **) &title, 1,
|
||||
XUTF8StringStyle, &titleprop);
|
||||
if (status == Success) {
|
||||
X11_XSetTextProperty(display, data->xwindow, &titleprop,
|
||||
_NET_WM_NAME);
|
||||
X11_XFree(titleprop.value);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
if (icon != NULL) {
|
||||
char *icon_locale = SDL_iconv_utf8_locale(icon);
|
||||
if (!icon_locale) {
|
||||
SDL_OutOfMemory();
|
||||
return;
|
||||
}
|
||||
status = X11_XStringListToTextProperty(&icon_locale, 1, &iconprop);
|
||||
SDL_free(icon_locale);
|
||||
if (status) {
|
||||
X11_XSetTextProperty(display, data->xwindow, &iconprop,
|
||||
XA_WM_ICON_NAME);
|
||||
X11_XFree(iconprop.value);
|
||||
}
|
||||
#ifdef X_HAVE_UTF8_STRING
|
||||
if (SDL_X11_HAVE_UTF8) {
|
||||
status =
|
||||
X11_Xutf8TextListToTextProperty(display, (char **) &icon, 1,
|
||||
XUTF8StringStyle, &iconprop);
|
||||
if (status == Success) {
|
||||
X11_XSetTextProperty(display, data->xwindow, &iconprop,
|
||||
_NET_WM_ICON_NAME);
|
||||
X11_XFree(iconprop.value);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
X11_XFlush(display);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user