import bemenu

master
Steve Ayerhart 2021-08-09 11:46:01 -04:00
parent c780502a8c
commit 384052eda0
2 changed files with 577 additions and 0 deletions

11
bemenu/bemenu.factor Normal file
View File

@ -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 ;

566
bemenu/ffi/ffi.factor Normal file
View File

@ -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 )