É possível executar um subcomando a partir de um lançador do Gnome Shell?

3

Eu tenho um alias configurado para iniciar meu editor de texto de uma maneira que o mantenha local para a área de trabalho específica na qual estou trabalhando no Gnome Shell:

alias geany="geany --socket-file=/tmp/geany-sock-$(xprop -root _NET_CURRENT_DESKTOP | awk '{print $3}') ${1+"$@"}"

Gostaria de emular isso com o lançador do Gnome Shell. Tal como está, tenho o comando do iniciador definido para:

geany --socket-file=/tmp/geany-sock-$(xprop -root _NET_CURRENT_DESKTOP | awk '{print $3}') %F

O que apontará para a sessão Geany aberta na janela atual se uma já estiver aberta, mas não iniciará uma nova sessão. Eu vou pegar um spinner, e então ele simplesmente sai, em vez de lançar o aplicativo. Existe alguma maneira de fazer isso?

    
por ND Geek 14.03.2013 / 18:40

2 respostas

1

O parâmetro do shell e a expansão de variáveis em .desktop files não são compatíveis nem documentados . A solução usual é (como o Avlmd disse) criar um script de shell e apontar o arquivo .desktop para esse executável.

Quando se trata de lançar aplicativos do dash, gnome-shell é padronizado para ativação o aplicativo em vez de iniciá-lo se outra instância já estiver em execução (contanto que você não use Ctrl + clique em para realmente iniciar uma nova instância).
O comportamento gnome-shell pode ser alterado por meio de extensões de shell, portanto, no seu caso particular, uma extensão substituindo onActivate de /usr/share/gnome-shell/js/ui/appDisplay.js deve fazer o que você deseja:

  • Criar pasta de extensão:

mkdir -p ~/.local/share/gnome-shell/extensions/[email protected]

  • Adicione estes dois arquivos dentro:

metadata.json :

{
    "shell-version": ["3.6.3.1"], 
    "uuid": "[email protected]", 
    "name": "Geany Launcher", 
    "description": "Fire up new window if no instance on current workspace"
}

extension.js :

const Clutter = imports.gi.Clutter;
const Shell = imports.gi.Shell;
const Main = imports.ui.main;
const AppDisplay = imports.ui.appDisplay;

var _onActivateOriginal = null;

function  _onActivate(event) {
        this.emit('launching');
        let modifiers = event.get_state();
        let cTRL = Clutter.ModifierType.CONTROL_MASK;
        let rUN = Shell.AppState.RUNNING;
        let crtW = global.screen.get_active_workspace();
        if (this._onActivateOverride) {
            this._onActivateOverride(event);
        } else {
            if (this.app.get_id() == "geany.desktop") {
                if (this.app.state == rUN && ((modifiers & cTRL) || !this.app.is_on_workspace(crtW))) {
                    this.app.open_new_window(-1);
                } else {
                    this.app.activate();
                    } 
            } else {
                if (modifiers & cTRL && this.app.state == rUN) {
                    this.app.open_new_window(-1);
                } else {
                    this.app.activate();
                    }
                }
            }
        Main.overview.hide();
}

function init() {
  _onActivateOriginal = AppDisplay.AppWellIcon.prototype._onActivate;
}

function enable() {
  AppDisplay.AppWellIcon.prototype._onActivate = _onActivate;
}

function disable() {
  AppDisplay.AppWellIcon.prototype._onActivate = _onActivateOriginal;
}
  • Reinicie o shell com Alt + F2 , r , Insira . Em seguida, ative a extensão com gnome-tweak-tool (talvez seja necessário reiniciar o shell mais uma vez para ativar a extensão).

Isso funciona com gnome-shell-3.6.3.1 , se você tiver outra edição de edição metadata.json e alterar essa linha para refletir sua versão do shell (não há garantia de que funcionaria com versões antigas do shell como 3.4.x ou versões futuras como 3.8.x) :

"shell-version": ["3.6.3.1"],

Note que a extensão apenas sobrescreve o comportamento do shell, se você (duplamente) clicar em arquivos em Nautilus para abri-los com Geany , ele ainda ativará a janela principal em outro desktop para que você também tenha que recorrer ao shell truque de script para obter um comportamento consistente: abra uma nova janela somente se nenhuma instância estiver na área de trabalho atual; caso contrário, ative a existente. Eu não tenho xprop instalado, mas isso funciona no meu sistema:

  • Crie um novo executável em algum lugar no meu $ PATH (como /usr/local/bin/djinni ):
#!/bin/sh

geany --socket-file /tmp/geany-sock-$(xdotool get_desktop) ${1+"$@"}
  • Aponte o ativador ( /usr/share/applications/geany.desktop ) para o script recém-criado:

    Exec=djinni %F

por 27.03.2013 / 15:32
0

Uma solução possível é salvar seu comando em ~ / bin / geany:

mkdir -p ~/bin
cat > ~/bin/geany
/usr/bin/geany --socket-file=/tmp/geany-sock-$(xprop -root _NET_CURRENT_DESKTOP | awk '{print $3}') $1
^d
chmod 755 ~/bin/geany

executável e cria o launcher .desktop assim: /home/$USER/bin/geany %F .

    
por 21.03.2013 / 21:46