# Xinerama: WM auf Knopfdruck Screen wechseln

## Finswimmer

Hi!

Heute habe ich mal unter Windows mit einem Xinerama Setup gearbeitet.

Dort gab es neben Minimieren einen Knopf, der das jeweilige Fenster von einem Screen zum nächsten springen ließ.

Dies ging auch bei Vollbildfenstern.

Unter KDE müsste ich erst ein Vollbildfenster minimieren, verschieben und dann maximieren.

Habt ihr eine Idee, wie ich das hinbekommen kann?

Danke

Tobi

----------

## Mr_Maniac

 *Finswimmer wrote:*   

> Hi!
> 
> Heute habe ich mal unter Windows mit einem Xinerama Setup gearbeitet.
> 
> Dort gab es neben Minimieren einen Knopf, der das jeweilige Fenster von einem Screen zum nächsten springen ließ.
> ...

 

Das ist keine Windows-Funktion, sondern wird von nVidias Treiber bereitgestellt (Stichwort nView).

Finde ich auch sehr praktisch.

Ich habe auf meinem PC momentan ein Setup mit "Fake Xinerama".

Mein primärer Monitor ist ein FullHD Widescreen TFT und mein sekundärer Monitor ist mein "alter" 19 Zoll TFT.

Mit Twinview werden dann quasi beide Monitore wie einer behandelt, also wenn ich eine Anwendung maximiere, wird diese auf beide Bildschirme gestreckt und das noch so, dass ich auf dem 19" nur einen Teil der Anwendung sehe, weil nach oben/unten hin 176 Pixel fehlen.

"Normales" Xinerama wollte nicht klappen und so habe ich eine von nvidia-settings erstellte Config genommen.

Somit habe ich zwei seperate Screens. Die Maus lässt sich auch prima in den zweiten Bildschirm hineinziehen, aber Anwendungen nicht. Diese muss ich explizit auf dem zweiten Screen starten (:0.1).

----------

## chilla

 *Quote:*   

> Unter KDE müsste ich erst ein Vollbildfenster minimieren, verschieben und dann maximieren.
> 
> 

 

Das ist komisch. Ich habe xinerama mit einem 1024er und einem 1280er bildschirm. Ich kann die einfach zwischen den Bildschirmen hin und herschieben und muss dafür nichts erst minimieren und danach wieder maximieren. Bist du dir sicher, dass du xinerama richtig eingerichtet hast?

----------

## Finswimmer

@Mr_Maniac: Danke für das Stichwort, werde ich mal schauen, ob das auch unter Linux klappt.

@chilla: Ja, hmm. Da hatte ich wohl was falsch in Erinnerung gehabt. Ein maximiertes Fenster verschieben geht ohne Probleme. Nur kann man das Fenster auch so schieben, dass es nicht mehr komplett auf dem Bildschirm ist.

Mit o.g. Taste wäre es ja so, dass er es automatisch wieder in der Mitte zentriert.

Tobi

----------

## Finswimmer

Hmm. Zu nview finde ich nur, dass nview das gleiche wie Twinview 2.0 ist.

Aber da ich zwei verschiedene GraKas habe benutze ich ja kein Twinview, oder?

Ist die von mir gewünschte Funktion nicht eine Funktion von einem WM? Der Nvidia Treiber hat damit doch wenig zu tun?

Tobi

----------

## Mr_Maniac

 *Finswimmer wrote:*   

> Hmm. Zu nview finde ich nur, dass nview das gleiche wie Twinview 2.0 ist.

 

Nun... nView ist eine Art "kleiner Desktop-Manager" (Windows only), der u.a. auch meherere Desktops/Arbeitsflächen unter Windows erlaubt (so wie es bei jedem WM unter Linux seit Jahren der Fall ist  :Wink:  ).

Es hat nicht unbedingt nur was mit mehreren Monitoren zu tun.

 *Quote:*   

> Aber da ich zwei verschiedene GraKas habe benutze ich ja kein Twinview, oder?

 

Stimmt. Wusste nicht, dass du zwei GraKas hast  :Wink: 

