wlmaker
Loading...
Searching...
No Matches
Classes | Macros | Functions | Variables
container.c File Reference
#include "container.h"
#include <linux/input-event-codes.h>
#include <math.h>
#include <stdint.h>
#include <stdlib.h>
#include <toolkit/util.h>
#include <wayland-util.h>
#include <wlr/types/wlr_keyboard.h>
#include <wlr/types/wlr_scene.h>
#include <xkbcommon/xkbcommon.h>
#include "input.h"
Include dependency graph for container.c:

Classes

struct  fake_parent_container_t
 

Functions

static void _wlmtk_container_element_dlnode_destroy (bs_dllist_node_t *dlnode_ptr, void *ud_ptr)
 
static struct wlr_scene_node * _wlmtk_container_element_create_scene_node (wlmtk_element_t *element_ptr, struct wlr_scene_tree *wlr_scene_tree_ptr)
 
static void _wlmtk_container_element_get_dimensions (wlmtk_element_t *element_ptr, int *left_ptr, int *top_ptr, int *right_ptr, int *bottom_ptr)
 
static bool _wlmtk_container_element_pointer_accepts_motion (wlmtk_element_t *element_ptr, wlmtk_pointer_motion_event_t *motion_event_ptr)
 
static bool _wlmtk_container_element_pointer_button (wlmtk_element_t *element_ptr, const wlmtk_button_event_t *button_event_ptr)
 
static bool _wlmtk_container_element_pointer_axis (wlmtk_element_t *element_ptr, struct wlr_pointer_axis_event *wlr_pointer_axis_event_ptr)
 
static void _wlmtk_container_element_pointer_grab_cancel (wlmtk_element_t *element_ptr)
 
static void _wlmtk_container_element_keyboard_blur (wlmtk_element_t *element_ptr)
 
static bool _wlmtk_container_element_keyboard_event (wlmtk_element_t *element_ptr, struct wlr_keyboard_key_event *wlr_keyboard_key_event_ptr)
 
static bool _wlmtk_container_element_keyboard_sym (wlmtk_element_t *element_ptr, xkb_keysym_t keysym, enum xkb_key_direction direction, uint32_t modifiers)
 
static void _wlmtk_container_handle_wlr_scene_tree_node_destroy (struct wl_listener *listener_ptr, void *data_ptr)
 
static void _wlmtk_container_handle_element_pointer_leave (struct wl_listener *listener_ptr, void *data_ptr)
 
static bool _wlmtk_container_update_layout (wlmtk_container_t *container_ptr)
 
bool wlmtk_container_init (wlmtk_container_t *container_ptr)
 
bool wlmtk_container_init_attached (wlmtk_container_t *container_ptr, struct wlr_scene_tree *root_wlr_scene_tree_ptr)
 
wlmtk_container_vmt_t wlmtk_container_extend (wlmtk_container_t *container_ptr, const wlmtk_container_vmt_t *container_vmt_ptr)
 
void wlmtk_container_fini (wlmtk_container_t *container_ptr)
 
void wlmtk_container_add_element (wlmtk_container_t *container_ptr, wlmtk_element_t *element_ptr)
 
void wlmtk_container_add_element_atop (wlmtk_container_t *container_ptr, wlmtk_element_t *reference_element_ptr, wlmtk_element_t *element_ptr)
 
void wlmtk_container_remove_element (wlmtk_container_t *container_ptr, wlmtk_element_t *element_ptr)
 
void wlmtk_container_raise_element_to_top (wlmtk_container_t *container_ptr, wlmtk_element_t *element_ptr)
 
bool wlmtk_container_request_pointer_focus (wlmtk_container_t *container_ptr, wlmtk_element_t *element_ptr, wlmtk_pointer_motion_event_t *motion_event_ptr)
 
void wlmtk_container_pointer_grab (wlmtk_container_t *container_ptr, wlmtk_element_t *element_ptr)
 
void wlmtk_container_pointer_grab_release (wlmtk_container_t *container_ptr, wlmtk_element_t *element_ptr)
 
void wlmtk_container_set_keyboard_focus_element (wlmtk_container_t *container_ptr, wlmtk_element_t *element_ptr, bool enabled)
 
void wlmtk_container_update_layout_and_pointer_focus (wlmtk_container_t *container_ptr)
 
struct wlr_scene_tree * wlmtk_container_wlr_scene_tree (wlmtk_container_t *container_ptr)
 
