diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/meson.build | 2 | ||||
| -rw-r--r-- | src/ui/base.c | 5 | ||||
| -rw-r--r-- | src/ui/debug.c | 5 | ||||
| -rw-r--r-- | src/ui/menuwin.c | 22 | ||||
| -rw-r--r-- | src/ui/root.c | 14 | ||||
| -rw-r--r-- | src/ui/ui.internal.h | 12 | ||||
| -rw-r--r-- | src/ui/uimenu.internal.h | 2 |
7 files changed, 58 insertions, 4 deletions
diff --git a/src/meson.build b/src/meson.build index 03038df..f264e78 100644 --- a/src/meson.build +++ b/src/meson.build @@ -1,4 +1,4 @@ -umps_srcs = files('main.c', 'ui/base.c', 'ui/dock.c', 'ui/root.c', 'ui/debug.c', 'ui/menu.c') +umps_srcs = files('main.c', 'ui/base.c', 'ui/dock.c', 'ui/root.c', 'ui/debug.c', 'ui/menu.c', 'ui/menuwin.c') configure_file(input : 'config.h.in', output : 'config.h', configuration : conf_data) umps_config_inc = include_directories('.') diff --git a/src/ui/base.c b/src/ui/base.c index f1aa217..8e7a7ea 100644 --- a/src/ui/base.c +++ b/src/ui/base.c @@ -110,6 +110,7 @@ void ui__init_window_root(struct ui_window_root *root, WINDOW *cwindow) void ui__destroy_window_base(struct ui_window_base *base); void ui__destroy_window_leaf(struct ui_window_leaf *leaf); void ui__destroy_window_dock(struct ui_window_dock *dock); +void ui__destroy_window_menu(struct ui_window_menu *menu); void ui__window_destroy_root(struct ui_window_root *root) { @@ -165,6 +166,9 @@ void ui__destroy_window(struct ui_window_base *base) break; case UI__WINDOW_TYPE_BASE: ui__destroy_window_base(base); + break; + case UI__WINDOW_TYPE_MENU: + ui__destroy_window_menu(ui__cast(menu, base)); } } @@ -223,6 +227,7 @@ WINDOW *ui__find_focused_leaf(struct ui_window_base *start) { switch (start->type) { case UI__WINDOW_TYPE_LEAF: + case UI__WINDOW_TYPE_MENU: return ui__cast(leaf, start)->cwindow; case UI__WINDOW_TYPE_DOCK: { struct ui_window_dock *dock = ui__cast(dock, start); diff --git a/src/ui/debug.c b/src/ui/debug.c index 5623b97..0b47340 100644 --- a/src/ui/debug.c +++ b/src/ui/debug.c @@ -51,6 +51,11 @@ struct ui_window_root *ui__check_cast_to_root(void *obj, const char *file, const UMPS__DEBUG_DO_ERROR(obj, file, func, line, UI__WINDOW_TYPE_ROOT); } +struct ui_window_menu *ui__check_cast_to_menu(void *obj, const char *file, const char *func, int line) +{ + UMPS__DEBUG_DO_ERROR(obj, file, func, line, UI__WINDOW_TYPE_MENU); +} + int ui__debug_nc_check_int(int in, const char *call, const char *file, const char *func, int line) { if (in == ERR) { diff --git a/src/ui/menuwin.c b/src/ui/menuwin.c new file mode 100644 index 0000000..76c0ac3 --- /dev/null +++ b/src/ui/menuwin.c @@ -0,0 +1,22 @@ +#include "ui.internal.h" + +#include <stddef.h> /* for size_t */ + +/* number of columns wide a menu window is */ +#define UI__MENUWIN_COLS (20) + +size_t ui__menuwin_next_line(char **linep) +{ + +} + +void ui__init_window_menu(struct ui_window_menu *menu) +{ + +} + +/* for base.c */ +void ui__destroy_window_menu(struct ui_window_menu *menu) +{ + +} diff --git a/src/ui/root.c b/src/ui/root.c index eeeb1b9..49dc6c3 100644 --- a/src/ui/root.c +++ b/src/ui/root.c @@ -110,7 +110,7 @@ void ui__update_scroll(struct ui_window_root *root) } } -void ui__root_scroll_text(struct ui_window_root *root, unsigned cursor, const char *text, size_t tlen) +void ui__root_scroll_print(struct ui_window_root *root, unsigned cursor, const char *text, size_t tlen) { if (cursor < root->menu_scroll) { size_t strend = cursor + tlen; @@ -154,9 +154,10 @@ void ui__root_draw_menu(struct ui_window_root *root) if (item == root->menu_selected) { wattroff(root->menu_cwindow, A_REVERSE); /* the coordinates of the selected menu item are here, place the window :) */ + root->menu_selected_x = getcurx(root->menu_cwindow); } - ui__root_scroll_text(root, cursor, text, tlen); + ui__root_scroll_print(root, cursor, text, tlen); wattron(root->menu_cwindow, A_REVERSE); cursor += tlen; @@ -259,6 +260,15 @@ struct ui_window_base *ui__root_control_proc(struct ui_window_base *base, ui_con return NULL; } break; + case NS('\n'): + if (root->menu_selected) { + WINDOW *win = newwin(2, 30, 5, root->menu_selected_x); + ui__call_draw_proc(ui__cast(base, ui_root)); + mvwaddstr(win, 0, 0, "this line is too long to fit in the window. this line is too long to fit in the window. this line is too long to fit in the window."); + wrefresh(win); + delwin(win); + } + break; } if (root->menu_selected) { diff --git a/src/ui/ui.internal.h b/src/ui/ui.internal.h index 863d9b2..0ad03f1 100644 --- a/src/ui/ui.internal.h +++ b/src/ui/ui.internal.h @@ -22,7 +22,8 @@ O(BASE), \ O(LEAF), \ O(DOCK), \ - O(ROOT) + O(ROOT), \ + O(MENU) enum { #define WT_DEF(_t) UI__WINDOW_TYPE_ ## _t @@ -48,6 +49,7 @@ struct ui_window_base *ui__check_cast_to_base(void *, const char *, const char * struct ui_window_leaf *ui__check_cast_to_leaf(void *, const char *, const char *, int); struct ui_window_dock *ui__check_cast_to_dock(void *, const char *, const char *, int); struct ui_window_root *ui__check_cast_to_root(void *, const char *, const char *, int); +struct ui_window_menu *ui__check_cast_to_menu(void *, const char *, const char *, int); #define NCCI(_call) ui__debug_nc_check_int(_call, #_call, __FILE__, __func__, __LINE__) #define NCCP(_call) ui__debug_nc_check_ptr(_call, #_call, __FILE__, __func__, __LINE__) @@ -108,6 +110,7 @@ struct ui_window_root { size_t menu_prefix_len; struct uimenu_item_header *menu_selected; + int menu_selected_x; unsigned menu_scroll; bool undersize_scr; /* true if the screen was found to be undersize (set in layout proc) */ @@ -119,6 +122,12 @@ struct ui_window_root { struct uimenu_item_menu *menu_root; }; +struct ui_window_menu { + struct ui_window_leaf super; + + struct uimenu_item_header *first_item; +}; + /* internal utils */ /* in-place constructors */ @@ -126,6 +135,7 @@ void ui__init_window_base(struct ui_window_base *); void ui__init_window_leaf(struct ui_window_leaf *); void ui__init_window_dock(struct ui_window_dock *); void ui__init_window_root(struct ui_window_root *, WINDOW *); +void ui__init_window_menu(struct ui_window_menu *); struct ui_window_base *ui__find_focused(void); diff --git a/src/ui/uimenu.internal.h b/src/ui/uimenu.internal.h index 82360f5..f52ba4f 100644 --- a/src/ui/uimenu.internal.h +++ b/src/ui/uimenu.internal.h @@ -48,4 +48,6 @@ void uimenu_menu_remove(struct uimenu_item_menu *menu, struct uimenu_item_header /* frees children */ void uimenu_menu_free(struct uimenu_item_menu *menu); + + #endif /* include guard */ |
