8 #include "base_config.h"
12 /*---------------------------------------------------------------------------*/
14 void set_SDL_icon(const char *filename)
16 #if !defined(__APPLE__) && !defined(_WIN32)
19 if ((icon = load_surface(filename)))
21 SDL_WM_SetIcon(icon, NULL);
23 SDL_FreeSurface(icon);
29 void set_EWMH_icon(const char *filename)
31 #if SDL_VIDEO_DRIVER_X11 && !SDL_VIDEO_DRIVER_QUARTZ
40 SDL_VERSION(&info.version);
42 if (SDL_GetWMInfo(&info) != 1)
44 fprintf(stderr, L_("Failed to get WM info: %s\n"), SDL_GetError());
48 if (info.subsystem != SDL_SYSWM_X11)
51 dpy = info.info.x11.display;
52 window = info.info.x11.wmwindow;
55 * This code loads an image and sets it as the _NET_WM_ICON window
56 * property, as described in the Extended Window Manager Hints
57 * specification[*]. From the spec: "This is an array of 32-bit packed
58 * CARDINAL ARGB with high byte being A, low byte being B. The first two
59 * cardinals are width, height. Data is in rows, left to right and top to
62 * [*] http://standards.freedesktop.org/wm-spec/latest/
65 if ((p = image_load(config_data(filename), &w, &h, &b)))
69 if ((data = calloc(2 + w * h, sizeof (long))))
76 for (r = 0; r < h; r++)
77 for (c = 0; c < w; c++)
79 long *dp = &data[2 + r * w + c];
80 unsigned char *pp = &p[(h - r - 1) * w * b + c * b];
85 *dp |= *(pp + 1) << 24;
87 *dp |= *(pp + 0) << 16;
88 *dp |= *(pp + 0) << 8;
89 *dp |= *(pp + 0) << 0;
94 *dp |= *(pp + 3) << 24;
96 *dp |= *(pp + 0) << 16;
97 *dp |= *(pp + 1) << 8;
98 *dp |= *(pp + 2) << 0;
102 info.info.x11.lock_func();
104 Atom icon = XInternAtom(dpy, "_NET_WM_ICON", False);
106 XChangeProperty(dpy, window, icon, XA_CARDINAL, 32,
107 PropModeReplace, (unsigned char *) data,
110 info.info.x11.unlock_func();
115 fputs(L_("Failed to allocate memory for EWMH icon data.\n"), stderr);
124 /*---------------------------------------------------------------------------*/