wlmtk_container_twlmtk_container_create_fake_parent (void)
 
void wlmtk_container_destroy_fake_parent (wlmtk_container_t *container_ptr)
 
static void test_init_fini (bs_test_t *test_ptr)
 
static void test_add_remove (bs_test_t *test_ptr)
 
static void test_add_remove_with_scene_graph (bs_test_t *test_ptr)
 
static void test_add_with_raise (bs_test_t *test_ptr)
 
static void test_pointer_button (bs_test_t *test_ptr)
 
static void test_pointer_grab (bs_test_t *test_ptr)
 
static void test_pointer_grab_events (bs_test_t *test_ptr)
 
static void test_keyboard_event (bs_test_t *test_ptr)
 
static void test_keyboard_focus (bs_test_t *test_ptr)
 
static void test_pointer_axis (bs_test_t *test_ptr)
 
static void test_pointer_focus_with_parent (bs_test_t *test_ptr)
 
static void test_pointer_focus_children (bs_test_t *test_ptr)
 
static void test_pointer_focus_order (bs_test_t *test_ptr)
 

Variables

static const wlmtk_element_vmt_t container_element_vmt
 
static const wlmtk_container_vmt_t container_vmt
 
const bs_test_case_t wlmtk_container_test_cases []
 

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_container_element_create_scene_node()

struct wlr_scene_node * _wlmtk_container_element_create_scene_node ( wlmtk_element_t element_ptr,
struct wlr_scene_tree *  wlr_scene_tree_ptr 
)
static

Implementation of the superclass wlmtk_element_t::create_scene_node method.

Creates the wlroots scene graph tree for the container, and will attach all already-contained elements to the scene graph, as well.

Parameters
element_ptr
wlr_scene_tree_ptr
Returns
Pointer to the scene graph API node.

◆ _wlmtk_container_element_dlnode_destroy()

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

Calls dtor for wlmtk_element_t at dlnode_ptr in ud_ptr.

◆ _wlmtk_container_element_get_dimensions()

void _wlmtk_container_element_get_dimensions ( wlmtk_element_t element_ptr,
int *  left_ptr,
int *  top_ptr,
int *  right_ptr,
int *  bottom_ptr 
)
static

Implementation of the element's get_dimensions method: Return dimensions.

Parameters
element_ptr
left_ptrLeftmost position. May be NULL.
top_ptrTopmost position. May be NULL.
right_ptrRightmost position. Ma be NULL.
bottom_ptrBottommost position. May be NULL.

◆ _wlmtk_container_element_keyboard_blur()

void _wlmtk_container_element_keyboard_blur ( wlmtk_element_t element_ptr)
static

Implements wlmtk_element_vmt_t::keyboard_blur. Blurs all children.

◆ _wlmtk_container_element_keyboard_event()

bool _wlmtk_container_element_keyboard_event ( wlmtk_element_t element_ptr,
struct wlr_keyboard_key_event *  wlr_keyboard_key_event_ptr 
)
static

Handler for keyboard events: Pass to keyboard-focussed element, if any.

◆ _wlmtk_container_element_keyboard_sym()

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

Handler for translated keyboard events: To keyboard-focussed, if any.

◆ _wlmtk_container_element_pointer_accepts_motion()

bool _wlmtk_container_element_pointer_accepts_motion ( wlmtk_element_t element_ptr,
wlmtk_pointer_motion_event_t motion_event_ptr 
)
static

Implements wlmtk_element_vmt_t::pointer_accepts_motion.

Parameters
element_ptr
motion_event_ptr
Returns
Whether this container has an element that accepts the emotion.

◆ _wlmtk_container_element_pointer_axis()

bool _wlmtk_container_element_pointer_axis ( wlmtk_element_t element_ptr,
struct wlr_pointer_axis_event *  wlr_pointer_axis_event_ptr 
)
static

Implementation of the element's axis method: Handles axis events, by forwarding it to the element having pointer focus.

Parameters
element_ptr
wlr_pointer_axis_event_ptr
Returns
true if the axis event was handled.

◆ _wlmtk_container_element_pointer_button()

bool _wlmtk_container_element_pointer_button ( wlmtk_element_t element_ptr,
const wlmtk_button_event_t button_event_ptr 
)
static

Implementation of the element's pointer_button() method. Forwards it to the element currently having pointer focus.

Parameters
element_ptr
button_event_ptr
Returns
true if the button was handled.

◆ _wlmtk_container_element_pointer_grab_cancel()

