]> git.mdlowis.com Git - proto/labwc.git/commitdiff
SnapToRegion: Add regions_from_cursor()
authorConsolatis <35009135+Consolatis@users.noreply.github.com>
Wed, 6 Jul 2022 15:26:22 +0000 (17:26 +0200)
committerConsolatis <35009135+Consolatis@users.noreply.github.com>
Wed, 11 Jan 2023 17:52:24 +0000 (18:52 +0100)
include/regions.h
src/regions.c

index 7b9b224153719a0bc195233b99b23a2c9f3639e7..5717d4f8ba843a9a83219231380b2eaf40fdb8a9 100644 (file)
@@ -30,6 +30,7 @@ void regions_init(struct server *server, struct seat *seat);
 void regions_update(struct output *output);
 void regions_destroy(struct wl_list *regions);
 
+struct region *regions_from_cursor(struct server *server);
 struct region *regions_from_name(const char *region_name, struct output *output);
 
 #endif /* __LABWC_REGIONS_H */
index 4b299730bdecaf3828c09339457a1ea0da0f497e..e7063d95d2c9ecf4c80f0027667c049cf6769737 100644 (file)
@@ -3,6 +3,7 @@
 #define _POSIX_C_SOURCE 200809L
 #include <assert.h>
 #include <float.h>
+#include <math.h>
 #include <string.h>
 #include <wlr/types/wlr_scene.h>
 #include <wlr/util/box.h>
@@ -39,6 +40,37 @@ regions_from_name(const char *region_name, struct output *output)
        return NULL;
 }
 
+struct region *
+regions_from_cursor(struct server *server)
+{
+       assert(server);
+       double lx = server->seat.cursor->x;
+       double ly = server->seat.cursor->y;
+
+       struct wlr_output *wlr_output = wlr_output_layout_output_at(
+               server->output_layout, lx, ly);
+       struct output *output = output_from_wlr_output(server, wlr_output);
+       if (!output) {
+               return NULL;
+       }
+
+       double dist;
+       double dist_min = DBL_MAX;
+       struct region *closest_region = NULL;
+       struct region *region;
+       wl_list_for_each(region, &output->regions, link) {
+               if (wlr_box_contains_point(&region->geo, lx, ly)) {
+                       /* No need for sqrt((x1 - x2)^2 + (y1 - y2)^2) as we just compare */
+                       dist = pow(region->center.x - lx, 2) + pow(region->center.y - ly, 2);
+                       if (dist < dist_min) {
+                               closest_region = region;
+                               dist_min = dist;
+                       }
+               }
+       }
+       return closest_region;
+}
+
 void
 regions_update(struct output *output)
 {