struct wlr_scene_buffer *workspace_osd;
struct wlr_box usable_area;
+ struct wl_list regions; /* struct region.link */
+
struct lab_data_buffer *osd_buffer;
struct wl_listener destroy;
#include "labwc.h"
#include "layers.h"
#include "node.h"
+#include "regions.h"
#include "view.h"
static void
output_destroy_notify(struct wl_listener *listener, void *data)
{
struct output *output = wl_container_of(listener, output, destroy);
+ regions_destroy(&output->regions);
wl_list_remove(&output->link);
wl_list_remove(&output->frame.link);
wl_list_remove(&output->destroy.link);
output->frame.notify = output_frame_notify;
wl_signal_add(&wlr_output->events.frame, &output->frame);
+ wl_list_init(&output->regions);
+
/*
* Create layer-trees (background, bottom, top and overlay) and
* a layer-popup-tree.
output_update_usable_area(struct output *output)
{
if (update_usable_area(output)) {
+ regions_update(output);
desktop_arrange_all_views(output->server);
}
}
struct output *output;
wl_list_for_each(output, &server->outputs, link) {
- usable_area_changed |= update_usable_area(output);
+ if (update_usable_area(output)) {
+ usable_area_changed = true;
+ regions_update(output);
+ } else if (layout_changed) {
+ regions_update(output);
+ }
}
if (usable_area_changed || layout_changed) {
desktop_arrange_all_views(server);
#include <wlr/util/box.h>
#include <wlr/util/log.h>
#include "common/graphic-helpers.h"
+#include "common/list.h"
#include "common/mem.h"
#include "labwc.h"
#include "regions.h"
void
regions_update(struct output *output)
{
- /* To be filled later */
+ assert(output);
+
+ struct region *region;
+ struct wlr_box usable = output_usable_area_in_layout_coords(output);
+
+ /* Initialize regions */
+ if (wl_list_empty(&output->regions)) {
+ wl_list_for_each(region, &rc.regions, link) {
+ struct region *region_new = znew(*region_new);
+ /* Create a copy */
+ region_new->name = xstrdup(region->name);
+ region_new->percentage = region->percentage;
+ wl_list_append(&output->regions, ®ion_new->link);
+ }
+ }
+
+ /* Update regions */
+ struct wlr_box *perc, *geo;
+ wl_list_for_each(region, &output->regions, link) {
+ geo = ®ion->geo;
+ perc = ®ion->percentage;
+ geo->x = usable.x + usable.width * perc->x / 100;
+ geo->y = usable.y + usable.height * perc->y / 100;
+ geo->width = usable.width * perc->width / 100;
+ geo->height = usable.height * perc->height / 100;
+ region->center.x = geo->x + geo->width / 2;
+ region->center.y = geo->y + geo->height / 2;
+ }
}
void