void _wlmtk_container_element_pointer_grab_cancel ( wlmtk_element_t element_ptr)
static

Implements wlmtk_element_vmt_t::pointer_grab_cancel.

Cancels an existing pointer grab.

Parameters
element_ptr

◆ _wlmtk_container_handle_element_pointer_leave()

void _wlmtk_container_handle_element_pointer_leave ( struct wl_listener *  listener_ptr,
void *  data_ptr 
)
static

Handles 'pointer_leave' events: Blurs element currently having focus.

◆ _wlmtk_container_handle_wlr_scene_tree_node_destroy()

void _wlmtk_container_handle_wlr_scene_tree_node_destroy ( struct wl_listener *  listener_ptr,
void *  data_ptr 
)
static

Handles the 'destroy' callback of wlr_scene_tree_ptr->node.

Will also detach (but not destroy) each of the still-contained elements.

Parameters
listener_ptr
data_ptr

◆ _wlmtk_container_update_layout()

bool _wlmtk_container_update_layout ( wlmtk_container_t container_ptr)
static

Base implementation of wlmtk_container_vmt_t::update_layout.

Parameters
container_ptr
Returns
false, since a nondescript container doesn't rearrange elements.

◆ test_add_remove()

void test_add_remove ( bs_test_t *  test_ptr)
static

Exercises adding and removing elements, verifies destruction on fini.

◆ test_add_remove_with_scene_graph()

void test_add_remove_with_scene_graph ( bs_test_t *  test_ptr)
static

Tests that elements are attached, resp. detached from scene graph.

◆ test_add_with_raise()

void test_add_with_raise ( bs_test_t *  test_ptr)
static

Tests that elements inserted at position are also placed in scene graph.

◆ test_init_fini()

void test_init_fini ( bs_test_t *  test_ptr)
static

Exercises init() and fini() methods, verifies dtor forwarding.

◆ test_keyboard_event()

void test_keyboard_event ( bs_test_t *  test_ptr)
static

Tests that keyboard event are forwarded to element with keyboard focus.

◆ test_keyboard_focus()

void test_keyboard_focus ( bs_test_t *  test_ptr)
static

Test that keyboard focus is propagated and respects element removal.

◆ test_pointer_axis()

void test_pointer_axis ( bs_test_t *  test_ptr)
static

Tests that axis events are forwarded to element with pointer focus.

◆ test_pointer_button()

void test_pointer_button ( bs_test_t *  test_ptr)
static

Tests that pointer DOWN is forwarded to element with pointer focus.

◆ test_pointer_focus_children()

void test_pointer_focus_children ( bs_test_t *  test_ptr)
static

Tests moving pointer focus between children elements.

◆ test_pointer_focus_order()

void test_pointer_focus_order ( bs_test_t *  test_ptr)
static

Tests pointer focus when moving elements order (and position).

◆ test_pointer_focus_with_parent()

static void test_pointer_focus_with_parent ( bs_test_t *  test_ptr)
static

Tests pointer focus.

◆ test_pointer_grab()

void test_pointer_grab ( bs_test_t *  test_ptr)
static

◆ test_pointer_grab_events()

void test_pointer_grab_events ( bs_test_t *  test_ptr)
static

Tests that element with the pointer grab receives pointer events.

◆ wlmtk_container_add_element()

void wlmtk_container_add_element ( wlmtk_container_t container_ptr,
wlmtk_element_t element_ptr 
)

Adds element_ptr to the container.

Requires that element_ptr is not added to a container yet. The element will be added at the top of the container.

Parameters
container_ptr
element_ptr

◆ wlmtk_container_add_element_atop()

void wlmtk_container_add_element_atop ( wlmtk_container_t container_ptr,
wlmtk_element_t reference_element_ptr,
wlmtk_element_t element_ptr 
)

Adds element_ptr to the container atop the reference's position.

If reference_element_ptr is NULL, the element will be added at the back.

Parameters
container_ptr
reference_element_ptrMust be an element of this container.
element_ptr

◆ wlmtk_container_create_fake_parent()

wlmtk_container_t * wlmtk_container_create_fake_parent ( void  )

Constructor for a fake container with a scene tree.

◆ wlmtk_container_destroy_fake_parent()

void wlmtk_container_destroy_fake_parent ( wlmtk_container_t container_ptr)

Destructor for that fake container.

◆ wlmtk_container_extend()

