Client *next_visible(Client *c);
Client *prev_visible(Client *c);
Client *last_client();
void attach_to_end(Client *c);
void next_client(const char *arg);
void prev_client(const char *arg);

void
attach_to_end(Client *c) {
   Client *last = last_client();
   if( last == NULL )
   {
      attach(c);
      return;
   }
   last->next = c;
   c->prev = last;
   c->next = NULL;
}

Client*
prev_visible(Client *c)
{
   Client* dum = c;
   while( dum &&  !isvisible(dum) )
      dum = dum->prev;
   return dum;
}

Client* 
next_visible(Client *c)
{
   Client *dum = c;
   while( dum && !isvisible(dum) )
      dum = dum->next;
   return dum;
}

void
next_client(const char *arg)
{
   Client *c = next_visible(clients);
   if( !c ) return;
   detach(c);
   attach_to_end(c);

   Client *nc = next_visible(clients);
   focus(nc);
   arrange();
}

void
prev_client(const char *arg)
{
   Client *c  = last_client();
   if(!c) return;
   while( !isvisible(c) )
      c = prev_visible(c);
   if(!c) return;

   detach(c);
   attach(c);
   focus(c);
   arrange();
}

Client* last_client() {
   Client* dum = clients;
   if( !dum ) return NULL;

   while( dum->next )
      dum=dum->next;
   return dum;
}

