使用 DBUS 启动和控制 konsole

作者:Mitch Frazier

之前我写过一篇关于使用 dcop 自动创建多个 konsoles 的文章。 虽然当时我们已经进入 KDE4 时代,但我还没有升级,因为 KDE4 仍然存在一些问题尚未解决。现在这些问题大多已经修复,所以我已将一些系统升级到 KDE4,这意味着现在需要更新原始代码以使用 dbus。

我最初尝试使用dbus-send但在使用它没有取得太大进展后,我尝试使用qdbus相反,这证明更容易使用。在为 KDE4 重新实现此代码时,我还发现 Konsole 的 dbus 接口中存在一些尚未完全工作的问题

  • 目前还无法在另一个 konsole 窗口中启动新的 konsole,所有新的 konsoles 都出现在当前的 konsole 中。 我原来的代码创建了一个全新的 konsole 窗口,并在其中填充了新的 konsoles。 由于此功能尚未实现,因此该功能已被删除。
  • 使用特定的“Schema”(模式)启动控制台也尚未实现。执行此操作的代码仍然在下面的示例中,但已注释掉。另请注意,在 KDE4 中,schemas 已被“profiles”(配置文件)取代。
  • 目前还没有办法使用 dbus 激活特定的会话。

顶部是我想要启动的 konsoles 的定义。这是一个数组,其中每个 konsole 由数组中的 3 个条目定义:第一个是我想赋予 konsole 标签的名称,第二个是要使用的配置文件(目前被忽略,因为这不起作用),第三个是在 konsole 中执行的初始命令。

sessions=(
    sh1   $profile   'clear; bash'
    sh1   $profile   'clear; bash'
    su1   $profile   'clear; su'
    ssh1  $profile   'clear; ssh 127.0.0.1'
    )

之后是start_sessions函数,它与 KDE3 版本的原始函数非常相似,主要区别在于它调用qdbus而不是dcop与 konsole 交互。要创建一个新的会话,它会执行

        # Starting with a specific profile appears to be broken.
        #local session_num=$(qdbus org.kde.konsole /Konsole newSession $profile $HOME)
        local session_num=$(qdbus org.kde.konsole /Konsole newSession)
        sleep 0.1

您会注意到,包含配置文件的调用已注释掉,因为该调用在 KDE4/Konsole 中仍然不起作用。

要设置会话的标题,它会执行

        qdbus org.kde.konsole /Sessions/$session_num setTitle 0 $name
        sleep 0.1
        qdbus org.kde.konsole /Sessions/$session_num setTitle 1 $name
        sleep 0.1

标题 "0" 似乎是初始标题,标题 "1" 是在执行命令后使用的标题。 因此,如果您不设置标题 "1",则在您每次输入命令后,选项卡标题都会更改。

要设置新 konsole 要运行的命令,您可以将 text 发送到它

        qdbus org.kde.konsole /Sessions/$session_num sendText "$command"
        sleep 0.1
        qdbus org.kde.konsole /Sessions/$session_num sendText $'\n'
        sleep 0.1

第二个 send 发送一个换行符,因此 konsole 实际执行该命令。

脚本的主要部分询问您是否要创建 konsoles 并执行start_sessions如果您用类似于 yes 的答案回答。启动会话后,它会激活第一个会话。正如我上面提到的,没有办法激活特定的会话,因此代码通过多次激活“上一个”会话来激活第一个会话。

    # Activate first session.
    while [[ $nsessions -gt 1 ]]
    do
        qdbus org.kde.konsole /Konsole prevSession
        let nsessions--
    done

运行此程序,您应该得到一个konsole看起来像这样的窗口

konsoles.jpg

完整的代码如下

#!/bin/bash
#
# Create my standard konsole windows.

if [[ ! "$profile" ]]; then
    profile=Shell
fi

sessions=(
    sh1   $profile   'clear; bash'
    sh1   $profile   'clear; bash'
    su1   $profile   'clear; su'
    ssh1  $profile   'clear; ssh 127.0.0.1'
    )

nsessions=0

#####################################################################
# Start sessions in konsole.
function start_sessions()
{
    local session_count=${#sessions[*]}
    local i=0

    while [[ $i -lt $session_count ]]
    do
        local name=${sessions[$i]}
        let i++
        local profile=${sessions[$i]}
        let i++
        local command=${sessions[$i]}
        let i++

        echo "Creating $name: $command"
        # Starting with a specific profile appears to be broken.
        #local session_num=$(qdbus org.kde.konsole /Konsole newSession $profile $HOME)
        local session_num=$(qdbus org.kde.konsole /Konsole newSession)
        sleep 0.1
        qdbus org.kde.konsole /Sessions/$session_num setTitle 0 $name
        sleep 0.1
        qdbus org.kde.konsole /Sessions/$session_num setTitle 1 $name
        sleep 0.1
        qdbus org.kde.konsole /Sessions/$session_num sendText "$command"
        sleep 0.1
        qdbus org.kde.konsole /Sessions/$session_num sendText $'\n'
        sleep 0.1

        let nsessions++
    done
}

read -p "Create konsoles? " ans
if [[ "${ans:0:1}" == 'y' ]]; then
    start_sessions

    # Activate first session.
    while [[ $nsessions -gt 1 ]]
    do
        qdbus org.kde.konsole /Konsole prevSession
        let nsessions--
    done
fi


# vim: tabstop=4: shiftwidth=4: noexpandtab:
# kate: tab-width 4; indent-width 4; replace-tabs false;

Mitch Frazier 是艾默生电气公司的一名嵌入式系统程序员。 自 2000 年代初期以来,Mitch 一直是 Linux Journal 的贡献者和朋友。

加载 Disqus 评论