Xubuntu Window Tiling (視窗平鋪)

前言

今天研究了一下在「Xubuntu (XFCE)」下,「Window Tiling (視窗平鋪)」的功能。

一開始找到了兩個方案。

  • xfwm4-settings ( Settings / Window Manager / Keyboard / Tile Window * )
  • QuickTile (GitHub)

後來又找到一個「Tiling by drag window」,原本就有的功能,
有一個設定要調整,請看最下面的說明。

  • xfwm4-settings ( Settings / Window Manager / Advanced / )個

找尋過程

一開始想說,找看看「Xubuntu(Xfce)」下的快速鍵,
我知道的有兩個地方可以設定「快速鍵(Shortcuts)」。

一開始摸不著頭緒,所以想起以前看過的的一篇文章「Gnome、KDE 與 Cinnamon 的平鋪視窗控制

找到關鍵字「Tiling」,用「xfce tilingg」,查了一下,找到上面兩個解決方案。

後來又找到一個「Tiling by drag window」,原本就有的功能,

只是因為一個設定的關係變成另一個功能,請看最下面的說明。

測試環境

Xubuntu 14.04 64 位元

方案 - xfwm4-settings

在Xubuntu左上方,點選,下拉出「功能選單(開始功能表)」,

然後點選「Settings / Window Manager (或是執行 $ xfwm4-settings)」。

就會出現「Window Manager」這個設定對話框。

選擇「Keyboard」這個頁籤。

然後向下捲動,就會看到四個「Action」

  • Tile window to the top
  • Tile window to the bottom
  • Tile window to the left
  • Tile window to the right

一開始是沒有綁定「快速鍵」,所以「shortcut」那一個欄位是空白。

所以我自己做了以下的設定。

  • Tile window to the top => Super+K
  • Tile window to the bottom => Super+J
  • Tile window to the left => Super+H
  • Tile window to the right => Super+L

「hjkl」跟vi的方向鍵一樣。

而「Super」則是,「視窗鍵(window鍵)」。

設定檔的路徑在「~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml」。

方案 - QuickTile

事先安裝相依套件

1
$ sudo apt-get install python python-gtk2 python-xlib python-dbus python-wnck

clone 「QuickTile」專案下來

1
$ git clone https://github.com/ssokolow/quicktile.git

切換到「quicktile」這個資料夾

1
$ cd quicktile

安裝

1
$ sudo ./setup.py install

就會安裝完畢

主要有兩個檔

  • 「/etc/xdg/autostart/quicktile.desktop」 <== 重新開機就會執行這個檔
  • 「/usr/local/bin/quicktile.py」<== 上面的設定則會執行「quicktile.py」這個指令。

第一次執行下面指令,產生預設的設定檔

1
$ quicktile.py

會顯示

1
INFO: Wrote default config file to /home/user/.config/quicktile.cfg

也就是會在「~/.config/」這個資料夾,產生預設的設定檔「quicktile.cfg」。

觀看「~/.config/quicktile.cfg」的內容

1
$ cat ~/.config/quicktile.cfg

顯示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[general]
cfg_schema = 1
UseWorkarea = True
ModMask = <Ctrl><Alt>

[keys]

C = move-to-center
H = horizontal-maximize
V = vertical-maximize
KP_0 = maximize
KP_1 = bottom-left
KP_2 = bottom
KP_3 = bottom-right
KP_4 = left
KP_5 = middle
KP_6 = right
KP_7 = top-left
KP_8 = top
KP_9 = top-right
KP_Enter = monitor-switch

執行下面的指令,將「ModMask = <Ctrl><Alt>」改成「ModMask = <Ctrl><Mod4>」。

1
$ sed 's/ModMask = <Ctrl><Alt>/ModMask = <Ctrl><Mod4>/g' ~/.config/quicktile.cfg -i.bak

就會將「~/.config/quicktile.cfg」先備份到「~/.config/quicktile.cfg.bak」

然後改掉內容,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[general]
cfg_schema = 1
UseWorkarea = True
ModMask = <Ctrl><Mod4>

[keys]

C = move-to-center
H = horizontal-maximize
V = vertical-maximize
KP_0 = maximize
KP_1 = bottom-left
KP_2 = bottom
KP_3 = bottom-right
KP_4 = left
KP_5 = middle
KP_6 = right
KP_7 = top-left
KP_8 = top
KP_9 = top-right
KP_Enter = monitor-switch

執行下面的指令,就會起一個背景程式(指令行最後面可以加&, 目前測試所以沒加)

1
$ quicktile.py -d

或是

1
$ quicktile.py --daemonize

就會顯示

1
<class 'Xlib.protocol.request.QueryExtension'>

這時候就可以找一個目前使用的「視窗(應用程式)」來測試,

