XFCE / Run or Raise

Vissza álltam XFCE-re. Gyors, szép, sokat tud.

Egyetlen dolog hiányzik nekem, amelyet már pont le akartam programozni, de találtam kész megoldást. Azt szeretném, hogy ha egy program ikonjára klikkelek, akkor a már futó program ablakát hozza előtérbe és kapja meg a fókuszt. Ha nem fut, akkor pedig indítsa el. Mint a Unity-nél is az ikon klikk.

Alább találtam megoldást:

http://vickychijwani.github.io/2012/04/15/blazing-fast-application-swit…

Egyetlen csomag kell (van alapból minden disztróban elvileg): wmctrl

A megoldás:

wmctrl -x -a program || program -param1 -param2

Ilyen scriptet írtam hozzá run néven:

#!/bin/bash
# info: run app or raise its window if already running

if [ -z "$2" ]; then

wmctrl -x -a $1 || $1

else

$@

fi

Futtatás:

run firefox

vagy

run firefox hup.hu

Így nem kell használom semmilyen Window list megoldást vagy hosszú taskbar-t tele ablakokkal vagy Alt-tab-ot a sűrű program váltogatásokhoz, hanem csak a bazi ikonokat, amelyeket kiteszek a panelra.

Hozzászólások

Erdekes megoldas. Csak azon gondolodom, hogy mintha a panelra kirakott ikonoknal be lehetne allitani azt, hogy onallo peldany legyen-e, vagy epp ne. Az nem ugyanazt az eredmenyt hozza?

Feliratkozom, ezt a wmctrl-t nem ismertem és tetszik.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

welcome to windows 7

--
NetBSD - Simplicity is prerequisite for reliability

Ilyenkor szoktam örülni, hogy ismerek egy-két "programozható" ablakkezelőt, amivel ezek az "egyedi" igények nagyon könnyedén megoldhatóak.

> $@

En ezt lecserelnem exec "$@" -re. Just for fun.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. 

Amire te gondolsz, az az "$*".
$* = $@ = $1 " " $2 " " $3 ... - N db. sztring, de ha parameterben SPACE / TAB / ENTER van, osszekuszalodik.
"$*" = "$1 $2 $3 ..." - 1 db sztring, amiben szokozokkel elvalasztva ott van az osszes parameter
"$@" = "$1" "$2" "$3" ... - pontosan annyi db sztring, amennyi parameter volt, es pont a parameterek vannak ott (es nem zavaro a SPACE / TAB / ENTER)

Az exec meg csak azert kell, hogy sporolj egy processzt, amelyik egyebkent ott varna a programod lefutasaig csak azert, hogy utana kilepjen.

Sub. Nekem is a kedvenc ablakkezelőm. Ezt kipróbálom...

sub

int getRandomNumber() { return 4; }  // ← aláírás
//szabályos kockadobással választva. garantáltan véletlenszerű.  xkcd

Épp szükségem volt egy ilyen megoldásra a live Fedorámon, így az igényeimhez igazítottam, némileg általánosabb formában. A script /usr/local/bin/runrise, s így néz ki:

#!/bin/bash

PRG="${0##*/}"
[ x"$PRG" = x'runrise' ] && exit 1
if [ $# -eq 0 ]; then
    wmctrl -xa "$PRG" && exit 0
    pgrep -u "$USER" -x "$PRG" | grep -Evq "^$$\$" && exit 0
fi
PATH="${PATH/:\/usr\/local\/bin:/:}"
exec "$PRG" "$@"

A kívánt programok nevével symlinket kell csinálni a /usr/local/bin-be úgy, hogy a link a runrise scriptre mutasson. Mivel a PATH környezeti változóban a /usr/local/bin előrébb van, mint a /usr/bin, így amennyiben nem elérési úttal hivatkozunk a programra, csak a nevével, úgy a symlink miatt a runrise script indul, de beleteszi PRG változóba, milyen névvel indították. Paraméter nélkül hívva megpróbálkozik a fókusz áthelyezésével a kívánt program ablakára. Ha ez nem sikerül, akkor lehet, hogy még nincs ablaka a programnak, mert az lassan indul. Ezért megvizsgálom, hogy ezzel a névvel fut-e már process, de ebből önmagunkat nem vesszük figyelembe. Ha fut, kilépünk, mert akkor lesz ablak, csak idő kérdése, mikor.

Amennyiben nincs kívánt process, illetve, ha vannak parancssori paraméterek, úgy kiveszem a PATH-ból a /usr/local/bin-t, hogy ne a script hívódjon vissza, majd átadjuk a vezérlést a kívánt programnak.

Ezzel elég a symlinkeket megcsinálni, nem kell hozzányúlnom a menü konfigurációjához. Kipróbáltam, működik. :)

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Lehet, szebb, ha tőle kérünk descriptort, akkor biztosan nem futunk bele annak esetleges foglaltságába. Most nincs időm kipróbálni:

exec {fd}<"$0"
if ! flock -n $fd; then
  eval "exec $fd>&-"
  exit 1
fi

...

eval "exec $fd>&-"

Tegyük hozzá, nekem ez azért kellett, hogy lassú gépen ne lehessen elindítani sok példányban a böngészőt live-on, mert felzabálja a memóriát, tovább lassul, majd hatalmas load mellett közel meghal a gép. Ha két nagyon gyors kattintásra két példány elindul, az még belefér, de már az sem túl valószínű, hiszen nézem, fut-e már az illető process.

Ettől függetlenül a javaslatod korrektnek tűnik, az ötletet a következő verzióba bele fogom építeni. :)

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Valami baj van vele, debugolnom kell. Úgy tűnik, többnyire működik, de előfordul, hogy abban az esetben, amikor nem fut még az alkalmazás, az indító ikonjára kattintva a script valamiért nem indítja el. Talán lesz időm napközben foglalkozni vele. Remélem.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Na, ilyen lett, jól működik. Talán picit nem korrekt, de a gyakorlatban jó, egyszerű:

#!/bin/bash

PRG="${0##*/}"
[ x"$PRG" = x'runrise' ] && exit 1
if [ $# -eq 0 ]; then
    wmctrl -xa "$PRG" && exit 0
    [ `pgrep -c -u "$USER" -x "$PRG"` -gt 1 ] && exit 0
fi
PATH="${PATH/:\/usr\/local\/bin:/:}"
exec "$PRG" "$@"

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE