1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
index d5403e06..7b2f2707 100644
--- a/ivi-shell/hmi-controller.c
+++ b/ivi-shell/hmi-controller.c
@@ -129,9 +129,9 @@ struct hmi_controller {
struct weston_compositor *compositor;
struct wl_listener destroy_listener;
- struct wl_listener surface_created;
struct wl_listener surface_removed;
struct wl_listener surface_configured;
+ struct wl_listener desktop_surface_configured;
struct wl_client *user_interface;
struct ui_setting ui_setting;
@@ -581,28 +581,6 @@ create_layer(struct weston_output *output,
/**
* Internal set notification
*/
-static void
-set_notification_create_surface(struct wl_listener *listener, void *data)
-{
- struct hmi_controller *hmi_ctrl =
- wl_container_of(listener, hmi_ctrl,
- surface_created);
- struct ivi_layout_surface *ivisurf = data;
- struct hmi_controller_layer *layer_link =
- wl_container_of(hmi_ctrl->application_layer_list.prev,
- layer_link,
- link);
- struct ivi_layout_layer *application_layer = layer_link->ivilayer;
- int32_t ret = 0;
-
- /* skip ui widgets */
- if (is_surf_in_ui_widget(hmi_ctrl, ivisurf))
- return;
-
- ret = ivi_layout_interface->layer_add_surface(application_layer, ivisurf);
- assert(!ret);
-}
-
static void
set_notification_remove_surface(struct wl_listener *listener, void *data)
{
@@ -670,6 +648,42 @@ set_notification_configure_surface(struct wl_listener *listener, void *data)
switch_mode(hmi_ctrl, hmi_ctrl->layout_mode);
}
+static void
+set_notification_configure_desktop_surface(struct wl_listener *listener, void *data)
+{
+ struct hmi_controller *hmi_ctrl =
+ wl_container_of(listener, hmi_ctrl,
+ desktop_surface_configured);
+ struct ivi_layout_surface *ivisurf = data;
+ struct hmi_controller_layer *layer_link =
+ wl_container_of(hmi_ctrl->application_layer_list.prev,
+ layer_link,
+ link);
+ struct ivi_layout_layer *application_layer = layer_link->ivilayer;
+ struct weston_surface *surface;
+ int32_t ret = 0;
+
+ /* skip ui widgets */
+ if (is_surf_in_ui_widget(hmi_ctrl, ivisurf))
+ return;
+
+ ret = ivi_layout_interface->layer_add_surface(application_layer, ivisurf);
+ assert(!ret);
+
+ /*
+ * if application changes size of wl_buffer. The source rectangle shall be
+ * fit to the size.
+ */
+ surface = ivi_layout_interface->surface_get_weston_surface(ivisurf);
+ if (surface) {
+ ivi_layout_interface->surface_set_source_rectangle(ivisurf, 0,
+ 0, surface->width, surface->height);
+ }
+
+ ivi_layout_interface->commit_changes();
+ switch_mode(hmi_ctrl, hmi_ctrl->layout_mode);
+}
+
/**
* 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
@@ -852,6 +866,9 @@ hmi_controller_create(struct weston_compositor *ec)
hmi_ctrl->surface_configured.notify = set_notification_configure_surface;
ivi_layout_interface->add_listener_configure_surface(&hmi_ctrl->surface_configured);
+ hmi_ctrl->desktop_surface_configured.notify = set_notification_configure_desktop_surface;
+ ivi_layout_interface->add_listener_configure_desktop_surface(&hmi_ctrl->desktop_surface_configured);
+
hmi_ctrl->destroy_listener.notify = hmi_controller_destroy;
wl_signal_add(&hmi_ctrl->compositor->destroy_signal,
&hmi_ctrl->destroy_listener);
@@ -1275,13 +1292,6 @@ ivi_hmi_controller_UI_ready(struct wl_client *client,
ivi_layout_interface->commit_changes();
ivi_hmi_controller_add_launchers(hmi_ctrl, 256);
-
- /* Add surface_created listener after the initialization of launchers.
- * Otherwise, surfaces of the launchers will be added to application
- * layer too.*/
- hmi_ctrl->surface_created.notify = set_notification_create_surface;
- ivi_layout_interface->add_listener_create_surface(&hmi_ctrl->surface_created);
-
hmi_ctrl->is_initialized = 1;
}
diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c
index 6b854503..22d63708 100644
--- a/ivi-shell/ivi-layout.c
+++ b/ivi-shell/ivi-layout.c
@@ -787,9 +787,15 @@ commit_surface_list(struct ivi_layout *layout)
ivisurf->pending.prop.transition_type = IVI_LAYOUT_TRANSITION_NONE;
if (configured && !is_surface_transition(ivisurf)) {
- shell_surface_send_configure(ivisurf->surface,
- ivisurf->prop.dest_width,
- ivisurf->prop.dest_height);
+ if (ivisurf->weston_desktop_surface) {
+ weston_desktop_surface_set_size(ivisurf->weston_desktop_surface,
+ ivisurf->prop.dest_width,
+ ivisurf->prop.dest_height);
+ } else {
+ shell_surface_send_configure(ivisurf->surface,
+ ivisurf->prop.dest_width,
+ ivisurf->prop.dest_height);
+ }
}
} else {
configured = 0;
|