wlmaker
Loading...
Searching...
No Matches
Classes | Functions | Variables
menu.c File Reference
#include "menu.h"
#include <libbase/libbase.h>
#include <libbase/plist.h>
#include <linux/input-event-codes.h>
#include <stdint.h>
#include <stdlib.h>
#include <xkbcommon/xkbcommon.h>
#include <xkbcommon/xkbcommon-keysyms.h>
#include "base.h"
#include "input.h"
#include "util.h"
Include dependency graph for menu.c:

Classes

struct  _wlmtk_menu_t
 
struct  _wlmtk_menu_style_ref_t
 
struct  wlmtk_menu_style_holder
 

Functions

static void _wlmtk_menu_eliminate_item (bs_dllist_node_t *dlnode_ptr, void *ud_ptr)
 
static bool _wlmtk_menu_set_item_style (bs_dllist_node_t *dlnode_ptr, void *ud_ptr)
 
static void _wlmtk_menu_set_item_mode (bs_dllist_node_t *dlnode_ptr, void *ud_ptr)
 
static void _wlmtk_menu_box_element_destroy (wlmtk_element_t *element_ptr)
 
static void _wlmtk_menu_element_destroy (wlmtk_element_t *element_ptr)
 
static bool _wlmtk_menu_element_pointer_button (wlmtk_element_t *element_ptr, const wlmtk_button_event_t *button_event_ptr)
 
static bool _wlmtk_menu_element_keyboard_sym (wlmtk_element_t *element_ptr, xkb_keysym_t keysym, enum xkb_key_direction direction, uint32_t modifiers)
 
static bs_dllist_node_t * _wlmtk_menu_this_or_next_non_disabled_dlnode (bs_dllist_node_t *dlnode_ptr, bs_dllist_node_iterator_t iterator)
 
static void _wlmtk_menu_style_destroy (bs_ref_t *ref_ptr)
 
wlmtk_menu_twlmtk_menu_create (wlmtk_menu_style_ref_t *style_ref_ptr)
 
void wlmtk_menu_destroy (wlmtk_menu_t *menu_ptr)
 
wlmtk_element_twlmtk_menu_element (wlmtk_menu_t *menu_ptr)
 
wlmtk_base_twlmtk_menu_base (wlmtk_menu_t *menu_ptr)
 
wlmtk_menu_events_twlmtk_menu_events (wlmtk_menu_t *menu_ptr)
 
bool wlmtk_menu_set_style (wlmtk_menu_t *menu_ptr, wlmtk_menu_style_ref_t *style_ref_ptr)
 
void wlmtk_menu_set_open (wlmtk_menu_t *menu_ptr, bool opened)
 
bool wlmtk_menu_is_open (wlmtk_menu_t *menu_ptr)
 
void wlmtk_menu_set_mode (wlmtk_menu_t *menu_ptr, enum wlmtk_menu_mode mode)
 
enum wlmtk_menu_mode wlmtk_menu_get_mode (wlmtk_menu_t *menu_ptr)
 
void wlmtk_menu_add_item (wlmtk_menu_t *menu_ptr, wlmtk_menu_item_t *menu_item_ptr)
 
void wlmtk_menu_remove_item (wlmtk_menu_t *menu_ptr, wlmtk_menu_item_t *menu_item_ptr)
 
void wlmtk_menu_set_parent_item (wlmtk_menu_t *menu_ptr, wlmtk_menu_item_t *menu_item_ptr)
 
wlmtk_menu_item_twlmtk_menu_get_parent_item (wlmtk_menu_t *menu_ptr)
 
void wlmtk_menu_request_item_highlight (wlmtk_menu_t *menu_ptr, wlmtk_menu_item_t *menu_item_ptr)
 
size_t wlmtk_menu_items_size (wlmtk_menu_t *menu_ptr)
 
wlmtk_menu_item_twlmtk_menu_item_at (wlmtk_menu_t *menu_ptr, size_t i)
 
struct wlmtk_menu_stylewlmtk_menu_style_create (void)
 
wlmtk_menu_style_ref_twlmtk_menu_style_to_ref (struct wlmtk_menu_style *menu_style_ptr)
 
const struct wlmtk_menu_stylewlmtk_menu_style_ref_retain (wlmtk_menu_style_ref_t *ref_ptr)
 
void wlmtk_menu_style_ref_release (wlmtk_menu_style_ref_t *ref_ptr)
 
bool wlmtk_menu_style_decode (bspl_object_t *object_ptr, const union bspl_desc_value *desc_value_ptr, void *value_ptr)
 
