疯狂的Windows manager---如何让多套WM同时启动,并疯狂测试及调试WM

各种窗口管理器和美化相关
回复
头像
ljj_jjl2008
论坛版主
帖子: 14255
注册时间: 2007-09-16 8:29

疯狂的Windows manager---如何让多套WM同时启动,并疯狂测试及调试WM

#1

帖子 ljj_jjl2008 » 2011-08-07 9:24

疯狂的Windows manager---如何让多套WM同时启动,并疯狂测试及调试WM?
先总结一下前三轮折腾:
1,通过debootstrap,依靠网络从ubuntu软件源安装最小化的ubuntu系统,并给系统安装了一个jwm+rox-filer的简单桌面
2,新一轮折腾:让系统启动完成后就一个黑屏幕,没有鼠标光标,没有面板,没有桌面,没有图标,没有任何菜单,可是还能用。
折腾出来一个openbox(窗口管理器)+trayer(独立托盘)+unclutter(隐藏鼠标光标)+apwal(图形化启动菜单)+kdocker(最小化程序到托盘)的环境。
3,再一次折腾:启动后把几个最常用的程序都自动启动起来,然后缩小窗口,布置在屏幕四周,鼠标点到谁谁就自动放大(其他的自动缩小)
折腾出来一个:特别配置的awesome。

第四轮折腾的思路来源于:
viewtopic.php?f=15&t=340641
现在内存这么大,cpu核心也不少。能不能从硬件上或软件上实现多系统并行呢?
这样切换系统就像切换桌面一样,可以随时关闭打开一个系统,可以随时休眠一个系统,可以一个Linux系统用这两个核心编译着程序,那两个核心开着水果做图。

技术难度方面不太懂,不过我觉得能实现还是比较值得的。
大家有什么技术上的或应用上的想法?

高人,闲人,都来说说吧。
我没有那个帖子里面那么伟大的思想。我只是想在一个桌面上不用虚拟机开两套linux的WM。(不是tty7上开一个WM,tty8上面再开一个那种,那个没有什么意思)
正好我前面折腾出3个环境了,本来折腾这些是为了给我住处的老爷机用的,可发现openbox的和awesome的我都比较喜欢,现在这两个环境我轮流着使用着,已经有取代原来kde环境用于日常工作的趋势了。可是这两个环境风格特色上差异也太大了,我于是有了这个想法。另外一个原因是我是在上班时间折腾这些的,可是我不能因此耽误我的工作,我在以后折腾新风格新wm时,希望有一个环境可以开着飞鸽(公司制度有规定,开机必须开飞鸽,随时联系),而且能处理公文,另一个环境随便折腾,所以折腾的同时必须要保证不要丢了飞鸽的信息,及时接收别人传递的文件。
目标:
一个虚拟桌面启动openbox风格的,一个虚拟桌面启动awesome风格的。
如果做不到,就以一个为主,另一个在一个独立窗口里面启动和运行。
如果还是做不到,就加一个按钮或命令,能够在不用关闭已经打开的程序和文件,也不注销的前提下,快速切换wm和风格。

同样还是暂时没有任何思路和办法,不知道怎么解决呀!
后来经过不停google,并用我那可怜的英语水平阅读着英语文档,借助google翻译那语法不通的翻译结果,忙了一天时间,终于找到了解决方案。

其实方法并不特别,只是借助了一个叫Xephyr的软件。

****先是知识培训****(高手跳过)

代码: 全选

sudo apt-get install xserver-xephyr
Xephyr is a X server that runs as a small window within your current X session.

Xephyr 是一个 Xnest 的替代产品,因为 Xnest 不提供现代 X server 的一些 高级特性,比如图形加速的支持。简而言之,Xephyr 是一个 X server,但是 它执行在一个存在的 X server 里面,这个可以用来做很多事情,比如需要通 过 XDMCP 连接到另外一台主机,那么不需要另外打开一个新的 X server;又 比如正在写一个 window manager,那么在一个 X server 里面打开的 X server 里面调试,将会比直接在现有的 X server 里面替换现有的 window manager 方便很多。对于热衷于更换自己的 window manager 的狂热爱好 者,Xephyr 提供了绝佳的试验环境。

