weston-ivi-shell: change order of transmitting notification;
[profile/ivi/wayland-ivi-extension.git] / weston-ivi-shell / src / ivi-controller.c
index 8aee389..e050292 100755 (executable)
@@ -554,35 +554,22 @@ send_layer_add_event(struct ivilayer *ivilayer,
     if (mask & IVI_NOTIFICATION_REMOVE) {
         wl_list_for_each_safe(link_scrn, next, &ivilayer->list_screen, link) {
             ivi_controller_layer_send_screen(resource, NULL);
-            wl_list_remove(&link_scrn->link);
-            free(link_scrn);
-            link_scrn = NULL;
         }
     }
     else if (mask & IVI_NOTIFICATION_ADD) {
         for (i = 0; i < (int)length; i++) {
-            /* Create list_screen */
-            link_scrn = calloc(1, sizeof(*link_scrn));
-            if (NULL == link_scrn) {
-                continue;
-            }
-            wl_list_init(&link_scrn->link);
-            link_scrn->screen = NULL;
+            /* Send new layer event */
+            iviscrn = NULL;
             wl_list_for_each(iviscrn, &shell->list_screen, link) {
                 if (iviscrn->layout_screen == pArray[i]) {
-                    link_scrn->screen = iviscrn;
                     break;
                 }
             }
 
-            if (link_scrn->screen == NULL) {
-                free(link_scrn);
-                link_scrn = NULL;
+            if (iviscrn == NULL) {
                 continue;
             }
-            wl_list_insert(&ivilayer->list_screen, &link_scrn->link);
 
-            /* Send new layer event */
             resource_output =
                 wl_resource_find_for_client(&iviscrn->output->resource_list,
                                      client);
@@ -628,12 +615,69 @@ send_layer_event(struct wl_resource *resource,
         ivi_controller_layer_send_visibility(resource,
                                           prop->visibility);
     }
+    if (mask & IVI_NOTIFICATION_REMOVE) {
+        send_layer_add_event(ivilayer, resource, IVI_NOTIFICATION_REMOVE);
+    }
     if (mask & IVI_NOTIFICATION_ADD) {
         send_layer_add_event(ivilayer, resource, IVI_NOTIFICATION_ADD);
     }
+}
+
+static void
+update_layer_prop(struct ivilayer *ivilayer,
+                  enum ivi_layout_notification_mask mask)
+{
+    struct ivi_layout_screen **pArray = NULL;
+    uint32_t length = 0;
+    int32_t ans = 0;
+    struct link_screen *link_scrn = NULL;
+    struct link_screen *next = NULL;
+
+    ans = ivi_layout_getScreensUnderLayer(ivilayer->layout_layer,
+                                          &length, &pArray);
+    if (0 != ans) {
+        weston_log("failed to get screens at send_layer_add_event\n");
+        return;
+    }
+
+    /* Send Null to cancel added layer */
     if (mask & IVI_NOTIFICATION_REMOVE) {
-        send_layer_add_event(ivilayer, resource, IVI_NOTIFICATION_REMOVE);
+        wl_list_for_each_safe(link_scrn, next, &ivilayer->list_screen, link) {
+            wl_list_remove(&link_scrn->link);
+            free(link_scrn);
+            link_scrn = NULL;
+        }
+    }
+    if (mask & IVI_NOTIFICATION_ADD) {
+        int i = 0;
+        for (i = 0; i < (int)length; i++) {
+            struct ivishell *shell = ivilayer->shell;
+            struct iviscreen *iviscrn = NULL;
+            /* Create list_screen */
+            link_scrn = calloc(1, sizeof(*link_scrn));
+            if (NULL == link_scrn) {
+                continue;
+            }
+            wl_list_init(&link_scrn->link);
+            link_scrn->screen = NULL;
+            wl_list_for_each(iviscrn, &shell->list_screen, link) {
+                if (iviscrn->layout_screen == pArray[i]) {
+                    link_scrn->screen = iviscrn;
+                    break;
+                }
+            }
+
+            if (link_scrn->screen == NULL) {
+                free(link_scrn);
+                link_scrn = NULL;
+                continue;
+            }
+            wl_list_insert(&ivilayer->list_screen, &link_scrn->link);
+        }
     }
+
+    free(pArray);
+    pArray = NULL;
 }
 
 static void
@@ -654,6 +698,8 @@ send_layer_prop(struct ivi_layout_layer *layer,
         }
         send_layer_event(ctrllayer->resource, ivilayer, prop, mask);
     }
+
+    update_layer_prop(ivilayer, mask);
 }
 
 static void
@@ -1222,22 +1268,6 @@ add_client_to_resources(struct ivishell *shell,
     uint32_t id_layout_surface = 0;
     uint32_t id_layout_layer = 0;
 
-    wl_list_for_each_reverse(ivisurf, &shell->list_surface, link) {
-        id_layout_surface =
-            ivi_layout_getIdOfSurface(ivisurf->layout_surface);
-
-        ivi_controller_send_surface(controller->resource,
-                                    id_layout_surface);
-    }
-
-    wl_list_for_each_reverse(ivilayer, &shell->list_layer, link) {
-        id_layout_layer =
-            ivi_layout_getIdOfLayer(ivilayer->layout_layer);
-
-        ivi_controller_send_layer(controller->resource,
-                                  id_layout_layer);
-    }
-
     wl_list_for_each(iviscrn, &shell->list_screen, link) {
         resource_output = wl_resource_find_for_client(
                 &iviscrn->output->resource_list, client);
@@ -1254,6 +1284,20 @@ add_client_to_resources(struct ivishell *shell,
                                    wl_resource_get_id(resource_output),
                                    ctrlscrn->resource);
     }
+    wl_list_for_each_reverse(ivilayer, &shell->list_layer, link) {
+        id_layout_layer =
+            ivi_layout_getIdOfLayer(ivilayer->layout_layer);
+
+        ivi_controller_send_layer(controller->resource,
+                                  id_layout_layer);
+    }
+    wl_list_for_each_reverse(ivisurf, &shell->list_surface, link) {
+        id_layout_surface =
+            ivi_layout_getIdOfSurface(ivisurf->layout_surface);
+
+        ivi_controller_send_surface(controller->resource,
+                                    id_layout_surface);
+    }
 }
 
 static void