wlmtk_container_vmt_t wlmtk_container_extend ( wlmtk_container_t container_ptr,
const wlmtk_container_vmt_t container_vmt_ptr 
)

Extends the container's virtual methods.

Parameters
container_ptr
container_vmt_ptr
Returns
The previous virtual method table.

◆ wlmtk_container_fini()

void wlmtk_container_fini ( wlmtk_container_t container_ptr)

Un-initializes the container.

Any element still in elements will be destroyed.

Parameters
container_ptr

◆ wlmtk_container_init()

bool wlmtk_container_init ( wlmtk_container_t container_ptr)

Initializes the container with the provided virtual method table.

Parameters
container_ptr
Returns
true on success.

◆ wlmtk_container_init_attached()

bool wlmtk_container_init_attached ( wlmtk_container_t container_ptr,
struct wlr_scene_tree *  root_wlr_scene_tree_ptr 
)

Initializes the container, and attach to WLR sene graph.

Parameters
container_ptr
root_wlr_scene_tree_ptr
Returns
true on success.

◆ wlmtk_container_pointer_grab()

void wlmtk_container_pointer_grab ( wlmtk_container_t container_ptr,
wlmtk_element_t element_ptr 
)

Requests a pointer grab from container_ptr for element_ptr.

Will cancel any existing grab held by elements other than element_ptr, and propagates the grab to the parent container. When a pointer grab is held, pointer events will be routed exclusively to the element holding the pointer grab.

Parameters
container_ptr
element_ptrMust be a child of this container.

◆ wlmtk_container_pointer_grab_release()

void wlmtk_container_pointer_grab_release ( wlmtk_container_t container_ptr,
wlmtk_element_t element_ptr 
)

Releases a pointer grab in container_ptr held by element_ptr.

If the grab is held by an element other than element_ptr, nothing is done. Otherwise, the pointer grab is released, and the release is propagated to the parent container.

Parameters
container_ptr
element_ptrMust be a child of this container.

◆ wlmtk_container_raise_element_to_top()

void wlmtk_container_raise_element_to_top ( wlmtk_container_t container_ptr,
wlmtk_element_t element_ptr 
)

Places element_ptr at the top (head) of the container.

Expects that container_ptr is element_ptr's parent container.

Parameters
container_ptr
element_ptr

◆ wlmtk_container_remove_element()

void wlmtk_container_remove_element ( wlmtk_container_t container_ptr,
wlmtk_element_t element_ptr 
)

Removes element_ptr from the container.

Expects that container_ptr is element_ptr's parent container. In case element_ptr holds a pointer grab, wlmtk_element_pointer_grab_cancel will be called.

Parameters
container_ptr
element_ptr

◆ wlmtk_container_request_pointer_focus()

bool wlmtk_container_request_pointer_focus ( wlmtk_container_t container_ptr,
wlmtk_element_t element_ptr,
wlmtk_pointer_motion_event_t motion_event_ptr 
)

Requests that element_ptr be given pointer focus from container_ptr.

Parameters
container_ptr
element_ptrMust be in wlmtk_container_t::elements.
motion_event_ptrThe motion event (in particular: pointer) that led to request pointer focus. FIXME -> Must change to pointer!
Returns
false if the request fails.

◆ wlmtk_container_set_keyboard_focus_element()

void wlmtk_container_set_keyboard_focus_element ( wlmtk_container_t container_ptr,
wlmtk_element_t element_ptr,
bool  enabled 
)

Sets or disables keyboard focus for element_ptr for the container.

If enabled, calls wlmtk_element_keyboard_blur for the element currently having keyboard focus, and updates wlmtk_container_t::keyboard_focus_element_ptr to element_ptr. Otherwise, evaluates whether the focus is currently held by element_ptr, and (if yes) clears this container's focus. Propagates the event to the container's parent.

Parameters
container_ptr
element_ptr
enabled

◆ wlmtk_container_update_layout_and_pointer_focus()

void wlmtk_container_update_layout_and_pointer_focus ( wlmtk_container_t container_ptr)

Updates the layout of the container, and recomputes pointer focus as needed.

Must be called if an element is added or removed, or if any of the child elements changes visibility or dimensions. Propagates to the parent container(s).

If needed: Trigger a poitner focus computation.

Parameters
container_ptr

◆ wlmtk_container_wlr_scene_tree()

struct wlr_scene_tree * wlmtk_container_wlr_scene_tree ( wlmtk_container_t container_ptr)

