Несколько обоев рабочего пространства без использования ccsm
Есть ли способ получить разные фоны для каждого рабочего пространства без использования CCSM? Я прочитал несколько страшных историй и предпочел бы избежать этого, если это возможно. Я использую Raring Ringtail (13.04)
1 ответ
Наличие разных обоев на разных рабочих пространствах без использования ccsm
Скрипт ниже не использует менеджер настроек compiz, но предполагает:
python3
установлен (если нет, дайте мне знать)wmctrl
установлен (для извлечения данных на рабочих пространствах). Вам может понадобиться установить его: sudo apt-get install wmctrl
Это работает независимо от количества рабочих пространств; он вычисляет количество столбцов рабочих пространств и строку текущего рабочего пространства и устанавливает обои, определенные пользователем для этого (текущего) рабочего пространства.
После запуска сценария просто переключитесь на другое рабочее пространство и установите обои "обычным" (GUI) способом. Скрипт отслеживает обои для каждой рабочей области в небольшом файле, который он создает. Это не должно вызывать каких-либо задержек в производительности, поскольку файл читается только при запуске сценария или при изменении пользователем обоев рабочего пространства.
Сценарий
#!/usr/bin/env python3
import subprocess
import time
import os
key1 = "gsettings set org.gnome.desktop.background picture-uri "
key2 = "gsettings get org.gnome.desktop.background picture-uri"
def write_wspaces(file, current):
with open(file, "wt") as wt:
wt.write(current)
def read_wspaces(file):
with open(file) as src:
return src.read().strip()
def get_info(command):
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
def get_currwallpaper():
return get_info(key2).replace("file://", "").strip()
# get resolution
output = get_info("xrandr").split(); idf = output.index("current")
res = (int(output[idf+1]), int(output[idf+3].replace(",", "")))
def calculate_geometry():
# get viewport data
vp = get_info("wmctrl -d").split(" ")
span = vp[4].split("x"), vp[7].split(",")
# calculate number of (horizontal) viewports
n_vps_hor = int(int(span[0][0])/int(res[0]))
n_vps_vert = int(int(span[0][2])/int(res[1]))
n_wspaces = int(n_vps_hor)*int(n_vps_vert)
# calculate current viewport
curr_vp_hor = int((int(span[1][0])/int(res[0]))+1)
curr_vp_vert = int((int(span[1][3])/int(res[1]))+1)
return ((curr_vp_vert-1)*n_vps_hor)+curr_vp_hor, n_wspaces
home = os.environ["HOME"]
wspaces = home+"/"+".config/wall_wspaces"
if not os.path.exists(wspaces):
os.makedirs(wspaces)
if not os.path.exists(wspaces+"/wspaces.txt"):
current = get_currwallpaper().replace("'", "")
writelist = []; [writelist.append(current) for i in range(calculate_geometry()[1])]
write_wspaces(wspaces+"/wspaces.txt", str(writelist))
wall_list = eval(read_wspaces(wspaces+"/wspaces.txt"))
while True:
curr_vp1 = calculate_geometry()[0]; currwallpaper1 = get_currwallpaper()
time.sleep(2)
curr_vp2 = calculate_geometry()[0]; currwallpaper2 = get_currwallpaper()
if curr_vp1 != curr_vp2:
command = key1+"file://"+str(wall_list[curr_vp2-1])
subprocess.Popen(["/bin/bash", "-c", command])
elif currwallpaper1 != currwallpaper2:
wall_list = eval(read_wspaces(wspaces+"/wspaces.txt"))
wall_list[int(curr_vp2)-1] = currwallpaper2
write_wspaces(wspaces+"/wspaces.txt", str(wall_list))
else:
pass
Как пользоваться
Просто скопируйте скрипт в пустой файл, сохраните его как workspace_walls.py
и запустите его командой:
python3 /path/to/workspace_walls.py
Если он работает так, как вам нравится, добавьте его в свои запускаемые приложения: Dash > Startup Applications > Add
Редактировать:
Ниже полностью переписанная версия сценария, к модели этого.
Скрипт (с небольшими отличиями) + GUI также доступен как ppa
:
sudo add-apt-repository ppa:vlijm/wswitcher
sudo apt-get update
sudo apt-get install wswitcher
#!/usr/bin/env python3
import subprocess
import os
import time
workspace_data = os.environ["HOME"]+"/.wallpaper_data_"
key = [
"gsettings get ",
"gsettings set ",
"org.gnome.desktop.background picture-uri",
]
def getwall():
return subprocess.check_output(
["/bin/bash", "-c", key[0]+key[2]]
).decode("utf-8").strip()
def get_res():
# get resolution
xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
pos = xr.index("current")
return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
def current():
# get the current viewport
res = get_res()
vp_data = subprocess.check_output(
["wmctrl", "-d"]
).decode("utf-8").split()
dt = [int(n) for n in vp_data[3].split("x")]
cols = int(dt[0]/res[0])
curr_vpdata = [int(n) for n in vp_data[5].split(",")]
curr_col = int(curr_vpdata[0]/res[0])+1
curr_row = int(curr_vpdata[1]/res[1])
return str(curr_col+curr_row*cols)
curr_ws1 = current()
currwall1 = getwall()
while True:
time.sleep(1)
currwall2 = getwall()
# print(currwall2)
curr_ws2 = current()
datafile = workspace_data+curr_ws2
if curr_ws2 == curr_ws1:
if currwall2 != currwall1:
open(datafile, "wt").write(currwall2)
else:
if not os.path.exists(datafile):
open(datafile, "wt").write(currwall2)
else:
curr_set = open(datafile).read()
command = key[1]+key[2]+' "'+str(curr_set)+'"'
subprocess.Popen(["/bin/bash", "-c", command])
curr_ws1 = curr_ws2
currwall1 = getwall()
Budgie теперь поддерживается
Добавлена поддержка Budgie 21 июля 2017 года для Zesty при установке из ppa (см. Выше)