toaruos/base/usr/include/toaru/menu.h
2018-07-23 19:32:58 +09:00

119 lines
3.3 KiB
C

#pragma once
#include <toaru/graphics.h>
#include <toaru/hashmap.h>
#include <toaru/list.h>
enum MenuEntry_Type {
MenuEntry_Unknown,
MenuEntry_Normal,
MenuEntry_Submenu,
MenuEntry_Separator,
};
struct MenuList;
struct MenuEntry {
enum MenuEntry_Type _type;
struct MenuList * _owner;
int height; /* All must have a height, so put it here. */
int width; /* Actual width */
int rwidth; /* Requested width */
int hilight; /* Is currently hilighted */
int offset; /* Our offset when we were rendered */
void (*renderer)(gfx_context_t *, struct MenuEntry *, int);
void (*focus_change)(struct MenuEntry *, int);
void (*activate)(struct MenuEntry *, int);
void (*callback)(struct MenuEntry *);
};
struct MenuEntry_Normal {
struct MenuEntry; /* dependent on plan9 extensions */
const char * icon;
const char * title;
const char * action;
};
struct MenuEntry_Submenu {
struct MenuEntry;
const char * icon;
const char * title;
const char * action;
struct MenuList * _my_child;
};
struct MenuEntry_Separator {
struct MenuEntry;
};
struct MenuList {
list_t * entries;
gfx_context_t * ctx;
yutani_window_t * window;
struct MenuSet * set;
struct MenuList * child;
struct MenuList * parent;
struct menu_bar * _bar;
int closed;
};
struct MenuSet {
hashmap_t * _menus;
};
extern struct MenuEntry * menu_create_normal(const char * icon, const char * action, const char * title, void (*callback)(struct MenuEntry *));
extern struct MenuEntry * menu_create_submenu(const char * icon, const char * action, const char * title);
extern struct MenuEntry * menu_create_separator(void);
extern struct MenuList * menu_create(void);
extern struct MenuSet * menu_set_from_description(const char * path, void (*callback)(struct MenuEntry *));
extern void menu_insert(struct MenuList * menu, struct MenuEntry * entry);
extern void menu_show(struct MenuList * menu, yutani_t * yctx);
extern int menu_process_event(yutani_t * yctx, yutani_msg_t * m);
extern struct MenuList * menu_set_get_root(struct MenuSet * menu);
extern struct MenuList * menu_set_get_menu(struct MenuSet * menu, char * submenu);
extern void menu_free_entry(struct MenuEntry * ptr);
extern void menu_free_menu(struct MenuList * ptr);
extern void menu_free_set(struct MenuSet * ptr);
extern hashmap_t * menu_get_windows_hash(void);
extern int menu_definitely_close(struct MenuList * menu);
extern struct MenuSet * menu_set_create(void);
extern void menu_set_insert(struct MenuSet * set, char * action, struct MenuList * menu);
extern void menu_update_title(struct MenuEntry * self, char * new_title);
#define MENU_BAR_HEIGHT 24
struct menu_bar_entries {
char * title;
char * action;
};
struct menu_bar {
int x;
int y;
int width;
struct menu_bar_entries * entries;
struct MenuSet * set;
struct menu_bar_entries * active_entry;
struct MenuList * active_menu;
int active_menu_wid;
int active_entry_idx;
yutani_window_t * window;
int num_entries;
void (*redraw_callback)(void);
};
extern void menu_bar_render(struct menu_bar * self, gfx_context_t * ctx);
extern int menu_bar_mouse_event(yutani_t * yctx, yutani_window_t * window, struct menu_bar * self, struct yutani_msg_window_mouse_event * me, int x, int y);
extern void menu_bar_show_menu(yutani_t * yctx, yutani_window_t * window, struct menu_bar * self, int offset, struct menu_bar_entries * _entries);