使用 DBUS 启动和控制 konsole
之前我写过一篇关于使用 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看起来像这样的窗口

完整的代码如下
#!/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;