Returns the wlroots scene graph tree for this node.

Private: Should be called only by wlmtk_element_t.

Parameters
container_ptr
Returns
The scene tree, or NULL if not attached to a scene graph.

Variable Documentation

◆ container_element_vmt

const wlmtk_element_vmt_t container_element_vmt
static
Initial value:
= {
}
static bool _wlmtk_container_element_keyboard_sym(wlmtk_element_t *element_ptr, xkb_keysym_t keysym, enum xkb_key_direction direction, uint32_t modifiers)
Definition container.c:765
static struct wlr_scene_node * _wlmtk_container_element_create_scene_node(wlmtk_element_t *element_ptr, struct wlr_scene_tree *wlr_scene_tree_ptr)
Definition container.c:468
static bool _wlmtk_container_element_keyboard_event(wlmtk_element_t *element_ptr, struct wlr_keyboard_key_event *wlr_keyboard_key_event_ptr)
Definition container.c:749
static void _wlmtk_container_element_keyboard_blur(wlmtk_element_t *element_ptr)
Definition container.c:736
static bool _wlmtk_container_element_pointer_axis(wlmtk_element_t *element_ptr, struct wlr_pointer_axis_event *wlr_pointer_axis_event_ptr)
Definition container.c:691
static void _wlmtk_container_element_pointer_grab_cancel(wlmtk_element_t *element_ptr)
Definition container.c:721
static bool _wlmtk_container_element_pointer_button(wlmtk_element_t *element_ptr, const wlmtk_button_event_t *button_event_ptr)
Definition container.c:609
static bool _wlmtk_container_element_pointer_accepts_motion(wlmtk_element_t *element_ptr, wlmtk_pointer_motion_event_t *motion_event_ptr)
Definition container.c:553
static void _wlmtk_container_element_get_dimensions(wlmtk_element_t *element_ptr, int *left_ptr, int *top_ptr, int *right_ptr, int *bottom_ptr)
Definition container.c:507

Virtual method table for the container's super class: Element.

◆ container_vmt

const wlmtk_container_vmt_t container_vmt
static
Initial value:
= {
}
static bool _wlmtk_container_update_layout(wlmtk_container_t *container_ptr)
Definition container.c:835

Default virtual method table. Initializes non-abstract methods.

◆ wlmtk_container_test_cases

const bs_test_case_t wlmtk_container_test_cases[]
Initial value:
= {
{ 1, "init_fini", test_init_fini },
{ 1, "add_remove", test_add_remove },
{ 1, "add_remove_with_scene_graph", test_add_remove_with_scene_graph },
{ 1, "add_with_raise", test_add_with_raise },
{ 1, "pointer_button", test_pointer_button },
{ 1, "pointer_grab", test_pointer_grab },
{ 1, "pointer_grab_events", test_pointer_grab_events },
{ 1, "keyboard_event", test_keyboard_event },
{ 1, "keyboard_focus", test_keyboard_focus },
{ 1, "pointer_axis", test_pointer_axis },
{ 1, "pointer_focus_with_parent", test_pointer_focus_with_parent },
{ 1, "pointer_focus_children", test_pointer_focus_children },
{ 1, "test_pointer_focus_order", test_pointer_focus_order },
{ 0, NULL, NULL }
}
static void test_add_with_raise(bs_test_t *test_ptr)
Definition container.c:1106
static void test_pointer_grab_events(bs_test_t *test_ptr)
Definition container.c:1338
static void test_keyboard_focus(bs_test_t *test_ptr)
Definition container.c:1520
static void test_pointer_focus_children(bs_test_t *test_ptr)
Definition container.c:1801
static void test_keyboard_event(bs_test_t *test_ptr)
Definition container.c:1437
static void test_pointer_button(bs_test_t *test_ptr)
Definition container.c:1180
static void test_add_remove_with_scene_graph(bs_test_t *test_ptr)
Definition container.c:997
static void test_add_remove(bs_test_t *test_ptr)
Definition container.c:945
static void test_pointer_focus_with_parent(bs_test_t *test_ptr)
Definition container.c:1632
static void test_pointer_focus_order(bs_test_t *test_ptr)
Definition container.c:1886
static void test_init_fini(bs_test_t *test_ptr)
Definition container.c:929
static void test_pointer_axis(bs_test_t *test_ptr)
Definition container.c:1577
static void test_pointer_grab(bs_test_t *test_ptr)
Definition container.c:1289

Unit tests for the container.