Push the property requests down

Instead of calling each property handler with a property reply, it's now up to
the handlers to request the properties.

Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
Uli Schlachter 2010-08-09 13:04:08 +02:00
parent 2f20494676
commit 709619b466
4 changed files with 49 additions and 68 deletions

17
ewmh.c
View File

@ -590,17 +590,14 @@ ewmh_client_check_hints(client_t *c)
* \param strut_r (Optional) An existing reply.
*/
void
ewmh_process_client_strut(client_t *c, xcb_get_property_reply_t *strut_r)
ewmh_process_client_strut(client_t *c)
{
void *data;
xcb_get_property_reply_t *mstrut_r = NULL;
xcb_get_property_reply_t *strut_r;
if(!strut_r)
{
xcb_get_property_cookie_t strut_q = xcb_get_property_unchecked(globalconf.connection, false, c->window,
_NET_WM_STRUT_PARTIAL, XCB_ATOM_CARDINAL, 0, 12);
strut_r = mstrut_r = xcb_get_property_reply(globalconf.connection, strut_q, NULL);
}
xcb_get_property_cookie_t strut_q = xcb_get_property_unchecked(globalconf.connection, false, c->window,
_NET_WM_STRUT_PARTIAL, XCB_ATOM_CARDINAL, 0, 12);
strut_r = xcb_get_property_reply(globalconf.connection, strut_q, NULL);
if(strut_r
&& strut_r->value_len
@ -640,7 +637,7 @@ ewmh_process_client_strut(client_t *c, xcb_get_property_reply_t *strut_r)
}
}
p_delete(&mstrut_r);
p_delete(&strut_r);
}
/** Send request to get NET_WM_ICON (EWMH)
@ -654,7 +651,7 @@ ewmh_window_icon_get_unchecked(xcb_window_t w)
_NET_WM_ICON, XCB_ATOM_CARDINAL, 0, UINT32_MAX);
}
int
static int
ewmh_window_icon_from_reply(xcb_get_property_reply_t *r)
{
uint32_t *data;

3
ewmh.h
View File

@ -34,10 +34,9 @@ int ewmh_process_client_message(xcb_client_message_event_t *);
void ewmh_update_net_client_list_stacking(int);
void ewmh_client_check_hints(client_t *);
void ewmh_client_update_desktop(client_t *);
void ewmh_process_client_strut(client_t *, xcb_get_property_reply_t *);
void ewmh_process_client_strut(client_t *);
void ewmh_update_strut(xcb_window_t, strut_t *);
xcb_get_property_cookie_t ewmh_window_icon_get_unchecked(xcb_window_t);
int ewmh_window_icon_from_reply(xcb_get_property_reply_t *);
int ewmh_window_icon_get_reply(xcb_get_property_cookie_t);
#endif

View File

@ -551,7 +551,7 @@ HANDLE_GEOM(height)
property_update_wm_protocols(c, property_get_wm_protocols(c));
/* update strut */
ewmh_process_client_strut(c, NULL);
ewmh_process_client_strut(c);
ewmh_update_net_client_list(c->phys_screen);

View File