Debian 里的 xserver-xephyr 包:

root@jianlee:~# dpkg -L xserver-xephyr
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/xserver-xephyr
/usr/share/doc/xserver-xephyr/changelog.gz
/usr/share/doc/xserver-xephyr/changelog.Debian.gz
/usr/share/doc/xserver-xephyr/copyright
/usr/share/doc/xserver-xephyr/README
/usr/bin
/usr/bin/Xephyr
运行 -help 获得帮助,基本的使用方式是 Xephyr :n -options。这里 :n 是 DISPLAY 的值,Xephyr 本身是一个 X client,也是一个 X server,它是 client 通过环境变量 DISPLAY 设置显示的 X server,这里的 :n 指定的是它 作为 X server 的序号,也就是说 X client 可以通过 -display 或者更改环 境变量。我们这里简单介绍一些其他的参数,如 -query 和 -indirect 可以用 来向打开了 XDMCP 的主机发送连接请求,-screen 指定屏幕大小,-fullscreen 全屏。

简单说,Xephyr作用就是在我们屏幕上开一个窗口(或全屏),当一个虚拟的屏幕使用,并可以指定这个虚拟屏幕的代号为 :n 。以后我们打开的图形界面的程序,直接打开的就是在真实屏幕上运行的,而用以下方式打开就会到新开的虚拟屏幕中运行了:

代码: 全选

Xephyr :n -options
DISPLAY=:n command 
我们关心的参数是:
-screen 1024x768x16/-fullscreen(屏幕大小色深/全屏:二选一)
-dpi 96 (dpi值)
:n (虚拟屏幕代号)
-name [name](屏幕名称)
-title [title](屏幕标题)
-noreset(不加此选项,最后一个图形界面的程序关闭后,窗口自动关闭。加上则需要手工关闭。)
-host-cursor(加上以后光标不会被虚拟屏幕里面的程序改变,即鼠标光标是固定样式的,但光标移动速度比较快。不加则光标会改变,但有时反应迟钝)
-keybd(设置键盘类型)
希望我画的这个简单的图能说明Xephyr的工作原理:

代码: 全选

                硬 件
                    |
               Xserver----------------
               |        |              |
          Xephyr1      WM1----      Xephyr2
               |        |       |       |
            WM2      soft1    soft2   WM3                  
               |                        |
             soft                     soft
一般linux要显示窗口和图形界面需要3层:Xserver(图形驱动)、WM(窗口管理器)和soft(图形界面软件)。并且两个WM不能并存,如果新启动起来一个WM,个必然会替代掉先前启动的那一个WM。
但是Xephyr在Xserver(图形驱动)和 WM(窗口管理器)中间加上了一层,让后来启动起来的WM看不见Xserver,而把对应的Xephyr当成Xserver,就不会替代掉前面启动的WM。所以我们启动多少Xephyr,就可以对应启动多少WM(只要你的机器撑得住)。

咋一看,这好像是一种虚拟机,其实这和虚拟机是有很大区别的:我们在Xephyr内的程序和在Xephyr外的程序其实都是实实在在的进程,如果Xephyr内外都运行了一个gedit,不管我们在哪里发出一个killall gedit命令,这两个gedit就都被kill掉了。

并且我google到这么一段很有趣的内容:
Xephyr是一个替代的Xnest嵌套X服务器上周提到。这些方案都提供了嵌套的X显示-到一个窗口父X服务器,而不是直接绘制到一个硬屏绘图-但他们在非常不同的方式完成这一。Xnest代理X请求到父服务器(实际上不是执行的操作本身),而Xephyr行为对每个请求和汲取到的X图像,然后将其显示在父服务器上的一个窗口 。
这意味着,Xephyr可以处理父服务器无法处理请求。例如,它可以提供渲染扩展,使客户能够快速显示消除锯齿的文本父显示即使没有渲染扩展。
并且通过测试发现:还真是这样,在Xephyr里面的chromium-browser的字体渲染比在外面的果然要好一些。
****测试环境、内容和结果****

测试的环境是上面提到的3个环境。具体看以下链接:
viewtopic.php?f=77&t=338764
测试前的准备:

