1414#include "tig/argv.h"
1515#include "tig/view.h"
1616#include "tig/search.h"
17+ #include "tig/prompt.h"
1718#include "tig/draw.h"
1819
20+ extern const struct menu_item toggle_menu_items [];
21+
22+ static struct keymap toggle_menu_keymap = {
23+ "toggle" , NULL , 0 , false
24+ };
25+
1926/*
2027 * Help backend
2128 */
@@ -26,8 +33,11 @@ struct help_state {
2633};
2734
2835struct help {
29- struct keymap * keymap ;
3036 enum request request ;
37+ union {
38+ struct keymap * keymap ;
39+ struct menu_item * menu ;
40+ } item ;
3141 union {
3242 const char * text ;
3343 const struct request_info * req_info ;
@@ -38,16 +48,30 @@ static bool
3848help_draw (struct view * view , struct line * line , unsigned int lineno )
3949{
4050 struct help * help = line -> data ;
41- const struct keymap * keymap = help -> keymap ;
51+ const struct keymap * keymap = help -> item . keymap ;
4252 struct help_state * state = view -> private ;
4353
44- if (line -> type == LINE_SECTION ) {
54+ if (line -> type == LINE_SECTION && keymap ) {
4555 draw_formatted (view , line -> type , "[%c] %s bindings" ,
4656 keymap -> hidden ? '+' : '-' , keymap -> name );
4757
4858 } else if (line -> type == LINE_HELP_GROUP || !keymap ) {
4959 draw_text (view , line -> type , help -> data .text );
5060
61+ } else if (line -> type == LINE_HELP_TOGGLE ) {
62+ struct menu_item * item = help -> item .menu ;
63+ char text_buf [40 ];
64+
65+ snprintf (text_buf , sizeof (text_buf ), "%c" , item -> hotkey );
66+ if (draw_field (view , LINE_DEFAULT , text_buf , 28 , ALIGN_RIGHT , false))
67+ return true;
68+
69+ if (draw_field (view , LINE_HELP_ACTION , (char * )item -> data , 28 , ALIGN_LEFT , false))
70+ return true;
71+
72+ snprintf (text_buf , sizeof (text_buf ), "Toggle %s" , item -> text );
73+ draw_text (view , LINE_DEFAULT , text_buf );
74+
5175 } else if (help -> request > REQ_RUN_REQUESTS ) {
5276 struct run_request * req = get_run_request (help -> request );
5377 const char * key = get_keys (keymap , help -> request , true);
@@ -83,9 +107,9 @@ static bool
83107help_grep (struct view * view , struct line * line )
84108{
85109 struct help * help = line -> data ;
86- const struct keymap * keymap = help -> keymap ;
110+ const struct keymap * keymap = help -> item . keymap ;
87111
88- if (line -> type == LINE_SECTION ) {
112+ if (line -> type == LINE_SECTION && keymap ) {
89113 const char * text [] = { keymap -> name , NULL };
90114
91115 return grep_text (view , text );
@@ -95,6 +119,10 @@ help_grep(struct view *view, struct line *line)
95119
96120 return grep_text (view , text );
97121
122+ } else if (line -> type == LINE_HELP_TOGGLE ) {
123+ const char * text [] = { help -> item .menu -> text , NULL };
124+
125+ return grep_text (view , text );
98126 } else if (help -> request > REQ_RUN_REQUESTS ) {
99127 struct run_request * req = get_run_request (help -> request );
100128 const char * key = get_keys (keymap , help -> request , true);
@@ -127,7 +155,7 @@ add_help_line(struct view *view, struct help **help_ptr, struct keymap *keymap,
127155
128156 if (!add_line_alloc (view , & help , type , 0 , false))
129157 return false;
130- help -> keymap = keymap ;
158+ help -> item . keymap = keymap ;
131159 if (help_ptr )
132160 * help_ptr = help ;
133161 return true;
@@ -145,15 +173,15 @@ help_keys_visitor(void *data, const char *group, struct keymap *keymap,
145173
146174 if (iterator -> keymap != keymap ) {
147175 iterator -> keymap = keymap ;
148- if (!add_help_line (iterator -> view , & help , keymap , LINE_SECTION ))
176+ if (!add_help_line (view , & help , keymap , LINE_SECTION ))
149177 return false;
150178 }
151179
152180 if (keymap -> hidden )
153181 return true;
154182
155183 if (group ) {
156- if (!add_help_line (iterator -> view , & help , keymap , LINE_HELP_GROUP ))
184+ if (!add_help_line (view , & help , keymap , LINE_HELP_GROUP ))
157185 return false;
158186 help -> data .text = group ;
159187 }
@@ -177,6 +205,8 @@ help_open(struct view *view, enum open_flags flags)
177205{
178206 struct help_request_iterator iterator = { view };
179207 struct help * help ;
208+ const struct menu_item * menu = toggle_menu_items ;
209+ int i ;
180210
181211 reset_view (view );
182212
@@ -188,8 +218,28 @@ help_open(struct view *view, enum open_flags flags)
188218 return ERROR_OUT_OF_MEMORY ;
189219 help -> data .text = "" ;
190220
191- return foreach_key (help_keys_visitor , & iterator , true)
192- ? SUCCESS : error ("Failed to render key bindings" );
221+ if (!foreach_key (help_keys_visitor , & iterator , true)) {
222+ error ("Failed to render key bindings" );
223+ return ERROR_OUT_OF_MEMORY ;
224+ }
225+
226+ if (!add_help_line (view , & help , & toggle_menu_keymap , LINE_SECTION ))
227+ return ERROR_OUT_OF_MEMORY ;
228+ if (!toggle_menu_keymap .hidden ) {
229+ if (!add_help_line (view , & help , NULL , LINE_HELP_GROUP ))
230+ return ERROR_OUT_OF_MEMORY ;
231+ help -> data .text = "Toggle keys (enter: o <key>):" ;
232+
233+ i = 0 ;
234+ while (menu [i ].data )
235+ {
236+ if (!add_help_line (view , & help , (struct keymap * )& menu [i ], LINE_HELP_TOGGLE ))
237+ return ERROR_OUT_OF_MEMORY ;
238+ i ++ ;
239+ }
240+ }
241+
242+ return SUCCESS ;
193243}
194244
195245static enum request
@@ -200,7 +250,7 @@ help_request(struct view *view, enum request request, struct line *line)
200250 switch (request ) {
201251 case REQ_ENTER :
202252 if (line -> type == LINE_SECTION ) {
203- struct keymap * keymap = help -> keymap ;
253+ struct keymap * keymap = help -> item . keymap ;
204254
205255 keymap -> hidden = !keymap -> hidden ;
206256 refresh_view (view );
0 commit comments