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