@ -56,8 +56,7 @@
static int \
property_handle_##funcname(uint8_t state, \
xcb_window_t window, \
xcb_atom_t name, \
xcb_get_property_reply_t *reply) \
xcb_atom_t name) \
{ \
client_t *c = client_getbywin(window); \
if(c) \
@ -79,8 +78,7 @@ HANDLE_TEXT_PROPERTY(wm_window_role, WM_WINDOW_ROLE, client_set_role)
static int \
property_handle_##name(uint8_t state, \
xcb_window_t window, \
xcb_atom_t name, \
xcb_get_property_reply_t *reply) \
xcb_atom_t name) \
{ \
client_t *c = client_getbywin(window); \
if(c) \
@ -227,13 +225,12 @@ property_update_wm_class(client_t *c, xcb_get_property_cookie_t cookie)
static int
property_handle_net_wm_strut_partial(uint8_t state,
xcb_window_t window,
xcb_atom_t name,
xcb_get_property_reply_t *reply)
xcb_atom_t name)
{
client_t *c = client_getbywin(window);
if(c)
ewmh_process_client_strut(c, reply);
ewmh_process_client_strut(c);
return 0;
}
@ -317,13 +314,20 @@ property_update_wm_protocols(client_t *c, xcb_get_property_cookie_t cookie)
static int
property_handle_xembed_info(uint8_t state,
xcb_window_t window,
xcb_atom_t name,
xcb_get_property_reply_t *reply)
xcb_atom_t name)
{
xembed_window_t *emwin = xembed_getbywin(&globalconf.embedded, window);
if(emwin)
xembed_property_update(globalconf.connection, emwin, reply);
{
xcb_get_property_cookie_t cookie =
xcb_get_property(globalconf.connection, 0, window, _XEMBED_INFO,
XCB_GET_PROPERTY_TYPE_ANY, 0, 3);
xcb_get_property_reply_t *propr =
xcb_get_property_reply(globalconf.connection, cookie, 0);
xembed_property_update(globalconf.connection, emwin, propr);
p_delete(&propr);
}
return 0;
}
@ -331,8 +335,7 @@ property_handle_xembed_info(uint8_t state,
static int
property_handle_xrootpmap_id(uint8_t state,
xcb_window_t window,
xcb_atom_t name,
xcb_get_property_reply_t *reply)
xcb_atom_t name)
{
if(globalconf.xinerama_is_active)
foreach(w, globalconf.wiboxes)
@ -351,15 +354,14 @@ property_handle_xrootpmap_id(uint8_t state,
static int
property_handle_net_wm_opacity(uint8_t state,
xcb_window_t window,
xcb_atom_t name,
xcb_get_property_reply_t *reply)
xcb_atom_t name)
{
wibox_t *wibox = wibox_getbywin(window);
if(wibox)
{
luaA_object_push(globalconf.L, wibox);
window_set_opacity(globalconf.L, -1, xwindow_get_opacity_from_reply(reply));
window_set_opacity(globalconf.L, -1, xwindow_get_opacity(wibox->window));
lua_pop(globalconf.L, -1);
}
else
@ -368,7 +370,7 @@ property_handle_net_wm_opacity(uint8_t state,
if(c)
{
luaA_object_push(globalconf.L, c);
window_set_opacity(globalconf.L, -1, xwindow_get_opacity_from_reply(reply));
window_set_opacity(globalconf.L, -1, xwindow_get_opacity(c->window));
lua_pop(globalconf.L, 1);
}
}
@ -385,68 +387,51 @@ property_handle_net_wm_opacity(uint8_t state,
void
property_handle_propertynotify(xcb_property_notify_event_t *ev)
{
uint32_t length;
int (*handler)(uint8_t state,
xcb_window_t window,
xcb_atom_t name,
xcb_get_property_reply_t *reply) = NULL;
xcb_atom_t name) = NULL;
/* Find the correct event handler */
#define HANDLE(atom_, cb, len) \
#define HANDLE(atom_, cb) \
if (ev->atom == atom_) \
{ \
handler = cb; \
length = len; \
} else
#define HANDLE_L(atom, cb) HANDLE(atom, cb, UINT_MAX)
#define HANDLE_S(atom, cb) HANDLE(atom, cb, 1)
#define END return
/* Xembed stuff */
HANDLE_L(_XEMBED_INFO, property_handle_xembed_info)
HANDLE(_XEMBED_INFO, property_handle_xembed_info)
/* ICCCM stuff */
HANDLE_L(XCB_ATOM_WM_TRANSIENT_FOR, property_handle_wm_transient_for)
HANDLE_L(WM_CLIENT_LEADER, property_handle_wm_client_leader)
HANDLE_L(XCB_ATOM_WM_NORMAL_HINTS, property_handle_wm_normal_hints)
HANDLE_L(XCB_ATOM_WM_HINTS, property_handle_wm_hints)
HANDLE_L(XCB_ATOM_WM_NAME, property_handle_wm_name)
HANDLE_L(XCB_ATOM_WM_ICON_NAME, property_handle_wm_icon_name)
HANDLE_L(XCB_ATOM_WM_CLASS, property_handle_wm_class)
HANDLE_L(WM_PROTOCOLS, property_handle_wm_protocols)
HANDLE_L(XCB_ATOM_WM_CLIENT_MACHINE, property_handle_wm_client_machine)
HANDLE_L(WM_WINDOW_ROLE, property_handle_wm_window_role)
HANDLE(XCB_ATOM_WM_TRANSIENT_FOR, property_handle_wm_transient_for)
HANDLE(WM_CLIENT_LEADER, property_handle_wm_client_leader)
HANDLE(XCB_ATOM_WM_NORMAL_HINTS, property_handle_wm_normal_hints)
HANDLE(XCB_ATOM_WM_HINTS, property_handle_wm_hints)
HANDLE(XCB_ATOM_WM_NAME, property_handle_wm_name)
HANDLE(XCB_ATOM_WM_ICON_NAME, property_handle_wm_icon_name)
HANDLE(XCB_ATOM_WM_CLASS, property_handle_wm_class)
HANDLE(WM_PROTOCOLS, property_handle_wm_protocols)
HANDLE(XCB_ATOM_WM_CLIENT_MACHINE, property_handle_wm_client_machine)
HANDLE(WM_WINDOW_ROLE, property_handle_wm_window_role)
/* EWMH stuff */
HANDLE_L(_NET_WM_NAME, property_handle_net_wm_name)
HANDLE_L(_NET_WM_ICON_NAME, property_handle_net_wm_icon_name)
HANDLE_L(_NET_WM_STRUT_PARTIAL, property_handle_net_wm_strut_partial)
HANDLE_L(_NET_WM_ICON, property_handle_net_wm_icon)
HANDLE_L(_NET_WM_PID, property_handle_net_wm_pid)
HANDLE_S(_NET_WM_WINDOW_OPACITY, property_handle_net_wm_opacity)
HANDLE(_NET_WM_NAME, property_handle_net_wm_name)
HANDLE(_NET_WM_ICON_NAME, property_handle_net_wm_icon_name)
HANDLE(_NET_WM_STRUT_PARTIAL, property_handle_net_wm_strut_partial)
HANDLE(_NET_WM_ICON, property_handle_net_wm_icon)
HANDLE(_NET_WM_PID, property_handle_net_wm_pid)
HANDLE(_NET_WM_WINDOW_OPACITY, property_handle_net_wm_opacity)
/* background change */
HANDLE_S(_XROOTPMAP_ID, property_handle_xrootpmap_id)
HANDLE(_XROOTPMAP_ID, property_handle_xrootpmap_id)
/* If nothing was found, return */
END;
#undef HANDLE_L
#undef HANDLE_S
#undef HANDLE
#undef END
/* Get the property, if needed. */
xcb_get_property_reply_t *propr = NULL;
if(ev->state != XCB_PROPERTY_DELETE)
{
xcb_get_property_cookie_t cookie =
xcb_get_property(globalconf.connection, 0, ev->window, ev->atom,
XCB_GET_PROPERTY_TYPE_ANY, 0, length);
propr = xcb_get_property_reply(globalconf.connection, cookie, 0);
}
(*handler)(ev->state, ev->window, ev->atom, propr);
p_delete(&propr);
(*handler)(ev->state, ev->window, ev->atom);
}
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80