diff --git a/include/labwc.h b/include/labwc.h index 1d383d1f..9f728a00 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -309,6 +309,8 @@ struct output { 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; diff --git a/src/output.c b/src/output.c index a43bc097..b30ba643 100644 --- a/src/output.c +++ b/src/output.c @@ -19,6 +19,7 @@ #include "labwc.h" #include "layers.h" #include "node.h" +#include "regions.h" #include "view.h" static void @@ -40,6 +41,7 @@ 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); @@ -148,6 +150,8 @@ new_output_notify(struct wl_listener *listener, void *data) 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. @@ -446,6 +450,7 @@ void output_update_usable_area(struct output *output) { if (update_usable_area(output)) { + regions_update(output); desktop_arrange_all_views(output->server); } } @@ -457,7 +462,12 @@ output_update_all_usable_areas(struct server *server, bool layout_changed) 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); diff --git a/src/regions.c b/src/regions.c index 2b8ea87a..52d2c5d3 100644 --- a/src/regions.c +++ b/src/regions.c @@ -8,6 +8,7 @@ #include #include #include "common/graphic-helpers.h" +#include "common/list.h" #include "common/mem.h" #include "labwc.h" #include "regions.h" @@ -27,7 +28,34 @@ regions_init(struct server *server, struct seat *seat) 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