Implement new 'sticky' command to manually set, remove or toggle the sticky state on a window.
This commit is contained in:
@ -1569,6 +1569,37 @@ void cmd_fullscreen(I3_CMD, char *action, char *fullscreen_mode) {
|
||||
ysuccess(true);
|
||||
}
|
||||
|
||||
/*
|
||||
* Implementation of 'sticky enable|disable|toggle'.
|
||||
*
|
||||
*/
|
||||
void cmd_sticky(I3_CMD, char *action) {
|
||||
DLOG("%s sticky on window\n", action);
|
||||
HANDLE_EMPTY_MATCH;
|
||||
|
||||
owindow *current;
|
||||
TAILQ_FOREACH(current, &owindows, owindows) {
|
||||
if (current->con->window == NULL) {
|
||||
ELOG("only containers holding a window can be made sticky, skipping con = %p\n", current->con);
|
||||
continue;
|
||||
}
|
||||
DLOG("setting sticky for container = %p / %s\n", current->con, current->con->name);
|
||||
|
||||
bool sticky = false;
|
||||
if (strcmp(action, "enable") == 0)
|
||||
sticky = true;
|
||||
else if (strcmp(action, "disable") == 0)
|
||||
sticky = false;
|
||||
else if (strcmp(action, "toggle") == 0)
|
||||
sticky = !current->con->sticky;
|
||||
|
||||
current->con->sticky = sticky;
|
||||
ewmh_update_sticky(current->con->window->id, sticky);
|
||||
}
|
||||
|
||||
ysuccess(true);
|
||||
}
|
||||
|
||||
/*
|
||||
* Implementation of 'move <direction> [<pixels> [px]]'.
|
||||
*
|
||||
|
14
src/ewmh.c
14
src/ewmh.c
@ -213,6 +213,20 @@ void ewmh_update_client_list_stacking(xcb_window_t *stack, int num_windows) {
|
||||
stack);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set or remove _NET_WM_STATE_STICKY on the window.
|
||||
*
|
||||
*/
|
||||
void ewmh_update_sticky(xcb_window_t window, bool sticky) {
|
||||
uint32_t values[1];
|
||||
unsigned int num = 0;
|
||||
|
||||
if (sticky)
|
||||
values[num++] = A__NET_WM_STATE_STICKY;
|
||||
|
||||
xcb_change_property(conn, XCB_PROP_MODE_REPLACE, window, A__NET_WM_STATE, XCB_ATOM_ATOM, 32, num, values);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up the EWMH hints on the root window.
|
||||
*
|
||||
|
Reference in New Issue
Block a user