Skip to content

Commit

Permalink
Merge pull request #42 from kidanger/ignore_tag
Browse files Browse the repository at this point in the history
Ajout d'un mode pour les clients : ignore_tag
  • Loading branch information
xorg62 committed Apr 14, 2012
2 parents ef855ae + e65c6a7 commit aae337a
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 33 deletions.
22 changes: 21 additions & 1 deletion src/client.c
Expand Up @@ -548,7 +548,8 @@ _client_tab(struct client *c, struct client *cm)

/* Do not tab already tabbed client */
if(c->flags & (CLIENT_TABBED | CLIENT_TABMASTER)
|| c->tag != cm->tag || c == cm)
|| c->tag != cm->tag || c == cm
|| !COMPCLIENT(c, cm))
return;

layout_split_arrange_closed(c);
Expand Down Expand Up @@ -1459,6 +1460,25 @@ uicb_client_toggle_free(Uicb cmd)
}
}

void uicb_client_toggle_ignore_tag(Uicb cmd)
{
struct client *c;
(void)cmd;

if(!(W->client))
return;

W->client->flags ^= CLIENT_IGNORE_TAG;

/* Set tabbed client of toggled client as ignore_tag */
if(W->client->flags & CLIENT_TABMASTER)
{
SLIST_FOREACH(c, &W->client->tag->clients, tnext)
if(c->tabmaster == W->client && c != W->client)
c->flags ^= CLIENT_IGNORE_TAG;
}
}

void
uicb_client_tab_next_opened(Uicb cmd)
{
Expand Down
8 changes: 6 additions & 2 deletions src/client.h
Expand Up @@ -18,6 +18,9 @@
SLIST_FOREACH(V, H, F) \
if(!(V->flags & CLIENT_FREE))

/* Are two clients compatibles ? (to be tabbed together) */
#define COMPCLIENT(C1, C2) ((C1->flags & CLIENT_IGNORE_TAG) == (C2->flags & CLIENT_IGNORE_TAG))

void client_configure(struct client *c);
struct client *client_gb_win(Window w);
struct client *client_gb_frame(Window w);
Expand Down Expand Up @@ -58,6 +61,7 @@ void client_update_props(struct client *c, Flags f);
void client_fac_hint(struct client *c);
void uicb_client_untab(Uicb cmd);
void uicb_client_toggle_free(Uicb cmd);
void uicb_client_toggle_ignore_tag(Uicb cmd);
void uicb_client_tab_next_opened(Uicb cmd);

/* Generated */
Expand Down Expand Up @@ -187,14 +191,14 @@ clients_tag_arrange_map(struct tag *t)
}