Twinview ist - soweit ich weiß - tatsächlich nur für eine Grafikkarte gedacht. Da wird dann einfach ein Framebuffer für zwei Monitore genutzt.

Also sieht der XServer eigentlich quasi nur einen "Monitor" mit der horizontalen Auflösung von Monitor1+Monitor2 und der vertikalen Auflösung des "höheren" Monitors. Das ist - wenn ich das richtig beobachtet habe - unter Linux wie unter Windows gleich (ich habe mal einen Screenshot in einem Spiel gemacht. Das Spiel lief auf meinem Widescreen TFT und auf dem 19" TFT liefen SpeedFan und der Taskmanager. Der Screenshot war dann 3200x1200 groß und ging direkt von dem Screenshot im Spiel (links) auf den etwas kleineren Screenshot mit SpeedFan mit Taskmanager über (rechts). Über dem kleinen Screenshot war dann halt ein schwarzer Balken. Wenn der Wunsch besteht, kann ich diesen Screenshot ja mal hochladen).

Jedoch funktioniert das unter Windows (noch?) ein wenig besser: Dort sieht nämlich auch Windows zwei Bildschirme und der Bereich im Framebuffer, der nicht genutzt wird, wird wohl tatsächlich auch als nicht benutzbar markiert.

(Achtung: Diese Angaben sind alle ohne Gewähr  :Wink:  )

Wenn ich das so unter Linux haben will, muss hier dieses "Fake Xinerama" Setup nehmen. "Echtes" Xinerama funktioniert nicht.

Jedoch kann ich Fenster somit NICHT zwischen den Screens hin- und herschieben  :Sad: 

Dieser Button wäre auch meiner Meinung nach sehr Praktisch. Denn wie schon von dir erwähnt wird dann ja das Fenster nicht einfach nur hinüber geschoben, sondern auch gleich auf die richtige Auflösung angepasst. Bei verschieden großen Auflösungen (bei mir 1920x1200 zu 1280x1024) ist das sehr angenehm!

Ich habe bisher leider noch nirgends eine Funktion "senden an Bildschirm X oder Screen X" gefunden  :Sad: 

Allerdings nutze ich auch nur FluxBox oder Compiz mit Emerald  :Wink: 

 *Quote:*   

> Ist die von mir gewünschte Funktion nicht eine Funktion von einem WM? Der Nvidia Treiber hat damit doch wenig zu tun?

 

Zumindest unter Windows nicht... Dort wird diese Funktion von nView in die Windows-GUI rein"gebastelt".

Ich habe das mal wunderbar beobachtet, als da mal etwas ein wenig schief lief (ich glaube es war, als ich aus einem Spiel mit einer anderen Auflösung als der nativen wieder auf den Desktop zurückkehrte):

Da war ein Fenster, dass ursprünglich auf Monitor2 war plötzlich auf Monitor1, aber dieser "Monitor wechseln"-Button war seltsamer Weise noch auf Monitor2.

----------

## fuchur

Hi

Sawfish kann so etwas. Wenn du ein "aktuelles" (svn) ebuild

möchtes kann ich es hier posten.

MfG

----------

## Finswimmer

 *fuchur wrote:*   

> Hi
> 
> Sawfish kann so etwas. Wenn du ein "aktuelles" (svn) ebuild
> 
> möchtes kann ich es hier posten.
> ...

 

Ein Test ist es allemal wert.  :Smile: 

Danke!

Tobi

----------

## fuchur

Hi

Hier ist das ebuild.

Nachdem du Sawfish einmal gestartet hast legst du

wenn nicht vorhanden folgende Files/Dateien an:

```

mkdir ~/.sawfish/lisp/

touch ~/.sawfish/rc
```

Danach die erweiterung Send-to-head

in ~/.sawfish/lisp/ speichern.

In Datei ~/.sawfish/rc folgendes eintragen

```

(require 'Send-to-head)
```

eintragen. Sawfish neu starten.

Dann mittlere Maustaste auf Desktop

Anpassen -> Tastenkombinationen und z.B.

Zusammenhang -> Close button -> Hinzufügen

Taste:Button2-Off Befehl:Send to next Head.

Wenn du nun mit der mittleren Maustaste auf den

Close Button drückst springt das Fenster zum nächsten Head.

MfG

----------

## Finswimmer

Habe alles so gemacht, aber:

*** Invalid function: #<window 3200005> 

wenn ich es aus der Konsole starte.

Tobi

----------

## fuchur

Hi

 *Finswimmer wrote:*   

> Habe alles so gemacht, aber:
> 
> *** Invalid function: #<window 3200005> 
> 
> wenn ich es aus der Konsole starte.

 

Läuft noch ein anderer WM? Hast du mal probiert aus GDM/KDM

nur sawfish zu starten?

Wenn du kde benutzt leg mal die datei

~/.kde/env/wmmannage.sh an. In der Datei schreibst du 

```
#!/bin/sh

export KDEWM=/usr/bin/sawfish
```

 und ausfürbar machen.

Kde neu starten.

MfG

----------

## Finswimmer

 *fuchur wrote:*   

> Hi
> 
>  *Finswimmer wrote:*   Habe alles so gemacht, aber:
> 
> *** Invalid function: #<window 3200005> 
> ...

 

Aus KDM kann ich nun sawfish starten. Der Fehler ist immer noch da.

Leider.

Kann ich dem auch irgendwie sagen, dass er standardmäßig die Fenster nur auf einen Screen maximieren soll?

Tobi

----------

## fuchur

Hi

Habe das gerade einmal bei mir mit einem neuen Benutzer

nach meiner Anleitung ausprobiert und es hat funktioniert.

Die Fehlermeldung bei dir hatte ich auch das kommt von

einem Klammerfehler in Send-to-head.jl. Ein Send-to-head 

ohne Klammerfehler findest du hier.

MfG

----------

## fuchur

Hi

 *Finswimmer wrote:*   

> Kann ich dem auch irgendwie sagen, dass er standardmäßig die Fenster nur auf einen Screen maximieren soll?

 Wie meinst du das? Ein bisschen genauer bitte.

MfG

----------

## Finswimmer

 *fuchur wrote:*   

> Hi
> 
> Habe das gerade einmal bei mir mit einem neuen Benutzer
> 
> nach meiner Anleitung ausprobiert und es hat funktioniert.
> ...

 

Mit der neuen Version kommt kein Fehler, allerdings passiert auch nichts.

 *Quote:*   

> 
> 
> Hi
> 
> Finswimmer wrote:
> ...

 

Im Moment maximiert mir Sawfish ein Fenster über beide Screens, wenn ich auf den Button klicke.

Ich möchte allerdings, dass er es immer nur über 1 Screen macht.

Tobi

----------

## fuchur

Hi

Poste mal die Ausgabe von

```
sawfish-client -e "(head-count)"

sawfish-client -e "(head-offset 0)"

sawfish-client -e "(head-offset 1)"
```

Xinerama Flag ist gesetzt?

MfG

----------

## Finswimmer

```
[18:23:25]|[tobi@tobi-rechner]|~

$sawfish-client -e "(head-count)"

1

[18:23:28]|[tobi@tobi-rechner]|~

$sawfish-client -e "(head-offset 0)"

(0 . 0)

[18:23:28]|[tobi@tobi-rechner]|~

$sawfish-client -e "(head-offset 1)"

*** Remote sawfish error: (bad-arg #<subr head-offset> 1 1)

```

Xinerama ist gesetzt. Aber sawfish selbst hat kein Xinerama USE-Flag?

[ebuild   R   ] x11-wm/sawfish-1.3.4  USE="audiofile esd nls readline -debug -gnome -pango" 0 kB [1]

Danke für die ganze Mühe!

EDIT: Meine xorg.conf könnte nützlich sein: http://rafb.net/p/Yjaqk814.html

Tobi

----------

## fuchur

Hi

 *Finswimmer wrote:*   

> 
> 
> ```
> [18:23:25]|[tobi@tobi-rechner]|~
> 
> ...

 

Du hast nur einen Head. Bei 2 Heads müsste

```
sawfish-client -e "(head-count)"

2
```

erscheinen. Auch müsste dann bei "head-offset 1" keinen Fehlermeldung kommen sondern

sollte in etwa so aussehen:

```
sawfish-client -e "(head-offset 1)"

(1280 . 0)
```

 Wenn xinerama gesetzt ist denke ich mal es liegt an der xorg.conf.

Kannst sie ja mal posten. 

Sawfish selber benötigt kein xinerama flag.

MfG

----------

## Finswimmer

Da hast du wohl mein EDIT übersehen (oder ich hab es zu spät hinzugefügt):

 Meine xorg.conf könnte nützlich sein: http://rafb.net/p/Yjaqk814.html

Evtl liegt es daran, dass ich zwei Grafikkarten drin habe?

Tobi

----------

## fuchur

Hi

Erstelle mal ~/.xinitrc. Wenn vorhanden zu testzwecken umbenenne.

In ~/.xinitrc folgendes eintragen

```

#!/bin/bash

defaultwm=sawfish

#set the window manager to $1 if it was supplied

windowmgr=${1:-$defaultwm}

#start the respective window managers

case ${windowmgr} in

    sawfish)

        WINDOWMANAGER=sawfish

    ;;

    *)  WINDOWMANAGER=$defaultwm # default for unknown wm's