bool wlmtk_menu_style_decode_init (void *dst_ptr)
 
void wlmtk_menu_style_decode_fini (void *dst_ptr)
 
static void test_pointer_highlight (bs_test_t *test_ptr)
 
static void test_set_mode (bs_test_t *test_ptr)
 
static void test_keyboard_navigation (bs_test_t *test_ptr)
 
static void test_keyboard_navigation_nested (bs_test_t *test_ptr)
 

Variables

static const wlmtk_element_vmt_t _wlmtk_menu_element_vmt
 
static const wlmtk_element_vmt_t _wlmtk_menu_box_element_vmt
 
static const bspl_desc_t _wlmtk_menu_style_desc []
 
static const bs_test_case_t _wlmtk_menu_test_cases []
 
const bs_test_set_t wlmtk_menu_test_set
 
static struct wlmtk_menu_style_holder _test_style_holder
 

Detailed Description

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Function Documentation

◆ _wlmtk_menu_box_element_destroy()

void _wlmtk_menu_box_element_destroy ( wlmtk_element_t element_ptr)
static

Dtor for wlmtk_menu_t::box.

◆ _wlmtk_menu_element_destroy()

void _wlmtk_menu_element_destroy ( wlmtk_element_t element_ptr)
static

Wraps to dtor. Implements wlmtk_element_vmt_t::destroy.

◆ _wlmtk_menu_element_keyboard_sym()

bool _wlmtk_menu_element_keyboard_sym ( wlmtk_element_t element_ptr,
xkb_keysym_t  keysym,
enum xkb_key_direction  direction,
uint32_t  modifiers 
)
static

Implements wlmtk_element_vmt_t::keyboard_sym. Translated keys.

◆ _wlmtk_menu_element_pointer_button()

bool _wlmtk_menu_element_pointer_button ( wlmtk_element_t element_ptr,
const wlmtk_button_event_t button_event_ptr 
)
static

If the menu is in right-click mode, acts on right-button events and signals the menu to close.

Implementation of wlmtk_element_vmt_t::pointer_button.

Parameters
element_ptr
button_event_ptr
Returns
whether the button event was claimed.

◆ _wlmtk_menu_eliminate_item()

void _wlmtk_menu_eliminate_item ( bs_dllist_node_t *  dlnode_ptr,
void *  ud_ptr 
)
static

Callback for bs_dllist_for_each: Removes item from items, destroys it.

◆ _wlmtk_menu_set_item_mode()

void _wlmtk_menu_set_item_mode ( bs_dllist_node_t *  dlnode_ptr,
void *  ud_ptr 
)
static

Callback for bs_dllist_for_each: Sets the menu mode for the item.

Parameters
dlnode_ptr
ud_ptr

◆ _wlmtk_menu_set_item_style()

bool _wlmtk_menu_set_item_style ( bs_dllist_node_t *  dlnode_ptr,
void *  ud_ptr 
)
static

Callback for bs_dllist_all: Sets the style for each menu item.

Parameters
dlnode_ptr
ud_ptr
Returns
true on success.

◆ _wlmtk_menu_style_destroy()

void _wlmtk_menu_style_destroy ( bs_ref_t *  ref_ptr)
static

Destroys the menu style.

◆ _wlmtk_menu_this_or_next_non_disabled_dlnode()

bs_dllist_node_t * _wlmtk_menu_this_or_next_non_disabled_dlnode ( bs_dllist_node_t *  dlnode_ptr,
bs_dllist_node_iterator_t  iterator 
)
static

Returns the given-or-next non-disabled menu item, from dlnode_ptr.

Parameters
dlnode_ptr
iteratorIterator to reach the "next" item.
Returns
A pointer to wlmtk_menu_item_t::dlnode of dlnode_ptr (or the the next non-disabled item), or NULL.

◆ test_keyboard_navigation()

void test_keyboard_navigation ( bs_test_t *  test_ptr)
static

Tests keyboard navigation within the menu.

◆ test_keyboard_navigation_nested()

void test_keyboard_navigation_nested ( bs_test_t *  test_ptr)
static

Tests keyboard navigation with nested menus.

◆ test_pointer_highlight()

void test_pointer_highlight ( bs_test_t *  test_ptr)
static

Tests that pointer moves highlight the items.

◆ test_set_mode()

void test_set_mode ( bs_test_t *  test_ptr)
static

Tests setting the menu's mode.

◆ wlmtk_menu_add_item()

