Bild der Arbeitsflächen kriegen

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Bild der Arbeitsflächen kriegen

Beitrag von Teekeks »

Hallo!
Ich würde gerne mal wissen wie man ein Bild von jeder Arbeitsfläche die man hat bekommt bei SUSE11.2 (also KDE4).
Also auch von den Programmen die auf dieser gerade an sind.
Gibt es da irgendeine Funktion oder muss ich mir das selber zusammen tippen und wenn ja, wie?

Vermutlich brauche ich ja irgendwie das Handle der Arbeitsfläche, aber wie bekomme ich das und wie mach ich daraus dann ein Bild?

Gruß Teekeks

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: Bild der Arbeitsflächen kriegen

Beitrag von theo »

Sie müssen nur den Nippel durch die Lasche ziehn
und mit der kleinen Kurbel ganz nach oben drehn.
Da erscheint sofort ein Pfeil
und da drücken sie dann drauf
ich wollt' es gerade tun
da schlug ich auf.
:wink:

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Bild der Arbeitsflächen kriegen

Beitrag von Targion »

Theo, was ist denn mit dir los? :shock:
Also, wie genau du das mit Lazarus machen kannst, weiß ich nicht... Da müsste ich erstmal die Doku der entsprechenden X11-Funktion lesen...
Ich könnte dir aber eine Alternative anbieten: Screenshot mittels ImageMagick. Natürlich hat dann deine Anwendung imagemagick als Abhängigkeit...

Code: Alles auswählen

function TakeScreenshot(fname: String): Boolean;
var p: TProcess;s: TStringList;
procedure Free_All()
begin
 if Assigned(p) then p.Free;
 if Assigned(s) then s.Free;
end;
begin
  Result:=true;
  if FileExists(fname) then
  begin
   Result:=false;
   Free_All();
   exit;
  end;
  p:=TProcess.Create(nil);
  p.Options:=[poStdErrToOutput,poUsePipes,poWaitOnExit];
  p.CommandLine:='which import';
  p.Execute;
  s:=TStringList.Create;
  s.LoadFromStream(p.Output);
  if (s.Count < 0)or(not FileExists(s[1])) then
  begin
   Result:=false;
   Free_All();
   exit;
  end;
  s.Free;
 p.CommandLine:='import -window root '+fname;
 p.Execute;
 if p.ExitStatus>0 then
   Result:=false;
  p.Free;
end;
Den Code habe ich mir hier schnell ausgedacht, er ist nicht getestet. :!: :mrgreen:

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: Bild der Arbeitsflächen kriegen

Beitrag von theo »

Naja, das ist ja nur der kleiner Teil der Frage. Den Screenshot kann man auch nur mit Bordmitteln nehmen:
http://wiki.lazarus.freepascal.org/Deve ... the_screen" onclick="window.open(this.href);return false;

Die eigentliche Frage ist, wie man durch die virtuellen Desktops schaltet. Da ich das nicht weiss, habe ich mal den Nippel zitiert. War nicht böse gemeint.

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Bild der Arbeitsflächen kriegen

Beitrag von Teekeks »

Hmmm, mit Import bekomme ich aber doch nur ein Bild vom Aktuell angezeigten screen, ich will aber von jedem (auch von den momentan nicht angezeigten) eins.

bembulak
Beiträge: 370
Registriert: Di 6. Feb 2007, 09:29
OS, Lazarus, FPC: L0.9.29 SVN:24607 FPC 2.4.0-32 bit @ Win XP SP3
CPU-Target: 32bit i386, ARM
Wohnort: Oberösterreich

Re: Bild der Arbeitsflächen kriegen

Beitrag von bembulak »

Kann es sein, dass das System gar nicht "weiß", wie der aktuelle Screen aussieht und den (unabhängig von irgendwelchen Pagern im Panel) Inhalt erst dann wieder "neu zeichnet", wenn's denn notwendig ist?

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Bild der Arbeitsflächen kriegen

Beitrag von Teekeks »

neee, es gibt doch auch diese Übersichten über die Oberflächen wo auch die Fenster mit angezeigt werden.
Das sollte also möglich sein...

bembulak
Beiträge: 370
Registriert: Di 6. Feb 2007, 09:29
OS, Lazarus, FPC: L0.9.29 SVN:24607 FPC 2.4.0-32 bit @ Win XP SP3
CPU-Target: 32bit i386, ARM
Wohnort: Oberösterreich

Re: Bild der Arbeitsflächen kriegen

Beitrag von bembulak »

Also sicher bin ich mir da nicht. Ein "Pager", zeichnet ja nur "Vierecke" in einem kleinen Feld, die Koordinaten/Größe holt er sich vom "aktuellen" Screen, soviel ist klar. Aber der Pager muss nicht wissen/weiß nicht, ob und wie Icons am Desktop angeordnet sind, ob der Bildschirm 4:3 oder 16:9 ist, welchen Hintergrund ich habe und wie viele Panels (z.B. Gnome oben und unten) ich habe. Das zeigt mir der Pager nicht an.

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Bild der Arbeitsflächen kriegen

