|
@@ -739,52 +739,72 @@ void X11_SetWindowTitle(_THIS, SDL_Window *window)
|
|
|
SDL_X11_SetWindowTitle(display, xwindow, title);
|
|
|
}
|
|
|
|
|
|
-void X11_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon)
|
|
|
+static SDL_bool caught_x11_error = SDL_FALSE;
|
|
|
+static int X11_CatchAnyError(Display *d, XErrorEvent *e)
|
|
|
+{
|
|
|
+ /* this may happen during tumultuous times when we are polling anyhow,
|
|
|
+ so just note we had an error and return control. */
|
|
|
+ caught_x11_error = SDL_TRUE;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int X11_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon)
|
|
|
{
|
|
|
SDL_WindowData *data = window->driverdata;
|
|
|
Display *display = data->videodata->display;
|
|
|
Atom _NET_WM_ICON = data->videodata->_NET_WM_ICON;
|
|
|
+ int retVal = 0;
|
|
|
+ int (*prevHandler)(Display *, XErrorEvent *) = NULL;
|
|
|
|
|
|
if (icon) {
|
|
|
int propsize;
|
|
|
long *propdata;
|
|
|
|
|
|
+ int x, y;
|
|
|
+ Uint32 *src;
|
|
|
+ long *dst;
|
|
|
+
|
|
|
/* Set the _NET_WM_ICON property */
|
|
|
SDL_assert(icon->format->format == SDL_PIXELFORMAT_ARGB8888);
|
|
|
propsize = 2 + (icon->w * icon->h);
|
|
|
propdata = SDL_malloc(propsize * sizeof(long));
|
|
|
- if (propdata) {
|
|
|
- int x, y;
|
|
|
- Uint32 *src;
|
|
|
- long *dst;
|
|
|
-
|
|
|
- propdata[0] = icon->w;
|
|
|
- propdata[1] = icon->h;
|
|
|
- dst = &propdata[2];
|
|
|
- for (y = 0; y < icon->h; ++y) {
|
|
|
- src = (Uint32 *)((Uint8 *)icon->pixels + y * icon->pitch);
|
|
|
- for (x = 0; x < icon->w; ++x) {
|
|
|
- *dst++ = *src++;
|
|
|
- }
|
|
|
+
|
|
|
+ if (!propdata) {
|
|
|
+ return SDL_OutOfMemory();
|
|
|
+ }
|
|
|
+ X11_XSync(display, False);
|
|
|
+ prevHandler = X11_XSetErrorHandler(X11_CatchAnyError);
|
|
|
+
|
|
|
+ propdata[0] = icon->w;
|
|
|
+ propdata[1] = icon->h;
|
|
|
+ dst = &propdata[2];
|
|
|
+
|
|
|
+ for (y = 0; y < icon->h; ++y) {
|
|
|
+ src = (Uint32 *)((Uint8 *)icon->pixels + y * icon->pitch);
|
|
|
+ for (x = 0; x < icon->w; ++x) {
|
|
|
+ *dst++ = *src++;
|
|
|
}
|
|
|
- X11_XChangeProperty(display, data->xwindow, _NET_WM_ICON, XA_CARDINAL,
|
|
|
+ }
|
|
|
+
|
|
|
+ X11_XChangeProperty(display, data->xwindow, _NET_WM_ICON, XA_CARDINAL,
|
|
|
32, PropModeReplace, (unsigned char *)propdata,
|
|
|
propsize);
|
|
|
- }
|
|
|
SDL_free(propdata);
|
|
|
- } else {
|
|
|
- X11_XDeleteProperty(display, data->xwindow, _NET_WM_ICON);
|
|
|
+
|
|
|
+ if (caught_x11_error) {
|
|
|
+ retVal = SDL_SetError("An error occurred while trying to set the window's icon");
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
+
|
|
|
X11_XFlush(display);
|
|
|
-}
|
|
|
|
|
|
-static SDL_bool caught_x11_error = SDL_FALSE;
|
|
|
-static int X11_CatchAnyError(Display *d, XErrorEvent *e)
|
|
|
-{
|
|
|
- /* this may happen during tumultuous times when we are polling anyhow,
|
|
|
- so just note we had an error and return control. */
|
|
|
- caught_x11_error = SDL_TRUE;
|
|
|
- return 0;
|
|
|
+ if (prevHandler != NULL) {
|
|
|
+ X11_XSetErrorHandler(prevHandler);
|
|
|
+ caught_x11_error = SDL_FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ return retVal;
|
|
|
}
|
|
|
|
|
|
void X11_SetWindowPosition(_THIS, SDL_Window *window)
|