同時按下「Ctrl」+「視窗鍵」+「數字鍵」,就會將該視窗平鋪在該位置。

注意這裡指的「數字鍵」,是鍵盤右方的「數字鍵盤」,「9宮格位置」剛好對應「螢幕位置」。

1
2
3
7 8 9
4 5 6
1 2 3

剛剛只是測試,上面的指令「quicktile.py --daemonize」,重開機會自動執行,

因為有這個檔「/etc/xdg/autostart/quicktile.desktop」。

觀看「/etc/xdg/autostart/quicktile.desktop」。

1
$ cat /etc/xdg/autostart/quicktile.desktop

顯示

1
2
3
4
5
6
7
8
[Desktop Entry]
Encoding=UTF-8
Version=1.0
Name=QuickTile
GenericName=Window-Tiling Helper
Type=Application
Exec=quicktile.py --daemonize
Categories=Utility;

你也可以在「Settings / Session and Startup / Application Autostart」

找到「QuickTile」這一個項目。

「Settings / Session and Startup」的指令是「xfce4-session-settings

所以也可以執行下面的指令啟動。

1
$ xfce4-session-settings

quicktile.py 更多用法

直接執行

1
$ quicktile.py

會顯示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Known Commands       
--------------------------------------------------------------------

Ask the Window Manager to begin a keyboard-driven operation
trigger-move
trigger-resize

Center the window in the monitor it currently occupies
move-to-center

Cycle the active window between monitors while preserving position
monitor-next
monitor-prev
monitor-switch

Cycle the active window through a list of positions and shapes
bottom
bottom-left
bottom-right
left
middle
right
top
top-left
top-right

Move the active window to another workspace (next/prev wrap around)
workspace-send-down
workspace-send-left
workspace-send-next
workspace-send-prev
workspace-send-right
workspace-send-up

Switch the active workspace (next/prev wrap around)
workspace-go-down
workspace-go-left
workspace-go-next
workspace-go-prev
workspace-go-right
workspace-go-up

Toggle "all windows minimized" to view the desktop
show-desktop

Toggle window state on the active window
all-desktops
always-above
always-below
bordered
fullscreen
horizontal-maximize
maximize
minimize
shade
vertical-maximize


Use --help for a list of valid options.

所以就可以執行

1
$ quicktile.py show-desktop

就會將所有的視窗縮小到工具列,顯示桌面。(Xubuntu內建的快速鍵Ctrl+Alt+D)

其他就自行把玩吧。

manual

執行

1
$ quicktile.py -h

顯示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Usage: quicktile.py [options] [action] ...

Options:
--version show program's version number and exit
-h, --help show this help message and exit
-d, --daemonize Attempt to set up global keybindings using python-xlib
and a D-Bus service using dbus-python. Exit if neither
succeeds
-b, --bindkeys Deprecated alias for --daemonize
--debug Display debug messages
--no-workarea Overlap panels but work better with non-rectangular
desktops

Additional Help:
--show-bindings List all configured keybinds
--show-actions List valid arguments for use without --daemonize

執行

1
$ quicktile.py --show-bindings

顯示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Keybindings defined for use with --daemonize:

Modifier: <Ctrl><Mod4>

Key Action
-------- -------------------
C move-to-center
H horizontal-maximize
KP_0 maximize
KP_1 bottom-left
KP_2 bottom
KP_3 bottom-right
KP_4 left
KP_5 middle
KP_6 right
KP_7 top-left
KP_8 top
KP_9 top-right
KP_Enter monitor-switch
V vertical-maximize

執行

1
$ quicktile.py --show-actions

等同剛剛執行 $ quicktile.py 顯示的結果。

也可以執行

1
$ quicktile.py show-desktop --debug

加上「–debug」,可以看到額外的「除錯訊息」。

Tiling by drag window

從「這篇討論」,

發現「Tiling by drag window」的方式。

一開始我嘗試不出來,所以才先找快速鍵的方式。

原來設定的方式,導致變成另一個功能,關鍵點如下,

從「Settings / Window Manager / Advanced」

在「Wrap workspaces when reaching the screen edge」,

有一個選項「With a dragged window」不勾選。

這樣用滑鼠拖拉視窗到左方,上方,下方,右方,

就會有「Tiling」的效果。

我原本有勾選「With a dragged window」,

而且我有開多個「Workspace」,所以當拖拉視窗到左右邊界的時候,是會切換到不同的「Workspace」。

我就在納悶,我以前用拖拉的方式可以,現在怎麼不行。

原來是要更改這個設定。

Move window to another workspace

視窗移到不同的Workspace,我通常是在視窗標題列按下右鍵,選擇「Move to Another Workspace / n」。

今天發現「( Settings / Window Manager / Keyboard / )」那也有綁定快速鍵,可以從那裡查詢。

相關討論

官方文件