mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-19 12:28:22 +01:00
Fix handling of NET_WM_ICON
NET_WM_ICON is a property change, not a message. updateIconImage doesn't use scr, remove it. updateIconImage should clear out the net_icon_image if there isn't one anymore (i.e. XGetWindowProperty fails or the icon cannot be extracted). When the icon is changed, we need to call wIconUpdate. Signed-off-by: Brad Jorsch <anomie@users.sourceforge.net>
This commit is contained in:
committed by
Carlos R. Mafra
parent
5eebb8bc3c
commit
7aff3b6e44
29
src/wmspec.c
29
src/wmspec.c
@@ -426,13 +426,16 @@ static RImage *makeRImageFromARGBData(unsigned long *data)
|
|||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void updateIconImage(WScreen * scr, WWindow * wwin)
|
static void updateIconImage(WWindow * wwin)
|
||||||
{
|
{
|
||||||
unsigned long *property, *data;
|
unsigned long *property, *data;
|
||||||
unsigned long items, rest;
|
unsigned long items, rest;
|
||||||
Atom type;
|
Atom type;
|
||||||
int format;
|
int format;
|
||||||
RImage *image;
|
|
||||||
|
if (wwin->net_icon_image)
|
||||||
|
RReleaseImage(wwin->net_icon_image);
|
||||||
|
wwin->net_icon_image = NULL;
|
||||||
|
|
||||||
if (XGetWindowProperty(dpy, wwin->client_win, net_wm_icon, 0L, LONG_MAX,
|
if (XGetWindowProperty(dpy, wwin->client_win, net_wm_icon, 0L, LONG_MAX,
|
||||||
False, XA_CARDINAL, &type, &format, &items, &rest,
|
False, XA_CARDINAL, &type, &format, &items, &rest,
|
||||||
@@ -451,15 +454,11 @@ static void updateIconImage(WScreen * scr, WWindow * wwin)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
image = makeRImageFromARGBData(data);
|
wwin->net_icon_image = makeRImageFromARGBData(data);
|
||||||
|
|
||||||
if (image) {
|
|
||||||
if (wwin->net_icon_image)
|
|
||||||
RReleaseImage(wwin->net_icon_image);
|
|
||||||
wwin->net_icon_image = image;
|
|
||||||
}
|
|
||||||
|
|
||||||
XFree(property);
|
XFree(property);
|
||||||
|
|
||||||
|
if (wwin->icon) wIconUpdate(wwin->icon);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void updateShowDesktop(WScreen * scr, Bool show)
|
static void updateShowDesktop(WScreen * scr, Bool show)
|
||||||
@@ -1329,7 +1328,7 @@ Bool wNETWMCheckInitialClientState(WWindow * wwin)
|
|||||||
|
|
||||||
hasState |= updateNetIconInfo(wwin);
|
hasState |= updateNetIconInfo(wwin);
|
||||||
|
|
||||||
updateIconImage(wwin->screen_ptr, wwin);
|
updateIconImage(wwin);
|
||||||
|
|
||||||
return hasState;
|
return hasState;
|
||||||
}
|
}
|
||||||
@@ -1443,7 +1442,7 @@ Bool wNETWMProcessClientMessage(XClientMessageEvent * event)
|
|||||||
long set = event->data.l[0];
|
long set = event->data.l[0];
|
||||||
|
|
||||||
#ifdef DEBUG_WMSPEC
|
#ifdef DEBUG_WMSPEC
|
||||||
printf("net_wm_state set %d a1 %s a2 %s\n", set,
|
printf("net_wm_state set %ld a1 %s a2 %s\n", set,
|
||||||
XGetAtomName(dpy, event->data.l[1]), XGetAtomName(dpy, event->data.l[2]));
|
XGetAtomName(dpy, event->data.l[1]), XGetAtomName(dpy, event->data.l[2]));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1471,8 +1470,6 @@ Bool wNETWMProcessClientMessage(XClientMessageEvent * event)
|
|||||||
wWindowSetOmnipresent(wwin, False);
|
wWindowSetOmnipresent(wwin, False);
|
||||||
wWindowChangeWorkspace(wwin, desktop);
|
wWindowChangeWorkspace(wwin, desktop);
|
||||||
}
|
}
|
||||||
} else if (event->message_type == net_wm_icon) {
|
|
||||||
updateIconImage(scr, wwin);
|
|
||||||
} else {
|
} else {
|
||||||
done = False;
|
done = False;
|
||||||
}
|
}
|
||||||
@@ -1484,6 +1481,10 @@ Bool wNETWMCheckClientHintChange(WWindow * wwin, XPropertyEvent * event)
|
|||||||
{
|
{
|
||||||
Bool ret = True;
|
Bool ret = True;
|
||||||
|
|
||||||
|
#ifdef DEBUG_WMSPEC
|
||||||
|
printf("clientHintChange type %s\n", XGetAtomName(dpy, event->atom));
|
||||||
|
#endif
|
||||||
|
|
||||||
if (event->atom == net_wm_strut) {
|
if (event->atom == net_wm_strut) {
|
||||||
updateStrut(wwin, False);
|
updateStrut(wwin, False);
|
||||||
updateStrut(wwin, True);
|
updateStrut(wwin, True);
|
||||||
@@ -1502,6 +1503,8 @@ Bool wNETWMCheckClientHintChange(WWindow * wwin, XPropertyEvent * event)
|
|||||||
char *name = wNETWMGetIconName(wwin->client_win);
|
char *name = wNETWMGetIconName(wwin->client_win);
|
||||||
wIconChangeTitle(wwin->icon, name);
|
wIconChangeTitle(wwin->icon, name);
|
||||||
}
|
}
|
||||||
|
} else if (event->atom == net_wm_icon) {
|
||||||
|
updateIconImage(wwin);
|
||||||
} else {
|
} else {
|
||||||
ret = False;
|
ret = False;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user