--- a/plugins/single_plugins/oswitch.cpp +++ b/plugins/single_plugins/oswitch.cpp @@ -50,18 +50,24 @@ if (contains(zone.geometry, pointer.x, pointer.y)) current = &zone; if (!current) return; const wf::output_stitch_zone_t *next = nullptr; + const wf::output_stitch_zone_t *wrap = current; double distance = std::numeric_limits::max(); double origin = current->geometry.x + current->geometry.width / 2.0; for (const auto& zone : layout->zones) { - double delta = direction * (zone.geometry.x + zone.geometry.width / 2.0 - origin); + double center = zone.geometry.x + zone.geometry.width / 2.0; + double wrap_center = wrap->geometry.x + wrap->geometry.width / 2.0; + if (direction * center < direction * wrap_center) wrap = &zone; + double delta = direction * (center - origin); if (delta > 0 && delta < distance) { next = &zone; distance = delta; } } - if (!next) return; + // At an outer edge, continue from the opposite horizontal edge. + if (!next) next = wrap; + if (next == current) return; auto region = next->geometry; wayfire_toplevel_view focus = nullptr; uint64_t newest = 0;