wlmaker
Loading...
Searching...
No Matches
Macros | Functions | Variables
element.c File Reference
#include "element.h"
#include "container.h"
#include "util.h"
#include <wlr/types/wlr_keyboard.h>
#include <wlr/types/wlr_scene.h>
Include dependency graph for element.c:

Functions

static void _wlmtk_element_get_pointer_area (wlmtk_element_t *element_ptr, int *x1_ptr, int *y1_ptr, int *x2_ptr, int *y2_ptr)
 
static bool _wlmtk_element_pointer_motion (wlmtk_element_t *element_ptr, double x, double y, uint32_t time_msec)
 
static bool _wlmtk_element_pointer_button (wlmtk_element_t *element_ptr, const wlmtk_button_event_t *button_event_ptr)
 
static bool _wlmtk_element_pointer_axis (wlmtk_element_t *element_ptr, struct wlr_pointer_axis_event *wlr_pointer_axis_event_ptr)
 
static void _wlmtk_element_pointer_enter (wlmtk_element_t *element_ptr)
 
static void _wlmtk_element_pointer_leave (wlmtk_element_t *element_ptr)
 
static void _wlmtk_element_keyboard_blur (wlmtk_element_t *element_ptr)
 
static bool _wlmtk_element_keyboard_event (wlmtk_element_t *element_ptr, struct wlr_keyboard_key_event *wlr_keyboard_key_event_ptr, const xkb_keysym_t *key_syms, size_t key_syms_count, uint32_t modifiers)
 
static void handle_wlr_scene_node_destroy (struct wl_listener *listener_ptr, void *data_ptr)
 
bool wlmtk_element_init (wlmtk_element_t *element_ptr, wlmtk_env_t *env_ptr)
 
wlmtk_element_vmt_t wlmtk_element_extend (wlmtk_element_t *element_ptr, const wlmtk_element_vmt_t *element_vmt_ptr)
 
void wlmtk_element_fini (wlmtk_element_t *element_ptr)
 
bs_dllist_node_t * wlmtk_dlnode_from_element (wlmtk_element_t *element_ptr)
 
wlmtk_element_twlmtk_element_from_dlnode (bs_dllist_node_t *dlnode_ptr)
 
void wlmtk_element_set_parent_container (wlmtk_element_t *element_ptr, wlmtk_container_t *parent_container_ptr)
 
void wlmtk_element_attach_to_scene_graph (wlmtk_element_t *element_ptr)
 
void wlmtk_element_set_visible (wlmtk_element_t *element_ptr, bool visible)
 
void wlmtk_element_get_position (wlmtk_element_t *element_ptr, int *x_ptr, int *y_ptr)
 
void wlmtk_element_set_position (wlmtk_element_t *element_ptr, int x, int y)
 
bool wlmtk_element_pointer_motion (wlmtk_element_t *element_ptr, double x, double y, uint32_t time_msec)
 
static void fake_destroy (wlmtk_element_t *element_ptr)
 
static struct wlr_scene_node * fake_create_scene_node (wlmtk_element_t *element_ptr, struct wlr_scene_tree *wlr_scene_tree_ptr)
 
static void fake_get_dimensions (wlmtk_element_t *element_ptr, int *left_ptr, int *top_ptr, int *right_ptr, int *bottom_ptr)
 
static void fake_get_pointer_area (wlmtk_element_t *element_ptr, int *left_ptr, int *top_ptr, int *right_ptr, int *bottom_ptr)
 
static bool fake_pointer_motion (wlmtk_element_t *element_ptr, double x, double y, uint32_t time_msec)
 
static bool fake_pointer_button (wlmtk_element_t *element_ptr, const wlmtk_button_event_t *button_event_ptr)
 
static bool fake_pointer_axis (wlmtk_element_t *element_ptr, struct wlr_pointer_axis_event *wlr_pointer_axis_event_ptr)
 
static void fake_pointer_enter (wlmtk_element_t *element_ptr)
 
static void fake_pointer_leave (wlmtk_element_t *element_ptr)
 
static void fake_keyboard_blur (wlmtk_element_t *element_ptr)
 
