Ubuntu: How to add element to the gsettings array at the specific location (given by index)?


I want to write a script that translates devilspie's window rules into compiz' rules. Compiz settings can be changed by gsettings keys in path org.compiz.profiles.unity.plugins.place. There are three keys: viewport-matches, viewport-x-values and viewport-y-values. Unfortunately each key is an array, and the index of the elements matters.

Gsettings lacks any support of array types other than rewriting whole array at once, and I need to place item in the array at the specific location (say, at the beginning, index '1').

I know, that if I don't care about the index, I can use

gsettings set ${schema} ${key} \"`gsettings get ${schema} ${key} | sed s/.$//`, ${value}]\"  

The question complements How to remove element from gsettings array in script?


The following python3 script will insert new element(s) at a given index:

#!/usr/bin/env python3    import argparse  import subprocess    parser = argparse.ArgumentParser()  parser.add_argument("schema", help="gsettings shema", metavar="SCHEMA")  parser.add_argument("key", help="gsettings key", metavar="KEY")  parser.add_argument("index",                      help="KEY array index where VALUE(s) need to be inserted",                      metavar="INDEX", type=int)  parser.add_argument("value",                      help="gsettings VALUE(s) to add to the KEY array",                      metavar="VALUE", nargs='*')    args = parser.parse_args()    array = eval(subprocess.check_output(["gsettings", "get", args.schema, args.key]))  for v in sorted(args.value, reverse=True):      try:          value = eval(v)      except NameError:          value = v      array.insert(args.index, value)  subprocess.call(["gsettings", "set", args.schema, args.key, str(array)])  


You can also do this via a bash script:

#!/bin/bash    SCHEMA="your.wanted.schema"  KEY="your-wanted-key"    STATUS=$(gsettings get ${SCHEMA} ${KEY})    # Optional proof, whether value to add already exsists  if [[ $STATUS == *"'to.add.value'"* ]]; then      echo "to.add.value is already in the list!"  else      gsettings set ${SCHEMA} ${KEY} "${STATUS%]*}, 'to.add.value']"      echo "Added to.add.value to the list."  fi  

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Next Post »