ivi-shell: rewrite controller API

This fixes the breakage caused by "ivi-shell: make ivi-layout.c as a
part of ivi-shell.so"

hmi-controller.c:
A reference implementation of controller module does not use the layout
functions directly. This get function pointers at controller_module_init
which called by ivi-shell.

ivi-layout-export.h:
Definition of interfaces in a struction: ivi_controller_interface.
function pointers are set at ivi-layout.c.

ivi-layout-private.h:
Definition of some interfaces are remove bucause it is implemented in
ivi-layout.c and set it as function pointer. Several interfaces are kept
here because they are implemented in ivi-layout.c/transition.c but used
in other files.

ivi-layout-transition.c:
remove WL_EXPORT because export is not needed anymore.
remove unnesesary unsed method.

ivi-shell.c:
call controller_module_init of hmi-controller to init it and set
function pointers. If the interface_version is equal or
greater than what hmi_controller was built with, things are pass.
If the interface_version is smaller than what the controller expects,
it has to fail because it cannot work. This is followed the manner,

- never remove a function pointer
- never modify an existing function signature
- additions are allowed at the end of struct ivi_controller_interface
- all function pointers must always be populated and working in
  ivi-shell.so (ivi-layout.c etc.)

Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
Acked-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
diff --git a/ivi-shell/hmi-controller.c b/ivi-shell/hmi-controller.c
index 1ad63a2..36a1b56 100644
--- a/ivi-shell/hmi-controller.c
+++ b/ivi-shell/hmi-controller.c
@@ -128,6 +128,14 @@
 	int32_t index;
 };
 
+const struct ivi_controller_interface *ivi_controller_interface;
+
+int
+controller_module_init(struct weston_compositor *ec,
+		       int *argc, char *argv[],
+		       const struct ivi_controller_interface *interface,
+		       size_t interface_version);
+
 /*****************************************************************************
  *  local functions
  ****************************************************************************/
