#include <assert.h>
#include <string.h>
+#include <libweston/config-parser.h>
#include <libweston/libweston.h>
#include <libweston-desktop/libweston-desktop.h>
void
ivi_layout_init(struct ivi_compositor *ivi, struct ivi_output *output)
{
- ivi_background_init(ivi, output);
+ bool use_default_area = true;
+ struct weston_config_section *section = output->config;
+ char *t;
+
+ weston_config_section_get_string(section, "activation-area", &t, NULL);
+ if (t) {
+ if (output->area_activation.width == 0 &&
+ output->area_activation.height == 0 &&
+ output->area_activation.x == 0 &&
+ output->area_activation.y == 0) {
+ weston_log("WARNING: activation-area set in "
+ "configuration file, but yet applied!\n");
+ if (parse_activation_area(t, output) < 0)
+ weston_log("Invalid activation-area \"%s\" for output %s\n",
+ t, output->name);
+ }
+ }
+ free(t);
- 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);
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);
weston_view_set_output(view, woutput);
- weston_view_set_position(view,
- woutput->x + output->area.x,
- woutput->y + output->area.y);
+
+ if (surf->role != IVI_SURFACE_ROLE_BACKGROUND)
+ weston_view_set_position(view,
+ woutput->x + output->area.x,
+ woutput->y + output->area.y);
view->is_mapped = true;
surf->mapped = true;
}
}
-
if (output->active) {
- output->active->view->is_mapped = false;
- output->active->view->surface->is_mapped = false;
+ /* keep the background surface mapped at all times */
+ if (output->active->role != IVI_SURFACE_ROLE_BACKGROUND) {
+ output->active->view->is_mapped = false;
+ output->active->view->surface->is_mapped = false;
- weston_layer_entry_remove(&output->active->view->layer_link);
+ weston_layer_entry_remove(&output->active->view->layer_link);
+ }
}
output->previous_active = output->active;
output->active = surf;
}
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);
+
+ shell_send_app_state(ivi, app_id, AGL_SHELL_APP_STATE_ACTIVATED);
+}
+
+static bool
+ivi_layout_find_output_with_app_id(const char *app_id, struct ivi_output *output)
+{
+ char *cur;
+ size_t app_id_len;
+
+ cur = output->app_ids;
+ app_id_len = strlen(app_id);
+
+ while ((cur = strstr(cur, app_id))) {
+ if ((cur[app_id_len] == ',' || cur[app_id_len] == '\0') &&
+ (cur == output->app_ids || cur[-1] == ','))
+ return true;
+ cur++;
+ }
+
+ return false;
}
struct ivi_output *
return NULL;
wl_list_for_each(out, &ivi->outputs, link) {
- if (!out->app_id)
+ if (!out->app_ids)
continue;
- if (!strcmp(app_id, out->app_id))
+ if (ivi_layout_find_output_with_app_id(app_id, out))
return out;
}
-
return NULL;
}
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);
if (surf->hidden_layer_output &&
surf->hidden_layer_output != ivi_output) {
weston_layer_entry_remove(&ev->layer_link);
+ weston_view_geometry_dirty(ev);
+ weston_surface_damage(ev->surface);
- if (ivi_output->area.width != surf->hidden_layer_output->area.width &&
+ if (ivi_output->area.width != surf->hidden_layer_output->area.width ||
ivi_output->area.height != surf->hidden_layer_output->area.height) {
weston_desktop_surface_set_maximized(dsurf, true);
weston_desktop_surface_set_size(dsurf,
struct ivi_output *remote_output =
ivi_layout_find_with_app_id(app_id, ivi);
+ weston_log("Changed activation for app_id %s, type %s, on output %s\n", app_id,
+ ivi_layout_get_surface_role_name(surf), output->output->name);
+
/* if already active on a remote output do not
* attempt to activate it again */
if (remote_output && remote_output->active == surf)
return;
}
+ /* the background surface is already "maximized" so we don't need to
+ * add to the hidden layer */
+ if (surf->role == IVI_SURFACE_ROLE_BACKGROUND) {
+ ivi_layout_activate_complete(output, surf);
+ return;
+ }
+
ivi_layout_add_to_hidden_layer(surf, output);
}
weston_view_geometry_dirty(view);
weston_surface_damage(view->surface);
}
+
+ shell_send_app_state(ivi, app_id, AGL_SHELL_APP_STATE_DEACTIVATED);
}