[client] Fix bug with atoi() and make uicb focus take 0 as arg

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Julien Danjou 2008-05-03 12:17:49 +02:00
parent 0e1747587c
commit 39a070a5ae
1 changed files with 27 additions and 13 deletions

View File

@ -904,22 +904,28 @@ uicb_client_settrans(int screen __attribute__ ((unused)), char *arg)
} }
/** Find a visible client on screen. Return next client or previous client if /** Find a visible client on screen. Return next client or previous client if
* reverse is true. * nindex is less than 0. If nindex is 0, then sel itself can be returned if
* \param sel current selected client * visible.
* \param reverse return previous instead of next if true * \param sel Current selected client.
* \return next or previous client * \param nindex Number of windows to match before returning.
* \return Next or previous visible client.
*/ */
static client_t * static client_t *
client_find_visible(client_t *sel, int nindex) client_find_visible(client_t *sel, int nindex)
{ {
int i = 0; int i = 0, screen;
client_t *next; client_t *next;
client_t *(*client_iter)(client_t **, client_t *) = client_list_next_cycle; client_t *(*client_iter)(client_t **, client_t *) = client_list_next_cycle;
if(!sel || nindex == 0) if(!sel)
return NULL; return NULL;
else if(nindex < 0)
screen = sel->screen;
if(nindex < 0)
client_iter = client_list_prev_cycle; client_iter = client_list_prev_cycle;
else if(nindex == 0)
sel = client_list_prev_cycle(&globalconf.clients, sel);
nindex = abs(nindex); nindex = abs(nindex);
@ -928,7 +934,7 @@ client_find_visible(client_t *sel, int nindex)
next && next != sel; next && next != sel;
next = client_iter(&globalconf.clients, next)) next = client_iter(&globalconf.clients, next))
{ {
if(!next->skip && client_isvisible(next, sel->screen)) if(!next->skip && client_isvisible(next, screen))
i++; i++;
if(i >= nindex) if(i >= nindex)
return next; return next;
@ -948,9 +954,9 @@ void
uicb_client_swap(int screen, char *arg) uicb_client_swap(int screen, char *arg)
{ {
client_t *swap = NULL; client_t *swap = NULL;
int i = atoi(arg); int i;
if(i) if(arg && (i = atoi(arg)))
swap = client_find_visible(globalconf.focus->client, i); swap = client_find_visible(globalconf.focus->client, i);
else if(globalconf.focus->client == globalconf.clients) else if(globalconf.focus->client == globalconf.clients)
swap = client_find_visible(globalconf.focus->client, 1); swap = client_find_visible(globalconf.focus->client, 1);
@ -1146,6 +1152,9 @@ uicb_client_togglemax(int screen, char *arg)
} }
/** Give focus to the next or previous visible client in the stack. /** Give focus to the next or previous visible client in the stack.
* Argument mus be a relative number of windows to give focus after current one.
* Giving 1 as argument will focus next visible window, -2 will focus previous
* of previous visible window. Giving 0 as argument will focus master window.
* \param screen Virtual screen number. * \param screen Virtual screen number.
* \param arg Relative number in the client stack. * \param arg Relative number in the client stack.
* \ingroup ui_callback * \ingroup ui_callback
@ -1153,10 +1162,15 @@ uicb_client_togglemax(int screen, char *arg)
void void
uicb_client_focus(int screen, char *arg) uicb_client_focus(int screen, char *arg)
{ {
client_t *next; client_t *next = NULL;
int i = atoi(arg); int i;
if((next = client_find_visible(globalconf.focus->client, i))) if(arg && (i = atoi(arg)))
next = client_find_visible(globalconf.focus->client, i);
else if(globalconf.clients)
next = client_find_visible(globalconf.clients, 0);
if(next)
client_focus(next, screen, true); client_focus(next, screen, true);
} }