Configure gnome-shell extensions from command line

I like to run a couple of scripts to automatically install packages and do some configurations on fresh OS installs. I use gnome shell with a few extensions and was thinking of improving my scripts to configure them.

I usually configure the extensions using gnome-shell-extension-prefs or dconf-editor and I know how to edit other schemas from the command line. Example:

gsettings set org.gnome.desktop.background picture-options stretched

But, although I can find and edit the installed extensions under org.gnome.shell.extensions using dconf-editor I can’t access them using gsettings since they don’t seem to have an assigned schema:

No such schema 'org.gnome.shell.extensions.extname'

The only extensions accessible with gsettings seem to be the ones that came pre-installed.

So, the question is, how can I configure the installed extensions from the command line? Is there any way to assign to gsettings the compiled schemas in ~/.local/share/gnome-shell/extensions/ ? Maybe I’m looking in the wrong direction.

Environment: Ubuntu Gnome 14.04 (Gnome Shell 3.10.4)

Thanks in advance.

Asked By: albhilazo

||

Found the answer by myself in the end.

sudo cp ~/.local/share/gnome-shell/extensions/extname/schemas/org.gnome.shell.extensions.extname.gschema.xml 
    /usr/share/glib-2.0/schemas/ &&
sudo glib-compile-schemas /usr/share/glib-2.0/schemas/

Copy and compile the schemas in ~/.local/share/gnome-shell/extensions and gsettings will be able to work with them.

Answered By: albhilazo

I’ve written this script: Bash script to enable/disable gnome-shell-extensions and more.

Just cp it in /usr/bin or /usr/local/bin and make it executable:

sudo chmod +x /usr/bin/gnome-shell-extension-cl

Check the help.

Enable extension:

gnome-shell-extension-cl -e extension-name

Disable extension:

gnome-shell-extension-cl -d extension-name
Answered By: cyberalex4life

In CentOS 7 – and I would think in Ubuntu also – I’ve identified what I think is a slight improvement on the accepted answer by introducing the –schemadir switch as follows:

# gsettings --schemadir ${schemaDir} set ${schema} ${key} "${value}"

In the above command gsettings directly sets ${key} to ${value} in ${schema} where ${schema} does not reside in the default /usr/share/glib-2.0/schemas directory. (and there is no requirement to move the schema to the default directory)

Some examples:

gsettings --schemadir ~/.local/share/gnome-shell/extensions/putWindow@clemens.lab21.org/schemas/ list-recursively org.gnome.shell.extensions.org-lab21-putwindow
gsettings --schemadir ~/.local/share/gnome-shell/extensions/unitylike-hotkey@webgyerek.net/schemas/  list-recursively org.gnome.shell.extensions.app-keys
gsettings --schemadir ~/.local/share/gnome-shell/extensions/emoji-selector@maestroschan.fr/schemas/  list-recursively org.gnome.shell.extensions.emoji-selector
Answered By: Pancho

dconf Documentation Says:

The dconf API is not particularly friendly, and is not guaranteed to
be stable. Because of this and the lack of portability, you almost
certainly want to use some sort of wrapper API around it. The wrapper
API used by GTK+ and GNOME applications is GSettings2, which is
included as part of GLib.

Here, dconf-editor is Graphical editor for gsettings and dconf.

dconf-editor Documentation Says:

dconf-editor reads gsettings schemas from $XDG_DATA_DIRS/glib-2.0/schemas to obtain descriptions, default values and allowed values for keys.

credits to @albhilazo and How to properly configure a dconf schema from a gschema.xml file?:

find $HOME/.local/share/gnome-shell/extensions/ -name '*.gschema.xml' -exec cp "{}" "$HOME/.local/share/glib-2.0/schemas" ;
glib-compile-schemas $HOME/.local/share/glib-2.0/schemas/

glib-compile-schemas Documentation Says:

At runtime, GSettings looks for schemas in the glib-2.0/schemas subdirectories of all directories specified in the XDG_DATA_DIRS environment variable. The usual location to install schema files is /usr/share/glib-2.0/schemas.

If you have not noticed, another way is to use XDG_DATA_DIRS. I have a hunch (not tested it) that, just setting the following in .profile or .zshenv (based on what default shell you are using) will also solve the problem.

export XDG_CACHE_HOME=$HOME/.cache
export XDG_CONFIG_DIRS=/etc/xdg
export XDG_CONFIG_HOME=$HOME/.config
export XDG_DATA_DIRS=/usr/local/share/:/usr/share/
export XDG_DATA_HOME=$HOME/.local/share
export XDG_STATE_HOME=$HOME/.cache
Answered By: Ahmad Ismail