static bool fake_keyboard_event (wlmtk_element_t *element_ptr, struct wlr_keyboard_key_event *wlr_keyboard_key_event_ptr, const xkb_keysym_t *key_syms, size_t key_syms_count, uint32_t modifiers)
 
wlmtk_fake_element_twlmtk_fake_element_create (void)
 
void wlmtk_fake_element_grab_keyboard (wlmtk_fake_element_t *fake_element_ptr)
 
static void test_init_fini (bs_test_t *test_ptr)
 
static void test_set_parent_container (bs_test_t *test_ptr)
 
static void test_set_get_position (bs_test_t *test_ptr)
 
static void test_get_dimensions (bs_test_t *test_ptr)
 
static void test_get_pointer_area (bs_test_t *test_ptr)
 
static void test_pointer_motion_leave (bs_test_t *test_ptr)
 
static void test_pointer_button (bs_test_t *test_ptr)
 
static void test_pointer_axis (bs_test_t *test_ptr)
 
static void test_keyboard_focus (bs_test_t *test_ptr)
 
static void test_keyboard_event (bs_test_t *test_ptr)
 

Variables

static const wlmtk_element_vmt_t element_vmt
 
static const wlmtk_element_vmt_t fake_element_vmt
 
const bs_test_case_t wlmtk_element_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_element_get_pointer_area()

void _wlmtk_element_get_pointer_area ( wlmtk_element_t * element_ptr,
int * x1_ptr,
int * y1_ptr,
int * x2_ptr,
int * y2_ptr )
static

Wraps to wlmtk_element_vmt_t::get_dimensions as default implementation.

◆ _wlmtk_element_keyboard_blur()

void _wlmtk_element_keyboard_blur ( wlmtk_element_t * element_ptr)
static

Handler for losing keyboard focus. Nothing for default impl.

◆ _wlmtk_element_keyboard_event()

bool _wlmtk_element_keyboard_event ( wlmtk_element_t * element_ptr,
struct wlr_keyboard_key_event * wlr_keyboard_key_event_ptr,
const xkb_keysym_t * key_syms,
size_t key_syms_count,
uint32_t modifiers )
static

Handler for keyboard events. By default: Nothing is handled.

◆ _wlmtk_element_pointer_axis()

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

Does nothing, returns false.

◆ _wlmtk_element_pointer_button()

bool _wlmtk_element_pointer_button ( wlmtk_element_t * element_ptr,
const wlmtk_button_event_t * button_event_ptr )
static

Does nothing, returns false.

◆ _wlmtk_element_pointer_enter()

void _wlmtk_element_pointer_enter ( wlmtk_element_t * element_ptr)
static

Handler for when the pointer enters the area. Sets default cursor.

◆ _wlmtk_element_pointer_leave()

void _wlmtk_element_pointer_leave ( wlmtk_element_t * element_ptr)
static

Handler for when the pointer leaves the area. Nothing for default impl.

◆ _wlmtk_element_pointer_motion()

bool _wlmtk_element_pointer_motion ( wlmtk_element_t * element_ptr,
double x,
double y,
uint32_t time_msec )
static

Stores pointer coordinates and timestamp. Returns true is x,y not NAN.

◆ fake_create_scene_node()

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

A "fake" 'create_scene_node': Creates a non-attached buffer node.

◆ fake_destroy()

void fake_destroy ( wlmtk_element_t * element_ptr)
static

dtor for the "fake" element used for tests.

◆ fake_get_dimensions()

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

A "fake" 'get_dimensions'.

◆ fake_get_pointer_area()

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

A "fake" 'get_pointer_area'.

◆ fake_keyboard_blur()

void fake_keyboard_blur ( wlmtk_element_t * element_ptr)
static

Registers losing keyboard focus.

◆ fake_keyboard_event()

bool fake_keyboard_event ( wlmtk_element_t * element_ptr,
struct wlr_keyboard_key_event * wlr_keyboard_key_event_ptr,
const xkb_keysym_t * key_syms,
size_t key_syms_count,
uint32_t modifiers )
static

Handles 'keyboard_event' events for the fake element.

◆ fake_pointer_axis()

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

