From 384052eda0a3cab3113d2dae530f0e0ca5971275 Mon Sep 17 00:00:00 2001 From: Steve Ayerhart Date: Mon, 9 Aug 2021 11:46:01 -0400 Subject: [PATCH] import bemenu --- bemenu/bemenu.factor | 11 + bemenu/ffi/ffi.factor | 566 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 577 insertions(+) create mode 100644 bemenu/bemenu.factor create mode 100644 bemenu/ffi/ffi.factor diff --git a/bemenu/bemenu.factor b/bemenu/bemenu.factor new file mode 100644 index 0000000..a7ef6b2 --- /dev/null +++ b/bemenu/bemenu.factor @@ -0,0 +1,11 @@ +USING: kernel destructors ; +USING: bemenu.ffi ; + +IN: bemenu + +: get-text ( -- str ) + [ + f bm_menu_new &bm_menu_free + bm_menu_render + "hi" + ] with-destructors ; diff --git a/bemenu/ffi/ffi.factor b/bemenu/ffi/ffi.factor new file mode 100644 index 0000000..fe459cf --- /dev/null +++ b/bemenu/ffi/ffi.factor @@ -0,0 +1,566 @@ +USING: kernel system combinators alien alien.destructors alien.libraries alien.syntax alien.c-types specialized-arrays ; + +IN: bemenu.ffi + +<< "bemenu" { + { [ os unix? ] [ "libbemenu.so" ] } +} cond cdecl add-library >> + +LIBRARY: bemenu + +C-TYPE: bm_renderer +C-TYPE: bm_menu +C-TYPE: bm_item + +! Init bemenu, loads up the renderers. +! +! You can force single renderer with BEMENU_RENDERER env variable, +! and directory containing renderers with BEMENU_RENDERERS env variable. +! +! @return true on success, false on failure. +FUNCTION: bool bm_init ( ) + +! Get list of available renderers. +! +! @param out_nmemb Reference to uint32_t where total count of returned renderers will be stored. +! @return Pointer to array of bm_renderer instances. +FUNCTION: bm_renderer** bm_get_renderers ( uint32_t *out_nmemb ) + +! Get version of the library in 'major.minor.patch' format. +! +! @see @link http://semver.org/ Semantic Versioning @endlink +! +! @return Null terminated C "string" to version string. +FUNCTION: c-string bm_version ( ) + +ENUM: bm_priority + ! renderer runs in terminal + BM_PRIO_TERMINAL + ! renderer runs in GUI + BM_PRIO_GUI ; + +! Get name of the renderer. +! +! @param renderer bm_renderer instance. +! @return Null terminated C "string" to renderer's name. +FUNCTION: c-string bm_renderer_get_name ( bm_renderer* renderer ) + +! Get priorty of the renderer. +! +! @param renderer bm_renderer instance. +! @return bm_priorty enum value. +FUNCTION: bm_priority bm_renderer_get_priority ( bm_renderer* renderer ) + +ENUM: bm_filter_mode + BM_FILTER_MODE_DMENU + BM_FILTER_MODE_DMENU_CASE_INSENSITIVE + BM_FILTER_MODE_DMENU_LAST ; + +ENUM: bm_scrollbar_mode + BM_SCROLLBAR_NONE + BM_SCROLLBAR_ALWAYS + BM_SCROLLBAR_AUTOHIDE + BM_SCROLLBAR_LAST ; + +ENUM: bm_run_result + BM_RUN_RESULT_RUNNING + BM_RUN_RESULT_SELECTED + BM_RUN_RESULT_CANCEL + BM_RUN_RESULT_CUSTOM_1 + BM_RUN_RESULT_CUSTOM_2 + BM_RUN_RESULT_CUSTOM_3 + BM_RUN_RESULT_CUSTOM_4 + BM_RUN_RESULT_CUSTOM_5 + BM_RUN_RESULT_CUSTOM_6 + BM_RUN_RESULT_CUSTOM_7 + BM_RUN_RESULT_CUSTOM_8 + BM_RUN_RESULT_CUSTOM_9 + BM_RUN_RESULT_CUSTOM_10 ; + +ENUM: bm_key + BM_KEY_NONE + BM_KEY_UP + BM_KEY_DOWN + BM_KEY_LEFT + BM_KEY_RIGHT + BM_KEY_HOME + BM_KEY_END + BM_KEY_PAGE_UP + BM_KEY_PAGE_DOWN + BM_KEY_SHIFT_PAGE_UP + BM_KEY_SHIFT_PAGE_DOWN + BM_KEY_BACKSPACE + BM_KEY_DELETE + BM_KEY_LINE_DELETE_LEFT + BM_KEY_LINE_DELETE_RIGHT + BM_KEY_WORD_DELETE + BM_KEY_TAB + BM_KEY_SHIFT_TAB + BM_KEY_ESCAPE + BM_KEY_RETURN + BM_KEY_SHIFT_RETURN + BM_KEY_CONTROL_RETURN + BM_KEY_CUSTOM_1 + BM_KEY_CUSTOM_2 + BM_KEY_CUSTOM_3 + BM_KEY_CUSTOM_4 + BM_KEY_CUSTOM_5 + BM_KEY_CUSTOM_6 + BM_KEY_CUSTOM_7 + BM_KEY_CUSTOM_8 + BM_KEY_CUSTOM_9 + BM_KEY_CUSTOM_10 + BM_KEY_UNICODE + BM_KEY_LAST ; + +ENUM: bm_color + BM_COLOR_TITLE_BG + BM_COLOR_TITLE_FG + BM_COLOR_FILTER_BG + BM_COLOR_FILTER_FG + BM_COLOR_ITEM_BG + BM_COLOR_ITEM_FG + BM_COLOR_HIGHLIGHTED_BG + BM_COLOR_HIGHLIGHTED_FG + BM_COLOR_SELECTED_BG + BM_COLOR_SELECTED_FG + BM_COLOR_SCROLLBAR_BG + BM_COLOR_SCROLLBAR_FG + BM_COLOR_LAST ; + +FUNCTION: bm_menu* bm_menu_new ( c-string renderer ) +FUNCTION: void bm_menu_free ( bm_menu* menu ) + +DESTRUCTOR: bm_menu_free + +FUNCTION: void bm_menu_free_items ( bm_menu* menu ) + +FUNCTION: bm_renderer* bm_menu_get_renderer ( bm_menu *menu ) + +! Set userdata pointer to bm_menu instance. +! Userdata will be carried unmodified by the instance. +! +! @param menu bm_menu instance where to set userdata pointer. +! @param userdata Pointer to userdata. +FUNCTION: void bm_menu_set_userdata ( bm_menu *menu, void *userdata ) + +! Get userdata pointer from bm_menu instance. +! +! @param menu bm_menu instance which userdata pointer to get. +! @return Pointer for unmodified userdata. +FUNCTION: void bm_menu_get_userdata ( bm_menu *menu ) + +! Set highlight prefix. +! This is shown on vertical list mode only. +! +! @param menu bm_menu instance where to set highlight prefix. +! @param prefix "string" to act as prefix for highlighted item. May be set f for none. +FUNCTION: void bm_menu_set_prefix ( bm_menu *menu, c-string prefix ) + +! Get highlight prefix. +! +! @param menu bm_menu instance where to get highlight prefix. +! @param Const pointer to current highlight prefix, may be f if empty. +FUNCTION: c-string bm_menu_get_prefix ( bm_menu *menu ) + +! Set filter text to bm_menu instance. +! +! The cursor will be automatically placed at the end of the new filter text. +! +! @param menu bm_menu instance where to set filter. +! @param filter Null terminated C "string" to act as filter. May be set **NULL** for none. +FUNCTION: void bm_menu_set_filter ( bm_menu *menu, c-string *filter ) + + +! Get filter text from bm_menu instance. +! +! @param menu bm_menu instance where to get filter. +! @return Const pointer to current filter text, may be **NULL** if empty. +FUNCTION: c-string bm_menu_get_filter ( bm_menu *menu ) + + +! Set active filter mode to bm_menu instance. +! +! @param menu bm_menu instance where to set filter mode. +! @param mode bm_filter_mode constant. +FUNCTION: void bm_menu_set_filter_mode ( bm_menu *menu, bm_filter_mode mode ) + + +! Get active filter mode from bm_menu instance. +! +! @param menu bm_menu instance where to get filter mode. +! @return bm_filter_mode constant. +FUNCTION: bm_filter_mode bm_menu_get_filter_mode ( bm_menu *menu ) + + +! Set amount of max vertical lines to be shown. +! Some renderers such as ncurses may ignore this when it does not make sense. +! +! @param menu bm_menu instance where to set max vertical line amount. +! @param lines 0 for single line layout, > 0 to show that many lines. +FUNCTION: void bm_menu_set_lines ( bm_menu *menu, uint32_t lines ) + + +! Get amount of max vertical lines to be shown. +! +! @param menu bm_menu instance where to get max vertical line amount. +! @return uint32_t for max amount of vertical lines to be shown. +FUNCTION: uint32_t bm_menu_get_lines ( bm_menu *menu ) + + +! Set selection wrapping on/off. +! +! @param menu bm_menu instance where to toggle selection wrapping. +! @param wrap true/false. +FUNCTION: void bm_menu_set_wrap ( bm_menu *menu, bool wrap ) + + +! Get selection wrapping state. +! +! @param menu bm_menu instance where to get selection wrapping state. +! @return int for wrap state. +FUNCTION: bool bm_menu_get_wrap ( bm_menu *menu ) + + +! Set title to bm_menu instance. +! +! @param menu bm_menu instance where to set title. +! @param title C "string" to set as title, can be **NULL** for empty title. +! @return true if set was succesful, false if out of memory. +FUNCTION: bool bm_menu_set_title ( bm_menu *menu, c-string title ) + + +! Get title from bm_menu instance. +! +! @param menu bm_menu instance where to get title from. +! @return Pointer to null terminated C "string", can be **NULL** for empty title. +FUNCTION: c-string bm_menu_get_title ( bm_menu *menu ) + + +! Set font description to bm_menu instance. +! +! @param menu bm_menu instance where to set font. +! @param font C "string" for a **pango style font description**, can be **NULL** for default (Terminus 9). +! @return true if set was succesful, false if out of memory. +FUNCTION: bool bm_menu_set_font ( bm_menu *menu, c-string font ) + + +! Get font description from bm_menu instance. +! +! @param menu bm_menu instance where to get font description from. +! @return Pointer to null terminated C "string". +FUNCTION: c-string bm_menu_get_font ( bm_menu *menu ) + + +! Set size of line in pixels. +! Some renderers such as ncurses may ignore this when it does not make sense. +! +! @param menu bm_menu instance where to set line height. +! @param line_height 0 for default line height, > 0 for that many pixels. +FUNCTION: void bm_menu_set_line_height ( bm_menu *menu, uint32_t line_height ) + + +! Get size of line in pixels. +! +! @param menu bm_menu instance where to get line height. +! @return uint32_t for max amount of vertical lines to be shown. +FUNCTION: uint32_t bm_menu_get_line_height ( bm_menu *menu ) + + +! Set a hexadecimal color for element. +! +! @param menu bm_menu instance where to set color. +! @param color bm_color type. +! @param hex Color in hexadecimal format starting with '#'. +! @return true if set was succesful, false if out of memory. +FUNCTION: bool bm_menu_set_color ( bm_menu *menu, bm_color color, c-string hex ) + + +! Get hexadecimal color for element. +! +! @param menu bm_menu instance where to get color from. +! @param color bm_color type. +! @return Pointer to null terminated C "string". +FUNCTION: c-string bm_menu_get_color ( bm_menu *menu, bm_color color ) + + +! Set scrollbar display mode. +! +! @param menu bm_menu instance to set scrollbar for. +! @param mode bm_scrollbar_mode constant. +FUNCTION: void bm_menu_set_scrollbar ( bm_menu *menu, bm_scrollbar_mode mode ) + + +! Return current scrollbar display mode. +! +! @param menu bm_menu instance where to get scrollbar display state from. +! @return bm_scrollbar_mode constant. +FUNCTION: bm_scrollbar_mode bm_menu_get_scrollbar ( bm_menu *menu ) + + +! Display menu at bottom of the screen. +! This may be no-op on some renderers (curses, wayland) +! +! @param menu bm_menu instance to set bottom mode for. +! @param bottom true for bottom mode, false for top mode. +FUNCTION: void bm_menu_set_bottom ( bm_menu *menu, bool bottom ) + + +! Is menu being displayed at bottom of the screen? +! +! @param menu bm_menu instance where to get bottom mode from. +! @return true if bottom mode, false otherwise. +FUNCTION: bool bm_menu_get_bottom ( bm_menu *menu ) + + +! Display menu at monitor index. +! Indices start at 0, a value of -1 can be passed for the active monitor (default). +! If index is more than amount of monitors, the monitor with highest index will be selected. +! +! @param menu bm_menu instance to set monitor for. +! @param monitor Monitor index starting from 0, or -1 for the active monitor. +FUNCTION: void bm_menu_set_monitor ( bm_menu *menu, int32_t monitor ) + + +! Display menu with monitor_name. +! Only works for Wayland. +! +! @param menu bm_menu instance to set monitor for. +! @param monitor_name Monitor name passed in. +FUNCTION: void bm_menu_set_monitor_name ( bm_menu *menu, c-string monitor_name ) + + +! Return index for current monitor. +! +! @param menu bm_menu instance where to get current monitor from. +! @return Monitor index starting from 1. +FUNCTION: uint32_t bm_menu_get_monitor ( bm_menu *menu ) + + +! Tell renderer to grab keyboard. +! This only works with x11 renderer. +! +! @param menu bm_menu instance to set grab for. +! @param grab true for grab, false for ungrab. +FUNCTION: void bm_menu_grab_keyboard ( bm_menu *menu, bool grab ) + + +! Is keyboard grabbed for bm_menu? +! +! @param menu bm_menu instance where to check grab status from. +! @return true if grabbed, false if not. +FUNCTION: bool bm_menu_is_keyboard_grabbed ( bm_menu *menu ) + + +! Tell the renderer to position the menu that it can overlap panels. +FUNCTION: void bm_menu_set_panel_overlap ( bm_menu *menu, bool overlap ) + + +! Replace input with asterisks. +! +! @param menu bm_menu instance to set password mode for. +! @param password true for password mode, false for deafault behavior. +FUNCTION: void bm_menu_set_password ( bm_menu *menu, bool password ) + + +! Is password mode activated and input hidden? +! +! @param menu bm_menu instance where to get password mode from. +! @return true if password mode, false otherwise. +FUNCTION: bool bm_menu_get_password ( bm_menu *menu ) + + +! Properties + +! @name Menu Items + + +! Add item to bm_menu instance at specific index. +! +! @param menu bm_menu instance where item will be added. +! @param item bm_item instance to add. +! @param index Index where item will be added. +! @return true on successful add, false on failure. +FUNCTION: bool bm_menu_add_item_at ( bm_menu *menu, bm_item *item, uint32_t index ) + + +! Add item to bm_menu instance. +! +! @param menu bm_menu instance where item will be added. +! @param item bm_item instance to add. +! @return true on successful add, false on failure. +FUNCTION: bool bm_menu_add_item ( bm_menu *menu, bm_item *item ) + + +! Remove item from bm_menu instance at specific index. +! +! @warning The item won't be freed, use bm_item_free to do that. +! +! @param menu bm_menu instance from where item will be removed. +! @param index Index of item to remove. +! @return true on successful add, false on failure. +FUNCTION: bool bm_menu_remove_item_at ( bm_menu *menu, uint32_t index ) + +! Remove item from bm_menu instance. +! +! @warning The item won't be freed, use bm_item_free to do that. +! +! @param menu bm_menu instance from where item will be removed. +! @param item bm_item instance to remove. +! @return true on successful add, false on failure. +FUNCTION: bool bm_menu_remove_item ( bm_menu *menu, bm_item *item ) + +! Highlight item in menu by index. +! +! @param menu bm_menu instance from where to highlight item. +! @param index Index of item to highlight. +! @return true on successful highlight, false on failure. +FUNCTION: bool bm_menu_set_highlighted_index ( bm_menu *menu, uint32_t index ) + +! Highlight item in menu. +! +! @param menu bm_menu instance from where to highlight item. +! @param item bm_item instance to highlight. +! @return true on successful highlight, false on failure. +FUNCTION: bool bm_menu_set_highlighted_item ( bm_menu *menu, bm_item *item ) + +! Get highlighted item from bm_menu instance. +! +! @warning The pointer returned by this function may be invalid after items change. +! +! @param menu bm_menu instance from where to get highlighted item. +! @return Selected bm_item instance, **NULL** if none highlighted. +FUNCTION: bm_item* bm_menu_get_highlighted_item ( bm_menu *menu ) + +! Set selected items to bm_menu instance. +! +! @param menu bm_menu instance where items will be set. +! @param items Array of bm_item pointers to set. +! @param nmemb Total count of items in array. +! @return true on successful set, false on failure. +FUNCTION: bool bm_menu_set_selected_items ( bm_menu *menu, bm_item **items, uint32_t nmemb ) + +! Get selected items from bm_menu instance. +! +! @warning The pointer returned by this function may be invalid after selection or items change. +! +! @param menu bm_menu instance from where to get selected items. +! @param out_nmemb Reference to uint32_t where total count of returned items will be stored. +! @return Pointer to array of bm_item pointers. +FUNCTION: bm_item** bm_menu_get_selected_items ( bm_menu *menu, uint32_t *out_nmemb ) + +! Set items to bm_menu instance. +! Will replace all the old items on bm_menu instance. +! +! If items is **NULL**, or nmemb is zero, all items will be freed from the menu. +! +! @param menu bm_menu instance where items will be set. +! @param items Array of bm_item pointers to set. +! @param nmemb Total count of items in array. +! @return true on successful set, false on failure. +FUNCTION: bool bm_menu_set_items ( bm_menu *menu, bm_item **items, uint32_t nmemb ) + +! Get items from bm_menu instance. +! +! @warning The pointer returned by this function may be invalid after removing or adding new items. +! +! @param menu bm_menu instance from where to get items. +! @param out_nmemb Reference to uint32_t where total count of returned items will be stored. +! @return Pointer to array of bm_item pointers. +FUNCTION: bm_item** bm_menu_get_items ( bm_menu *menu, uint32_t *out_nmemb ) + +! Get filtered (displayed) items from bm_menu instance. +! +! @warning The pointer returned by this function _will_ be invalid when menu internally filters its list again. +! Do not store this pointer. +! +! @param menu bm_menu instance from where to get filtered items. +! @param out_nmemb Reference to uint32_t where total count of returned items will be stored. +! @return Pointer to array of bm_item pointers. +FUNCTION: bm_item** bm_menu_get_filtered_items ( bm_menu *menu, uint32_t *out_nmemb ) + +! Menu Items + +! @name Menu Logic + +! Render bm_menu instance using chosen renderer. +! +! This function may block on **wayland** and **x11** renderer. +! +! @param menu bm_menu instance to be rendered. +FUNCTION: void bm_menu_render ( bm_menu *menu ) + +! Trigger filtering of menu manually. +! This is useful when adding new items and want to dynamically see them filtered. +! +! Do note that filtering might be heavy, so you should only call it after batch manipulation of items. +! Not after manipulation of each single item. +! +! @param menu bm_menu instance which to filter. +FUNCTION: void bm_menu_filter ( bm_menu *menu ) + + +! Poll key and unicode from underlying UI toolkit. +! +! This function will block on **curses** renderer. +! +! @param menu bm_menu instance from which to poll. +! @param out_unicode Reference to uint32_t. +! @return bm_key for polled key. +FUNCTION: bm_key bm_menu_poll_key ( bm_menu *menu, uint32_t *out_unicode ) + +! Advances menu logic with key and unicode as input. +! +! @param menu bm_menu instance to be advanced. +! @param key Key input that will advance menu logic. +! @param unicode Unicode input that will advance menu logic. +! @return bm_run_result for menu state. +FUNCTION: bm_run_result bm_menu_run_with_key ( bm_menu *menu, bm_key key, uint32_t unicode ) + +! Menu Logic + +! Menu +! @addtogroup Item +! @name Item Memory + +! Allocate a new item. +! +! @param text Pointer to null terminated C "string", can be **NULL** for empty text. +! @return bm_item for new item instance, **NULL** if creation failed. +FUNCTION: bm_item* bm_item_new ( c-string *text ) + + +! Release bm_item instance. +! +! @param item bm_item instance to be freed from memory. +FUNCTION: void bm_item_free ( bm_item *item ) + +! Item Memory */ + +! @name Item Properties + +! Set userdata pointer to bm_item instance. +! Userdata will be carried unmodified by the instance. +! +! @param item bm_item instance where to set userdata pointer. +! @param userdata Pointer to userdata. +FUNCTION: void bm_item_set_userdata ( bm_item *item, void *userdata ) + +! Get userdata pointer from bm_item instance. +! +! @param item bm_item instance which userdata pointer to get. +! @return Pointer for unmodified userdata. +FUNCTION: void* bm_item_get_userdata ( bm_item *item ) + +! Set text to bm_item instance. +! +! @param item bm_item instance where to set text. +! @param text C "string" to set as text, can be **NULL** for empty text. +! @return true if set was succesful, false if out of memory. +FUNCTION: bool bm_item_set_text ( bm_item *item, c-string text ) + +! Get text from bm_item instance. +! +! @param item bm_item instance where to get text from. +! @return Pointer to null terminated C "string", can be **NULL** for empty text. +FUNCTION: c-string bm_item_get_text ( bm_item *item )