esac

exec $WINDOWMANAGER
```

Zweiten xserver mit sawfisch starten

```
/usr/bin/startx sawfish -- :1
```

Poste von dem xserver dann mal

```

sawfish-client -e "(head-count)"

sawfish-client -e "(head-offset 0)"

sawfish-client -e "(head-offset 1)"
```

MfG

----------

## fuchur

Hi

Kannst ja auch mal diese xorg.conf ausprobieren. Auf eigenes Risiko natürlich  :Wink: .

MfG

----------

## Finswimmer

 *fuchur wrote:*   

> Hi
> 
> Kannst ja auch mal diese xorg.conf ausprobieren. Auf eigenes Risiko natürlich .
> 
> MfG

 

Das will auch nicht. Ich musste Screen0/1 aus der Card Definition rausnehmen, sonst startete X gar nicht.

Habe dann sawfish gestartet und in einem Xterm die o.g. Befehle ausgeführt. Er findet immer nur 1 Head.

Schade…

EDIT: Wie wäre es mit einer Funktion, die das Fenster entweder 0,0 oder 1280,0 setzt? Je nachdem, wo das Fenster gerade ist.

Leider habe ich sowas nicht gefunden und mit lisp kenne ich mich auch nicht aus…

Tobi

----------

## fuchur

Hi

Wenn du wirkilch alles mit der xinerama flag übersetzt hast liegt es wohl am nvidia treiber.

Kannst es ja noch mal überprüfen mit

```
eix -U xinerama -I -c
```

Was ist den wenn du einen Nvidia Treiber in deiner xorg.conf durch den nv treiber ersetzt?

 *Finswimmer wrote:*   

> EDIT: Wie wäre es mit einer Funktion, die das Fenster entweder 0,0 oder 1280,0 setzt? Je nachdem, wo das Fenster gerade ist.
> 
> Leider habe ich sowas nicht gefunden und mit lisp kenne ich mich auch nicht aus…

 

Wie soll sawfish den dann deine Auflösungen/Offsets/current-pointer-head  usw. herausbekommen?

Müsste man alle variable von "Hand setzen" ist aber sicherlich ein großer Aufwand.

MfG

----------

## fuchur

Hi

Alles was du benötigst findest du hier

Habe das gerade bei mir ausprobiert bei eine Monitor mit einer Auflösung von 1280x1024.

Konnte damit ein Xinerama Bildschirm von 2 mal 640x1024 erstellen. 

So habe ich es gemacht:

```

