Expande o conceito de atividades do KDE para o shell

5

Às vezes, eu uso o KDE, e uma das coisas que eu mais gosto no KDE 4 é o conceito de atividade. No trabalho, é muito útil porque eu trabalho frequentemente em vários projetos diferentes durante um dia. Mudar para outra atividade me permite alterar os widgets, para que eu possa ter acesso a pastas relacionadas ao projeto atual, por exemplo.

Eu decidi usar esse conceito no shell, então codifiquei uma pequena função bash chamada "switch", que define aliases úteis para o projeto atual, por exemplo, alias cdwww=~/public_html/current_project/www e assim por diante.

A minha pergunta é : Existe uma maneira de sincronizar as atividades do KDE com as atividades do shell, que estão chamando 'myproj' em todos os terminais abertos ao alternar para a atividade 'myproj' através do KDE e vice-versa (pergunta bônus)

Outra questão : como faço meus aliases recém-criados funcionarem em todos os consoles? Existe uma maneira de detectar cada terminal aberto no konsole ou no gnome-terminal e executar minha função nele?

EDIT: aqui está a função switch, localizada no final do meu arquivo .bashrc, fique à vontade para comentar:

function switch() {

    if [ ! -d ~/.switch ]
    then
        mkdir ~/.switch
    fi

    if [ ! -f ~/.switch/proj.save ]
    then
        touch ~/.switch/proj.save
    fi

    echo "$1" > ~/.switch/proj.save

    case $1 in
    meddispar )
        echo "Switching to meddispar..."

        echo "setting cdproj alias"
        alias cdproj="cd ~/public_html/onp/"

        echo "setting cdwww alias"
        alias cdwww="cd ~/public_html/onp/www/"

        echo "setting cc alias"
        alias cc="cdwww && php bin/php/ezcache.php --clear-all --purge && cd -"
    ;;
    darjeeling )
        echo "Switching to darjeeling..."

        echo "setting cdproj alias"
        alias cdproj="cd ~/public_html/darjeeling/"

        echo "setting cdwww alias"
        alias cdwww="cd ~/public_html/darjeeling/www/"

        echo "setting cc alias"
        alias cc="rm -rf ~/public_html/darjeeling/www/var/cache/*"
    ;;
    * )
        echo "'$1'? WTF?"
        rm ~/.switch/proj.save
    ;;
    esac
}
if [ -f ~/.switch/proj.save ]
then
     switch 'cat ~/.switch/proj.save'
fi

De acordo com a resposta de Gilles, aqui está o que eu tenho:

greg@tiny :) ~ > qdbus |ack ctivity
 org.kde.ActivityController-1949
 org.kde.ActivityManager
greg@tiny :) ~ > qdbus org.kde.ActivityManager 
/
/ActivityManager
/MainApplication
/StatusNotifierWatcher
/connections
/kbuildsycoca
/kded
/kxkb
/modules
/modules/StatusNotifierWatcher
/modules/activitymanager
/modules/device_automounter
/modules/dnssdwatcher
/modules/favicons
/modules/freespacenotifier
/modules/keyboard
/modules/khotkeys
/modules/kpackagekitd
/modules/kremotecontroldaemon
/modules/ktimezoned
/modules/kwrited
/modules/nepomuksearchmodule
/modules/networkmanagement
/modules/networkstatus
/modules/powerdevil
/modules/randrmonitor
/modules/remotedirnotify
/modules/solidautoeject
/modules/statusnotifierwatcher
/org
/org/freedesktop
/org/freedesktop/PowerManagement
/org/freedesktop/PowerManagement/Inhibit
/org/kde
/org/kde/networkmanagement
/org/kde/networkmanagement/Activatable
/org/kde/networkmanagement/Activatable/10
/org/kde/networkmanagement/Activatable/11
/org/kde/networkmanagement/Activatable/12
/org/kde/networkmanagement/Activatable/13
/org/kde/networkmanagement/Activatable/14
/org/kde/networkmanagement/Activatable/15
/org/kde/networkmanagement/Activatable/16
/org/kde/networkmanagement/Activatable/17
/org/kde/networkmanagement/Activatable/2
/org/kde/networkmanagement/Activatable/3
/org/kde/networkmanagement/Activatable/4
/org/kde/networkmanagement/Activatable/5
/org/kde/networkmanagement/Activatable/6
/org/kde/networkmanagement/Activatable/7
/org/kde/networkmanagement/Activatable/8
greg@tiny :) ~ > qdbus org.kde.ActivityManager /ActivityManager
method QStringList org.kde.ActivityManager.ActivitiesForResource(QString uri)
method QString org.kde.ActivityManager.ActivityIcon(QString id)
method QString org.kde.ActivityManager.ActivityName(QString id)
signal void org.kde.ActivityManager.ActivityNameChanged(QString id, QString name)
method QString org.kde.ActivityManager.AddActivity(QString name)
method QStringList org.kde.ActivityManager.AvailableActivities()
method QString org.kde.ActivityManager.CurrentActivity()
signal void org.kde.ActivityManager.CurrentActivityChanged(QString id)
method bool org.kde.ActivityManager.IsBackstoreAvailable()
method void org.kde.ActivityManager.RegisterActivityController(QString service)
method void org.kde.ActivityManager.RegisterResourceWindow(uint wid, QString uri)
method QStringList org.kde.ActivityManager.RegisteredActivityControllers()
method void org.kde.ActivityManager.RemoveActivity(QString id)
method void org.kde.ActivityManager.SetActivityIcon(QString id, QString name)
method void org.kde.ActivityManager.SetActivityName(QString id, QString name)
method bool org.kde.ActivityManager.SetCurrentActivity(QString id)
method void org.kde.ActivityManager.UnregisterResourceWindow(uint wid, QString uri)
method QString org.kde.ActivityManager._allInfo()
method QString org.kde.ActivityManager._serviceIteration()
method QDBusVariant org.freedesktop.DBus.Properties.Get(QString interface_name, QString property_name)
method QVariantMap org.freedesktop.DBus.Properties.GetAll(QString interface_name)
method void org.freedesktop.DBus.Properties.Set(QString interface_name, QString property_name, QDBusVariant value)
method QString org.freedesktop.DBus.Introspectable.Introspect()
greg@tiny :) ~ > qdbus org.kde.ActivityController-1949 /ActivityController 
method void org.kde.ActivityController.ActivityAdded(QString id)
method void org.kde.ActivityController.ActivityRemoved(QString id)
method void org.kde.ActivityController.ResourceWindowRegistered(uint wid, QString uri)
method void org.kde.ActivityController.ResourceWindowUnregistered(uint wid, QString uri)
method QDBusVariant org.freedesktop.DBus.Properties.Get(QString interface_name, QString property_name)
method QVariantMap org.freedesktop.DBus.Properties.GetAll(QString interface_name)
method void org.freedesktop.DBus.Properties.Set(QString interface_name, QString property_name, QDBusVariant value)
method QString org.freedesktop.DBus.Introspectable.Introspect()