void wlmtk_menu_add_item ( wlmtk_menu_t menu_ptr,
wlmtk_menu_item_t menu_item_ptr 
)

Adds a menu item to the menu.

Parameters
menu_ptr
menu_item_ptr

◆ wlmtk_menu_base()

wlmtk_base_t * wlmtk_menu_base ( wlmtk_menu_t menu_ptr)
Returns
pointer to the menu's wlmtk_base_t superclass.

◆ wlmtk_menu_create()

wlmtk_menu_t * wlmtk_menu_create ( wlmtk_menu_style_ref_t style_ref_ptr)

Creates a menu.

Parameters
style_ref_ptr
Returns
Pointer to the menu state or NULL on error.

◆ wlmtk_menu_destroy()

void wlmtk_menu_destroy ( wlmtk_menu_t menu_ptr)

Destroys the menu.

Parameters
menu_ptr

◆ wlmtk_menu_element()

wlmtk_element_t * wlmtk_menu_element ( wlmtk_menu_t menu_ptr)
Returns
pointer to the menu's wlmtk_element_t superclass.

◆ wlmtk_menu_events()

wlmtk_menu_events_t * wlmtk_menu_events ( wlmtk_menu_t menu_ptr)
Returns
a pointer to wlmtk_menu_t::events.

◆ wlmtk_menu_get_mode()

enum wlmtk_menu_mode wlmtk_menu_get_mode ( wlmtk_menu_t menu_ptr)
Returns
mode of the menu.
See also
wlmtk_menu_set_mode.

◆ wlmtk_menu_get_parent_item()

wlmtk_menu_item_t * wlmtk_menu_get_parent_item ( wlmtk_menu_t menu_ptr)
Returns
the parent menu item, if this is a submenu. NULL otherwise.

◆ wlmtk_menu_is_open()

bool wlmtk_menu_is_open ( wlmtk_menu_t menu_ptr)
Returns
whether the menu is open, ie. visible.

◆ wlmtk_menu_item_at()

wlmtk_menu_item_t * wlmtk_menu_item_at ( wlmtk_menu_t menu_ptr,
size_t  i 
)
Parameters
menu_ptr
i
Returns
the i-th element of wlmtk_menu_t::items, or NULL if i is out of bounds.

◆ wlmtk_menu_items_size()

size_t wlmtk_menu_items_size ( wlmtk_menu_t menu_ptr)
Parameters
menu_ptr
Returns
the size of wlmtk_menu_t::items.

◆ wlmtk_menu_remove_item()

void wlmtk_menu_remove_item ( wlmtk_menu_t menu_ptr,
wlmtk_menu_item_t menu_item_ptr 
)

Removes a menu item from the menu.

Parameters
menu_ptr
menu_item_ptr

◆ wlmtk_menu_request_item_highlight()

void wlmtk_menu_request_item_highlight ( wlmtk_menu_t menu_ptr,
wlmtk_menu_item_t menu_item_ptr 
)

Requests that menu_item_ptr be highlighted.

Parameters
menu_ptr
menu_item_ptr

◆ wlmtk_menu_set_mode()

void wlmtk_menu_set_mode ( wlmtk_menu_t menu_ptr,
enum wlmtk_menu_mode  mode 
)

Sets the mode of the menu.

Parameters
menu_ptr
mode

◆ wlmtk_menu_set_open()

void wlmtk_menu_set_open ( wlmtk_menu_t menu_ptr,
bool  opened 
)

Opens the menu: Makes it visible or invisible, and resets state if needed.

Parameters
menu_ptr
opened

◆ wlmtk_menu_set_parent_item()

void wlmtk_menu_set_parent_item ( wlmtk_menu_t menu_ptr,
wlmtk_menu_item_t menu_item_ptr 
)

Registers menu_item_ptr as this submenu's parent item.

Must be called only from wlmtk_menu_item_set_submenu.

Parameters
menu_ptr
menu_item_ptr

◆ wlmtk_menu_set_style()

bool wlmtk_menu_set_style ( wlmtk_menu_t menu_ptr,
wlmtk_menu_style_ref_t style_ref_ptr 
)

Sets the menu's style.

Parameters
menu_ptr
style_ref_ptrReference to the new style.
Returns
true on success.

◆ wlmtk_menu_style_create()

struct wlmtk_menu_style * wlmtk_menu_style_create ( void  )

Creates a holder for the menu style, with initialized reference.

Returns
Pointer to wlmtk_menu_style. To destroy, call wlmtk_menu_style_ref_release on wlmtk_menu_style_to_ref.

