1
0
mirror of https://github.com/Cloudef/bemenu synced 2024-11-23 17:32:11 +01:00
bemenu/lib/internal.h

221 lines
5.2 KiB
C
Raw Normal View History

#include "bemenu.h"
#ifndef size_t
# include <stddef.h> /* for size_t */
#endif
/**
* Destructor function pointer for some list calls.
*/
typedef void (*list_free_fun)(void*);
/**
* List type
*/
struct list {
/**
* Items in the list.
*/
void **items;
2014-04-10 12:23:42 +02:00
/**
* Number of items.
2014-04-10 12:23:42 +02:00
*/
uint32_t count;
/**
* Number of allocated items.
*/
uint32_t allocated;
2014-03-28 21:14:13 +01:00
};
/**
* Internal render api struct.
* Renderers should be able to fill this one as they see fit.
*/
struct render_api {
/**
* Create underlying renderer.
*/
bool (*constructor)(struct bm_menu *menu);
/**
* Release underlying renderer.
*/
void (*destructor)(struct bm_menu *menu);
/**
* Get count of displayed items by the underlying renderer.
*/
uint32_t (*get_displayed_count)(const struct bm_menu *menu);
2014-04-10 12:23:42 +02:00
/**
* If the underlying renderer is a UI toolkit. (curses, etc...)
* There might be possibility to get user input, and this should be thus implemented.
*/
enum bm_key (*poll_key)(const struct bm_menu *menu, uint32_t *unicode);
2014-04-10 12:23:42 +02:00
/**
* Tells underlying renderer to draw the menu.
*/
void (*render)(const struct bm_menu *menu);
};
/**
* Internal bm_renderer struct.
*/
struct bm_renderer {
/**
* Name of the renderer.
*/
char *name;
2014-04-10 12:23:42 +02:00
/**
* File path of the renderer.
2014-04-10 12:23:42 +02:00
*/
char *file;
/**
* Open handle to the plugin file of this renderer.
*/
void *handle;
/**
* API
*/
struct render_api api;
};
/**
* Internal bm_item struct that is not exposed to public.
* Represents a single item in menu.
*/
struct bm_item {
/**
* Userdata pointer.
* This pointer will be passed around with the item untouched.
*/
void *userdata;
/**
* Primary text shown on item as null terminated C "string".
* Matching will be done against this text as well.
*/
char *text;
};
/**
* Internal bm_menu struct that is not exposed to public.
*/
struct bm_menu {
/**
* Userdata pointer.
* This pointer will be passed around with the menu untouched.
*/
void *userdata;
2014-04-10 12:23:42 +02:00
/**
* Underlying renderer access.
*/
const struct bm_renderer *renderer;
2014-04-10 12:23:42 +02:00
/**
* Items contained in menu instance.
2014-04-10 12:23:42 +02:00
*/
struct list items;
2014-04-10 12:23:42 +02:00
/**
* Filtered/displayed items contained in menu instance.
*/
struct list filtered;
/**
* Selected items.
*/
struct list selection;
2014-04-10 12:23:42 +02:00
/**
* Menu instance title.
*/
char *title;
/**
* Text used to filter matches.
*/
2014-04-12 19:52:29 +02:00
char *filter;
2014-04-10 12:23:42 +02:00
/**
* Used as optimization.
*/
char *old_filter;
2014-04-12 19:52:29 +02:00
/**
* Size of filter buffer
*/
size_t filter_size;
2014-04-12 19:52:29 +02:00
2014-04-10 12:23:42 +02:00
/**
* Current byte offset on filter text.
*/
uint32_t cursor;
2014-04-10 12:23:42 +02:00
/**
* Current column/cursor position on filter text.
*/
uint32_t curses_cursor;
2014-04-10 12:23:42 +02:00
/**
* Current filtered/highlighted item index in menu instance.
2014-04-10 12:23:42 +02:00
* This index is valid for the list returned by bmMenuGetFilteredItems.
*/
uint32_t index;
2014-04-10 12:23:42 +02:00
/**
* Current filtering method in menu instance.
*/
enum bm_filter_mode filter_mode;
2014-04-14 18:25:16 +02:00
/**
* Should selection be wrapped?
*/
bool wrap;
2014-03-28 21:14:13 +01:00
};
/* library.c */
bool bm_renderer_activate(struct bm_renderer *renderer, struct bm_menu *menu);
/* menu.c */
bool bm_menu_item_is_selected(const struct bm_menu *menu, const struct bm_item *item);
/* filter.c */
struct bm_item** bm_filter_dmenu(struct bm_menu *menu, bool addition, uint32_t *out_nmemb);
struct bm_item** bm_filter_dmenu_case_insensitive(struct bm_menu *menu, bool addition, uint32_t *out_nmemb);
/* list.c */
void list_free_list(struct list *list);
void list_free_items(struct list *list, list_free_fun destructor);
void* list_get_items(const struct list *list, uint32_t *out_nmemb);
bool list_set_items_no_copy(struct list *list, void *items, uint32_t nmemb);
bool list_set_items(struct list *list, const void *items, uint32_t nmemb, list_free_fun destructor);
bool list_grow(struct list *list, uint32_t step);
bool list_add_item_at(struct list *list, void *item, uint32_t index);
bool list_add_item(struct list *list, void *item);
bool list_remove_item_at(struct list *list, uint32_t index);
bool list_remove_item(struct list *list, const void *item);
/* util.c */
char* bm_strdup(const char *s);
size_t bm_strip_token(char *string, const char *token, size_t *out_next);
int bm_strupcmp(const char *hay, const char *needle);
int bm_strnupcmp(const char *hay, const char *needle, size_t len);
char* bm_strupstr(const char *hay, const char *needle);
int32_t bm_utf8_string_screen_width(const char *string);
size_t bm_utf8_rune_next(const char *string, size_t start);
size_t bm_utf8_rune_prev(const char *string, size_t start);
size_t bm_utf8_rune_width(const char *rune, uint32_t u8len);
size_t bm_utf8_rune_remove(char *string, size_t start, size_t *out_rune_width);
size_t bm_utf8_rune_insert(char **string, size_t *bufSize, size_t start, const char *rune, uint32_t u8len, size_t *out_rune_width);
size_t bm_unicode_insert(char **string, size_t *bufSize, size_t start, uint32_t unicode, size_t *out_rune_width);
/* vim: set ts=8 sw=4 tw=0 :*/