EDIT: Eu reescrevi completamente o meu script usando python, e agora todo o projeto está disponível aqui: link

    
por greg0ire 26.10.2010 / 23:16

2 respostas

8

Controlando as atividades do KDE via dbus

O KDE pode ser controlado a partir da linha de comando com qdbus . A sintaxe geral é qdbus COMPONENT PATH METHOD ARGUMENT1... , em que COMPONENT é tipicamente algo como org.freedesktop.Foo ou org.kde.Bar , PATH denota uma classe exposta pelo componente, METHOD é o nome de uma determinada ação nessa classe e pode haver argumentos adicionais dependendo do método.

Aqui estão os comandos para o KDE ≥4,7 para listar atividades, para obter a atividade atual e para definir a atividade atual.

qdbus org.kde.kactivitymanagerd /ActivityManager org.kde.ActivityManager.ListActivities
qdbus org.kde.kactivitymanagerd /ActivityManager org.kde.ActivityManager.CurrentActivity
qdbus org.kde.kactivitymanagerd /ActivityManager org.kde.ActivityManager.SetCurrentActivity "activity identifier "

Descobrir o que o dbus pode fazer

A documentação do dbus do KDE é muito pobre. Cada aula é minimamente documentada, por ex. Atividade , DesktopCorona ). Mas você provavelmente terá que experimentar e talvez ler a fonte (há links nas páginas de documentação da API) para descobrir o que está disponível.

Se você digitar qdbus com até dois argumentos, ele listará as possibilidades do próximo argumento. O seguinte trecho de shell lista todos os métodos Qt-dbus disponíveis:

for x in $(qdbus | sed '/^:/d'); do
  for y in $(qdbus $x); do
    qdbus $x $y | sed "s~^~$x $y ~"
  done
done 2>/dev/null >qdbus.list

Outra maneira de explorar a árvore dbus é qdbusviewer nas ferramentas de desenvolvimento do Qt. Há também uma interface qt-dbus do Python como parte do PyQt .

Fazendo a casca reagir

Para fazer um shell reagir a eventos externos, o melhor que você pode razoavelmente fazer é verificar algo antes de exibir um prompt. Bash executa $PROMPT_COMMAND antes de exibir um prompt e zsh executa a função precmd . Então você pode procurar a atividade atual do KDE e fazer algo se for alterado desde a última vez que você olhou.

    
por 05.02.2012 / 18:17
0

how do I make my newly created aliases work in all consoles

Isso é especialmente fácil quando se usa o fish shell em vez de bash. Além de aumentar a produtividade em geral (pelo menos para mim), ele conhece o conceito de uma variável global (universal), que é definida por

set -U VARIABLE_NAME VALUES

A variável está imediatamente disponível em todos os consoles e o valor é restaurado após a reinicialização.

    
por 04.10.2013 / 10:15