Handles 'axis' events for the fake element.

◆ fake_pointer_button()

bool fake_pointer_button ( wlmtk_element_t * element_ptr,
const wlmtk_button_event_t * button_event_ptr )
static

Handles 'button' events for the fake element.

◆ fake_pointer_enter()

void fake_pointer_enter ( wlmtk_element_t * element_ptr)
static

Handles 'enter' events for the fake element.

◆ fake_pointer_leave()

void fake_pointer_leave ( wlmtk_element_t * element_ptr)
static

Handles 'leave' events for the fake element.

◆ fake_pointer_motion()

bool fake_pointer_motion ( wlmtk_element_t * element_ptr,
double x,
double y,
uint32_t time_msec )
static

Handles 'motion' events for the fake element, updates last position.

◆ handle_wlr_scene_node_destroy()

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

Handles the 'destroy' callback of the wlr_scene_node.

A call here indicates that teardown was not executed properly!

Parameters
listener_ptr
data_ptr

◆ test_get_dimensions()

void test_get_dimensions ( bs_test_t * test_ptr)
static

Tests get_dimensions.

◆ test_get_pointer_area()

void test_get_pointer_area ( bs_test_t * test_ptr)
static

Tests get_dimensions.

◆ 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

Exercises "keyboard_event" method.

◆ test_keyboard_focus()

void test_keyboard_focus ( bs_test_t * test_ptr)
static

Exercises keyboard grab & blur methods.

◆ test_pointer_axis()

void test_pointer_axis ( bs_test_t * test_ptr)
static

Exercises "pointer_axis" method.

◆ test_pointer_button()

void test_pointer_button ( bs_test_t * test_ptr)
static

Exercises "pointer_button" method.

◆ test_pointer_motion_leave()

void test_pointer_motion_leave ( bs_test_t * test_ptr)
static

Exercises "pointer_motion" and "pointer_leave" methods.

◆ test_set_get_position()

void test_set_get_position ( bs_test_t * test_ptr)
static

Tests get_position and set_position, and that scene graph follows.

◆ test_set_parent_container()

void test_set_parent_container ( bs_test_t * test_ptr)
static

Tests set_parent_container, and that scene graph follows.

◆ wlmtk_dlnode_from_element()

bs_dllist_node_t * wlmtk_dlnode_from_element ( wlmtk_element_t * element_ptr)

Gets the dlnode from the element.

◆ wlmtk_element_attach_to_scene_graph()

void wlmtk_element_attach_to_scene_graph ( wlmtk_element_t * element_ptr)

Attaches or detaches the element to the parent's wlroots scene tree.

If the element has a parent, and that parent is itself attached to the wlroots scene tree, this will either re-parent an already existing node, or invoke wlmtk_element_vmt_t::create_scene_node to create and attach a new node to the paren'ts tree. Otherwise, it will clear any existing node.

The function is idempotent.

Private: Should only called by wlmtk_container_t methods, when there are changes to wlmtk_container_t::wlr_scene_tree.

Parameters
element_ptr

◆ wlmtk_element_extend()

wlmtk_element_vmt_t wlmtk_element_extend ( wlmtk_element_t * element_ptr,
const wlmtk_element_vmt_t * element_vmt_ptr )

Extends the element's virtual methods.

Parameters
element_ptr
element_vmt_ptr
Returns
The previous virtual method table.

◆ wlmtk_element_fini()

void wlmtk_element_fini ( wlmtk_element_t * element_ptr)

Cleans up the element.

Parameters
element_ptr

◆ wlmtk_element_from_dlnode()

wlmtk_element_t * wlmtk_element_from_dlnode ( bs_dllist_node_t * dlnode_ptr)

Gets the element from the dlnode.

◆ wlmtk_element_get_position()

void wlmtk_element_get_position ( wlmtk_element_t * element_ptr,
int * x_ptr,
int * y_ptr )

Returns the position of the element.

Parameters
element_ptr
x_ptrOptional, may be NULL.
y_ptrOptional, may be NULL.

◆ wlmtk_element_init()

bool wlmtk_element_init ( wlmtk_element_t * element_ptr,
wlmtk_env_t * env_ptr )

