ewmh: make ewmh_window_icon_get() asynchronous
Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
parent
5c9cc7857d
commit
9e3fbfdb4b
5
client.c
5
client.c
|
@ -363,6 +363,7 @@ client_raise(client_t *c)
|
||||||
void
|
void
|
||||||
client_manage(xcb_window_t w, xcb_get_geometry_reply_t *wgeom, int screen)
|
client_manage(xcb_window_t w, xcb_get_geometry_reply_t *wgeom, int screen)
|
||||||
{
|
{
|
||||||
|
xcb_get_property_cookie_t ewmh_icon_cookie;
|
||||||
client_t *c, *t = NULL;
|
client_t *c, *t = NULL;
|
||||||
xcb_window_t trans;
|
xcb_window_t trans;
|
||||||
bool rettrans, retloadprops;
|
bool rettrans, retloadprops;
|
||||||
|
@ -374,6 +375,8 @@ client_manage(xcb_window_t w, xcb_get_geometry_reply_t *wgeom, int screen)
|
||||||
| XCB_EVENT_MASK_ENTER_WINDOW
|
| XCB_EVENT_MASK_ENTER_WINDOW
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Send request to get NET_WM_ICON property as soon as possible... */
|
||||||
|
ewmh_icon_cookie = ewmh_window_icon_get_unchecked(w);
|
||||||
xcb_change_window_attributes(globalconf.connection, w, XCB_CW_EVENT_MASK, select_input_val);
|
xcb_change_window_attributes(globalconf.connection, w, XCB_CW_EVENT_MASK, select_input_val);
|
||||||
|
|
||||||
if(systray_iskdedockapp(w))
|
if(systray_iskdedockapp(w))
|
||||||
|
@ -399,7 +402,7 @@ client_manage(xcb_window_t w, xcb_get_geometry_reply_t *wgeom, int screen)
|
||||||
c->geometry.height = c->f_geometry.height = c->m_geometry.height = wgeom->height;
|
c->geometry.height = c->f_geometry.height = c->m_geometry.height = wgeom->height;
|
||||||
c->layer = c->oldlayer = LAYER_TILE;
|
c->layer = c->oldlayer = LAYER_TILE;
|
||||||
client_setborder(c, wgeom->border_width);
|
client_setborder(c, wgeom->border_width);
|
||||||
c->icon = ewmh_window_icon_get(c->win);
|
c->icon = ewmh_window_icon_get_reply(ewmh_icon_cookie);
|
||||||
|
|
||||||
/* update hints */
|
/* update hints */
|
||||||
u_size_hints = client_updatesizehints(c);
|
u_size_hints = client_updatesizehints(c);
|
||||||
|
|
3
event.c
3
event.c
|
@ -540,9 +540,10 @@ event_handle_propertynotify(void *data __attribute__ ((unused)),
|
||||||
client_updatetitle(c);
|
client_updatetitle(c);
|
||||||
else if(ev->atom == _NET_WM_ICON)
|
else if(ev->atom == _NET_WM_ICON)
|
||||||
{
|
{
|
||||||
|
xcb_get_property_cookie_t icon_q = ewmh_window_icon_get_unchecked(c->win);
|
||||||
netwm_icon_delete(&c->icon);
|
netwm_icon_delete(&c->icon);
|
||||||
c->icon = ewmh_window_icon_get(c->win);
|
|
||||||
widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS);
|
widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS);
|
||||||
|
c->icon = ewmh_window_icon_get_reply(icon_q);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
20
ewmh.c
20
ewmh.c
|
@ -511,12 +511,23 @@ ewmh_check_client_hints(client_t *c)
|
||||||
p_delete(&reply);
|
p_delete(&reply);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get NET_WM_ICON.
|
/** Send request to get NET_WM_ICON (EWMH)
|
||||||
* \param w The window.
|
* \param w The window.
|
||||||
|
* \return The cookie associated with the request.
|
||||||
|
*/
|
||||||
|
xcb_get_property_cookie_t
|
||||||
|
ewmh_window_icon_get_unchecked(xcb_window_t w)
|
||||||
|
{
|
||||||
|
return xcb_get_property_unchecked(globalconf.connection, false, w,
|
||||||
|
_NET_WM_ICON, CARDINAL, 0, UINT32_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get NET_WM_ICON.
|
||||||
|
* \param cookie The cookie.
|
||||||
* \return A netwm_icon_t structure which must be deleted after usage.
|
* \return A netwm_icon_t structure which must be deleted after usage.
|
||||||
*/
|
*/
|
||||||
netwm_icon_t *
|
netwm_icon_t *
|
||||||
ewmh_window_icon_get(xcb_window_t w)
|
ewmh_window_icon_get_reply(xcb_get_property_cookie_t cookie)
|
||||||
{
|
{
|
||||||
double alpha;
|
double alpha;
|
||||||
netwm_icon_t *icon;
|
netwm_icon_t *icon;
|
||||||
|
@ -525,10 +536,7 @@ ewmh_window_icon_get(xcb_window_t w)
|
||||||
unsigned char *imgdata;
|
unsigned char *imgdata;
|
||||||
xcb_get_property_reply_t *r;
|
xcb_get_property_reply_t *r;
|
||||||
|
|
||||||
r = xcb_get_property_reply(globalconf.connection,
|
r = xcb_get_property_reply(globalconf.connection, cookie, NULL);
|
||||||
xcb_get_property_unchecked(globalconf.connection, false, w,
|
|
||||||
_NET_WM_ICON, CARDINAL, 0, UINT32_MAX),
|
|
||||||
NULL);
|
|
||||||
if(!r || r->type != CARDINAL || r->format != 32 || r->length < 2 ||
|
if(!r || r->type != CARDINAL || r->format != 32 || r->length < 2 ||
|
||||||
!(data = (uint32_t *) xcb_get_property_value(r)))
|
!(data = (uint32_t *) xcb_get_property_value(r)))
|
||||||
{
|
{
|
||||||
|
|
3
ewmh.h
3
ewmh.h
|
@ -44,7 +44,8 @@ int ewmh_process_client_message(xcb_client_message_event_t *);
|
||||||
void ewmh_update_net_client_list_stacking(int);
|
void ewmh_update_net_client_list_stacking(int);
|
||||||
void ewmh_check_client_hints(client_t *);
|
void ewmh_check_client_hints(client_t *);
|
||||||
void ewmh_update_workarea(int);
|
void ewmh_update_workarea(int);
|
||||||
netwm_icon_t * ewmh_window_icon_get(xcb_window_t);
|
xcb_get_property_cookie_t ewmh_window_icon_get_unchecked(xcb_window_t);
|
||||||
|
netwm_icon_t *ewmh_window_icon_get_reply(xcb_get_property_cookie_t);
|
||||||
void ewmh_restart(void);
|
void ewmh_restart(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue