This patch moves the corner action zones right into the very corners, which makes them much easier to use.
In the image below, the left shows how it is now. If you move your mouse into the gap between areas then a split/join/swap cannot happen.
This patch makes it as seen on the right, where the actionzones slightly overflow their areas and meet in the middle. So there is no longer an area in between that you have to avoid.
This does make the splitting/joining/swapping much easier to do. But it does, obviously, make it so you cannot do resizing at that spot in the edge. I personally don't see an issue with that but you might have different ideas.
The only complication with this is that for all these actions we need to know which areas were are intending to affect, but the space between areas is not an area. So some of the existing code would not support a drag starting from a gap position.
The first part of the patch simply alters one side of each corner zone to go into the corners a bit so they touch in the middle.
Then there are two little helper functions added. One that finds an actionzone by position, regardless of area. And the other returns the area that an azone belongs to.
actionzone_area_poll - check if we are inside any actionzone, not just current one
actionzone_invoke - need to save actionzone to sad.sa1, even if current mouse position is in gap
actionzone_modal - check for actionzone regardless of mouse position
When the operation turns into a possible join we call area_join_invoke. It would save the original mouse down position, and current mouse position, so that area_join_init knows what to work on. That would fail if either mouse position was in the gap. However, in that same section of code we already know the two areas we are joining so I just pass the positions of those areas instead, which makes more sense and covers this problem.