diff -r f46b82ad54ea -r 5c4b906de39c session.c --- a/session.c Mon May 26 19:38:31 2008 -0400 +++ b/session.c Wed May 28 11:28:45 2008 -0400 @@ -3034,7 +3034,7 @@ } -void do_access_keys_frame(struct session *ses, struct f_data_c *fd, char *next_letter) { +void do_access_keys_frame(struct session *ses, struct f_data_c *fd, char *letters_used) { struct f_data_c *f; struct f_data *fdd = fd->f_data; int i; @@ -3070,27 +3070,50 @@ ((struct access_key_data*)(w->data))->l->type == L_LINK && !strcmp(((struct access_key_data*)(w->data))->l->where, dat->l->where)) break; + dat->k = -1; if(w != (struct window *)(ses->term->active_tab->windows.prev)) dat->k = ((struct access_key_data*)(w->data))->k; - else - dat->k = (*next_letter)++; +#ifdef G + else if(F && fdd->links[i].type == L_LINK && !fdd->links[i].where_img) { + char *link_text = ((struct g_object_text *)(fdd->links[i].obj))->text; + for(; *link_text; link_text++) + if('A' <= upcase(*link_text) && upcase(*link_text) <= 'Z' && + !letters_used[upcase(*link_text) - 'A']) + break; + if(*link_text) { + dat->k = upcase(*link_text); + letters_used[dat->k - 'A'] = 1; + } + } +#endif /* G */ + if(dat->k == -1) { + char k; + for(k = 0; letters_used[k] && k < 26; k++); + if(k == 26) { + mem_free(dat); + return; + } + dat->k = k + 'A'; + letters_used[k] = 1; + } add_window(ses->term, access_key_handler, dat); } foreach(f, fd->subframes) - do_access_keys_frame(ses, f, next_letter); + do_access_keys_frame(ses, f, letters_used); } void do_access_keys(struct session *ses) { struct f_data_c *fd = ses->screen; int i; - char next_letter = 'A'; + char letters_used[26]; + memset(letters_used, 0, 26 * sizeof(char)); if(!fd->f_data) return; - do_access_keys_frame(ses, fd, &next_letter); + do_access_keys_frame(ses, fd, letters_used); }