Beitrag von Teekeks »

Ich rede ja anscheinend von einem anderen Ding, ich rede von dem teil was bei SUSE11.2 auf berührung der Bildschirmecke erscheint (wenn man das aktiviert).
Da wird einem z.B. in Würfelform jeweils ein Screenie der Oberflächen angezeigt...

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Bild der Arbeitsflächen kriegen

Beitrag von Targion »

Nein, Linux weiß definitiv nicht, wie alle virtuellen Desktops aussehen. Compiz oder KWin holen sich diese Information extra, sobald der entsprechende Effekt aktiviert wurde.
Du musst dir mal anschauen, wie KWin / Compiz das regeln, wenn Exposé oder der Würfel aufgerufen wird.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Bild der Arbeitsflächen kriegen

Beitrag von pluto »

Unter Delphi gab es die Möglichkeit, einen eigenen Virtuellen Desktop anzulegen bzw. zwischen den hin und her zu schalten.
Wenn du mit GetDC(0) den Bildschirm holst, holst du den Aktiven Bildschirm Inhalt. Vielleicht klappt es ja, wenn du statt 0 1 verwendest für den zweiten Desktop.
Du brauchst "nur" den Handle. Dann könntest du das über GetDC machen. Dazu gab es mal ein Beispiel im Lazarus-Wiki.
MFG
Michael Springwald

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Bild der Arbeitsflächen kriegen

Beitrag von Hitman »

pluto hat geschrieben:Unter Delphi gab es die Möglichkeit, einen eigenen Virtuellen Desktop anzulegen bzw. zwischen den hin und her zu schalten.
Wenn du mit GetDC(0) den Bildschirm holst, holst du den Aktiven Bildschirm Inhalt. Vielleicht klappt es ja, wenn du statt 0 1 verwendest für den zweiten Desktop.
Du brauchst "nur" den Handle. Dann könntest du das über GetDC machen. Dazu gab es mal ein Beispiel im Lazarus-Wiki.
Du meinst aber sicherlich physische Desktops (aka Multimonitoring) ... Virtuelle Desktops sind was anderes (eben nicht physisch vorhanden, sondern "emuliert" durch Verstecken und Wiederanzeigen von Fenstern, oder unterschiedliche Koordinaten, oder was auch immer aktuelle Windowmanager so treiben).
Zudem hat der Device Context (den du mit GetDC bekommst) überhaupt nix damit zu tun. Jedes Fenster hat einen DC, und das Fenster mit Handle 0 ist halt der Desktop selbst - also "alles". Somit macht man einen Screenshot, wenn man den Device Context vom Root Window beschafft und sich kopiert was der grad zeichnet.
(Abgesehen davon, dass die Frage sich auf KDE4 unter Linux bezog, und nicht auf Windows ;-))

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Bild der Arbeitsflächen kriegen

Beitrag von Teekeks »

Targion hat geschrieben: Compiz oder KWin holen sich diese Information extra, sobald der entsprechende Effekt aktiviert wurde.
Du musst dir mal anschauen, wie KWin / Compiz das regeln, wenn Exposé oder der Würfel aufgerufen wird.
Weiß das jemand wie die das machen?
Genau das ist es nämlich was ich (von der Art her) machen will.

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Bild der Arbeitsflächen kriegen

Beitrag von Targion »

Ich habe mich da nicht richtig reingearbeitet, aber die workspace.c des WM WindowMaker sieht ganz vielversprechend aus. Der KWin-Code liegt im KDE-SVN, aber da blickst man ohne Anleitung weniger durch.
Vielleicht findest du ja auch noch eine Dokumentation der X11-Funktionen oder von Compiz.
Je nachdem, was die Arbeitsflächen verwaltet könnte es aber sein, dass dein Programm hinteher von KDE-Komponenten oder von GNOME abhängt.

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: Bild der Arbeitsflächen kriegen

Beitrag von theo »

Targion hat geschrieben:Ich habe mich da nicht richtig reingearbeitet, aber die workspace.c des WM WindowMaker sieht ganz vielversprechend aus. Der KWin-Code liegt im KDE-SVN, aber da blickst man ohne Anleitung weniger durch.
Vielleicht findest du ja auch noch eine Dokumentation der X11-Funktionen oder von Compiz.
Je nachdem, was die Arbeitsflächen verwaltet könnte es aber sein, dass dein Programm hinteher von KDE-Komponenten oder von GNOME abhängt.
@Targion: Verstehst du jetzt, warum ich geschrieben habe "Sie müssen nur den Nippel durch die Lasche ziehn..." :lol:

Antworten