common: pass item by reference
[git-cheetah/kirill.git] / common / menuengine.h
blobc16d62892c0db09dd04a02eb90dda7f83b4b58e7
1 #ifndef MENUENGINE_H
2 #define MENUENGINE_H
4 struct git_data {
5 struct git_shell_ext {
6 void *virtual_table;
7 struct git_data *git_data;
8 } shell_ext;
9 struct git_menu {
10 void *virtual_table;
11 struct git_data *git_data;
12 } menu;
13 struct git_columns {
14 void *virtual_table;
15 struct git_data *git_data;
16 } columns;
17 unsigned int count;
18 char name[MAX_PATH];
19 struct strbuf other_files;
23 * flags to match the selection
25 #define MENU_ITEM_ALWAYS 0 /* always insert the menu item */
26 #define MENU_ITEM_CLEANUP (1 << 31) /* menu item requires free() of
27 string and helptext */
28 #define MENU_ITEM_LAST -1 /* the last menu item */
30 struct menu_item;
32 typedef unsigned int selection_to_mask(struct git_data *);
33 typedef void menu_item_handler(struct git_data *, unsigned int);
35 * if platform-specific builder returns TRUE, the menu item
36 * is added to the active menu and can be passed to menu_item_handler
37 * later, e.g. when a user selects the item
39 typedef BOOL menu_item_builder(struct git_data *, const struct menu_item *, void *);
41 struct menu_item {
42 unsigned int selection;
43 char *string;
44 char *helptext;
45 menu_item_builder *builder;
46 menu_item_handler *handler;
49 extern struct menu_item *active_menu;
50 extern unsigned int next_active_item;
53 * The main entry point of the menu engine.
55 * Important things to note:
56 * - it resets the active menu;
57 * - it walks menu_def until MENU_ITEM_LAST is found or
58 * menu_def_count times, whatever is earlier.
60 void build_menu_items(struct git_data *data,
61 selection_to_mask *mask_builder,
62 const struct menu_item menu_def[],
63 const unsigned int menu_def_count,
64 void *platform);
66 void reset_active_menu();
68 char *get_menu_item_text(unsigned int id);
71 * Parses a menu entries text and removes the '&' character
72 * which is used to specify the shortcut key. It returns
73 * the first found key or zero if nothing is found
75 static inline int parse_and_remove_shortcuts(char *name)
77 int i,j;
78 char key = 0;
79 for (i=0,j=0; name[i] && name[j]; i++,j++) {
80 if (!key && name[j] == '&') {
81 key = name[j+1];
82 j++;
84 name[i] = name[j];
86 name[i] = '\0';
87 return key;
90 void handle_menu_item(void *data, unsigned int id);
93 * usually, menu engine will append items, based on the return
94 * from menu_item_builder, but a custom builder might need to
95 * instruct the engine to track a particular item
97 void append_active_menu(const struct menu_item *item);
99 #endif /* MENUENGINE_H */