代码: 全选

setxkbmap -query 
输出内容大致如下:
rules: evdev
model: pc105
layout: us
variant: euro
每一项的可选值和含义到这个文件去查:/usr/share/X11/xkb/rules/base.lst
如果内容是空或者明显是错误的,网上的说法是修改xorg.conf的键盘对应项的键值,可是我改了却不起作用。

代码: 全选

Section "InputDevice"
	Identifier  "Keyboard0"
	Driver      "kbd"
	Option "XkbLayout" "us"
    Option "XkbModel" "pc105"
    Option "XkbVariant" "euro"
EndSection
后来google到一个办法:修改文件 /etc/default/keyboard ,内容还是参照上面那个文件,不过如果是台式机,一般按我的这个设法就可以了。这个文件中有警告,是建议我们去xorg.conf里面去改。
改正确以后,记下这些值。
测试内容:
1,下面这写命令请写成shell文件(可执行权限),用各种方式调用(菜单、快捷键、命令行等),也可以放入WM的启动文件中自动启动,都可以启动Xephyr新环境,命令行如下:
(Xephyr这一行请根据需要来修改,比如键盘布局部分,比如加上-host-cursor等)

代码: 全选

Xephyr :3 -fullscreen -keybd ephyr,,,xkbmodel=pc105,xkblayout=us,xkbrules=evdev,xkboption=euro -noreset  -dpi 96 -ac -name awesome -title awesome &
sleep 4
#xkbcomp :0 :3 &
DISPLAY=:3 exec awesome &
DISPLAY=:3 geany &
DISPLAY=:3 dolphin &
DISPLAY=:3 sakura &
DISPLAY=:3 chromium-browser &
DISPLAY=:3 fcitx &

代码: 全选

Xephyr :4 -fullscreen -keybd ephyr,,,xkbmodel=pc105,xkblayout=us,xkbrules=evdev,xkboption=euro -noreset  -dpi 96 -ac -name openbox -title openbox &
sleep 5
#xkbcomp :0 :4 &
DISPLAY=:4 exec openbox-session &
DISPLAY=:4 fcitx &

代码: 全选

Xephyr :2 -fullscreen -keybd ephyr,,,xkbmodel=pc105,xkblayout=us,xkbrules=evdev,xkboption=euro -noreset  -dpi 96 -ac -name jwm -title jwm &
sleep 4 
#xkbcomp :0 :2 &
DISPLAY=:2 jwm &
DISPLAY=:2 rox-filer -p default &
DISPLAY=:2 fcitx &
测试结果:正常。
(1),需要在Xephyr中单独启动一个fcitx进程,才能输入汉字。我估计有的输入法不能同时开多个进程,就无法在这个环境中使用了。
(2),xkbcomp :0 :n的作用是调整Xephyr的键盘布局,这条指令是我花了接近3个小时才google到的,是最简单最有效的指令,如果不输入这条指令,Xephyr内的键盘是混乱的,很多按键都错位了。当时郁闷死了,还好最后找到了办法解决。
因为已经改变了Xephyr指令的写法,这句指令可以省略了-----2011.08.07 注
(3),等用指令启动起来在Xephyr中WM以后,利用WM的菜单(以及快捷键)打开的程序是在Xephyr窗口里面的,不能切换到Xephyr窗口外面去(如果Xephyr是全屏模式,其实也不行,只是看不出来了),并且是Xephyr里面WM的风格布局。
但也有例外,比如chromium,假如主WM里面已经开了一个chromium,Xephyr窗口里面再打开的chromium就会跑到主窗口来,反之则不跑出来。
(4),可以在openbox里面再次打开openbox,诸如此类,这主要用于调试,比如改了配置文件,担心出错,就可以这么先来一次看看效果。同样适用于awesome等。调试awesome的命令是:

代码: 全选

awesome -c ~/.config/awesome/rc.lua.new
(5),快捷键:主WM中的快捷键会覆盖Xephyr窗口WM中相同的快捷键,所以设置的快捷键不要冲突。
(6),软件设置:几个WM中打开的软件其实用的是一个~目录,一套设置文件,所以有时有点影响:在awesome中打开一次某个软件然后关闭,再到openbox里面打开他,往往发现这个软件就出现在awesome打开时布局到的位置和大小了,然后把他最大化,再关闭,在到awesome里面打开,软件很可能还是最大化状态,没有被自动布局,需要win-m切换一下。
(7),剪切板有问题:不能共享主WM中打开的全局剪切板,也不能在Xephyr窗口WM中开独立进程,Xephyr窗口WM没有全局剪切板可用。开另外一种类型的全局剪切板可用,但是我担心安全问题,没有开。与主WM共享剪切板有解决方案,如下:
(发现问题:如果一次复制成千上万个字符时,这个方法失效,同步过来的是乱码。慎用----2011.08.09)
先安装xsel:

代码: 全选

sudo apt-get install xsel
然后建立一个shell文件

代码: 全选

#! /bin/bash
firstxserver=$1
secondxserver=$2
#set the variables to the default
echo . | xsel --display $firstxserver -b -i 
echo . | xsel --display $secondxserver -b -i
clipboard=.

while [ 1 ]
do
#get the values of the clipboard
firstdislpayclipboard=$(xsel --display $firstxserver -b -o)
seconddislpayclipboard=$(xsel --display $secondxserver -b -o)

#if the first x servers clipboad chages
if [ "$firstdislpayclipboard" != "$clipboard" ]
then

#if it doesnt change to be blank
if [ $(echo $firstdislpayclipboard | grep ^$ -c) -ne 1 ]
then
#set the appropriate variables to be the contents of the first comand
seconddislpayclipboard=$firstdislpayclipboard
clipboard=$firstdislpayclipboard
xsel --display $firstxserver -b -o | xsel --display $secondxserver -b -i
else
#if it is blank set it to be .in case if its because the x server went  down
echo . | xsel --display $firstxserver -b -i 
fi

fi

#if the second x servers clipboad chages
if [ "$seconddislpayclipboard" != "$clipboard" ]
then

#if it doesnt change to be blank
if [ $(echo $seconddislpayclipboard | grep ^$ -c) -ne 1 ]
then
#set the appropriate variables to be the contents of the first comand
firstdislpayclipboard=$seconddislpayclipboard
clipboard=$seconddislpayclipboard
xsel --display $secondxserver -b -o | xsel --display $firstxserver -b -i
else
#if it is blank set it to be .in case if its because the x server went  down
echo . | xsel --display $secondxserver -b -i 
fi

fi

sleep 3
done
sleep 3 则是每3秒同步一下两个窗口的剪切板。
用下列命令打开这个文件:

代码: 全选

/path/to/file :0 :n
n是启动Xephyr 时指定的,比如:Xephyr :2....,则是/path/to/file :0 :2

我还在继续测试中,如果能改进,会汇报出来。

****这个,有什么作用?****

1,装酷唬人:
启动到openbox里面,切换到桌面2,全屏启动一个awesome,再切换到桌面3里面,启动一个jwm......
唬人绰绰有余了,骗个女朋友什么的不难吧。
2,调试系统:
这个就不用说了
3,测试其他WM
也不用多说了
4,提高工作效率
这是我自己折腾这套系统的目的:
awesome工作效率高,但不适合用于im(即时通讯工具),因为他会自动把IM的窗口给“布局”了,并且不能随意移动。
openbox适用于IM,可是在处理事物型工作方面比awesome低太多了,awesome把几个窗口一起开着,布局一下,就是方便。
也许有人有本领把awesome设置成浮动窗口可以自由移动,也许有人能够把openbox设置成可以自动布局,但总归这不是他们擅长的东西,强硬设置成了那样子也不会真正好用,还不如干脆把他们都启动起来。分工合作。
有了这个,鱼和熊掌就能兼得了。我的机器同时开openbox和awesome,并不很慢(这两个都是轻量级的)

几个注意事项:
1,一定要记住主WM关闭窗口的快捷键,Xephyr窗口全屏时,关闭掉里面的WM,Xephyr窗口很可能不会自动关闭,这时需要按一下关闭窗口的快捷键(openbox和大多数WM里面是ctrl+f4,awesome里面默认是win+shift+c)
2,注销主WM时,有很大可能会把Xephyr和里面的WM一起灭掉。所以尽量先关闭掉Xephyr窗口(包括全屏窗口)再注销主WM。
(全文终)
(测试还在进行中,请关注最新进展)
头像
ljj_jjl2008
论坛版主
帖子: 14255
注册时间: 2007-09-16 8:29

Re: 疯狂的Windows manager---如何让多套WM同时启动,并疯狂测试及调试WM

#2

帖子 ljj_jjl2008 » 2011-08-07 9:25

一个shell:作用是选择已经安装的WM,用Xephyr启动起来(试用阶段,逐步完善中)
已经做了重大改进,看下面链接的26楼:
viewtopic.php?f=168&t=340419&start=15

代码: 全选

#!/bin/bash
#xstarter.sh

WM_LIST=( ' ' 'Twm'  'Flwm'  'Openbox'  'Awesome'  'Jwm'  'VTWM'  'Wmaker' 'AfterStep' 'WindowLab')
TOTAL_WMS=9
#need to assign the $TERM comparison to a variable
#same goes for the console comparison

echo  'Please select one:'
for ((i=1; i<=$TOTAL_WMS;  i++))
do
    echo  "$i. ${WM_LIST[$i]}"
done
echo  ' '
read -n 1 choice
echo " "
echo "Your choice: ${WM_LIST[$choice]}"
Xephyr :6 -fullscreen -keybd ephyr,,,xkbmodel=pc105,xkblayout=us,xkbrules=evdev,xkboption=intl -noreset -host-cursor -dpi 96 -ac -name wm -title wm &
sleep 3
case ${WM_LIST[$choice]} in
Twm)
   DISPLAY=:6 twm &
   ;;
Flwm)
   DISPLAY=:6 flwm &
   ;;
Openbox)
    DISPLAY=:6 exec openbox-session &
    ;;
Awesome)
    DISPLAY=:6 exec awesome &
    DISPLAY=:6 geany &
    DISPLAY=:6 dolphin &
    DISPLAY=:6 sakura &
    DISPLAY=:6 chromium-browser &
    ;;
Jwm)
    DISPLAY=:6 jwm &
    DISPLAY=:6 rox-filer -p default &
    ;;
VTWM)
   DISPLAY=:6 vtwm &
   ;;
Wmaker)
   DISPLAY=:6 exec wmaker &
   ;;
AfterStep)
   DISPLAY=:6 afterstep &
   ;;
WindowLab)
   DISPLAY=:6 windowlab &
   ;;
*)
   DISPLAY=:6 fcitx &
   ;;
esac
头像
luojie-dune
帖子: 22033
注册时间: 2007-07-30 18:28
系统: Linux
来自: 空气中

Re: 疯狂的Windows manager---如何让多套WM同时启动,并疯狂测试及调试WM

#3

帖子 luojie-dune » 2011-08-07 9:53

这个啊。我也用不过是手机上用,同时运行maemo5(debian3)和debian 4 arm
『这个世界都是我的 ,我爱你们』

ENTP ⥂ INTP ⥄ INFP ⇦ INTJ

在此发布的文章使用 Creative Commons Attribution-ShareAlike 4.0 协议
头像
wiewi
帖子: 628
注册时间: 2008-11-20 22:50
系统: ArchLinux

Re: 疯狂的Windows manager---如何让多套WM同时启动,并疯狂测试及调试WM

#5

帖子 wiewi » 2011-08-07 12:44

潜力股,占一个
楼主牛,膜拜
===我的小窝===
无聊吗?点我吧,楼主迫切期待你的光临~~
又一个轮子
------------------------------------
这年头,没有1000贴都不好意思见人了
------------------------------------
献丑不如藏拙
------------
jtshs256
帖子: 22323
注册时间: 2010-07-19 21:41
系统: OS X

Re: 疯狂的Windows manager---如何让多套WM同时启动,并疯狂测试及调试WM

#6

帖子 jtshs256 » 2011-08-07 13:18

:em06
躺平
头像
cjxgm
帖子: 1952
注册时间: 2010-04-23 20:40
系统: Arch Linux
来自: 浙江·杭州
联系:

Re: 疯狂的Windows manager---如何让多套WM同时启动,并疯狂测试及调试WM

#7

帖子 cjxgm » 2011-08-07 17:32

mark
Clanjor Prods. | Develop for Developers. (C++, Lua) | 作曲编曲 | 实时渲染引擎
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: 疯狂的Windows manager---如何让多套WM同时启动,并疯狂测试及调试WM

#8

帖子 tusooa » 2011-08-14 11:26

luojie-dune 写了:这个啊。我也用不过是手机上用,同时运行maemo5(debian3)和debian 4 arm
强大。

代码: 全选

] ls -ld //
头像
ljj_jjl2008
论坛版主
帖子: 14255
注册时间: 2007-09-16 8:29

Re: 疯狂的Windows manager---如何让多套WM同时启动,并疯狂测试及调试WM

#9

帖子 ljj_jjl2008 » 2011-08-31 9:40

就加一个按钮或命令,能够在不用关闭已经打开的程序和文件,也不注销的前提下,快速切换wm和风格。
关于这一点,最近研究了几天,发现了几个办法。

****先是知识培训****(高手跳过)

先简单说一下系统启动图形界面用到的文件和各自作用(我个人理解的,简单描述):

要启动图形界面,先要启动起来一个X,因为我们现在用的是X的第11个版本,所以又叫X11.

