mirror of
https://github.com/Trensa-Organization/hy3.git
synced 2025-03-16 03:03:40 +01:00
Fix: Only look for nodes on neighbor monitor in correct direction
Use last-focused-window when navigating to monitor by direction if it has same relative position as the logically closest window
This commit is contained in:
parent
0e9077ec3d
commit
bca5a9dbd2
2 changed files with 29 additions and 2 deletions
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
- Implement `resizeactivewindow` for floating windows
|
- Implement `resizeactivewindow` for floating windows
|
||||||
- Fully implement `resizeactivewindow` for tiled windows
|
- Fully implement `resizeactivewindow` for tiled windows
|
||||||
- Add `hy3:resizenode` dispatcher, drop-in replacement for `resizeactivewindow` applied at the Hy3 group level.
|
- `hy3:resizenode` added, drop-in replacement for `resizeactivewindow` applied to a whole node.
|
||||||
- Implement keyboard-based focusing for floating windows
|
- Implement keyboard-based focusing for floating windows
|
||||||
- Implement keyboard-based movement for floating windows
|
- Implement keyboard-based movement for floating windows
|
||||||
- Add configuration `kbd_shift_delta` providing delta [in pixels] for shift
|
- Add configuration `kbd_shift_delta` providing delta [in pixels] for shift
|
||||||
|
|
|
@ -1078,8 +1078,14 @@ CWindow* getWindowInDirection(CWindow* source, ShiftDirection direction, bool co
|
||||||
const auto current_surface_box = source->getWindowMainSurfaceBox();
|
const auto current_surface_box = source->getWindowMainSurfaceBox();
|
||||||
auto target_distance = Distance { direction };
|
auto target_distance = Distance { direction };
|
||||||
|
|
||||||
|
// TODO: Don't assume that source window is on focused monitor
|
||||||
|
// BUG: This will only find windows on the immediately neighbouring monitor, it won't find any on
|
||||||
|
// the neighbour's neighbour if the immediate neighbour happens to be empty
|
||||||
|
CMonitor* other_monitor = considerOtherMonitors ? g_pCompositor->getMonitorInDirection(directionToChar(direction))
|
||||||
|
: nullptr;
|
||||||
|
|
||||||
auto isCandidate = [=, mon = source->m_iMonitorID](CWindow* w) {
|
auto isCandidate = [=, mon = source->m_iMonitorID](CWindow* w) {
|
||||||
return (considerOtherMonitors || w->m_iMonitorID == mon)
|
return (w->m_iMonitorID == mon || (other_monitor && w->m_iMonitorID == other_monitor->ID))
|
||||||
&& ((considerFloating && w->m_bIsFloating) || (considerTiled && !w->m_bIsFloating) || (w->m_iMonitorID != mon))
|
&& ((considerFloating && w->m_bIsFloating) || (considerTiled && !w->m_bIsFloating) || (w->m_iMonitorID != mon))
|
||||||
&& w->m_bIsMapped
|
&& w->m_bIsMapped
|
||||||
&& w->m_iX11Type != 2
|
&& w->m_iX11Type != 2
|
||||||
|
@ -1100,6 +1106,27 @@ CWindow* getWindowInDirection(CWindow* source, ShiftDirection direction, bool co
|
||||||
}
|
}
|
||||||
|
|
||||||
hy3_log(LOG, "getWindowInDirection: closest window to {} is {}", source, target_window);
|
hy3_log(LOG, "getWindowInDirection: closest window to {} is {}", source, target_window);
|
||||||
|
|
||||||
|
// If the closest window is on a different monitor and the nearest edge has the same position
|
||||||
|
// as the last focused window on that monitor's workspace then choose the last focused window instead
|
||||||
|
if(target_window && other_monitor && target_window->m_iMonitorID == other_monitor->ID) {
|
||||||
|
auto new_workspace = g_pCompositor->getWorkspaceByID(other_monitor->activeWorkspace);
|
||||||
|
if(new_workspace) {
|
||||||
|
auto last_focused = new_workspace->getLastFocusedWindow();
|
||||||
|
if(last_focused) {
|
||||||
|
auto target_bounds = CBox(target_window->m_vRealPosition.vec(), target_window->m_vRealSize.vec());
|
||||||
|
auto last_focused_bounds = CBox(last_focused->m_vRealPosition.vec(), last_focused->m_vRealSize.vec());
|
||||||
|
if((direction == ShiftDirection::Left && target_bounds.x + target_bounds.w == last_focused_bounds.x + last_focused_bounds.w)
|
||||||
|
|| (direction == ShiftDirection::Right && target_bounds.x == last_focused_bounds.x)
|
||||||
|
|| (direction == ShiftDirection::Up && target_bounds.y + target_bounds.h == last_focused_bounds.y + last_focused_bounds.h)
|
||||||
|
|| (direction == ShiftDirection::Down && target_bounds.y == last_focused_bounds.y)) {
|
||||||
|
target_window = last_focused;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return target_window;
|
return target_window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue