client: add client_seturgent() and remove urgent hint on focus

According to EWMH, the window manager is responsible for removing the
urgent state of a client. Also, this commit adds a new
client_seturgent(client_t *, bool) function to set the urgent state if
needed.

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Gregor Best 2009-02-11 18:41:58 +01:00 committed by Julien Danjou
parent 01eff69bf4
commit 050a6bbb61
4 changed files with 38 additions and 12 deletions

View File

@ -110,6 +110,36 @@ window_hasproto(xcb_window_t win, xcb_atom_t atom)
return ret;
}
/** Change the clients urgency flag.
* \param c The client
* \param urgent The new flag state
*/
void
client_seturgent(client_t *c, bool urgent)
{
if(c->isurgent != urgent)
{
xcb_get_property_cookie_t hints =
xcb_get_wm_hints_unchecked(globalconf.connection, c->win);
c->isurgent = urgent;
ewmh_client_update_hints(c);
/* update ICCCM hints */
xcb_wm_hints_t wmh;
xcb_get_wm_hints_reply(globalconf.connection, hints, &wmh, NULL);
if(urgent)
wmh.flags |= XCB_WM_HINT_X_URGENCY;
else
wmh.flags &= ~XCB_WM_HINT_X_URGENCY;
xcb_set_wm_hints(globalconf.connection, c->win, &wmh);
hooks_property(c, "urgent");
}
}
/** Returns true if a client is tagged
* with one of the tags of the specified screen.
* \param c The client to check.
@ -296,6 +326,9 @@ client_focus(client_t *c)
luaA_dofunction(globalconf.L, globalconf.hooks.focus, 1, 0);
}
/* according to EWMH, we have to remove the urgent state from a client */
client_seturgent(c, false);
ewmh_update_net_active_window(c->phys_screen);
}

View File

@ -66,6 +66,7 @@ void client_setmaxhoriz(client_t *, bool);
void client_setmaxvert(client_t *, bool);
void client_setminimized(client_t *, bool);
void client_setborder(client_t *, int);
void client_seturgent(client_t *, bool);
void client_focus(client_t *);
int luaA_client_newindex(lua_State *);

9
ewmh.c
View File

@ -347,14 +347,11 @@ ewmh_process_state_atom(client_t *c, xcb_atom_t state, int set)
else if(state == _NET_WM_STATE_DEMANDS_ATTENTION)
{
if(set == _NET_WM_STATE_REMOVE)
c->isurgent = false;
client_seturgent(c, false);
else if(set == _NET_WM_STATE_ADD)
c->isurgent = true;
client_seturgent(c, true);
else if(set == _NET_WM_STATE_TOGGLE)
c->isurgent = !c->isurgent;
/* execute hook */
hooks_property(c, "urgent");
client_seturgent(c, !c->isurgent);
}
}

View File

@ -172,12 +172,7 @@ property_update_wm_hints(client_t *c, xcb_get_property_reply_t *reply)
}
bool isurgent = xcb_wm_hints_get_urgency(&wmh);
if(isurgent != c->isurgent)
{
c->isurgent = isurgent;
/* execute hook */
hooks_property(c, "urgent");
}
client_seturgent(c, isurgent);
if(wmh.flags & XCB_WM_HINT_STATE &&
wmh.initial_state == XCB_WM_STATE_WITHDRAWN)
client_setborder(c, 0);