上游反馈 · 待提交积攒本

用途:把”本机踩到的、值得反馈给上游的”问题攒在这里,攒够一批一起提(或让 opencode 一次起草/批量提交)。 每条都写到可以直接粘贴进 Bugzilla 的程度:复现步骤 + 根因代码位置 + 建议补丁 + 临时绕法。 提交目标一般写在对应组件的 metadata.json 的 BugReportUrl 里(下面每条都标了)。


1. 虚拟桌面分页器(Pager)没有「布局:水平/竖直」选项,只有活动分页器有

  • 状态:草稿(2026-09-17 记录)
  • 目标:KDE Bugzilla → product plasmashell,component Pager widget (来源:/usr/share/plasma/plasmoids/org.kde.plasma.activitypager/metadata.json 的 BugReportUrl)
  • 环境:Plasma 6.7.5 / plasma-desktop 6.7.5-1.1 / KWin Wayland(CachyOS)
  • 类型:wishlist(功能缺失),非崩溃

复现步骤

  1. 新建一个竖直面板(或把现有面板设为竖直),保持 KWin 虚拟桌面数为 2、行数为 1(默认)。
  2. 往面板里放两个部件:「活动切换器」和「虚拟桌面切换器」。
  3. 分别右键 → 配置:
    • 活动切换器:能看到 布局(Layout):默认 / 水平 / 竖直 下拉框。
    • 虚拟桌面切换器:没有这个下拉框。

期望

虚拟桌面分页器也能显式选择”竖直”,从而在竖直面板里排成一列(而不是跟随 KWin 网格)。

实际

  • 配置界面里该下拉框被隐藏;
  • 即使手改 ~/.config/plasma-org.kde.plasma.desktop-appletsrc 给分页器加 pagerLayout=Vertical,也不生效。

根因(代码位置)

两者其实是同一份实现:org.kde.plasma.activitypager 只是 metadata 薄壳 ("X-Plasma-RootPath": "org.kde.plasma.pager"),实现在 plasma-desktop: applets/pager/(QML 编译进 org.kde.plasma.pager.so 的 qrc)。

上游在两处用 applet id 把它锁成”活动专用”:

// applets/pager/qml/configGeneral.qml
readonly property bool isActivityPager: Plasmoid.pluginName === "org.kde.plasma.activitypager"
...
QQC2.ComboBox {
    id: pagerLayout
    Kirigami.FormData.label: i18nc("@title:listbox", "Layout:")
    model: [ "Default", "Horizontal", "Vertical" ]
    visible: root.isActivityPager          // ← 非活动分页器即隐藏
}
// applets/pager/qml/main.qml  (pagerItemGrid.effectiveRows)
if (root.isActivityPager && Plasmoid.configuration.pagerLayout !== 0 /*Default*/) {
    if (Plasmoid.configuration.pagerLayout === 1 /*Horizontal*/) rows = 1;
    else if (Plasmoid.configuration.pagerLayout === 2 /*Vertical*/) rows = pagerModel.count;
} else {
    // 自动:按 KWin 虚拟桌面网格算行列
    let columns = Math.floor(pagerModel.count / pagerModel.layoutRows());
    ...
}
// applets/pager/pagermodel.cpp
int PagerModel::layoutRows() const {
    const int rows = std::min(d->virtualDesktopInfo->desktopLayoutRows(),
                              d->virtualDesktopInfo->numberOfDesktops());
    return std::max(1, rows);   // ← 就是 KWin 的 [Desktops] Rows
}

历史:pagerLayout 是 2016-10 为活动分页器引入的 (commit 2a5580d4 “Improve Activity Pager Layout for horizontal and vertical cases”,BUG 367990); 2016-09 两个 applet 合并为一个实现(commit 4b9d8046,Eike Hein),此后该选项一直只对活动分页器可见/生效。

建议补丁(方向)

把两处 root.isActivityPager 门控放开为”用户显式选了非 Default 就生效”,例如:

  • configGeneral.qml:删掉 visible: root.isActivityPager(或改为在 Default 时提示”跟随 KWin 网格”)。
  • main.qml:把条件改成 Plasmoid.configuration.pagerLayout !== 0 即生效(活动/虚拟桌面通用)。

注意 Default 语义应保持”跟随 KWin 网格”,避免改变老用户行为。

临时绕法(无需上游改动)

  1. 把 KWin 的虚拟桌面行数改成等于桌面数:系统设置 → 虚拟桌面 → 行数(~/.config/kwinrc → [Desktops] Rows)。 例:2 个桌面设 Rows=2 → 网格 2 行 × 1 列 → 分页器自动变竖条。 ⚠️ 这是全局设置,也会影响桌面切换动画与桌面网格自身布局。
  2. 用「活动切换器」(它本来就支持竖直),但它切的是活动,不是虚拟桌面。

新条目模板

## N. <一句话标题>
- **状态**:草稿 / 已提(链接) / 上游已修(版本)
- **目标**:product / component(取自 metadata.json 的 BugReportUrl)
- **环境**:Plasma 版本 / 发行版 / 会话类型(X11/Wayland)
- **类型**:bug / wishlist / performance
### 复现步骤 / ### 期望 / ### 实际 / ### 根因(代码位置)/ ### 建议补丁 / ### 临时绕法