Set and unset individual atoms in _NET_WM_STATE instead of overwriting the entire list everytime. This allows independent management of multiple states.
fixes #1873
This commit is contained in:
45
src/xcb.c
45
src/xcb.c
@ -274,3 +274,48 @@ xcb_visualid_t get_visualid_by_depth(uint16_t depth) {
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add an atom to a list of atoms the given property defines.
|
||||
* This is useful, for example, for manipulating _NET_WM_STATE.
|
||||
*
|
||||
*/
|
||||
void xcb_add_property_atom(xcb_connection_t *conn, xcb_window_t window, xcb_atom_t property, xcb_atom_t atom) {
|
||||
xcb_change_property(conn, XCB_PROP_MODE_APPEND, window, property, XCB_ATOM_ATOM, 32, 1, (uint32_t[]){atom});
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove an atom from a list of atoms the given property defines without
|
||||
* removing any other potentially set atoms. This is useful, for example, for
|
||||
* manipulating _NET_WM_STATE.
|
||||
*
|
||||
*/
|
||||
void xcb_remove_property_atom(xcb_connection_t *conn, xcb_window_t window, xcb_atom_t property, xcb_atom_t atom) {
|
||||
xcb_grab_server(conn);
|
||||
|
||||
xcb_get_property_reply_t *reply =
|
||||
xcb_get_property_reply(conn,
|
||||
xcb_get_property(conn, false, window, property, XCB_GET_PROPERTY_TYPE_ANY, 0, 4096), NULL);
|
||||
if (reply == NULL || xcb_get_property_value_length(reply) == 0)
|
||||
goto release_grab;
|
||||
xcb_atom_t *atoms = xcb_get_property_value(reply);
|
||||
if (atoms == NULL) {
|
||||
goto release_grab;
|
||||
}
|
||||
|
||||
{
|
||||
int num = 0;
|
||||
const int current_size = xcb_get_property_value_length(reply) / (reply->format / 8);
|
||||
xcb_atom_t values[current_size];
|
||||
for (int i = 0; i < current_size; i++) {
|
||||
if (atoms[i] != atom)
|
||||
values[num++] = atoms[i];
|
||||
}
|
||||
|
||||
xcb_change_property(conn, XCB_PROP_MODE_REPLACE, window, property, XCB_ATOM_ATOM, 32, num, values);
|
||||
}
|
||||
|
||||
release_grab:
|
||||
FREE(reply);
|
||||
xcb_ungrab_server(conn);
|
||||
}
|
||||
|
Reference in New Issue
Block a user