使用DCOP启动和控制 konsole
我喜欢在我的终端 (konsole) 窗口中打开很多标签页:几个标准 shell,几个sushell,还有一些ssh连接到我经常访问的其他系统。 KDE 可以通过其会话功能记住一些这些设置,但它并不总是记住我想要的所有内容,有时它会记住我希望它忘记的内容。所以,为了获得我的标准标签页,我使用 DCOP 在我想要的时间启动我想要的东西。
DCOP (桌面通信协议) 是一种允许应用程序互操作的协议。 DCOP 有一个命令行工具来使用它,当然,名为dcop。请注意,DCOP 已在 KDE4 中被 D-Bus (桌面总线) 取代,因此如果您已迁移到 KDE4,这将对您没有任何好处。
这个想法是创建一个脚本,创建我想要创建的 konsole 标签页。 首先是 library 函数。 有三个函数
create_konsole- 启动一个新的konsole副本,并返回它的 DCOP ID。
wait_for_session- 等待直到指定konsole中的会话计数(即标签页计数)达到某个值。 这用于确保最近创建的会话在尝试与之交互之前已实际启动。
start_sessions- 使用全局sessions数组来启动会话列表。 该数组包含每个会话的三个项目
- 会话名称
- 会话的 schema
- 要在会话中运行的命令
库代码如下
#!/bin/bash
#
# Functions from creating konsoles.
#####################################################################
# Create new console.
function create_konsole()
{
local basename=$(date +"%H%M%N")
local name=$basename"_konsoleX1_"
local kstart_options=$1
local konsole_options=$2
kstart $kstart_options --window $name konsole $konsole_options --script -T $name >/dev/null 2>&1
local konsole_id=konsole-$(ps aux | grep konsole | grep -v grep | grep $name | awk '{print $2}')
echo $konsole_id
}
#####################################################################
# Wait to make sure the session count equals $1.
function wait_for_session()
{
local konsole_id=$1
local count=$2
local session_count=$(dcop $konsole_id konsole sessionCount 2>/dev/null)
while [[ $session_count -ne $count ]]
do
sleep 0.1
session_count=$(dcop $konsole_id konsole sessionCount)
done
}
#####################################################################
# Start sessions in konsole.
function start_sessions()
{
local konsole_id=$1
local nsessions=1
local session_count=${#sessions[*]}
local i=0
while [[ $i -lt $session_count ]]
do
local name=${sessions[$i]}
let i++
local schema=${sessions[$i]}
let i++
local command=${sessions[$i]}
let i++
dcop $konsole_id $session_id renameSession "$name"
sleep 0.1
dcop $konsole_id $session_id setSchema "$schema"
sleep 0.1
dcop $konsole_id $session_id sendSession "$command"
sleep 0.1
if [[ $i -lt $session_count ]]; then
let nsessions++
local session_id=$(dcop $konsole_id konsole newSession)
wait_for_session $konsole_id $nsessions
fi
done
}
# vim: tabstop=4: shiftwidth=4: noexpandtab:
# kate: tab-width 4; indent-width 4; replace-tabs false;
在create_konsole我们使用命令启动新的 konsole
kstart $kstart_options --window $name konsole $konsole_options --script -T $name >/dev/null 2>&1
这使用kstart启动konsole使用已知的窗口名称,以便我们可以通过下一行中的一些 ps/grep 操作来获取其名称。
在start_sessions,我们使用dcop重命名会话
dcop $konsole_id $session_id renameSession "$name"
设置会话的 schema
dcop $konsole_id $session_id setSchema "$schema"
并向会话发送命令
dcop $konsole_id $session_id sendSession "$command"
在函数末尾,如果还有更多会话要创建,我们也会使用dcop启动另一个会话
local session_id=$(dcop $konsole_id konsole newSession)
在我们的主脚本中,我们需要定义我们想要的会话。 对于此示例,我们将启动两个标准 shell,一个sushell 和一个ssh连接
sessions=(
sh1 $schema 'clear; bash'
sh1 $schema 'clear; bash'
su1 $schema 'clear; su'
ssh1 $schema 'clear; ssh 127.0.0.1'
)
这里的schema变量设置为我们想要的标签页的*.schema文件。 整个脚本是konsole步骤是
#!/bin/bash
#
# Create my standard konsole windows.
source ~/bin/konsoles.sh
if [[ ! "$schema" ]]; then
#schema=XTerm.schema
#schema=BlackOnLightColor.schema
#schema=Linux.schema
#schema=GreenTint.schema
#schema=syscolor.schema
#schema=LightPicture.schema
#schema=DarkPicture.schema
schema=GreenOnBlack.schema
#schema=BlackOnLightYellow.schema
#schema=LightPaper.schema
#schema=WhiteOnBlack.schema
#schema=BlackOnWhite.schema
#schema=Transparent.schema
#schema=Transparent_MC.schema
#schema=Transparent_lightbg.schema
#schema=GreenTint_MC.schema
#schema=vim.schema
#schema=Transparent_darkbg.schema
fi
sessions=(
sh1 $schema 'clear; bash'
sh1 $schema 'clear; bash'
su1 $schema 'clear; su'
ssh1 $schema 'clear; ssh 127.0.0.1'
)
konsole_id=$(create_konsole '--iconify')
wait_for_session 1
session_id=$(dcop $konsole_id konsole currentSession)
first_session_id=$session_id
start_sessions $konsole_id
dcop $konsole_id konsole activateSession $first_session_id
sleep 0.1
dcop $konsole_id 'konsole-mainwindow#1' restore
sleep 0.1
dcop $konsole_id 'konsole-mainwindow#1' setGeometry 100 100 600 400
# vim: tabstop=4: shiftwidth=4: noexpandtab:
# kate: tab-width 4; indent-width 4; replace-tabs false;
- 这些步骤是:
- 调用create_konsole创建初始控制台并等待它准备就绪。 窗口以图标化方式创建。
- 使用dcop获取创建的第一个会话的会话 ID。 我们在创建所有其他会话之后使用它来激活第一个会话。
- 调用start_sessions在我们的sessions数组中创建会话。
- 使用dcop激活创建的第一个会话。
- 使用dcop恢复主窗口。
- 使用dcop调整主窗口的大小和位置。
运行主脚本,您应该得到一个看起来像konsole窗口