◆ wlmtk_menu_style_decode()

bool wlmtk_menu_style_decode ( bspl_object_t *  object_ptr,
const union bspl_desc_value *  desc_value_ptr,
void *  value_ptr 
)

Decodes dict at object_ptr into wlmtk_menu_style at value_ptr

◆ wlmtk_menu_style_decode_fini()

void wlmtk_menu_style_decode_fini ( void *  dst_ptr)

Fini.

◆ wlmtk_menu_style_decode_init()

bool wlmtk_menu_style_decode_init ( void *  dst_ptr)

Initializer.

◆ wlmtk_menu_style_ref_release()

void wlmtk_menu_style_ref_release ( wlmtk_menu_style_ref_t ref_ptr)

Releases a reference.

◆ wlmtk_menu_style_ref_retain()

const struct wlmtk_menu_style * wlmtk_menu_style_ref_retain ( wlmtk_menu_style_ref_t ref_ptr)

Retains a reference.

Returns
a read-only style.

◆ wlmtk_menu_style_to_ref()

wlmtk_menu_style_ref_t * wlmtk_menu_style_to_ref ( struct wlmtk_menu_style menu_style_ptr)
Returns
the wlmtk_menu_style_ref_t for the style.

Variable Documentation

◆ _test_style_holder

struct wlmtk_menu_style_holder _test_style_holder
static
Initial value:
= {
.msr = { .reference = { .count = 1 } },
.style = {
.margin = { .width = 2 },
.border = { .width = 2 },
.item = { .height = 10, .bezel_width=1, .width = 100 }
}
}

For tests: Meu style to apply.

◆ _wlmtk_menu_box_element_vmt

const wlmtk_element_vmt_t _wlmtk_menu_box_element_vmt
static
Initial value:
= {
}
static void _wlmtk_menu_box_element_destroy(wlmtk_element_t *element_ptr)
Definition menu.c:464

Extra override for the box element. Does not have a dtor by default.

◆ _wlmtk_menu_element_vmt

const wlmtk_element_vmt_t _wlmtk_menu_element_vmt
static
Initial value:
= {
}
static void _wlmtk_menu_element_destroy(wlmtk_element_t *element_ptr)
Definition menu.c:473
static bool _wlmtk_menu_element_pointer_button(wlmtk_element_t *element_ptr, const wlmtk_button_event_t *button_event_ptr)
Definition menu.c:494
static bool _wlmtk_menu_element_keyboard_sym(wlmtk_element_t *element_ptr, xkb_keysym_t keysym, enum xkb_key_direction direction, uint32_t modifiers)
Definition menu.c:515

The superclass' element virtual method table.

◆ _wlmtk_menu_style_desc

const bspl_desc_t _wlmtk_menu_style_desc[]
static
Initial value:
= {
BSPL_DESC_DICT(
"Item", true, struct wlmtk_menu_style, item, item,
BSPL_DESC_DICT(
"Margin", true, struct wlmtk_menu_style, margin, margin,
BSPL_DESC_DICT(
"Border", true, struct wlmtk_menu_style, border, border,
}
const bspl_desc_t wlmtk_menu_item_style_desc[]
Definition menu_item.c:137
Definition menu.h:49
const bspl_desc_t wlmtk_style_margin_desc[]
Definition style.c:29

Descriptor for decoding the "Menu" dictionary.

◆ _wlmtk_menu_test_cases

const bs_test_case_t _wlmtk_menu_test_cases[]
static
Initial value:
= {
{ 1, "pointer_highlight", test_pointer_highlight },
{ 1, "set_mode", test_set_mode },
{ 1, "keyboard_navigation", test_keyboard_navigation },
{ 1, "keyboard_navigation_nested", test_keyboard_navigation_nested },
}
static void test_keyboard_navigation_nested(bs_test_t *test_ptr)
Definition menu.c:914
static void test_keyboard_navigation(bs_test_t *test_ptr)
Definition menu.c:807
static void test_pointer_highlight(bs_test_t *test_ptr)
Definition menu.c:685
static void test_set_mode(bs_test_t *test_ptr)
Definition menu.c:749

Test cases

◆ wlmtk_menu_test_set

const bs_test_set_t wlmtk_menu_test_set
Initial value:
= BS_TEST_SET(
true, "menu", _wlmtk_menu_test_cases)
static const bs_test_case_t _wlmtk_menu_test_cases[]
Definition menu.c:662

Unit test cases.