agl-shell: Add support for defining an activation area
[src/agl-compositor.git] / src / layout.c
index 15858ff..96eb215 100644 (file)
@@ -151,17 +151,40 @@ ivi_panel_init(struct ivi_compositor *ivi, struct ivi_output *output,
 void
 ivi_layout_init(struct ivi_compositor *ivi, struct ivi_output *output)
 {
-       ivi_background_init(ivi, output);
+       bool use_default_area = true;
 
-       output->area.x = 0;
-       output->area.y = 0;
-       output->area.width = output->output->width;
-       output->area.height = output->output->height;
+       ivi_background_init(ivi, output);
 
-       ivi_panel_init(ivi, output, output->top);
-       ivi_panel_init(ivi, output, output->bottom);
-       ivi_panel_init(ivi, output, output->left);
-       ivi_panel_init(ivi, output, output->right);
+       if (output->area_activation.width ||
+           output->area_activation.height ||
+           output->area_activation.x ||
+           output->area_activation.y) {
+               /* Sanity check target area is within output bounds */
+               if ((output->area_activation.x + output->area_activation.width) < output->output->width ||
+                   (output->area_activation.y + output->area_activation.height) < output->output->height) {
+                       weston_log("Using specified area for output %s, ignoring panels\n",
+                                  output->name);
+                       output->area.x = output->area_activation.x;
+                       output->area.y = output->area_activation.y;
+                       output->area.width = output->area_activation.width;
+                       output->area.height = output->area_activation.height;
+                       use_default_area = false;
+               } else {
+                       weston_log("Invalid activation-area position for output %s, ignoring\n",
+                                  output->name);
+               }
+       }
+       if (use_default_area) {
+               output->area.x = 0;
+               output->area.y = 0;
+               output->area.width = output->output->width;
+               output->area.height = output->output->height;
+
+               ivi_panel_init(ivi, output, output->top);
+               ivi_panel_init(ivi, output, output->bottom);
+               ivi_panel_init(ivi, output, output->left);
+               ivi_panel_init(ivi, output, output->right);
+       }
 
        weston_compositor_schedule_repaint(ivi->compositor);
 
@@ -194,6 +217,7 @@ ivi_layout_activate_complete(struct ivi_output *output,
        struct weston_view *view = surf->view;
        struct weston_seat *wseat = get_ivi_shell_weston_first_seat(ivi);
        struct ivi_shell_seat *ivi_seat = get_ivi_shell_seat(wseat);
+       const char *app_id = weston_desktop_surface_get_app_id(surf->dsurface);
 
        if (weston_view_is_mapped(view)) {
                weston_layer_entry_remove(&view->layer_link);
@@ -281,8 +305,13 @@ ivi_layout_activate_complete(struct ivi_output *output,
        }
 
        weston_log("Activation completed for app_id %s, role %s, output %s\n",
-                       weston_desktop_surface_get_app_id(surf->dsurface),
+                       app_id,
                        ivi_layout_get_surface_role_name(surf), output->name);
+
+      if (wl_resource_get_version(ivi->shell_client.resource) >= AGL_SHELL_APP_STATE_SINCE_VERSION)
+               agl_shell_send_app_state(ivi->shell_client.resource,
+                                        app_id, AGL_SHELL_APP_STATE_ACTIVATED);
+
 }
 
 struct ivi_output *
@@ -343,8 +372,8 @@ ivi_layout_add_to_hidden_layer(struct ivi_surface *surf,
                                                ivi_output->area.height);
 
                weston_log("Setting app_id %s, role %s, set to maximized (%dx%d)\n",
-                               app_id, ivi_layout_get_surface_role_name(surf),
-                               ivi_output->area.width, ivi_output->area.height);
+                          app_id, ivi_layout_get_surface_role_name(surf),
+                          ivi_output->area.width, ivi_output->area.height);
 
                surf->hidden_layer_output = ivi_output;
                weston_view_set_output(ev, ivi_output->output);
@@ -1031,4 +1060,8 @@ ivi_layout_deactivate(struct ivi_compositor *ivi, const char *app_id)
                weston_view_geometry_dirty(view);
                weston_surface_damage(view->surface);
        }
+
+      if (wl_resource_get_version(ivi->shell_client.resource) >= AGL_SHELL_APP_STATE_SINCE_VERSION)
+             agl_shell_send_app_state(ivi->shell_client.resource, app_id,
+                                      AGL_SHELL_APP_STATE_DEACTIVATED);
 }