labwc/include/menu/menu.h

119 lines
2.8 KiB
C
Raw Normal View History

/* SPDX-License-Identifier: GPL-2.0-only */
2020-10-19 22:14:17 +01:00
#ifndef __LABWC_MENU_H
#define __LABWC_MENU_H
#include <wayland-server.h>
2022-02-19 02:05:38 +01:00
/* forward declare arguments */
struct view;
struct server;
struct wl_list;
struct wlr_scene_tree;
2022-02-19 02:05:38 +01:00
struct wlr_scene_node;
struct scaled_font_buffer;
2022-02-19 02:05:38 +01:00
enum menu_align {
LAB_MENU_OPEN_AUTO = 0,
LAB_MENU_OPEN_LEFT = 1 << 0,
LAB_MENU_OPEN_RIGHT = 1 << 1,
LAB_MENU_OPEN_TOP = 1 << 2,
LAB_MENU_OPEN_BOTTOM = 1 << 3,
};
struct menu_scene {
2022-06-05 14:42:06 +02:00
struct wlr_scene_tree *tree;
2022-02-19 02:05:38 +01:00
struct wlr_scene_node *text;
struct wlr_scene_node *background;
struct scaled_font_buffer *buffer;
2022-02-19 02:05:38 +01:00
};
2020-10-19 22:14:17 +01:00
struct menuitem {
struct wl_list actions;
2022-03-03 04:33:33 +01:00
struct menu *parent;
struct menu *submenu;
bool selectable;
int height;
2022-06-05 14:42:06 +02:00
struct wlr_scene_tree *tree;
2022-02-19 02:05:38 +01:00
struct menu_scene normal;
struct menu_scene selected;
2021-08-09 17:28:39 +01:00
struct wl_list link; /* menu::menuitems */
2020-10-19 22:14:17 +01:00
};
/* This could be the root-menu or a submenu */
2020-10-19 22:14:17 +01:00
struct menu {
char *id;
char *label;
2022-02-19 02:05:38 +01:00
int item_height;
struct menu *parent;
2022-02-19 02:05:38 +01:00
struct {
int width;
int height;
} size;
2020-10-19 22:14:17 +01:00
struct wl_list menuitems;
struct server *server;
2022-02-19 02:05:38 +01:00
struct {
struct menu *menu;
struct menuitem *item;
} selection;
struct wlr_scene_tree *scene_tree;
/* Used to match a window-menu to the view that triggered it. */
struct view *triggered_by_view; /* may be NULL */
2020-10-19 22:14:17 +01:00
};
void menu_init_rootmenu(struct server *server);
2022-01-26 00:07:10 +01:00
void menu_init_windowmenu(struct server *server);
void menu_finish(void);
2020-10-19 22:14:17 +01:00
2022-02-19 02:05:38 +01:00
/**
* menu_get_by_id - get menu by id
*
* @id id string defined in menu.xml like "root-menu"
*/
struct menu *menu_get_by_id(const char *id);
/**
* menu_open - open menu on position (x, y)
*
* This function will close server->menu_current, open the
* new menu and assign @menu to server->menu_current.
*
* Additionally, server->input_mode wil be set to LAB_INPUT_STATE_MENU.
*/
void menu_open(struct menu *menu, int x, int y);
/**
* menu_process_cursor_motion
*
* - handles hover effects
* - may open/close submenus
*/
2022-03-03 04:33:33 +01:00
void menu_process_cursor_motion(struct wlr_scene_node *node);
2020-10-19 22:14:17 +01:00
2022-02-19 02:05:38 +01:00
/**
2022-03-03 04:33:33 +01:00
* menu_call_actions - call actions associated with a menu node
*
* If menuitem connected to @node does not just open a submenu:
* - associated actions will be called
* - server->menu_current will be closed
* - server->menu_current will be set to NULL
2022-02-19 02:05:38 +01:00
*
2022-03-03 04:33:33 +01:00
* Returns true if actions have actually been executed
2022-02-19 02:05:38 +01:00
*/
2022-03-03 04:33:33 +01:00
bool menu_call_actions(struct wlr_scene_node *node);
2020-10-19 22:14:17 +01:00
/**
* menu_close_root- close root menu
*
* This function will close server->menu_current and set it to NULL.
* Asserts that server->input_mode is set to LAB_INPUT_STATE_MENU.
*
* Additionally, server->input_mode wil be set to LAB_INPUT_STATE_PASSTHROUGH.
*/
void menu_close_root(struct server *server);
2020-10-19 22:14:17 +01:00
2021-02-19 23:05:14 +00:00
/* menu_reconfigure - reload theme and content */
2022-02-19 02:05:38 +01:00
void menu_reconfigure(struct server *server);
2021-02-19 23:05:14 +00:00
2020-10-19 22:14:17 +01:00
#endif /* __LABWC_MENU_H */