gcc -O2 -Wall Xinerama.c -fPIC -o libXinerama.so.1.0 -shared

mv /usr/lib/libXinerama.so.1.0.0 /usr/lib/libXinerama.so.1.0.0-org

mv /gerade/gebaute/libXinerama.so.1.0 /usr/lib/libXinerama.so.1.0.0
```

Datei ~/.fakexinerama oder/und /root/.fakexinerama halt der

Benutzer der X ausführt

```
2

0 0 640 1024

640 0 640 1024
```

Auflösung in .fakexinerama musst noch anpassen. Wenn das bei dir

auch funktioniert kannst du dir dann eine Patch für "x11-libs/libXinerama-1.0.2"

machen.

MfG

----------

## Finswimmer

Vorhin mal getestet. Baut auch anscheinend ein anderes Xinerama auf, aber sawfish sagt immernoch nur 1 Head…

Tobi

----------

## fuchur

Hi

 *Finswimmer wrote:*   

> Vorhin mal getestet. Baut auch anscheinend ein anderes Xinerama auf, aber sawfish sagt immernoch nur 1 Head…

 

Klappt bei mir mit Fluxbox Metacity XFWM4 Sawfish mit einem oder zwei Heads. Sawfish sagt bei mir immer

das er zwei Heads hat. Wenn du X danach noch neu gestartet hast und es trotzdem nicht funktioniert,

weiß ich nicht. Dann halt nicht.

MfG

----------

## Mr_Maniac

Nur am Rande:

Ich habe gerade gemerkt, dass ja bei mir das Xinerama USE-Flag gar nicht gesetzt war.

Hatte ja bisher nur einen Monitor...

Mal schauen, was sich nach dem Rebuild ändert  :Wink: 

----------

## Freiburg

ansonsten kann ich nur openbox empfehlen, da kann man sich das ganze nett auf eine Tastenkombination legen (Bei mir Windows-1 für den ersten Monitor und Windows-2 für den zweiten)

----------

## Finswimmer

 *Freiburg wrote:*   

> ansonsten kann ich nur openbox empfehlen, da kann man sich das ganze nett auf eine Tastenkombination legen (Bei mir Windows-1 für den ersten Monitor und Windows-2 für den zweiten)

 

Das sollte sawfish ja auch koennen. Aber das Ding hat bei mir immer nur einen Head erkannt. Dadurch war das dann alles nicht moeglich.

Hast du denn, wie ich, 2 Grafikkarten in dem Rechner? Oder 1 Karte mit Twinview?

Tobi

----------

## Mr_Maniac

Also selbst mit Xinerama USE-Flag habe ich immer noch keine Möglichkeit, die Programme ÜBERHAUPT zwischen den Screens hin- oder her zu schieben.

Ich persönlich konnte sowieso bei KEINEM Programm einen Unterschied in der GUI oder sonstwo feststellen...

Gibt es keinen Shell-Befehl für sowas?

xsend $programm $screen?

Übrigens... Es gibt ja auch unter KDE beim "Einrichten der Kontrollleiste" einen Button "Identifizieren" (Xinerama-Einstellungen). Wenn ich dort drauf klicke, werden mir die "1" und die "2" (die ja eigentlich auf den verschiedenen Monitoren erscheinen sollten) beide auf dem "primären" Monitor angezeigt.

Kann das ggf. etwas mit dem nVidia-Treiber zu tun haben? Schließlich nutze ich ja nicht das "echte" Xinerama, sondern die nVidia-Xinerama-Erweiterung (Fake-Xinerama?).

Ich probiere einfach noch etwas herum...

----------

## Finswimmer

 *Freiburg wrote:*   

> ansonsten kann ich nur openbox empfehlen, da kann man sich das ganze nett auf eine Tastenkombination legen (Bei mir Windows-1 für den ersten Monitor und Windows-2 für den zweiten)

 

Wie mache ich das denn?

Danke

Tobi

----------

## Finswimmer

Nach weiterem Rumprobieren sieht es immer noch so aus, als ob ich keine Head-1 Head-2 habe, da ich zwei Grafikkarten mit je 1 Monitor habe.

Gibt es nicht die Möglichkeit Fenster über Koordinaten zu platzieren?

Denn dann bräuchte ich nur noch ein Symbol oben in der Fensterleiste, welches das dazugehörige Skript aufruft.

Tobi

----------