Initializes the element.

Parameters
element_ptr
env_ptr
Returns
true on success.

◆ wlmtk_element_pointer_motion()

bool wlmtk_element_pointer_motion ( wlmtk_element_t * element_ptr,
double x,
double y,
uint32_t time_msec )

Passes a pointer motion event on to the element.

Will forward to wlmtk_element_vmt_t::pointer_motion, and (depending on that return value) trigger wlmtk_element_vmt_t::pointer_enter of wlmtk_element_vmt_t::pointer_leave calls.

Parameters
element_ptr
x
y
time_msec

◆ wlmtk_element_set_parent_container()

void wlmtk_element_set_parent_container ( wlmtk_element_t * element_ptr,
wlmtk_container_t * parent_container_ptr )

Sets the parent container for the element.

Will call wlmtk_element_attach_to_scene_graph to align the scene graph with the new (or deleted) parent.

Private: Should only be called by wlmtk_container_add_element, respectively wlmtk_container_remove_element ("friends").

Parameters
element_ptr
parent_container_ptrPointer to the parent container, or NULL if the parent should be cleared.

◆ wlmtk_element_set_position()

void wlmtk_element_set_position ( wlmtk_element_t * element_ptr,
int x,
int y )

Sets the position of the element.

Parameters
element_ptr
x
y

◆ wlmtk_element_set_visible()

void wlmtk_element_set_visible ( wlmtk_element_t * element_ptr,
bool visible )

Sets the element's visibility.

Parameters
element_ptr
visible

◆ wlmtk_fake_element_create()

wlmtk_fake_element_t * wlmtk_fake_element_create ( void )

Ctor for the fake element, useful for tests.

Returns
A pointer to wlmtk_fake_element_t. Should be destroyed via wlmtk_element_destroy, by passing the pointer to wlmtk_fake_element_t::element as argument.

◆ wlmtk_fake_element_grab_keyboard()

void wlmtk_fake_element_grab_keyboard ( wlmtk_fake_element_t * fake_element_ptr)

Sets wlmtk_fake_element_t::has_keyboard_focus and calls wlmtk_container_set_keyboard_focus_element for the parent (if set).

Parameters
fake_element_ptr

Variable Documentation

◆ element_vmt

const wlmtk_element_vmt_t element_vmt
static
Initial value:
= {
.get_pointer_area = _wlmtk_element_get_pointer_area,
.pointer_motion = _wlmtk_element_pointer_motion,
.pointer_button = _wlmtk_element_pointer_button,
.pointer_axis = _wlmtk_element_pointer_axis,
.pointer_enter = _wlmtk_element_pointer_enter,
.pointer_leave = _wlmtk_element_pointer_leave,
.keyboard_blur = _wlmtk_element_keyboard_blur,
.keyboard_event = _wlmtk_element_keyboard_event,
}
static void _wlmtk_element_get_pointer_area(wlmtk_element_t *element_ptr, int *x1_ptr, int *y1_ptr, int *x2_ptr, int *y2_ptr)
Definition element.c:300
static bool _wlmtk_element_keyboard_event(wlmtk_element_t *element_ptr, struct wlr_keyboard_key_event *wlr_keyboard_key_event_ptr, const xkb_keysym_t *key_syms, size_t key_syms_count, uint32_t modifiers)
Definition element.c:374
static void _wlmtk_element_keyboard_blur(wlmtk_element_t *element_ptr)
Definition element.c:367
static void _wlmtk_element_pointer_enter(wlmtk_element_t *element_ptr)
Definition element.c:350
static bool _wlmtk_element_pointer_axis(wlmtk_element_t *element_ptr, struct wlr_pointer_axis_event *wlr_pointer_axis_event_ptr)
Definition element.c:341
static bool _wlmtk_element_pointer_motion(wlmtk_element_t *element_ptr, double x, double y, uint32_t time_msec)
Definition element.c:312
static void _wlmtk_element_pointer_leave(wlmtk_element_t *element_ptr)
Definition element.c:360
static bool _wlmtk_element_pointer_button(wlmtk_element_t *element_ptr, const wlmtk_button_event_t *button_event_ptr)
Definition element.c:332