static inline struct client*
client_get_larger(struct tag *t)
client_get_larger(struct tag *t, bool ignoring_tag)
{
struct client *c, *lc = NULL;
int tmp, l = 0;

FOREACH_NFCLIENT(c, &t->clients, tnext)
{
if((tmp = (c->geo.w + c->geo.h)) > l)
if((tmp = (c->geo.w + c->geo.h)) > l && (c->flags & CLIENT_IGNORE_TAG) == ignoring_tag)
{
l = tmp;
lc = c;
Expand Down
55 changes: 28 additions & 27 deletions src/config.h
Expand Up @@ -55,33 +55,34 @@ static const struct { char *name; void (*func)(Uicb cmd); } uicb_list[] =
{ "layout_integrate_bottom", uicb_layout_integrate_Bottom },

/* Client */
{ "client_close", uicb_client_close },
{ "client_resize_right", uicb_client_resize_Right },
{ "client_resize_left", uicb_client_resize_Left },
{ "client_resize_top", uicb_client_resize_Top },
{ "client_resize_bottom", uicb_client_resize_Bottom },
{ "client_focus_right", uicb_client_focus_Right },
{ "client_focus_left", uicb_client_focus_Left },
{ "client_focus_top", uicb_client_focus_Top },
{ "client_focus_bottom", uicb_client_focus_Bottom },
{ "client_tab_right", uicb_client_tab_Right },
{ "client_tab_left", uicb_client_tab_Left },
{ "client_tab_top", uicb_client_tab_Top },
{ "client_tab_bottom", uicb_client_tab_Bottom },
{ "client_swap_right", uicb_client_swap_Right },
{ "client_swap_left", uicb_client_swap_Left },
{ "client_swap_top", uicb_client_swap_Top },
{ "client_swap_bottom", uicb_client_swap_Bottom },
{ "client_focus_next", uicb_client_focus_next },
{ "client_focus_prev", uicb_client_focus_prev },
{ "client_swap_next", uicb_client_swapsel_next },
{ "client_swap_prev", uicb_client_swapsel_prev },
{ "client_untab", uicb_client_untab },
{ "client_focus_next_tab", uicb_client_focus_next_tab },
{ "client_focus_prev_tab", uicb_client_focus_prev_tab },
{ "client_focus_click", uicb_client_focus_click },
{ "client_toggle_free", uicb_client_toggle_free },
{ "client_tab_next_opened", uicb_client_tab_next_opened },
{ "client_close", uicb_client_close },
{ "client_resize_right", uicb_client_resize_Right },
{ "client_resize_left", uicb_client_resize_Left },
{ "client_resize_top", uicb_client_resize_Top },
{ "client_resize_bottom", uicb_client_resize_Bottom },
{ "client_focus_right", uicb_client_focus_Right },
{ "client_focus_left", uicb_client_focus_Left },
{ "client_focus_top", uicb_client_focus_Top },
{ "client_focus_bottom", uicb_client_focus_Bottom },
{ "client_tab_right", uicb_client_tab_Right },
{ "client_tab_left", uicb_client_tab_Left },
{ "client_tab_top", uicb_client_tab_Top },
{ "client_tab_bottom", uicb_client_tab_Bottom },
{ "client_swap_right", uicb_client_swap_Right },
{ "client_swap_left", uicb_client_swap_Left },
{ "client_swap_top", uicb_client_swap_Top },
{ "client_swap_bottom", uicb_client_swap_Bottom },
{ "client_focus_next", uicb_client_focus_next },
{ "client_focus_prev", uicb_client_focus_prev },
{ "client_swap_next", uicb_client_swapsel_next },
{ "client_swap_prev", uicb_client_swapsel_prev },
{ "client_untab", uicb_client_untab },
{ "client_focus_next_tab", uicb_client_focus_next_tab },
{ "client_focus_prev_tab", uicb_client_focus_prev_tab },
{ "client_focus_click", uicb_client_focus_click },
{ "client_toggle_free", uicb_client_toggle_free },
{ "client_toggle_ignore_tag", uicb_client_toggle_ignore_tag },
{ "client_tab_next_opened", uicb_client_tab_next_opened },

/* Status */
{ "status" , uicb_status },
Expand Down
9 changes: 6 additions & 3 deletions src/layout.c
Expand Up @@ -395,8 +395,9 @@ layout_split_integrate(struct client *c, struct client *sc)
if(!sc
|| sc == c
|| sc->tag != c->tag
|| (sc->flags & CLIENT_FREE))
sc = client_get_larger(c->tag);
|| (sc->flags & CLIENT_FREE)
|| !COMPCLIENT(c, sc))
sc = client_get_larger(c->tag, c->flags & CLIENT_IGNORE_TAG);

/* Largest not correct */
if(!sc || sc == c)
Expand All @@ -419,13 +420,14 @@ layout_split_integrate(struct client *c, struct client *sc)
}

/* Tab Next Opened Client option */
if(W->flags & WMFS_TABNOC)
if(W->flags & WMFS_TABNOC && COMPCLIENT(c, sc))
{
W->flags ^= WMFS_TABNOC;
_client_tab(c, sc);
return;
}

/* If there are clients but we can tab with them, split the screen. */
c->flags |= CLIENT_TILED;

g = layout_split(sc, (sc->geo.h < sc->geo.w));
Expand All @@ -437,6 +439,7 @@ layout_split_integrate(struct client *c, struct client *sc)
client_fac_hint(sc);

layout_save_set(c->tag);
W->flags &= ~WMFS_TABNOC;
}

/* Arrange inter-clients holes:
Expand Down
9 changes: 9 additions & 0 deletions src/tag.c
Expand Up @@ -46,17 +46,26 @@ tag_new(struct screen *s, char *name)
void
tag_screen(struct screen *s, struct tag *t)
{
struct client *c;

/* Return to the previous tag */
if(t == s->seltag && TAILQ_NEXT(TAILQ_FIRST(&s->tags), next))
t = t->prev;

if(!t)
t = TAILQ_FIRST(&s->tags);

/* Move clients which ignore tags */
SLIST_FOREACH(c, &W->h.client, next)
if (c->flags & CLIENT_IGNORE_TAG)
tag_client(t, c);

t->prev = s->seltag;
s->seltag = t;

clients_arrange_map();

/* Update focus */
if(!SLIST_EMPTY(&t->clients) && !(W->flags & WMFS_SCAN))
client_focus( client_tab_next(t->sel));

Expand Down
1 change: 1 addition & 0 deletions src/wmfs.h
Expand Up @@ -216,6 +216,7 @@ struct client
#define CLIENT_FREE 0x1000
#define CLIENT_TILED 0x2000
#define CLIENT_MOUSE 0x4000
#define CLIENT_IGNORE_TAG 0x8000
Flags flags;
Window win, frame, tmp;
SLIST_ENTRY(client) next; /* Global list */
Expand Down

0 comments on commit aae337a

Please sign in to comment.