Anzeige:
Ergebnis 1 bis 1 von 1

Thema: FVWM: Programm auf aktuellem Desktop starten

  1. #1
    paranoid
    Registriert seit
    Dec 2001
    Beiträge
    162

    FVWM: Programm auf aktuellem Desktop starten

    Klingt eher trivial, aber wie soll ich das sonst kurz formulieren?

    1. Das Problem

    Natürlich startet ein Programm auf dem aktuellen Desktop. Aber nur, wenn man diesen nicht wechselt. Ein Fenster erscheint immer auf dem Desktop, der beim Erstellen des Fensters aktiv ist. Und oft genug dauert es ein paar Sekunden zwischen dem Programmstart und dem Aufbau des Fensters. Ich habe diese Frage, wie das zu umgehen ist, schon recht oft gehört/gelesen, und sie wurde nie zufriedenstellend beantwortet.
    Die Sache ist die: Der X-Server weiss nicht, auf welchem Desktop ein Programm gestartet wurde. Das Programm selbst weiss es genausowenig. Der letzte Ansatz ist also der Window-Manager, der aufgrund seiner Bezeichnung ja schon dafür zuständig sein muss
    Und schon kommt das nächste Problem: Woher weiss man, welches Fenster zu welchem Programm/Prozess gehört? Das weiss wohl nur das Programm selbst, aber sagt es im Normalfall nicht weiter.
    Deshalb fehlt diese oft gewünschte Funktion bei allen (mir bekannten) Window-Managern.

    2. Die Idee

    Ich bin ein Fan von FVWM, einem in höchstem Maße konfigurierbaren Window-Manager. Da bin ich auf die Idee gekommen, dass man mit FVWM sich ein solches Verhalten ("Auf dem Desktop anzeigen wo es gestartet wurde") bestimmt auch skripten kann.
    Den Schritt Programmname->Fenstername muss immer noch der User übernehmen, sollte es dazu eine bessere Lösung geben, wäre ich dankbar für die Erwähnung einer solchen.

    3. Die Lösung (alpha)

    In FVWM kann ich mir Funktionen mit (fast) beliebigem Zweck definieren. Ich brauche also eine Funktion, die beim Starten eines Programms dafür sorgt, dass dessen Fenster auf dem zum Startzeitpunkt aktuellen Desktop landet. Die Funktion (StartOnCurrentDesk) arbeitet dann folgendermaßen:
    Code:
    StartOnCurrentDesk <Befehl> <Fenstername>
    Die Funktion bekommt die wichtigen Daten als Argument, und sorgt selbst für den Programmstart.
    Jetzt zum wichtigsten: Wie sieht diese Funktion aus?
    So:
    Code:
    DestroyFunc StartOnCurrentDesk
    AddToFunc StartOnCurrentDesk
    + I PipeRead `echo Style $1 SkipMapping, !FPGrabFocus, !FPFocusByProgram, StartsOnPage $[desk.n] $[page.nx] $[page.ny]`
    + I Exec exec $0
    + I Wait $1
    + I Style $1 !SkipMapping, FPGrabFocus, FPFocusByProgram, StartsAnyWhere
    Mit PipeRead kann ich die Standard-Ausgabe von beliebigen Programmen als Fvwm-Befehle auswerten.
    Und FVWM speichert Informationen wie die aktuelle Page oder den Desktop in Umgebungsvariablen, die "echo" einfach auflöst.
    (FVWM unterteilt die Desktops noch in Pages)
    Mit dem "Style" Befehl sage ich FVWM, dass ein Fenster mit dem Namen "$1" (zweites Argument der Funktion, es wird bei 0 zu zählen begonnen) beim Erstellen nicht den Fokus erhalten soll (da ich sonst von dem Desktop, den ich gerade aktiv habe, zurückspringe zu dem Desktop, wo das Fenster erscheint), und dass es auf der aktuellen Page (die ich über die Variablen herausfinde) gestartet werden soll. Nachdem das Fenster erschienen ist, setze ich den Style wieder zurück, damit ein nächstes Fenster des gleichen Programms sich wieder "normal" verhält.

    4. Die Lösung (beta)

    Ich hätte jetzt zusätzlich noch gerne, dass das mit meinem Skript erstellte nicht aktive Fenster automatisch den Fokus erhält, wenn ich auf die Page wechsle, wo das Fenster sitzt.
    Auch das klappt mit FVWM. Dazu passe ich mein Skript wie folgt an:
    Code:
    DestroyFunc StartOnCurrentDesk
    AddToFunc StartOnCurrentDesk
    + I All ($1) State 1 True
    + I PipeRead `echo Style $1 SkipMapping, !FPGrabFocus, !FPFocusByProgram, StartsOnPage $[desk.n] $[page.nx] $[page.ny]`
    + I Exec exec $0
    + I Wait $1
    + I All ($1, !State 1) State 2 True
    + I Style $1 !SkipMapping, FPGrabFocus, FPFocusByProgram, StartsAnyWhere
    Ich verwende State 1, um mir zu merken, welche Fenster mit dem angegebenen Namen schon vorher existiert haben. Nach dem Programmstart markiere ich das neue Fenster mit State 2. Damit ein Fenster mit State 2 automatisch fokusiert wird beim Desktopwechsel, brauche ich noch FvwmEvent:
    Code:
    *FvwmEvent: Cmd Function
    *FvwmEvent: new_page All (CurrentPage, State 2) Focus
    Module FvwmEvent
    Jetzt wird beim Desktop/Page-Wechsel jedes Fenster fokusiert, was auf der Page ist und "State 2" hat.

    5. Praktische Anwendung

    Wie setze ich das Ganze ein?
    In meinen FVWM-Menü-Definitionen, Shortcuts, "Startleisten",...
    Aus
    Code:
    Exec xchat-2
    wird
    Code:
    StartOnCurrentPage xchat-2 X-Chat
    ...oder sogar in der Shell. Dazu braucht man ein alias (oder man muss sehr viel tippen). Beispiel mit der bash:
    Code:
    alias <alias-name>='FvwmCommand "StartOnCurrentPage <Befehl> <Fenstername>"'
    Aber Vorsicht: Dieses alias funktioniert nur, wenn fvwm auch läuft!

    Wichtig: Das Skript zu benutzen hat nur Sinn bei Programmen, die tatsächlich einige Zeit brauchen, um ein Fenster zu erstellen. Bei sehr kleinen Programmen oder Terminal-Emulatoren ist die Zeit bis zur Fenster-Erstellung so gering, dass wohl niemand in dieser kurzen Zeit den Desktop wechselt. Ich verwende das Skript zum Beispiel für Firefox, Thunderbird, OpenOffice, Nicotine.

    Ein Beispielaufruf:
    Code:
    StartOnCurrentDesk firefox *Firefox*
    Wie man sehen kann, nimmt das Fenstername-Argument auch Wildcards an, was den Umgang sehr viel angenehmer macht.

    6. BUGS

    1) Es gibt Fenster, die die Aufmerksamkeit auf jeden Fall auf sich ziehen wollen. Die starten zwar dort, wo sie mit dem Skript sollen, aber FVWM wechselt auch sofort auf die Page, wo das Fenster entstanden ist. Bisher habe ich dieses Verhalten nur bei sancho feststellen können. Sollte es da noch mehr "unartige" Programme geben, könnt ihr diese gerne hier auflisten (Post oder PM an mich).

    2) Ich verwende die fvwm2rc von taviso, die ich etwas angepasst habe.
    In dieser Konfiguration gibt es eine Funktion WheelScroll, um die Pages zu wechseln.
    Ich kann mit meiner Anpassung diese Funktion auf 2 Arten aufrufen:
    - Mausrad auf dem Root Fenster (Desktop)
    - STRG drücken und Mausrad scrollen (Egal wo)

    Funktioniert auch wunderbar, außer es wurde mit meinem Skript ein Programm gestartet, dessen Fenster noch nicht erstellt wurde. Wenn ich zu diesem Zeitpunkt die zweite Methode verwende (STRG + Mausrad), dann beendet sich FVWM sofort. Seltsamerweise passiert das nicht, wenn ich die andere Methode verwende (Mausrad auf dem Desktop). Obwohl der Funktionsaufruf in beiden Fällen exakt gleich ist.

    Zu allen Fehlern sind behebende Maßnahmen (Fixes) immer Willkommen!

    7. Glossar

    Ja ich hoffe euch weitergeholfen zu haben, ohne dabei viel zuviel geschrieben zu haben. Ich wollte hier nicht nur eine Methode zur Lösung des eigentlichen Problems präsentieren, sondern auch die Mächtigkeit von FVWM demonstrieren. Vielleicht findet der Eine oder Andere ja mit FVWM den Windowmanager, den er/sie schon immer gesucht hat. Bei mir zumindest war das so *g*


    Solltet ihr Fehler in meiner Erklärung finden (Rechtschreibung, Grammatik, Syntax,...), PM an mich. Auch ich bin nicht unfehlbar


    hf&gl, euer Pixelbrei
    Geändert von Pixelbrei (13.11.04 um 03:34 Uhr) Grund: lol... Den ersten Rechtschreibfehler im Wort "Rechtschreibung" gefunden.

Ähnliche Themen

  1. Programm bei Systemstart starten und mittels Cronjob überwachen?
    Von Chaotix im Forum System installieren und konfigurieren
    Antworten: 14
    Letzter Beitrag: 04.09.06, 21:30
  2. XFCE 4 autostart programm auf workspace 4 starten !
    Von lazarusz im Forum Windowmanager
    Antworten: 0
    Letzter Beitrag: 20.10.04, 17:48
  3. Debian auf Powerbook 12" + Gott und die Welt
    Von n-tupel im Forum System installieren und konfigurieren
    Antworten: 4
    Letzter Beitrag: 30.08.04, 11:16
  4. Antworten: 15
    Letzter Beitrag: 09.03.04, 13:45
  5. xFce4: wie Programm auf bestimmtem Desktop starten?
    Von pommes im Forum Windowmanager
    Antworten: 5
    Letzter Beitrag: 05.03.04, 11:36

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •