我想要什么?

初来乍到 Deepin,界面不可谓不美观。试用不久就发现一个不爽的地方,键盘快捷方式太少了,特别是没有控制窗口停靠贴标的快捷方式,根本就没有这个选项。

在官方论坛里搜索一番,deepin-wm的 commit message 中有一条 :feat: support interactive tiling,这个新功能在官方论坛中也有介绍:

1、当一个窗口拖到边界分屏的时候; 2、剩下的应用窗口会全部平铺展示; 3、这时候点击剩下的应用窗口,会自动放置在另一半屏幕,方便左右对比;

于是,我就安装了这个版本的deepin-wm,并找到了这段代码的位置

这个拖动的过程大概可以分成:

  • 鼠标移动到 window title 部分,触控板按下不放
  • 开始移动
  • 移动到特定的触发区域(屏幕边界),显示 window preview
  • 放开触控板,窗口改变位置至屏幕的一侧,大小为屏幕宽度的一半。
  • 显示 TileSelector,来选择另一个需要平铺的窗口。

开发环境

  • 各种依赖(官方文档里有具体的)

  • deepin-mutter 3.20.30

  • deepin-wm (git reset ce50 --hard)

    1
    2
    
      ./autogen.sh --prefix=/usr && make
      sudo make install
    

但是都不是我想要的,没有快捷方式!!不想用鼠标来拖动啊!!

继续折腾

意外的在vi /usr/share/dde-daemon/gesture.json发现下面的配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
	 {
		  "Name": "swipe",
          "Direction": "left",
          "Fingers": 3,
          "Action": {
              "Type": "built-in",
              "Action": "SplitWindowLeft"
          }
      },
      {
          "Name": "swipe",
          "Direction": "right",
          "Fingers": 3,
          "Action": {
              "Type": "built-in",
              "Action": "SplitWindowRight"
          }
      }

这也算是一个意外的收获,毕竟不需要拖动窗口了,只需要用三根手指滑动。但是想想这姿势,就有点尴尬。。。

于是找到dde-daemon这个项目,发现时用 go 写的,还行。在 gesture包下的 built-in.go即是这个配置文件中 action 的实现。但是其实只有对wm方法的调用:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
const (
	wmTileDirectionLeft uint32 = iota + 1
	wmTileDirectionRight
)
//...
func (m *Manager) doTileActiveWindowLeft() error {
	return m.wm.TileActiveWindow(0, wmTileDirectionLeft)
}

func (m *Manager) doTileActiveWindowRight() error {
	return m.wm.TileActiveWindow(0, wmTileDirectionRight)

其中wmTileDirectionLeft为 1,wmTileDirectionRight为 2。使用到的 wm是在go-debug-factory下的com.deepin.wm/auto.go

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func (v *wm) GetObject_() *proxy.Object {
	return (*proxy.Object)(unsafe.Pointer(v))
}

func (*wm) GetInterfaceName_() string {
	return "com.deepin.wm"
}
//...
func (v *wm) GoTileActiveWindow(flags dbus.Flags, ch chan *dbus.Call, side uint32) *dbus.Call {
	return v.GetObject_().Go_(v.GetInterfaceName_()+".TileActiveWindow", flags, ch, side)
}

func (v *wm) TileActiveWindow(flags dbus.Flags, side uint32) error {
	return (<-v.GoTileActiveWindow(flags, make(chan *dbus.Call, 1), side).Done).Err
}

最终是用 dbus 调用 com.deepin.wm.TileActiveWindow 1, 1 代表左边,2 代表右边。

所以,可以新建两个快捷方式:

  • qdbus com.deepin.wm.TileActiveWindow 1
  • qdbus com.deepin.wm.TileActiveWindow 2

image1

触控板横向滑动

Deepin 默认没有开启触控板的左右滑动,需要在终端执行:

官方论坛里找到的解决方案:

1
gsettings set com.deepin.dde.touchpad horiz-scroll-enabled true

O(≧口≦)O

一波折腾,重启电脑,开不了机了,大概卡在了启动桌面环境?又出现和上次一样的迷之错误,(今年三月份的时候也遇到过,记得当时也是换了桌面环境之后遇到的,结果重装了系统)CTRL + ALT + F2之类也进不去终端。

image2

似乎是预感到会开不了机,在关机之前,我做了一个Ubuntu16.04启动盘。使用启动盘的Try ubuntu 功能,进入新系统备份了一些重要的资料。这已经是在为重装系统做准备了吧。。。

最后试了试recovery模式进入原来的系统,可以使用CTRL + ALT + F2进去终端,只要可以进去就有解决的方法了。于是我卸载了 ddedeepin-wm,切换 DMlightdm

1
2
sudo apt purge remove dde* deepin-*
sudo dpkg-reconfigure lightdm

退出recovery模式,进入原来的系统,终于不在出现那个迷之错误了,但是还是只能进入终端,没有图形界面。可以用这个命令启动图形界面:

1
sudo systemctl start graphical.target

终于,一道光闪过,进入了 unity 桌面。

不过我不甘心啊,又重新装了 dde ,总觉得是gdm3的问题,这次使用 lightdm进入 deepin 桌面,没什么大问题(就是不能开启 windows effect)。重启后还是一切正常。接着我把DM换成gdm3,又进不去了。。还是稳稳的用lightdm吧。

真香!