Default virtual method table. Initializes the non-abstract methods.

◆ fake_element_vmt

const wlmtk_element_vmt_t fake_element_vmt
static
Initial value:
= {
.destroy = fake_destroy,
.create_scene_node = fake_create_scene_node,
.get_dimensions = fake_get_dimensions,
.get_pointer_area = fake_get_pointer_area,
.pointer_motion = fake_pointer_motion,
.pointer_button = fake_pointer_button,
.pointer_axis = fake_pointer_axis,
.pointer_enter = fake_pointer_enter,
.pointer_leave = fake_pointer_leave,
.keyboard_blur = fake_keyboard_blur,
.keyboard_event = fake_keyboard_event,
}
static bool fake_keyboard_event(wlmtk_element_t *element_ptr, struct wlr_keyboard_key_event *wlr_keyboard_key_event_ptr, const xkb_keysym_t *key_syms, size_t key_syms_count, uint32_t modifiers)
Definition element.c:629
static struct wlr_scene_node * fake_create_scene_node(wlmtk_element_t *element_ptr, struct wlr_scene_tree *wlr_scene_tree_ptr)
Definition element.c:499
static bool fake_pointer_axis(wlmtk_element_t *element_ptr, struct wlr_pointer_axis_event *wlr_pointer_axis_event_ptr)
Definition element.c:581
static void fake_destroy(wlmtk_element_t *element_ptr)
Definition element.c:489
static void fake_get_dimensions(wlmtk_element_t *element_ptr, int *left_ptr, int *top_ptr, int *right_ptr, int *bottom_ptr)
Definition element.c:510
static void fake_keyboard_blur(wlmtk_element_t *element_ptr)
Definition element.c:620
static bool fake_pointer_button(wlmtk_element_t *element_ptr, const wlmtk_button_event_t *button_event_ptr)
Definition element.c:564
static void fake_pointer_enter(wlmtk_element_t *element_ptr)
Definition element.c:598
static void fake_get_pointer_area(wlmtk_element_t *element_ptr, int *left_ptr, int *top_ptr, int *right_ptr, int *bottom_ptr)
Definition element.c:529
static bool fake_pointer_motion(wlmtk_element_t *element_ptr, double x, double y, uint32_t time_msec)
Definition element.c:548
static void fake_pointer_leave(wlmtk_element_t *element_ptr)
Definition element.c:609

Virtual method table for the fake element.

◆ wlmtk_element_test_cases

const bs_test_case_t wlmtk_element_test_cases[]
Initial value:
= {
{ 1, "init_fini", test_init_fini },
{ 1, "set_parent_container", test_set_parent_container },
{ 1, "set_get_position", test_set_get_position },
{ 1, "get_dimensions", test_get_dimensions },
{ 1, "get_pointer_area", test_get_pointer_area },
{ 1, "pointer_motion_leave", test_pointer_motion_leave },
{ 1, "pointer_button", test_pointer_button },
{ 1, "pointer_axis", test_pointer_axis },
{ 1, "keyboard_focus", test_keyboard_focus },
{ 1, "keyboard_event", test_keyboard_event },
{ 0, NULL, NULL }
}
static void test_set_get_position(bs_test_t *test_ptr)
Definition element.c:732
static void test_keyboard_focus(bs_test_t *test_ptr)
Definition element.c:900
static void test_keyboard_event(bs_test_t *test_ptr)
Definition element.c:915
static void test_pointer_button(bs_test_t *test_ptr)
Definition element.c:868
static void test_get_dimensions(bs_test_t *test_ptr)
Definition element.c:774
static void test_pointer_motion_leave(bs_test_t *test_ptr)
Definition element.c:829
static void test_init_fini(bs_test_t *test_ptr)
Definition element.c:671
static void test_pointer_axis(bs_test_t *test_ptr)
Definition element.c:884
static void test_set_parent_container(bs_test_t *test_ptr)
Definition element.c:684
static void test_get_pointer_area(bs_test_t *test_ptr)
Definition element.c:806

Unit tests for the element.