Make dock pager follow keyboard focus order

Keep keyboard navigation aligned with the compact desktop pager group. Right from the Desktop button now enters the pager, pager buttons expose accessible activation, and focus continues into dock content after the last desktop.
This commit is contained in:
Marco Allegretti 2026-05-29 11:11:59 +02:00
parent 2aae067337
commit b80c878487
2 changed files with 64 additions and 16 deletions

View file

@ -299,6 +299,30 @@ MouseArea {
return "" return ""
} }
function focusFirstDockContent() {
let firstPager = leftPagerRepeater.itemAt(0)
if (firstPager) { firstPager.forceActiveFocus(); return }
root.focusAfterPager()
}
function focusAfterPager() {
let first = repeater.itemAt(0)
if (first) { first.keyboardFocus(); return }
let firstTask = taskRepeater.itemAt(0)
if (firstTask) { firstTask.forceActiveFocus(); return }
searchButton.forceActiveFocus()
}
function focusBeforeSearch() {
let lastTask = taskRepeater.itemAt(taskRepeater.count - 1)
if (lastTask) { lastTask.forceActiveFocus(); return }
let lastFav = repeater.itemAt(repeater.count - 1)
if (lastFav) { lastFav.keyboardFocus(); return }
let lastPager = leftPagerRepeater.itemAt(leftPagerRepeater.count - 1)
if (lastPager) { lastPager.forceActiveFocus(); return }
desktopButton.forceActiveFocus()
}
function runningTaskStorageId(taskModel) { function runningTaskStorageId(taskModel) {
var id = taskModel ? taskModel.AppId || "" : "" var id = taskModel ? taskModel.AppId || "" : ""
if (id && !id.endsWith(".desktop")) if (id && !id.endsWith(".desktop"))
@ -441,13 +465,7 @@ MouseArea {
Keys.onEnterPressed: desktopButton.toggleDesktop() Keys.onEnterPressed: desktopButton.toggleDesktop()
Keys.onSpacePressed: desktopButton.toggleDesktop() Keys.onSpacePressed: desktopButton.toggleDesktop()
Keys.onLeftPressed: homeButton.forceActiveFocus() Keys.onLeftPressed: homeButton.forceActiveFocus()
Keys.onRightPressed: { Keys.onRightPressed: root.focusFirstDockContent()
let first = repeater.itemAt(0)
if (first) { first.keyboardFocus(); return }
let firstTask = taskRepeater.itemAt(0)
if (firstTask) { firstTask.forceActiveFocus(); return }
searchButton.forceActiveFocus()
}
KeyboardHighlight { KeyboardHighlight {
anchors.fill: parent anchors.fill: parent
@ -615,13 +633,7 @@ MouseArea {
Keys.onReturnPressed: root.folio.HomeScreenState.openSearchWidget() Keys.onReturnPressed: root.folio.HomeScreenState.openSearchWidget()
Keys.onEnterPressed: root.folio.HomeScreenState.openSearchWidget() Keys.onEnterPressed: root.folio.HomeScreenState.openSearchWidget()
Keys.onSpacePressed: root.folio.HomeScreenState.openSearchWidget() Keys.onSpacePressed: root.folio.HomeScreenState.openSearchWidget()
Keys.onLeftPressed: { Keys.onLeftPressed: root.focusBeforeSearch()
let lastTask = taskRepeater.itemAt(taskRepeater.count - 1)
if (lastTask) { lastTask.forceActiveFocus(); return }
let lastFav = repeater.itemAt(repeater.count - 1)
if (lastFav) { lastFav.keyboardFocus(); return }
desktopButton.forceActiveFocus()
}
Keys.onRightPressed: overviewButton.forceActiveFocus() Keys.onRightPressed: overviewButton.forceActiveFocus()
KeyboardHighlight { KeyboardHighlight {
@ -701,6 +713,36 @@ MouseArea {
y: 0 y: 0
width: root.pagerButtonWidth width: root.pagerButtonWidth
height: root.height height: root.height
activeFocusOnTab: root.showPager
function activateDesktop() {
if (leftDesktopBtn.desktopId) {
root.folio.activateVirtualDesktop(leftDesktopBtn.desktopId)
}
}
Accessible.role: Accessible.Button
Accessible.name: root.pagerDesktopName(leftDesktopBtn.index)
Accessible.onPressAction: leftDesktopBtn.activateDesktop()
Keys.onReturnPressed: leftDesktopBtn.activateDesktop()
Keys.onEnterPressed: leftDesktopBtn.activateDesktop()
Keys.onSpacePressed: leftDesktopBtn.activateDesktop()
Keys.onLeftPressed: {
let previous = leftPagerRepeater.itemAt(index - 1)
if (previous) { previous.forceActiveFocus(); return }
desktopButton.forceActiveFocus()
}
Keys.onRightPressed: {
let next = leftPagerRepeater.itemAt(index + 1)
if (next) { next.forceActiveFocus(); return }
root.focusAfterPager()
}
KeyboardHighlight {
anchors.fill: parent
visible: leftDesktopBtn.activeFocus
}
MobileShell.MotionStateLayer { MobileShell.MotionStateLayer {
anchors.fill: parent anchors.fill: parent
@ -738,8 +780,8 @@ MouseArea {
root.hideDockToolTip(leftDesktopBtn) root.hideDockToolTip(leftDesktopBtn)
if (mouse.button === Qt.RightButton) { if (mouse.button === Qt.RightButton) {
leftPagerContextMenu.open() leftPagerContextMenu.open()
} else if (leftDesktopBtn.desktopId) { } else {
root.folio.activateVirtualDesktop(leftDesktopBtn.desktopId) leftDesktopBtn.activateDesktop()
} }
} }
onPressAndHold: { onPressAndHold: {

View file

@ -92,6 +92,12 @@ require_line "$favourites_bar" "readonly property int pagerLeftCount: showPager
require_line "$favourites_bar" "readonly property int pagerRightCount: 0" require_line "$favourites_bar" "readonly property int pagerRightCount: 0"
require_line "$favourites_bar" "readonly property real rightControlsWidth: convergenceMode ? navButtonWidth + searchButtonWidth + trashButtonWidth : 0" require_line "$favourites_bar" "readonly property real rightControlsWidth: convergenceMode ? navButtonWidth + searchButtonWidth + trashButtonWidth : 0"
require_line "$favourites_bar" "Virtual desktop pager: compact group next to the Desktop button" require_line "$favourites_bar" "Virtual desktop pager: compact group next to the Desktop button"
require_line "$favourites_bar" "function focusFirstDockContent()"
require_line "$favourites_bar" "Keys.onRightPressed: root.focusFirstDockContent()"
require_line "$favourites_bar" "Keys.onLeftPressed: root.focusBeforeSearch()"
require_line "$favourites_bar" "Accessible.name: root.pagerDesktopName(leftDesktopBtn.index)"
require_line "$favourites_bar" "Keys.onRightPressed: {"
require_line "$favourites_bar" "root.focusAfterPager()"
if grep -Fq "Math.ceil(virtualDesktopInfo.numberOfDesktops / 2)" "$favourites_bar"; then if grep -Fq "Math.ceil(virtualDesktopInfo.numberOfDesktops / 2)" "$favourites_bar"; then
echo "Desktop pager must not split virtual desktops between dock edges" >&2 echo "Desktop pager must not split virtual desktops between dock edges" >&2
exit 1 exit 1