diff --git a/src/config.h b/src/config.h index e95e411..12f2403 100644 --- a/src/config.h +++ b/src/config.h @@ -82,6 +82,8 @@ static const struct { char *name; void (*func)(Uicb cmd); } uicb_list[] = /* Screen */ { "screen_next", uicb_screen_next }, { "screen_prev", uicb_screen_prev }, + { "screen_move_client_next", uicb_screen_move_client_next }, + { "screen_move_client_prev", uicb_screen_move_client_prev }, { NULL, NULL } }; diff --git a/src/screen.c b/src/screen.c index 6dfb080..9a11820 100644 --- a/src/screen.c +++ b/src/screen.c @@ -126,6 +126,43 @@ uicb_screen_prev(Uicb cmd) screen_select(SLIST_FIRST(&W->h.screen)); } +static void +screen_move_client(struct client *c, struct screen *s) +{ + if (c && s) { + c->screen = s; + tag_client(s->seltag, c); + } +} + +void +uicb_screen_move_client_next(Uicb cmd) +{ + struct screen *s; + (void)cmd; + + if(!(s = SLIST_NEXT(W->screen, next))) + s = SLIST_FIRST(&W->h.screen); + + screen_move_client(W->client, s); +} + +void +uicb_screen_move_client_prev(Uicb cmd) +{ + struct screen *s; + (void)cmd; + + SLIST_FOREACH(s, &W->h.screen, next) + if(SLIST_NEXT(W->screen, next) == s) + { + screen_move_client(W->client, s); + return; + } + + screen_move_client(W->client, SLIST_FIRST(&W->h.screen)); +} + void screen_free(void) { diff --git a/src/screen.h b/src/screen.h index 41e60de..16b0dcb 100644 --- a/src/screen.h +++ b/src/screen.h @@ -45,6 +45,8 @@ struct screen* screen_update_sel(void); void screen_free(void); void uicb_screen_next(Uicb cmd); void uicb_screen_prev(Uicb cmd); +void uicb_screen_move_client_next(Uicb cmd); +void uicb_screen_move_client_prev(Uicb cmd); #endif /* SCREEN_H */