Vários papéis de parede do espaço de trabalho sem usar o ccsm

4

Existe alguma maneira de ter um fundo diferente para cada espaço de trabalho sem usar o CCSM? Eu li algumas histórias de horror e prefiro evitá-lo, se possível. Estou usando o Raring Ringtail (13.04)

    
por user165340 08.06.2013 / 01:16

1 resposta

5

Tendo diferentes papéis de parede em diferentes áreas de trabalho sem usar ccsm

O script abaixo não usa o gerenciador de configurações do compiz, mas assume:

  • python3 está instalado (se não me avise)
  • wmctrl está instalado (para buscar os dados nos espaços de trabalho). Você pode precisar instalá-lo:     sudo apt-get install wmctrl

Funciona não importa o número de espaços de trabalho; ele calcula o número de colunas das áreas de trabalho e a linha da área de trabalho atual e define o papel de parede definido pelo usuário para essa área de trabalho (atual).
Depois que o script for iniciado, basta alternar para os diferentes espaços de trabalho e definir o papel de parede no modo "normal" (GUI). O script controla o papel de parede por área de trabalho em um pequeno arquivo criado. Isso não deve causar nenhum atraso no desempenho, já que o arquivo é lido apenas quando o script é iniciado ou quando os papéis de parede por área de trabalho são alterados pelo usuário.

Oscript

#!/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

Como usar

Basta copiar o script em um arquivo vazio, salvá-lo como workspace_walls.py e executá-lo pelo comando:

python3 /path/to/workspace_walls.py

Se funcionar como você gosta, adicione-o aos seus aplicativos de inicialização: Dash > Aplicativos de inicialização > Adicionar

Editar:

Abaixo uma versão completamente reescrita do script, para o modelo de este .

O script (com algumas pequenas diferenças) + GUI também está disponível como ppa :

sudoadd-apt-repositoryppa:vlijm/wswitchersudoapt-getupdatesudoapt-getinstallwswitcher
#!/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 agora é suportado

Adicionado suporte para o Budgie em 21 de julho de 2017 para o Zesty, quando instalado a partir do ppa (veja acima)

    
por Jacob Vlijm 12.12.2014 / 21:55