mirror of
https://gitlab.freedesktop.org/wayland/weston
synced 2024-10-15 16:43:57 +00:00
hmi-controller: add input panel support
Implement listeners for the new input panel API of the IVI shell. Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
This commit is contained in:
parent
5d68a6c4b5
commit
3c6866088d
|
@ -72,6 +72,7 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
struct hmi_controller_layer {
|
struct hmi_controller_layer {
|
||||||
struct ivi_layout_layer *ivilayer;
|
struct ivi_layout_layer *ivilayer;
|
||||||
|
struct weston_output *output;
|
||||||
uint32_t id_layer;
|
uint32_t id_layer;
|
||||||
int32_t x;
|
int32_t x;
|
||||||
int32_t y;
|
int32_t y;
|
||||||
|
@ -95,6 +96,7 @@ struct hmi_server_setting {
|
||||||
uint32_t application_layer_id;
|
uint32_t application_layer_id;
|
||||||
uint32_t workspace_background_layer_id;
|
uint32_t workspace_background_layer_id;
|
||||||
uint32_t workspace_layer_id;
|
uint32_t workspace_layer_id;
|
||||||
|
uint32_t input_panel_layer_id;
|
||||||
uint32_t base_layer_id_offset;
|
uint32_t base_layer_id_offset;
|
||||||
int32_t panel_height;
|
int32_t panel_height;
|
||||||
uint32_t transition_duration;
|
uint32_t transition_duration;
|
||||||
|
@ -118,6 +120,8 @@ struct hmi_controller {
|
||||||
/* List of struct hmi_controller_layer */
|
/* List of struct hmi_controller_layer */
|
||||||
struct wl_list base_layer_list;
|
struct wl_list base_layer_list;
|
||||||
struct wl_list application_layer_list;
|
struct wl_list application_layer_list;
|
||||||
|
struct wl_list input_panel_layer_list;
|
||||||
|
struct hmi_controller_layer *active_input_panel_layer;
|
||||||
struct hmi_controller_layer workspace_background_layer;
|
struct hmi_controller_layer workspace_background_layer;
|
||||||
struct hmi_controller_layer workspace_layer;
|
struct hmi_controller_layer workspace_layer;
|
||||||
enum ivi_hmi_controller_layout_mode layout_mode;
|
enum ivi_hmi_controller_layout_mode layout_mode;
|
||||||
|
@ -135,6 +139,11 @@ struct hmi_controller {
|
||||||
struct wl_listener surface_configured;
|
struct wl_listener surface_configured;
|
||||||
struct wl_listener desktop_surface_configured;
|
struct wl_listener desktop_surface_configured;
|
||||||
|
|
||||||
|
struct wl_listener input_panel_configured;
|
||||||
|
struct wl_listener input_panel_show;
|
||||||
|
struct wl_listener input_panel_hide;
|
||||||
|
struct wl_listener input_panel_update;
|
||||||
|
|
||||||
struct wl_client *user_interface;
|
struct wl_client *user_interface;
|
||||||
struct ui_setting ui_setting;
|
struct ui_setting ui_setting;
|
||||||
|
|
||||||
|
@ -166,6 +175,11 @@ is_surf_in_ui_widget(struct hmi_controller *hmi_ctrl,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const struct ivi_layout_surface_properties *props;
|
||||||
|
props = hmi_ctrl->interface->get_properties_of_surface(ivisurf);
|
||||||
|
if (props->surface_type == IVI_LAYOUT_SURFACE_TYPE_INPUT_PANEL)
|
||||||
|
return 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -552,6 +566,7 @@ create_layer(struct weston_output *output,
|
||||||
layer->width,
|
layer->width,
|
||||||
layer->height);
|
layer->height);
|
||||||
assert(layer->ivilayer != NULL);
|
assert(layer->ivilayer != NULL);
|
||||||
|
layer->output = output;
|
||||||
|
|
||||||
ret = hmi_ctrl->interface->screen_add_layer(output, layer->ivilayer);
|
ret = hmi_ctrl->interface->screen_add_layer(output, layer->ivilayer);
|
||||||
assert(!ret);
|
assert(!ret);
|
||||||
|
@ -676,6 +691,106 @@ set_notification_configure_desktop_surface(struct wl_listener *listener, void *d
|
||||||
switch_mode(hmi_ctrl, hmi_ctrl->layout_mode);
|
switch_mode(hmi_ctrl, hmi_ctrl->layout_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_notification_configure_input_panel_surface(struct wl_listener *listener, void *data)
|
||||||
|
{
|
||||||
|
struct hmi_controller *hmi_ctrl =
|
||||||
|
wl_container_of(listener, hmi_ctrl,
|
||||||
|
input_panel_configured);
|
||||||
|
struct ivi_layout_surface *ivisurf = data;
|
||||||
|
struct weston_surface *surface;
|
||||||
|
struct hmi_controller_layer *layer_link;
|
||||||
|
|
||||||
|
wl_list_for_each(layer_link, &hmi_ctrl->input_panel_layer_list, link) {
|
||||||
|
hmi_ctrl->interface->layer_add_surface(layer_link->ivilayer, ivisurf);
|
||||||
|
}
|
||||||
|
|
||||||
|
surface = hmi_ctrl->interface->surface_get_weston_surface(ivisurf);
|
||||||
|
if (surface)
|
||||||
|
hmi_ctrl->interface->surface_set_source_rectangle(ivisurf, 0,
|
||||||
|
0, surface->width, surface->height);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_input_panel_position(struct hmi_controller *hmi_ctrl,
|
||||||
|
struct ivi_layout_text_input_state *state)
|
||||||
|
{
|
||||||
|
struct weston_surface *surface;
|
||||||
|
int32_t x, y;
|
||||||
|
|
||||||
|
surface = hmi_ctrl->interface->surface_get_weston_surface(state->input_panel);
|
||||||
|
|
||||||
|
if (state->overlay_panel) {
|
||||||
|
const struct ivi_layout_surface_properties *props;
|
||||||
|
|
||||||
|
props = hmi_ctrl->interface->get_properties_of_surface(state->surface);
|
||||||
|
x = props->dest_x + state->cursor_rectangle.x2;
|
||||||
|
y = props->dest_y + state->cursor_rectangle.y2;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
x = (hmi_ctrl->active_input_panel_layer->width - surface->width) / 2;
|
||||||
|
y = hmi_ctrl->active_input_panel_layer->height - surface->height;
|
||||||
|
}
|
||||||
|
|
||||||
|
hmi_ctrl->interface->surface_set_destination_rectangle(state->input_panel,
|
||||||
|
x, y,
|
||||||
|
surface->width,
|
||||||
|
surface->height);
|
||||||
|
hmi_ctrl->interface->surface_set_visibility(state->input_panel, true);
|
||||||
|
hmi_ctrl->interface->commit_changes();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_notification_show_input_panel(struct wl_listener *listener, void *data)
|
||||||
|
{
|
||||||
|
struct hmi_controller *hmi_ctrl =
|
||||||
|
wl_container_of(listener, hmi_ctrl,
|
||||||
|
input_panel_show);
|
||||||
|
struct ivi_layout_text_input_state *state = data;
|
||||||
|
struct hmi_controller_layer *layer_link;
|
||||||
|
struct weston_surface *focus;
|
||||||
|
|
||||||
|
focus = hmi_ctrl->interface->surface_get_weston_surface(state->surface);
|
||||||
|
|
||||||
|
wl_list_for_each(layer_link, &hmi_ctrl->input_panel_layer_list, link) {
|
||||||
|
if (layer_link->output != focus->output)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
hmi_ctrl->interface->layer_set_visibility(layer_link->ivilayer, true);
|
||||||
|
hmi_ctrl->active_input_panel_layer = layer_link;
|
||||||
|
update_input_panel_position(hmi_ctrl, state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_notification_hide_input_panel(struct wl_listener *listener, void *data)
|
||||||
|
{
|
||||||
|
struct hmi_controller *hmi_ctrl =
|
||||||
|
wl_container_of(listener, hmi_ctrl,
|
||||||
|
input_panel_hide);
|
||||||
|
|
||||||
|
if (!hmi_ctrl->active_input_panel_layer)
|
||||||
|
return;
|
||||||
|
|
||||||
|
hmi_ctrl->interface->layer_set_visibility(hmi_ctrl->active_input_panel_layer->ivilayer, false);
|
||||||
|
hmi_ctrl->active_input_panel_layer = NULL;
|
||||||
|
hmi_ctrl->interface->commit_changes();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_notification_update_input_panel(struct wl_listener *listener, void *data)
|
||||||
|
{
|
||||||
|
struct hmi_controller *hmi_ctrl =
|
||||||
|
wl_container_of(listener, hmi_ctrl,
|
||||||
|
input_panel_update);
|
||||||
|
struct ivi_layout_text_input_state *state = data;
|
||||||
|
|
||||||
|
if (!hmi_ctrl->active_input_panel_layer)
|
||||||
|
return;
|
||||||
|
|
||||||
|
update_input_panel_position(hmi_ctrl, state);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A hmi_controller used 4 ivi_layers to manage ivi_surfaces. The IDs of
|
* A hmi_controller used 4 ivi_layers to manage ivi_surfaces. The IDs of
|
||||||
* corresponding ivi_layer are defined in weston.ini. Default scene graph
|
* corresponding ivi_layer are defined in weston.ini. Default scene graph
|
||||||
|
@ -706,6 +821,9 @@ hmi_server_setting_create(struct weston_compositor *ec)
|
||||||
weston_config_section_get_uint(shell_section, "application-layer-id",
|
weston_config_section_get_uint(shell_section, "application-layer-id",
|
||||||
&setting->application_layer_id, 4000);
|
&setting->application_layer_id, 4000);
|
||||||
|
|
||||||
|
weston_config_section_get_uint(shell_section, "input-panel-layer-id",
|
||||||
|
&setting->input_panel_layer_id, 5000);
|
||||||
|
|
||||||
weston_config_section_get_uint(shell_section, "base-layer-id-offset",
|
weston_config_section_get_uint(shell_section, "base-layer-id-offset",
|
||||||
&setting->base_layer_id_offset, 10000);
|
&setting->base_layer_id_offset, 10000);
|
||||||
|
|
||||||
|
@ -762,6 +880,13 @@ hmi_controller_destroy(struct wl_listener *listener, void *data)
|
||||||
free(ctrl_layer_link);
|
free(ctrl_layer_link);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* clear input_panel_layer_list */
|
||||||
|
wl_list_for_each_safe(ctrl_layer_link, ctrl_layer_next,
|
||||||
|
&hmi_ctrl->input_panel_layer_list, link) {
|
||||||
|
wl_list_remove(&ctrl_layer_link->link);
|
||||||
|
free(ctrl_layer_link);
|
||||||
|
}
|
||||||
|
|
||||||
wl_list_remove(&hmi_ctrl->surface_removed.link);
|
wl_list_remove(&hmi_ctrl->surface_removed.link);
|
||||||
wl_list_remove(&hmi_ctrl->surface_configured.link);
|
wl_list_remove(&hmi_ctrl->surface_configured.link);
|
||||||
wl_list_remove(&hmi_ctrl->desktop_surface_configured.link);
|
wl_list_remove(&hmi_ctrl->desktop_surface_configured.link);
|
||||||
|
@ -795,6 +920,7 @@ hmi_controller_create(struct weston_compositor *ec)
|
||||||
const struct ivi_layout_interface *interface;
|
const struct ivi_layout_interface *interface;
|
||||||
struct hmi_controller_layer *base_layer = NULL;
|
struct hmi_controller_layer *base_layer = NULL;
|
||||||
struct hmi_controller_layer *application_layer = NULL;
|
struct hmi_controller_layer *application_layer = NULL;
|
||||||
|
struct hmi_controller_layer *input_panel_layer = NULL;
|
||||||
struct weston_output *output;
|
struct weston_output *output;
|
||||||
int32_t i;
|
int32_t i;
|
||||||
|
|
||||||
|
@ -871,6 +997,24 @@ hmi_controller_create(struct weston_compositor *ec)
|
||||||
hmi_ctrl->interface->layer_set_visibility(
|
hmi_ctrl->interface->layer_set_visibility(
|
||||||
hmi_ctrl->workspace_background_layer.ivilayer, false);
|
hmi_ctrl->workspace_background_layer.ivilayer, false);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
/* init input panel ivi_layer */
|
||||||
|
wl_list_init(&hmi_ctrl->input_panel_layer_list);
|
||||||
|
wl_list_for_each(output, &ec->output_list, link) {
|
||||||
|
input_panel_layer = xzalloc(sizeof(struct hmi_controller_layer));
|
||||||
|
input_panel_layer->x = 0;
|
||||||
|
input_panel_layer->y = 0;
|
||||||
|
input_panel_layer->width = output->current_mode->width;
|
||||||
|
input_panel_layer->height = output->current_mode->height - panel_height;
|
||||||
|
input_panel_layer->id_layer =
|
||||||
|
hmi_ctrl->hmi_setting->input_panel_layer_id +
|
||||||
|
(i * hmi_ctrl->hmi_setting->base_layer_id_offset);
|
||||||
|
wl_list_insert(&hmi_ctrl->input_panel_layer_list, &input_panel_layer->link);
|
||||||
|
|
||||||
|
create_layer(output, input_panel_layer, hmi_ctrl);
|
||||||
|
hmi_ctrl->interface->layer_set_visibility(input_panel_layer->ivilayer, false);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
wl_list_init(&hmi_ctrl->workspace_fade.layer_list);
|
wl_list_init(&hmi_ctrl->workspace_fade.layer_list);
|
||||||
tmp_link_layer = xzalloc(sizeof(*tmp_link_layer));
|
tmp_link_layer = xzalloc(sizeof(*tmp_link_layer));
|
||||||
|
@ -888,6 +1032,18 @@ hmi_controller_create(struct weston_compositor *ec)
|
||||||
hmi_ctrl->desktop_surface_configured.notify = set_notification_configure_desktop_surface;
|
hmi_ctrl->desktop_surface_configured.notify = set_notification_configure_desktop_surface;
|
||||||
hmi_ctrl->interface->add_listener_configure_desktop_surface(&hmi_ctrl->desktop_surface_configured);
|
hmi_ctrl->interface->add_listener_configure_desktop_surface(&hmi_ctrl->desktop_surface_configured);
|
||||||
|
|
||||||
|
hmi_ctrl->input_panel_configured.notify = set_notification_configure_input_panel_surface;
|
||||||
|
hmi_ctrl->interface->add_listener_configure_input_panel_surface(&hmi_ctrl->input_panel_configured);
|
||||||
|
|
||||||
|
hmi_ctrl->input_panel_show.notify = set_notification_show_input_panel;
|
||||||
|
hmi_ctrl->interface->add_listener_show_input_panel(&hmi_ctrl->input_panel_show);
|
||||||
|
|
||||||
|
hmi_ctrl->input_panel_hide.notify = set_notification_hide_input_panel;
|
||||||
|
hmi_ctrl->interface->add_listener_hide_input_panel(&hmi_ctrl->input_panel_hide);
|
||||||
|
|
||||||
|
hmi_ctrl->input_panel_update.notify = set_notification_update_input_panel;
|
||||||
|
hmi_ctrl->interface->add_listener_update_input_panel(&hmi_ctrl->input_panel_update);
|
||||||
|
|
||||||
if(hmi_ctrl->interface->shell_add_destroy_listener_once(&hmi_ctrl->destroy_listener,
|
if(hmi_ctrl->interface->shell_add_destroy_listener_once(&hmi_ctrl->destroy_listener,
|
||||||
hmi_controller_destroy) == IVI_FAILED){
|
hmi_controller_destroy) == IVI_FAILED){
|
||||||
hmi_controller_destroy(&hmi_ctrl->destroy_listener, NULL);
|
hmi_controller_destroy(&hmi_ctrl->destroy_listener, NULL);
|
||||||
|
|
Loading…
Reference in a new issue