ltk

GUI toolkit for X11 (WIP)
git clone git://lumidify.org/ltk.git (fast, but not encrypted)
git clone https://lumidify.org/ltk.git (encrypted, but very slow)
git clone git://4kcetb7mo7hj6grozzybxtotsub5bempzo4lirzc3437amof2c2impyd.onion/ltk.git (over tor)
Log | Files | Refs | README | LICENSE

menu.h (2939B)


      1 /*
      2  * Copyright (c) 2022-2024 lumidify <nobody@lumidify.org>
      3  *
      4  * Permission to use, copy, modify, and/or distribute this software for any
      5  * purpose with or without fee is hereby granted, provided that the above
      6  * copyright notice and this permission notice appear in all copies.
      7  *
      8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
      9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     15  */
     16 
     17 #ifndef LTK_MENU_H
     18 #define LTK_MENU_H
     19 
     20 #include <stddef.h>
     21 
     22 #include "text.h"
     23 #include "widget.h"
     24 #include "window.h"
     25 
     26 #define LTK_MENU_SIGNAL_INVALID -1
     27 
     28 #define LTK_MENUENTRY_SIGNAL_PRESSED -1
     29 #define LTK_MENUENTRY_SIGNAL_INVALID -2
     30 
     31 struct ltk_menuentry;
     32 typedef struct ltk_menuentry ltk_menuentry;
     33 
     34 typedef struct {
     35 	ltk_widget widget;
     36 	ltk_menuentry **entries;
     37 	size_t num_entries;
     38 	size_t num_alloc;
     39 	double x_scroll_offset;
     40 	double y_scroll_offset;
     41 	int scroll_timer_id;
     42 	char is_submenu;
     43 	char was_opened_left;
     44 	char was_opened_above;
     45 	/* FIXME: better names */
     46 	char popup_submenus;
     47 	char unpopup_submenus_on_hide;
     48 	char scroll_top_hover;
     49 	char scroll_bottom_hover;
     50 	char scroll_left_hover;
     51 	char scroll_right_hover;
     52 } ltk_menu;
     53 
     54 /* FIXME: maybe need to set entire widget hierarchy to hover state so menu entry
     55    is also hover when nested widget is hover? */
     56 
     57 struct ltk_menuentry {
     58 	ltk_widget widget;
     59 	/* FIXME: I guess if the regular label got the ability to
     60 	   change its color, a label could just be used instead of this */
     61 	ltk_text_line *text_line;
     62 	ltk_menu *submenu;
     63 };
     64 
     65 /* FIXME: ltk_orientation for hor/vert!
     66 should submenus also allow setting orientation?
     67 -> would maybe look weird in some cases */
     68 
     69 /* FIXME: allow orientation */
     70 ltk_menu *ltk_menu_create(ltk_window *window);
     71 ltk_menu *ltk_submenu_create(ltk_window *window);
     72 ltk_menuentry *ltk_menuentry_create(ltk_window *window, const char *text);
     73 int ltk_menuentry_attach_submenu(ltk_menuentry *e, ltk_menu *submenu);
     74 int ltk_menuentry_detach_submenu(ltk_menuentry *e);
     75 const char *ltk_menuentry_get_text(ltk_menuentry *entry);
     76 int ltk_menu_insert_entry(ltk_menu *menu, ltk_menuentry *entry, size_t idx);
     77 int ltk_menu_add_entry(ltk_menu *menu, ltk_menuentry *entry);
     78 ltk_menuentry *ltk_menu_remove_entry_index(ltk_menu *menu, size_t idx);
     79 int ltk_menu_remove_entry(ltk_menu *menu, ltk_menuentry *entry);
     80 void ltk_menu_remove_all_entries(ltk_menu *menu);
     81 size_t ltk_menu_get_num_entries(ltk_menu *menu);
     82 ltk_menuentry *ltk_menu_get_entry(ltk_menu *menu, size_t idx);
     83 size_t ltk_menu_get_entry_index(ltk_menu *menu, ltk_menuentry *entry);
     84 
     85 #endif /* LTK_MENU_H */