X11的配置文件在/etc/X11/目录里面,有以下几文件个最为重要:
(1)/etc/X11/xorg.conf 作用是配置键盘、鼠标、显卡、显示器、核心字体等。
(2)/etc/X11/init/initrc 启动系统的关键文件,是启动系统用的脚本。如果安装了kdm、gdm等登陆管理器,他会在执行完后自动启动起来默认的登陆管理器。
(3)/etc/X11/Xsession.d/* 这个目录下的文件都是启动时需要执行的文件,可能有多个文件。
(4)~/.xinitrc 和 ~/.bashrc 启动时,个人的脚本
(5)登陆管理器:有很多种,设置方式也有所不同,kdm、gdm之类为主。
如果想改变默认登陆管理器,现在的办法是终端执行指令:

代码: 全选

sudo dpkg-reconfigure kdm
然后会出现提示,根据提示来选择DM。
(6)sessions:登陆管理器调用的文件,可能存在于多个目录之下,比如:
/usr/share/xsessions/*
/usr/share/kde4/apps/kdm/sessions/*
/etc/X11/sessions/
/etc/dm/Sessions/
/usr/share/gdm/BuiltInSessions/

我们可以用文本编辑器打开一个sessions观看:
文件 /usr/share/kde4/apps/kdm/sessions/ratpoison.desktop
[Desktop Entry]
Type=XSession
Exec=ratpoison
TryExec=ratpoison
Name=Ratpoison
Comment=A simple keyboard-only window manager modeled after Screen
X-Ubuntu-Gettext-Domain=desktop_kde-workspace
注意以下两句:
Exec=ratpoison
TryExec=ratpoison
这两句里面要执行的命令,就是sessions调用的命令。只要这个命令的进程还在内存中,则sessions不会退出,否则sessions退出,X重启,重新登陆。
一般,sessions中调用的是一个窗口管理器(window manager),然后由窗口管理器负责打开程序、调整窗口布局等工作。也可以调用shell脚本文件,但最终都是启动起来一个窗口管理器以及对应的面板、桌面等部件。

(7)sessions调用的命令或者shell
他们一般在 /usr/bin/ 目录中。

****现在还是知识培训****(关于如何写sessions调用的shell,高手继续跳过)
就加一个按钮或命令,能够在不用关闭已经打开的程序和文件,也不注销的前提下,快速切换wm和风格。
知识介绍完毕,可见实现上面目标的关键是自己写个sessions和其调用的shell,关键在于shell怎么写。
& 后台工作
单一个& 符号,且放在完整指令列的最后端,即表示将该指令列放入后台中工作。
tar cvfz data.tar.gz data > /dev/null &
好吧,首先回顾一下您已经了解的知识。 在 shell 中敲入一条命令后,您就什么事都做不了了,除非等到该命令 执行完毕并退出。您的 session 调用的脚本也是如此。当脚本开始执行时, 凡遇到任何一个需要很长时间运行的程序(多数 X11 程序都是这样的), 它就停在那儿等到该程序执行完毕为止。

理想情况下,脚本里应该只有一处使得 X11 挂起。并且您多半都希望它位于脚本的末端。 所以,如果您希望 X11 下的程序在未到达此“挂起点”前先运行,您应该将它们置于后台。 即在行尾添上一个&。假设在运行其它程序的同时,您 还想执行 xclock,将下面这行放在“挂起点“之前:

代码: 全选

    xclock &
接下来就是您所看到的那个 exec 玩意儿, 很多参考资料在讲解如何将窗口管理器时添加到脚本中时都谈到了它。 但老实说,并不是非要它不可。如果您把窗口管理器放到脚本的最末端,即使不用 exec,X11 也会自动挂起。

那么要 exec 还有什么用呢?好吧,比方说您要在脚本里 放置多个窗口管理器的启动行,但只想使用一个。那么,您就可以利用 exec 将所选的启动行放到其它启动行前面。因为 exec 的意思就是:

"用这个程序代替我,换言之,启动这个程序,等它一结束马上就终止我自己。"

您要是把 exec wmaker 放到 exec enlightenment 的前面,那么当 wmaker 结束后,脚本也就执行完毕了,而不会继续执行下一行。

如果说不必要的话,您懂我的意思吗?用一组注释的窗口管理器启动行,也可以实现刚才的功能。

所以正常的思路是:把启动窗口管理器的语句放在shell的最后一句,其他语句末尾都加上 & ,只有最后一句不加 &。
另外的思路是:您可以先启动窗口管理器,然后将它的进程 ID 保存到某个环境变量中:

代码: 全选

        wmaker & wmpid=$!
上面这一句代码将 wmaker 置于后台(&)运行 并将其进程 ID($!)保存到变量(wmpid)中。 之后要构造“挂起点(一般是最后一句)”时,只需 wait:

代码: 全选

    wait $wmpid
这样比上面的好处是:假如有一些语句或命令依赖于WM,我们也可以在shell中把它启动起来。

以上的思路都是正常的做法,目的是关闭(退出、杀死)窗口管理器时,系统注销。

***这是解决方案了****
我们现在的目的正好相反,是关闭(退出、杀死)窗口管理器时,系统不能注销,然后我们可以切换新的窗口管理器。
所以我们现在反其道而行之,可以用以下办法实现目标:

特别的思路(1)是:最后一句挂起其他的程序,如 gedit 之类的,置于前台(放到最后一句并且不加 & )来达到目的。 但要记住,当此程序一结束,X11 会话也就关闭了,所以gedit里面要同时打开一个文件,里面写上警告:“千万不要关闭我,否则X会被终止”。
特别的思路(2)是:最后几句写成这个样子:

代码: 全选

while true; do
   musca
   pekwm
   ...
   ...
done
即让最后几句形成一个死循环,分头挂起不同的窗口管理器,前一个退出后一个自动接替,后一个退出还有一个再接替,使shell永远不能终止。要切换时,只需使用当前wm所提供的方式(如musca的是quit)正常退出(千万别kill)当前的wm即可,应该绝大多数wm都支持以此方式切换。需要注销时,可以尝试kill进程,或者kill掉X。
注销方法:
1,文件 ~/.bashrc 里面加上一行,把“无敌三键”启用起来,再碰到杀不死的就直接ctrl-alt-backspace。

代码: 全选

setxkbmap -option terminate:ctrl_alt_bksp
2,论坛大神提供一个命令:

代码: 全选

sudo pkill -9 X
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: 疯狂的Windows manager---如何让多套WM同时启动,并疯狂测试及调试WM

#10

帖子 自由建客 » 2016-10-14 0:49

标记 Xephyr
快捷键:主WM中的快捷键会覆盖Xephyr窗口WM中相同的快捷键,所以设置的快捷键不要冲突。
这点很重要。据此可推断,Xephyr 并非虚拟机那样的捕获键盘模式,而仅仅只是转发父 X 发送给它的按键。父 X 设置过的全局热键自然不会发送给它。
回复