@@ -154,7 +162,7 @@
 is_surf_in_ui_widget(struct hmi_controller *hmi_ctrl,
 		     struct ivi_layout_surface *ivisurf)
 {
-	uint32_t id = ivi_layout_get_id_of_surface(ivisurf);
+	uint32_t id = ivi_controller_interface->get_id_of_surface(ivisurf);
 
 	uint32_t *ui_widget_id = NULL;
 	wl_array_for_each(ui_widget_id, &hmi_ctrl->ui_widgets) {
@@ -235,11 +243,11 @@
 				surface_y = (int32_t)surface_height;
 			}
 
-			ivi_layout_surface_set_transition(ivisurf,
+			ivi_controller_interface->surface_set_transition(ivisurf,
 					IVI_LAYOUT_TRANSITION_VIEW_DEFAULT,
 					duration);
-			ivi_layout_surface_set_visibility(ivisurf, true);
-			ivi_layout_surface_set_destination_rectangle(ivisurf,
+			ivi_controller_interface->surface_set_visibility(ivisurf, true);
+			ivi_controller_interface->surface_set_destination_rectangle(ivisurf,
 					surface_x, surface_y,
 					(int32_t)surface_width,
 					(int32_t)surface_height);
@@ -247,11 +255,11 @@
 			num++;
 			continue;
 		}
-		ivi_layout_surface_set_visibility(ivisurf, false);
+		ivi_controller_interface->surface_set_visibility(ivisurf, false);
 	}
 
 	if (surf_num > 0) {
-		ivi_layout_layer_set_transition(layer->ivilayer,
+		ivi_controller_interface->layer_set_transition(layer->ivilayer,
 				IVI_LAYOUT_TRANSITION_LAYER_VIEW_ORDER,
 				duration);
 	}
@@ -282,11 +290,11 @@
 			continue;
 
 		if (num == 1) {
-			ivi_layout_surface_set_transition(ivisurf,
+			ivi_controller_interface->surface_set_transition(ivisurf,
 					IVI_LAYOUT_TRANSITION_VIEW_DEFAULT,
 					duration);
-			ivi_layout_surface_set_visibility(ivisurf, true);
-			ivi_layout_surface_set_destination_rectangle(ivisurf,
+			ivi_controller_interface->surface_set_visibility(ivisurf, true);
+			ivi_controller_interface->surface_set_destination_rectangle(ivisurf,
 							0, 0,
 							surface_width,
 							surface_height);
@@ -294,11 +302,11 @@
 			num++;
 			continue;
 		} else if (num == 2) {
-			ivi_layout_surface_set_transition(ivisurf,
+			ivi_controller_interface->surface_set_transition(ivisurf,
 					IVI_LAYOUT_TRANSITION_VIEW_DEFAULT,
 					duration);
-			ivi_layout_surface_set_visibility(ivisurf, true);
-			ivi_layout_surface_set_destination_rectangle(ivisurf,
+			ivi_controller_interface->surface_set_visibility(ivisurf, true);
+			ivi_controller_interface->surface_set_destination_rectangle(ivisurf,
 							surface_width, 0,
 							surface_width,
 							surface_height);
@@ -306,10 +314,10 @@
 			num++;
 			continue;
 		}
-		ivi_layout_surface_set_transition(ivisurf,
+		ivi_controller_interface->surface_set_transition(ivisurf,
 					IVI_LAYOUT_TRANSITION_VIEW_FADE_ONLY,
 					duration);
-		ivi_layout_surface_set_visibility(ivisurf, false);
+		ivi_controller_interface->surface_set_visibility(ivisurf, false);
 	}
 }
 
@@ -332,11 +340,11 @@
 		if (is_surf_in_ui_widget(hmi_ctrl, ivisurf))
 			continue;
 
-		ivi_layout_surface_set_transition(ivisurf,
+		ivi_controller_interface->surface_set_transition(ivisurf,
 					IVI_LAYOUT_TRANSITION_VIEW_DEFAULT,
 					duration);
-		ivi_layout_surface_set_visibility(ivisurf, true);
-		ivi_layout_surface_set_destination_rectangle(ivisurf, 0, 0,
+		ivi_controller_interface->surface_set_visibility(ivisurf, true);
+		ivi_controller_interface->surface_set_destination_rectangle(ivisurf, 0, 0,
 							     surface_width,
 							     surface_height);
 	}
@@ -363,14 +371,14 @@
 		if (is_surf_in_ui_widget(hmi_ctrl, ivisurf))
 			continue;
 
-		ivi_layout_surface_set_transition(ivisurf,
+		ivi_controller_interface->surface_set_transition(ivisurf,
 					IVI_LAYOUT_TRANSITION_VIEW_DEFAULT,
 					duration);
-		ivi_layout_surface_set_visibility(ivisurf, true);
+		ivi_controller_interface->surface_set_visibility(ivisurf, true);
 		surface_x = rand() % (layer->width - surface_width);
 		surface_y = rand() % (layer->height - surface_height);
 
-		ivi_layout_surface_set_destination_rectangle(ivisurf,
+		ivi_controller_interface->surface_set_destination_rectangle(ivisurf,
 							     surface_x,
 							     surface_y,
 							     surface_width,
@@ -417,7 +425,7 @@
 
 	hmi_ctrl->layout_mode = layout_mode;
 
-	ret = ivi_layout_get_surfaces(&surface_length, &pp_surface);
+	ret = ivi_controller_interface->get_surfaces(&surface_length, &pp_surface);
 	assert(!ret);
 
 	if (!has_application_surface(hmi_ctrl, pp_surface, surface_length)) {
@@ -445,7 +453,7 @@
 		break;
 	}
 
-	ivi_layout_commit_changes();
+	ivi_controller_interface->commit_changes();
 	free(pp_surface);
 }
 
@@ -463,11 +471,11 @@
 	fade->is_fade_in = is_fade_in;
 
 	wl_list_for_each(linklayer, &fade->layer_list, link) {
-		ivi_layout_layer_set_transition(linklayer->layout_layer,
+		ivi_controller_interface->layer_set_transition(linklayer->layout_layer,
 					IVI_LAYOUT_TRANSITION_LAYER_FADE,
 					duration);
-		ivi_layout_layer_set_fade_info(linklayer->layout_layer,
-					       is_fade_in, 1.0 - tint, tint);
+		ivi_controller_interface->layer_set_fade_info(linklayer->layout_layer,
+					is_fade_in, 1.0 - tint, tint);
 	}
 }
 
@@ -482,21 +490,21 @@
 	int32_t ret = 0;
 
 	layer->ivilayer =
-		ivi_layout_layer_create_with_dimension(layer->id_layer,
+		ivi_controller_interface->layer_create_with_dimension(layer->id_layer,
 						       layer->width,
 						       layer->height);
 	assert(layer->ivilayer != NULL);
 
-	ret = ivi_layout_screen_add_layer(iviscrn, layer->ivilayer);
+	ret = ivi_controller_interface->screen_add_layer(iviscrn, layer->ivilayer);
 	assert(!ret);
 
-	ret = ivi_layout_layer_set_destination_rectangle(layer->ivilayer,
+	ret = ivi_controller_interface->layer_set_destination_rectangle(layer->ivilayer,
 							 layer->x, layer->y,
 							 layer->width,
 							 layer->height);
 	assert(!ret);
 
-	ret = ivi_layout_layer_set_visibility(layer->ivilayer, true);
+	ret = ivi_controller_interface->layer_set_visibility(layer->ivilayer, true);
 	assert(!ret);
 }
 
@@ -516,7 +524,7 @@
 	if (is_surf_in_ui_widget(hmi_ctrl, ivisurf))
 		return;
 
-	ret = ivi_layout_layer_add_surface(application_layer, ivisurf);
+	ret = ivi_controller_interface->layer_add_surface(application_layer, ivisurf);
 	assert(!ret);
 }
 
@@ -630,11 +638,11 @@
 	hmi_ctrl->hmi_setting = hmi_server_setting_create(ec);
 	hmi_ctrl->compositor = ec;
 
-	ivi_layout_get_screens(&screen_length, &pp_screen);
+	ivi_controller_interface->get_screens(&screen_length, &pp_screen);
 
 	iviscrn = pp_screen[0];
 
-	ivi_layout_get_screen_resolution(iviscrn, &screen_width,
+	ivi_controller_interface->get_screen_resolution(iviscrn, &screen_width,
 					 &screen_height);
 
 	/* init base ivi_layer*/
@@ -669,9 +677,9 @@
 		hmi_ctrl->hmi_setting->workspace_background_layer_id;
 
 	create_layer(iviscrn, &hmi_ctrl->workspace_background_layer);
-	ivi_layout_layer_set_opacity(
+	ivi_controller_interface->layer_set_opacity(
 		hmi_ctrl->workspace_background_layer.ivilayer, 0);
-	ivi_layout_layer_set_visibility(
+	ivi_controller_interface->layer_set_visibility(
 		hmi_ctrl->workspace_background_layer.ivilayer, false);
 
 	/* init workspace ivi_layer */
@@ -685,8 +693,8 @@
 		hmi_ctrl->hmi_setting->workspace_layer_id;
 
 	create_layer(iviscrn, &hmi_ctrl->workspace_layer);
-	ivi_layout_layer_set_opacity(hmi_ctrl->workspace_layer.ivilayer, 0);
-	ivi_layout_layer_set_visibility(hmi_ctrl->workspace_layer.ivilayer,
+	ivi_controller_interface->layer_set_opacity(hmi_ctrl->workspace_layer.ivilayer, 0);
+	ivi_controller_interface->layer_set_visibility(hmi_ctrl->workspace_layer.ivilayer,
 					false);
 
 	wl_list_init(&hmi_ctrl->workspace_fade.layer_list);
@@ -700,11 +708,11 @@
 	wl_list_insert(&hmi_ctrl->workspace_fade.layer_list,
 		       &tmp_link_layer->link);
 
-	ivi_layout_add_notification_create_surface(
+	ivi_controller_interface->add_notification_create_surface(
 		set_notification_create_surface, hmi_ctrl);
-	ivi_layout_add_notification_remove_surface(
+	ivi_controller_interface->add_notification_remove_surface(
 		set_notification_remove_surface, hmi_ctrl);
-	ivi_layout_add_notification_configure_surface(
+	ivi_controller_interface->add_notification_configure_surface(
 		set_notification_configure_surface, hmi_ctrl);
 
 	hmi_ctrl->destroy_listener.notify = hmi_controller_destroy;
@@ -744,17 +752,17 @@
 						sizeof(*add_surface_id));
 	*add_surface_id = id_surface;
 
-	ivisurf = ivi_layout_get_surface_from_id(id_surface);
+	ivisurf = ivi_controller_interface->get_surface_from_id(id_surface);
 	assert(ivisurf != NULL);
 
-	ret = ivi_layout_layer_add_surface(ivilayer, ivisurf);
+	ret = ivi_controller_interface->layer_add_surface(ivilayer, ivisurf);
 	assert(!ret);
 
-	ret = ivi_layout_surface_set_destination_rectangle(ivisurf,
+	ret = ivi_controller_interface->surface_set_destination_rectangle(ivisurf,
 					dstx, dsty, width, height);
 	assert(!ret);
 
-	ret = ivi_layout_surface_set_visibility(ivisurf, true);
+	ret = ivi_controller_interface->surface_set_visibility(ivisurf, true);
 	assert(!ret);
 }
 
@@ -781,21 +789,21 @@
 						sizeof(*add_surface_id));
 	*add_surface_id = id_surface;
 
-	ivisurf = ivi_layout_get_surface_from_id(id_surface);
+	ivisurf = ivi_controller_interface->get_surface_from_id(id_surface);
 	assert(ivisurf != NULL);
 
-	ret = ivi_layout_layer_add_surface(ivilayer, ivisurf);
+	ret = ivi_controller_interface->layer_add_surface(ivilayer, ivisurf);
 	assert(!ret);
 
 	panel_height = hmi_ctrl->hmi_setting->panel_height;
 
 	dsty = hmi_ctrl->base_layer.height - panel_height;
 
-	ret = ivi_layout_surface_set_destination_rectangle(
+	ret = ivi_controller_interface->surface_set_destination_rectangle(
 		ivisurf, dstx, dsty, width, panel_height);
 	assert(!ret);
 
-	ret = ivi_layout_surface_set_visibility(ivisurf, true);
+	ret = ivi_controller_interface->surface_set_visibility(ivisurf, true);
 	assert(!ret);
 }
 
@@ -824,10 +832,10 @@
 						sizeof(*add_surface_id));
 	*add_surface_id = id_surface;
 
-	ivisurf = ivi_layout_get_surface_from_id(id_surface);
+	ivisurf = ivi_controller_interface->get_surface_from_id(id_surface);
 	assert(ivisurf != NULL);
 
-	ret = ivi_layout_layer_add_surface(ivilayer, ivisurf);
+	ret = ivi_controller_interface->layer_add_surface(ivilayer, ivisurf);
 	assert(!ret);
 
 	panel_height = hmi_ctrl->hmi_setting->panel_height;
@@ -835,11 +843,11 @@
 	dstx = (60 * number) + 15;
 	dsty = (hmi_ctrl->base_layer.height - panel_height) + 5;
 
-	ret = ivi_layout_surface_set_destination_rectangle(
+	ret = ivi_controller_interface->surface_set_destination_rectangle(
 		ivisurf,dstx, dsty, width, height);
 	assert(!ret);
 
-	ret = ivi_layout_surface_set_visibility(ivisurf, true);
+	ret = ivi_controller_interface->surface_set_visibility(ivisurf, true);
 	assert(!ret);
 }
 
@@ -866,17 +874,17 @@
 						sizeof(*add_surface_id));
 	*add_surface_id = id_surface;
 
-	ivisurf = ivi_layout_get_surface_from_id(id_surface);
+	ivisurf = ivi_controller_interface->get_surface_from_id(id_surface);
 	assert(ivisurf != NULL);
 
-	ret = ivi_layout_layer_add_surface(ivilayer, ivisurf);
+	ret = ivi_controller_interface->layer_add_surface(ivilayer, ivisurf);
 	assert(!ret);
 
-	ret = ivi_layout_surface_set_destination_rectangle(
+	ret = ivi_controller_interface->surface_set_destination_rectangle(
 			ivisurf, dstx, dsty, size, size);
 	assert(!ret);
 
-	ret = ivi_layout_surface_set_visibility(ivisurf, true);
+	ret = ivi_controller_interface->surface_set_visibility(ivisurf, true);
 	assert(!ret);
 }
 
@@ -902,17 +910,17 @@
 	*add_surface_id = id_surface;
 	ivilayer = hmi_ctrl->workspace_background_layer.ivilayer;
 
-	ivisurf = ivi_layout_get_surface_from_id(id_surface);
+	ivisurf = ivi_controller_interface->get_surface_from_id(id_surface);
 	assert(ivisurf != NULL);
 
-	ret = ivi_layout_layer_add_surface(ivilayer, ivisurf);
+	ret = ivi_controller_interface->layer_add_surface(ivilayer, ivisurf);
 	assert(!ret);
 
-	ret = ivi_layout_surface_set_destination_rectangle(ivisurf,
+	ret = ivi_controller_interface->surface_set_destination_rectangle(ivisurf,
 							   0, 0, width, height);
 	assert(!ret);
 
-	ret = ivi_layout_surface_set_visibility(ivisurf, true);
+	ret = ivi_controller_interface->surface_set_visibility(ivisurf, true);
 	assert(!ret);
 }
 
@@ -1037,17 +1045,17 @@
 		y = ny * fcell_size_y  + space_y;
 
 		layout_surface =
-			ivi_layout_get_surface_from_id(data->surface_id);
+			ivi_controller_interface->get_surface_from_id(data->surface_id);
 		assert(layout_surface);
 
-		ret = ivi_layout_layer_add_surface(layer, layout_surface);
+		ret = ivi_controller_interface->layer_add_surface(layer, layout_surface);
 		assert(!ret);
 
-		ret = ivi_layout_surface_set_destination_rectangle(
+		ret = ivi_controller_interface->surface_set_destination_rectangle(
 				layout_surface, x, y, icon_size, icon_size);
 		assert(!ret);
 
-		ret = ivi_layout_surface_set_visibility(layout_surface, true);
+		ret = ivi_controller_interface->surface_set_visibility(layout_surface, true);
 		assert(!ret);
 
 		nx++;
@@ -1059,7 +1067,7 @@
 	}
 
 	wl_array_release(&launchers);
-	ivi_layout_commit_changes();
+	ivi_controller_interface->commit_changes();
 }
 
 static void
@@ -1076,7 +1084,7 @@
 	ivi_hmi_controller_set_button(hmi_ctrl, hmi_ctrl->ui_setting.random_id, 3);
 	ivi_hmi_controller_set_home_button(hmi_ctrl, hmi_ctrl->ui_setting.home_id);
 	ivi_hmi_controller_set_workspacebackground(hmi_ctrl, hmi_ctrl->ui_setting.workspace_background_id);
-	ivi_layout_commit_changes();
+	ivi_controller_interface->commit_changes();
 
 	ivi_hmi_controller_add_launchers(hmi_ctrl, 256);
 	hmi_ctrl->is_initialized = 1;
@@ -1194,7 +1202,7 @@
 	if (200 < from_motion_time)
 		pointer_v = 0.0;
 
-	ivi_layout_layer_get_position(layer, &pos_x, &pos_y);
+	ivi_controller_interface->layer_get_position(layer, &pos_x, &pos_y);
 
 
 	if (is_flick) {
@@ -1214,14 +1222,14 @@
 
 	duration = hmi_ctrl->hmi_setting->transition_duration;
 	ivi_hmi_controller_send_workspace_end_control(resource, move->is_moved);
-	ivi_layout_layer_set_transition(layer,
+	ivi_controller_interface->layer_set_transition(layer,
 					IVI_LAYOUT_TRANSITION_LAYER_MOVE,
 					duration);
-	ivi_layout_layer_set_destination_rectangle(layer,
+	ivi_controller_interface->layer_set_destination_rectangle(layer,
 				end_pos, pos_y,
 				hmi_ctrl->workspace_background_layer.width,
 				hmi_ctrl->workspace_background_layer.height);
-	ivi_layout_commit_changes();
+	ivi_controller_interface->commit_changes();
 }
 
 static void
@@ -1299,8 +1307,8 @@
 
 	layout_pos_x = wl_fixed_to_int(pos_x);
 	layout_pos_y = wl_fixed_to_int(pos_y);
-	ivi_layout_layer_set_position(layer, layout_pos_x, layout_pos_y);
-	ivi_layout_commit_changes();
+	ivi_controller_interface->layer_set_position(layer, layout_pos_x, layout_pos_y);
+	ivi_controller_interface->commit_changes();
 }
 
 static void
@@ -1457,7 +1465,7 @@
 	wl_fixed_t rgn[2][2] = {{0}};
 	wl_fixed_t grab_pos[2] = { grab_x, grab_y };
 
-	ivi_layout_layer_get_position(layer, &layer_pos_x, &layer_pos_y);
+	ivi_controller_interface->layer_get_position(layer, &layer_pos_x, &layer_pos_y);
 
 	start_pos[0] = wl_fixed_from_int(layer_pos_x);
 	start_pos[1] = wl_fixed_from_int(layer_pos_y);
@@ -1525,7 +1533,7 @@
 
 	layer = hmi_ctrl->workspace_layer.ivilayer;
 
-	ivi_layout_transition_move_layer_cancel(layer);
+	ivi_controller_interface->transition_move_layer_cancel(layer);
 
 	switch (device) {
 	case HMI_GRAB_DEVICE_POINTER:
@@ -1585,7 +1593,7 @@
 					&hmi_ctrl->workspace_fade);
 	}
 
-	ivi_layout_commit_changes();
+	ivi_controller_interface->commit_changes();
 }
 
 /**
@@ -1688,14 +1696,24 @@
 /*****************************************************************************
  *  exported functions
  ****************************************************************************/
-
 WL_EXPORT int
-module_init(struct weston_compositor *ec,
-	    int *argc, char *argv[])
+controller_module_init(struct weston_compositor *ec,
+		       int *argc, char *argv[],
+		       const struct ivi_controller_interface *interface,
+		       size_t interface_version)
 {
-	struct hmi_controller *hmi_ctrl = hmi_controller_create(ec);
+	struct hmi_controller *hmi_ctrl = NULL;
 	struct wl_event_loop *loop = NULL;
 
+	if (interface_version < sizeof(struct ivi_controller_interface)) {
+		weston_log("ivi-shell: version mismatch of controller interface");
+		return -1;
+	}
+
+	ivi_controller_interface = interface;
+
+	hmi_ctrl = hmi_controller_create(ec);
+
 	if (!initialize(hmi_ctrl)) {
 		return -1;
 	}