forked from mirrors/linux
		
	menuconfig: Assign jump keys per-page instead of globally
At the moment, keys 1-9 are assigned to the first 9 search results. This patch makes them assigned to the first 9 results per-page instead. We are much less likely to run out of keys that way. Signed-off-by: Benjamin Poirier <bpoirier@suse.de> Signed-off-by: Michal Marek <mmarek@suse.cz>
This commit is contained in:
		
							parent
							
								
									1a374ae619
								
							
						
					
					
						commit
						95ac9b3b58
					
				
					 6 changed files with 148 additions and 72 deletions
				
			
		| 
						 | 
					@ -12,6 +12,7 @@ extern "C" {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <sys/queue.h>
 | 
				
			||||||
#ifndef __cplusplus
 | 
					#ifndef __cplusplus
 | 
				
			||||||
#include <stdbool.h>
 | 
					#include <stdbool.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -173,6 +174,14 @@ struct menu {
 | 
				
			||||||
#define MENU_CHANGED		0x0001
 | 
					#define MENU_CHANGED		0x0001
 | 
				
			||||||
#define MENU_ROOT		0x0002
 | 
					#define MENU_ROOT		0x0002
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct jump_key {
 | 
				
			||||||
 | 
						CIRCLEQ_ENTRY(jump_key) entries;
 | 
				
			||||||
 | 
						size_t offset;
 | 
				
			||||||
 | 
						struct menu *target;
 | 
				
			||||||
 | 
						int index;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					CIRCLEQ_HEAD(jk_head, jump_key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define JUMP_NB			9
 | 
					#define JUMP_NB			9
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern struct file *file_list;
 | 
					extern struct file *file_list;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,10 +21,10 @@ P(menu_get_root_menu,struct menu *,(struct menu *menu));
 | 
				
			||||||
P(menu_get_parent_menu,struct menu *,(struct menu *menu));
 | 
					P(menu_get_parent_menu,struct menu *,(struct menu *menu));
 | 
				
			||||||
P(menu_has_help,bool,(struct menu *menu));
 | 
					P(menu_has_help,bool,(struct menu *menu));
 | 
				
			||||||
P(menu_get_help,const char *,(struct menu *menu));
 | 
					P(menu_get_help,const char *,(struct menu *menu));
 | 
				
			||||||
P(get_symbol_str, int, (struct gstr *r, struct symbol *sym, struct menu
 | 
					P(get_symbol_str, void, (struct gstr *r, struct symbol *sym, struct jk_head
 | 
				
			||||||
			**jumps, int jump_nb));
 | 
								 *head));
 | 
				
			||||||
P(get_relations_str, struct gstr, (struct symbol **sym_arr, struct menu
 | 
					P(get_relations_str, struct gstr, (struct symbol **sym_arr, struct jk_head
 | 
				
			||||||
				   **jumps));
 | 
									   *head));
 | 
				
			||||||
P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help));
 | 
					P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* symbol.c */
 | 
					/* symbol.c */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -210,8 +210,13 @@ int first_alpha(const char *string, const char *exempt);
 | 
				
			||||||
int dialog_yesno(const char *title, const char *prompt, int height, int width);
 | 
					int dialog_yesno(const char *title, const char *prompt, int height, int width);
 | 
				
			||||||
int dialog_msgbox(const char *title, const char *prompt, int height,
 | 
					int dialog_msgbox(const char *title, const char *prompt, int height,
 | 
				
			||||||
		  int width, int pause);
 | 
							  int width, int pause);
 | 
				
			||||||
int dialog_textbox(const char *title, const char *file, int height, int width,
 | 
					
 | 
				
			||||||
		   int *keys, int *_vscroll, int *_hscroll);
 | 
					
 | 
				
			||||||
 | 
					typedef void (*update_text_fn)(char *buf, size_t start, size_t end, void
 | 
				
			||||||
 | 
								       *_data);
 | 
				
			||||||
 | 
					int dialog_textbox(const char *title, char *tbuf, int initial_height,
 | 
				
			||||||
 | 
							   int initial_width, int *keys, int *_vscroll, int *_hscroll,
 | 
				
			||||||
 | 
							   update_text_fn update_text, void *data);
 | 
				
			||||||
int dialog_menu(const char *title, const char *prompt,
 | 
					int dialog_menu(const char *title, const char *prompt,
 | 
				
			||||||
		const void *selected, int *s_scroll);
 | 
							const void *selected, int *s_scroll);
 | 
				
			||||||
int dialog_checklist(const char *title, const char *prompt, int height,
 | 
					int dialog_checklist(const char *title, const char *prompt, int height,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,23 +22,25 @@
 | 
				
			||||||
#include "dialog.h"
 | 
					#include "dialog.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void back_lines(int n);
 | 
					static void back_lines(int n);
 | 
				
			||||||
static void print_page(WINDOW * win, int height, int width);
 | 
					static void print_page(WINDOW *win, int height, int width, update_text_fn
 | 
				
			||||||
static void print_line(WINDOW * win, int row, int width);
 | 
							       update_text, void *data);
 | 
				
			||||||
 | 
					static void print_line(WINDOW *win, int row, int width);
 | 
				
			||||||
static char *get_line(void);
 | 
					static char *get_line(void);
 | 
				
			||||||
static void print_position(WINDOW * win);
 | 
					static void print_position(WINDOW * win);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int hscroll;
 | 
					static int hscroll;
 | 
				
			||||||
static int begin_reached, end_reached, page_length;
 | 
					static int begin_reached, end_reached, page_length;
 | 
				
			||||||
static const char *buf;
 | 
					static char *buf;
 | 
				
			||||||
static const char *page;
 | 
					static char *page;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * refresh window content
 | 
					 * refresh window content
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static void refresh_text_box(WINDOW *dialog, WINDOW *box, int boxh, int boxw,
 | 
					static void refresh_text_box(WINDOW *dialog, WINDOW *box, int boxh, int boxw,
 | 
				
			||||||
							  int cur_y, int cur_x)
 | 
								     int cur_y, int cur_x, update_text_fn update_text,
 | 
				
			||||||
 | 
								     void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	print_page(box, boxh, boxw);
 | 
						print_page(box, boxh, boxw, update_text, data);
 | 
				
			||||||
	print_position(dialog);
 | 
						print_position(dialog);
 | 
				
			||||||
	wmove(dialog, cur_y, cur_x);	/* Restore cursor position */
 | 
						wmove(dialog, cur_y, cur_x);	/* Restore cursor position */
 | 
				
			||||||
	wrefresh(dialog);
 | 
						wrefresh(dialog);
 | 
				
			||||||
| 
						 | 
					@ -49,9 +51,11 @@ static void refresh_text_box(WINDOW *dialog, WINDOW *box, int boxh, int boxw,
 | 
				
			||||||
 * Display text from a file in a dialog box.
 | 
					 * Display text from a file in a dialog box.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * keys is a null-terminated array
 | 
					 * keys is a null-terminated array
 | 
				
			||||||
 | 
					 * update_text() may not add or remove any '\n' or '\0' in tbuf
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int dialog_textbox(const char *title, const char *tbuf, int initial_height,
 | 
					int dialog_textbox(const char *title, char *tbuf, int initial_height,
 | 
				
			||||||
		   int initial_width, int *keys, int *_vscroll, int *_hscroll)
 | 
							   int initial_width, int *keys, int *_vscroll, int *_hscroll,
 | 
				
			||||||
 | 
							   update_text_fn update_text, void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i, x, y, cur_x, cur_y, key = 0;
 | 
						int i, x, y, cur_x, cur_y, key = 0;
 | 
				
			||||||
	int height, width, boxh, boxw;
 | 
						int height, width, boxh, boxw;
 | 
				
			||||||
| 
						 | 
					@ -131,7 +135,8 @@ int dialog_textbox(const char *title, const char *tbuf, int initial_height,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Print first page of text */
 | 
						/* Print first page of text */
 | 
				
			||||||
	attr_clear(box, boxh, boxw, dlg.dialog.atr);
 | 
						attr_clear(box, boxh, boxw, dlg.dialog.atr);
 | 
				
			||||||
	refresh_text_box(dialog, box, boxh, boxw, cur_y, cur_x);
 | 
						refresh_text_box(dialog, box, boxh, boxw, cur_y, cur_x, update_text,
 | 
				
			||||||
 | 
								 data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (!done) {
 | 
						while (!done) {
 | 
				
			||||||
		key = wgetch(dialog);
 | 
							key = wgetch(dialog);
 | 
				
			||||||
| 
						 | 
					@ -150,7 +155,8 @@ int dialog_textbox(const char *title, const char *tbuf, int initial_height,
 | 
				
			||||||
				begin_reached = 1;
 | 
									begin_reached = 1;
 | 
				
			||||||
				page = buf;
 | 
									page = buf;
 | 
				
			||||||
				refresh_text_box(dialog, box, boxh, boxw,
 | 
									refresh_text_box(dialog, box, boxh, boxw,
 | 
				
			||||||
						 cur_y, cur_x);
 | 
											 cur_y, cur_x, update_text,
 | 
				
			||||||
 | 
											 data);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case 'G':	/* Last page */
 | 
							case 'G':	/* Last page */
 | 
				
			||||||
| 
						 | 
					@ -160,8 +166,8 @@ int dialog_textbox(const char *title, const char *tbuf, int initial_height,
 | 
				
			||||||
			/* point to last char in buf */
 | 
								/* point to last char in buf */
 | 
				
			||||||
			page = buf + strlen(buf);
 | 
								page = buf + strlen(buf);
 | 
				
			||||||
			back_lines(boxh);
 | 
								back_lines(boxh);
 | 
				
			||||||
			refresh_text_box(dialog, box, boxh, boxw,
 | 
								refresh_text_box(dialog, box, boxh, boxw, cur_y,
 | 
				
			||||||
					 cur_y, cur_x);
 | 
										 cur_x, update_text, data);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case 'K':	/* Previous line */
 | 
							case 'K':	/* Previous line */
 | 
				
			||||||
		case 'k':
 | 
							case 'k':
 | 
				
			||||||
| 
						 | 
					@ -171,7 +177,7 @@ int dialog_textbox(const char *title, const char *tbuf, int initial_height,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			back_lines(page_length + 1);
 | 
								back_lines(page_length + 1);
 | 
				
			||||||
			refresh_text_box(dialog, box, boxh, boxw, cur_y,
 | 
								refresh_text_box(dialog, box, boxh, boxw, cur_y,
 | 
				
			||||||
					 cur_x);
 | 
										 cur_x, update_text, data);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case 'B':	/* Previous page */
 | 
							case 'B':	/* Previous page */
 | 
				
			||||||
		case 'b':
 | 
							case 'b':
 | 
				
			||||||
| 
						 | 
					@ -180,8 +186,8 @@ int dialog_textbox(const char *title, const char *tbuf, int initial_height,
 | 
				
			||||||
			if (begin_reached)
 | 
								if (begin_reached)
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			back_lines(page_length + boxh);
 | 
								back_lines(page_length + boxh);
 | 
				
			||||||
			refresh_text_box(dialog, box, boxh, boxw,
 | 
								refresh_text_box(dialog, box, boxh, boxw, cur_y,
 | 
				
			||||||
					 cur_y, cur_x);
 | 
										 cur_x, update_text, data);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case 'J':	/* Next line */
 | 
							case 'J':	/* Next line */
 | 
				
			||||||
		case 'j':
 | 
							case 'j':
 | 
				
			||||||
| 
						 | 
					@ -191,7 +197,7 @@ int dialog_textbox(const char *title, const char *tbuf, int initial_height,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			back_lines(page_length - 1);
 | 
								back_lines(page_length - 1);
 | 
				
			||||||
			refresh_text_box(dialog, box, boxh, boxw, cur_y,
 | 
								refresh_text_box(dialog, box, boxh, boxw, cur_y,
 | 
				
			||||||
					 cur_x);
 | 
										 cur_x, update_text, data);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case KEY_NPAGE:	/* Next page */
 | 
							case KEY_NPAGE:	/* Next page */
 | 
				
			||||||
		case ' ':
 | 
							case ' ':
 | 
				
			||||||
| 
						 | 
					@ -200,8 +206,8 @@ int dialog_textbox(const char *title, const char *tbuf, int initial_height,
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			begin_reached = 0;
 | 
								begin_reached = 0;
 | 
				
			||||||
			refresh_text_box(dialog, box, boxh, boxw,
 | 
								refresh_text_box(dialog, box, boxh, boxw, cur_y,
 | 
				
			||||||
					 cur_y, cur_x);
 | 
										 cur_x, update_text, data);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case '0':	/* Beginning of line */
 | 
							case '0':	/* Beginning of line */
 | 
				
			||||||
		case 'H':	/* Scroll left */
 | 
							case 'H':	/* Scroll left */
 | 
				
			||||||
| 
						 | 
					@ -216,8 +222,8 @@ int dialog_textbox(const char *title, const char *tbuf, int initial_height,
 | 
				
			||||||
				hscroll--;
 | 
									hscroll--;
 | 
				
			||||||
			/* Reprint current page to scroll horizontally */
 | 
								/* Reprint current page to scroll horizontally */
 | 
				
			||||||
			back_lines(page_length);
 | 
								back_lines(page_length);
 | 
				
			||||||
			refresh_text_box(dialog, box, boxh, boxw,
 | 
								refresh_text_box(dialog, box, boxh, boxw, cur_y,
 | 
				
			||||||
					 cur_y, cur_x);
 | 
										 cur_x, update_text, data);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case 'L':	/* Scroll right */
 | 
							case 'L':	/* Scroll right */
 | 
				
			||||||
		case 'l':
 | 
							case 'l':
 | 
				
			||||||
| 
						 | 
					@ -227,8 +233,8 @@ int dialog_textbox(const char *title, const char *tbuf, int initial_height,
 | 
				
			||||||
			hscroll++;
 | 
								hscroll++;
 | 
				
			||||||
			/* Reprint current page to scroll horizontally */
 | 
								/* Reprint current page to scroll horizontally */
 | 
				
			||||||
			back_lines(page_length);
 | 
								back_lines(page_length);
 | 
				
			||||||
			refresh_text_box(dialog, box, boxh, boxw,
 | 
								refresh_text_box(dialog, box, boxh, boxw, cur_y,
 | 
				
			||||||
					 cur_y, cur_x);
 | 
										 cur_x, update_text, data);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case KEY_ESC:
 | 
							case KEY_ESC:
 | 
				
			||||||
			if (on_key_esc(dialog) == KEY_ESC)
 | 
								if (on_key_esc(dialog) == KEY_ESC)
 | 
				
			||||||
| 
						 | 
					@ -301,12 +307,23 @@ static void back_lines(int n)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Print a new page of text. Called by dialog_textbox().
 | 
					 * Print a new page of text.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static void print_page(WINDOW * win, int height, int width)
 | 
					static void print_page(WINDOW *win, int height, int width, update_text_fn
 | 
				
			||||||
 | 
							       update_text, void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i, passed_end = 0;
 | 
						int i, passed_end = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (update_text) {
 | 
				
			||||||
 | 
							char *end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (i = 0; i < height; i++)
 | 
				
			||||||
 | 
								get_line();
 | 
				
			||||||
 | 
							end = page;
 | 
				
			||||||
 | 
							back_lines(height);
 | 
				
			||||||
 | 
							update_text(buf, page - buf, end - buf, data);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	page_length = 0;
 | 
						page_length = 0;
 | 
				
			||||||
	for (i = 0; i < height; i++) {
 | 
						for (i = 0; i < height; i++) {
 | 
				
			||||||
		print_line(win, i, width);
 | 
							print_line(win, i, width);
 | 
				
			||||||
| 
						 | 
					@ -319,7 +336,7 @@ static void print_page(WINDOW * win, int height, int width)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Print a new line of text. Called by dialog_textbox() and print_page().
 | 
					 * Print a new line of text.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static void print_line(WINDOW * win, int row, int width)
 | 
					static void print_line(WINDOW * win, int row, int width)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -286,8 +286,9 @@ static void conf_choice(struct menu *menu);
 | 
				
			||||||
static void conf_string(struct menu *menu);
 | 
					static void conf_string(struct menu *menu);
 | 
				
			||||||
static void conf_load(void);
 | 
					static void conf_load(void);
 | 
				
			||||||
static void conf_save(void);
 | 
					static void conf_save(void);
 | 
				
			||||||
static int show_textbox_ext(const char *title, const char *text, int r, int c,
 | 
					static int show_textbox_ext(const char *title, char *text, int r, int c,
 | 
				
			||||||
			    int *keys, int *vscroll, int *hscroll);
 | 
								    int *keys, int *vscroll, int *hscroll,
 | 
				
			||||||
 | 
								    update_text_fn update_text, void *data);
 | 
				
			||||||
static void show_textbox(const char *title, const char *text, int r, int c);
 | 
					static void show_textbox(const char *title, const char *text, int r, int c);
 | 
				
			||||||
static void show_helptext(const char *title, const char *text);
 | 
					static void show_helptext(const char *title, const char *text);
 | 
				
			||||||
static void show_help(struct menu *menu);
 | 
					static void show_help(struct menu *menu);
 | 
				
			||||||
| 
						 | 
					@ -310,6 +311,39 @@ static void set_config_filename(const char *config_filename)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct search_data {
 | 
				
			||||||
 | 
						struct jk_head *head;
 | 
				
			||||||
 | 
						struct menu **targets;
 | 
				
			||||||
 | 
						int *keys;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void update_text(char *buf, size_t start, size_t end, void *_data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct search_data *data = _data;
 | 
				
			||||||
 | 
						struct jump_key *pos;
 | 
				
			||||||
 | 
						int k = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						CIRCLEQ_FOREACH(pos, data->head, entries) {
 | 
				
			||||||
 | 
							if (pos->offset >= start && pos->offset < end) {
 | 
				
			||||||
 | 
								char header[4];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (k < JUMP_NB) {
 | 
				
			||||||
 | 
									int key = '0' + (pos->index % JUMP_NB) + 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									sprintf(header, "(%c)", key);
 | 
				
			||||||
 | 
									data->keys[k] = key;
 | 
				
			||||||
 | 
									data->targets[k] = pos->target;
 | 
				
			||||||
 | 
									k++;
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									sprintf(header, "   ");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								memcpy(buf + pos->offset, header, sizeof(header) - 1);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						data->keys[k] = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void search_conf(void)
 | 
					static void search_conf(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct symbol **sym_arr;
 | 
						struct symbol **sym_arr;
 | 
				
			||||||
| 
						 | 
					@ -341,18 +375,24 @@ static void search_conf(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sym_arr = sym_re_search(dialog_input);
 | 
						sym_arr = sym_re_search(dialog_input);
 | 
				
			||||||
	do {
 | 
						do {
 | 
				
			||||||
		struct menu *jumps[JUMP_NB] = {0};
 | 
							struct jk_head head = CIRCLEQ_HEAD_INITIALIZER(head);
 | 
				
			||||||
		int keys[JUMP_NB + 1] = {0}, i;
 | 
							struct menu *targets[JUMP_NB];
 | 
				
			||||||
 | 
							int keys[JUMP_NB + 1], i;
 | 
				
			||||||
 | 
							struct search_data data = {
 | 
				
			||||||
 | 
								.head = &head,
 | 
				
			||||||
 | 
								.targets = targets,
 | 
				
			||||||
 | 
								.keys = keys,
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		res = get_relations_str(sym_arr, jumps);
 | 
							res = get_relations_str(sym_arr, &head);
 | 
				
			||||||
		for (i = 0; i < JUMP_NB && jumps[i]; i++)
 | 
							dres = show_textbox_ext(_("Search Results"), (char *)
 | 
				
			||||||
			keys[i] = '1' + i;
 | 
										str_get(&res), 0, 0, keys, &vscroll,
 | 
				
			||||||
		dres = show_textbox_ext(_("Search Results"), str_get(&res), 0,
 | 
										&hscroll, &update_text, (void *)
 | 
				
			||||||
					0, keys, &vscroll, &hscroll);
 | 
										&data);
 | 
				
			||||||
		again = false;
 | 
							again = false;
 | 
				
			||||||
		for (i = 0; i < JUMP_NB && jumps[i]; i++)
 | 
							for (i = 0; i < JUMP_NB && keys[i]; i++)
 | 
				
			||||||
			if (dres == keys[i]) {
 | 
								if (dres == keys[i]) {
 | 
				
			||||||
				conf(jumps[i]->parent, jumps[i]);
 | 
									conf(targets[i]->parent, targets[i]);
 | 
				
			||||||
				again = true;
 | 
									again = true;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		str_free(&res);
 | 
							str_free(&res);
 | 
				
			||||||
| 
						 | 
					@ -642,16 +682,19 @@ static void conf(struct menu *menu, struct menu *active_menu)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int show_textbox_ext(const char *title, const char *text, int r, int c,
 | 
					static int show_textbox_ext(const char *title, char *text, int r, int c, int
 | 
				
			||||||
			    int *keys, int *vscroll, int *hscroll)
 | 
								    *keys, int *vscroll, int *hscroll, update_text_fn
 | 
				
			||||||
 | 
								    update_text, void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	dialog_clear();
 | 
						dialog_clear();
 | 
				
			||||||
	return dialog_textbox(title, text, r, c, keys, vscroll, hscroll);
 | 
						return dialog_textbox(title, text, r, c, keys, vscroll, hscroll,
 | 
				
			||||||
 | 
								      update_text, data);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void show_textbox(const char *title, const char *text, int r, int c)
 | 
					static void show_textbox(const char *title, const char *text, int r, int c)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	show_textbox_ext(title, text, r, c, (int []) {0}, NULL, NULL);
 | 
						show_textbox_ext(title, (char *) text, r, c, (int []) {0}, NULL, NULL,
 | 
				
			||||||
 | 
								 NULL, NULL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void show_helptext(const char *title, const char *text)
 | 
					static void show_helptext(const char *title, const char *text)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -507,12 +507,12 @@ const char *menu_get_help(struct menu *menu)
 | 
				
			||||||
		return "";
 | 
							return "";
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int get_prompt_str(struct gstr *r, struct property *prop, struct menu
 | 
					static void get_prompt_str(struct gstr *r, struct property *prop,
 | 
				
			||||||
			  **jumps, int jump_nb)
 | 
								   struct jk_head *head)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i, j;
 | 
						int i, j;
 | 
				
			||||||
	char header[4];
 | 
					 | 
				
			||||||
	struct menu *submenu[8], *menu, *location = NULL;
 | 
						struct menu *submenu[8], *menu, *location = NULL;
 | 
				
			||||||
 | 
						struct jump_key *jump;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	str_printf(r, _("Prompt: %s\n"), _(prop->text));
 | 
						str_printf(r, _("Prompt: %s\n"), _(prop->text));
 | 
				
			||||||
	str_printf(r, _("  Defined at %s:%d\n"), prop->menu->file->name,
 | 
						str_printf(r, _("  Defined at %s:%d\n"), prop->menu->file->name,
 | 
				
			||||||
| 
						 | 
					@ -530,7 +530,9 @@ static int get_prompt_str(struct gstr *r, struct property *prop, struct menu
 | 
				
			||||||
		if (location == NULL && accessible)
 | 
							if (location == NULL && accessible)
 | 
				
			||||||
			location = menu;
 | 
								location = menu;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (jumps && jump_nb < JUMP_NB && location) {
 | 
						if (head && location) {
 | 
				
			||||||
 | 
							jump = malloc(sizeof(struct jump_key));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (menu_is_visible(prop->menu)) {
 | 
							if (menu_is_visible(prop->menu)) {
 | 
				
			||||||
			/*
 | 
								/*
 | 
				
			||||||
			 * There is not enough room to put the hint at the
 | 
								 * There is not enough room to put the hint at the
 | 
				
			||||||
| 
						 | 
					@ -538,19 +540,26 @@ static int get_prompt_str(struct gstr *r, struct property *prop, struct menu
 | 
				
			||||||
			 * last "Location" line even when it would belong on
 | 
								 * last "Location" line even when it would belong on
 | 
				
			||||||
			 * the former.
 | 
								 * the former.
 | 
				
			||||||
			 */
 | 
								 */
 | 
				
			||||||
			jumps[jump_nb] = prop->menu;
 | 
								jump->target = prop->menu;
 | 
				
			||||||
		} else
 | 
							} else
 | 
				
			||||||
			jumps[jump_nb] = location;
 | 
								jump->target = location;
 | 
				
			||||||
		snprintf(header, 4, "(%d)", jump_nb + 1);
 | 
					
 | 
				
			||||||
	} else
 | 
							if (CIRCLEQ_EMPTY(head))
 | 
				
			||||||
		location = NULL;
 | 
								jump->index = 0;
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								jump->index = CIRCLEQ_LAST(head)->index + 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							CIRCLEQ_INSERT_TAIL(head, jump, entries);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (i > 0) {
 | 
						if (i > 0) {
 | 
				
			||||||
		str_printf(r, _("  Location:\n"));
 | 
							str_printf(r, _("  Location:\n"));
 | 
				
			||||||
		for (j = 1; --i >= 0; j += 2) {
 | 
							for (j = 4; --i >= 0; j += 2) {
 | 
				
			||||||
			menu = submenu[i];
 | 
								menu = submenu[i];
 | 
				
			||||||
			str_printf(r, "%s%*c-> %s", menu == location ? header
 | 
								if (head && location && menu == location)
 | 
				
			||||||
				   : "   ", j, ' ', _(menu_get_prompt(menu)));
 | 
									jump->offset = r->len - 1;
 | 
				
			||||||
 | 
								str_printf(r, "%*c-> %s", j, ' ',
 | 
				
			||||||
 | 
									   _(menu_get_prompt(menu)));
 | 
				
			||||||
			if (menu->sym) {
 | 
								if (menu->sym) {
 | 
				
			||||||
				str_printf(r, " (%s [=%s])", menu->sym->name ?
 | 
									str_printf(r, " (%s [=%s])", menu->sym->name ?
 | 
				
			||||||
					menu->sym->name : _("<choice>"),
 | 
										menu->sym->name : _("<choice>"),
 | 
				
			||||||
| 
						 | 
					@ -559,20 +568,15 @@ static int get_prompt_str(struct gstr *r, struct property *prop, struct menu
 | 
				
			||||||
			str_append(r, "\n");
 | 
								str_append(r, "\n");
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return location ? 1 : 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * jumps is optional and may be NULL
 | 
					 * head is optional and may be NULL
 | 
				
			||||||
 * returns the number of jumps inserted
 | 
					 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int get_symbol_str(struct gstr *r, struct symbol *sym, struct menu **jumps,
 | 
					void get_symbol_str(struct gstr *r, struct symbol *sym, struct jk_head *head)
 | 
				
			||||||
		   int jump_nb)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	bool hit;
 | 
						bool hit;
 | 
				
			||||||
	struct property *prop;
 | 
						struct property *prop;
 | 
				
			||||||
	int i = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (sym && sym->name) {
 | 
						if (sym && sym->name) {
 | 
				
			||||||
		str_printf(r, "Symbol: %s [=%s]\n", sym->name,
 | 
							str_printf(r, "Symbol: %s [=%s]\n", sym->name,
 | 
				
			||||||
| 
						 | 
					@ -588,7 +592,7 @@ int get_symbol_str(struct gstr *r, struct symbol *sym, struct menu **jumps,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for_all_prompts(sym, prop)
 | 
						for_all_prompts(sym, prop)
 | 
				
			||||||
		i += get_prompt_str(r, prop, jumps, jump_nb + i);
 | 
							get_prompt_str(r, prop, head);
 | 
				
			||||||
	hit = false;
 | 
						hit = false;
 | 
				
			||||||
	for_all_properties(sym, prop, P_SELECT) {
 | 
						for_all_properties(sym, prop, P_SELECT) {
 | 
				
			||||||
		if (!hit) {
 | 
							if (!hit) {
 | 
				
			||||||
| 
						 | 
					@ -606,18 +610,16 @@ int get_symbol_str(struct gstr *r, struct symbol *sym, struct menu **jumps,
 | 
				
			||||||
		str_append(r, "\n");
 | 
							str_append(r, "\n");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	str_append(r, "\n\n");
 | 
						str_append(r, "\n\n");
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return i;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct gstr get_relations_str(struct symbol **sym_arr, struct menu **jumps)
 | 
					struct gstr get_relations_str(struct symbol **sym_arr, struct jk_head *head)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct symbol *sym;
 | 
						struct symbol *sym;
 | 
				
			||||||
	struct gstr res = str_new();
 | 
						struct gstr res = str_new();
 | 
				
			||||||
	int i, jump_nb = 0;
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
 | 
						for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
 | 
				
			||||||
		jump_nb += get_symbol_str(&res, sym, jumps, jump_nb);
 | 
							get_symbol_str(&res, sym, head);
 | 
				
			||||||
	if (!i)
 | 
						if (!i)
 | 
				
			||||||
		str_append(&res, _("No matches found.\n"));
 | 
							str_append(&res, _("No matches found.\n"));
 | 
				
			||||||
	return res;
 | 
						return res;
 | 
				
			||||||
| 
						 | 
					@ -636,5 +638,5 @@ void menu_get_ext_help(struct menu *menu, struct gstr *help)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	str_printf(help, "%s\n", _(help_text));
 | 
						str_printf(help, "%s\n", _(help_text));
 | 
				
			||||||
	if (sym)
 | 
						if (sym)
 | 
				
			||||||
		get_symbol_str(help, sym, NULL, 0);
 | 
							get_symbol_str(help, sym, NULL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue