Registriert: Mi Dez 03, 2008 12:01 Beiträge: 167 Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
Hi, ich habe da ein Problem, dass im Grunde genommen weder zu Delphi noch zu OpenGL gehört. Es geht um den X-Server, mit dem ich da ein kleines Problem habe. Ich schreibe mir momentan eine Klasse, die es mir erlaubt, unter Linux und Windows OpenGL 2 & OpenGL 3+ Fenster zu erzeugen. Dazu gehört natürlich auch, dass die Fenster im Vollbildmodus sein können. Unter Windows ist das kein Problem, aber unter Linux macht mir das zu schaffen. Ich habe gelesen, dass würde ganz einfach funktionieren, wenn ich dem X-Server eine bestimmte Nachricht sende. Ich hab das ganze nach etwas basteln auch hinbekommen, allerdings gibt es da folgendes Problem: X11 scheint die Grröße des Fensters im Vollbildmodus zu ignorieren. Anstatt die Bildschirmauflösung auf die Größe des Fensters zu setzen, vergrößert er das Fenster auf den ganzen Bildschirm. Durch durchlesen diverser seltsamer Seiten habe ich herausgefunden, man müsse wohl die Auflösung des root-Fensters anpassen. Das soll wohl irgendwie mit der X11-Erweiterung Xrandr gehen. Nur konnte ich bisher leider nichts brauchbares finden, wie ich das benutze.
Daher hoffe ich, dass unter euch jemand mit X11-Wissen herumgeistert, der mir da weiterhelfen kann
_________________ Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
xrandr -s widthxheight wäre der Kommandozeilenbefehl Wenn das keine option ist, dann musst du dich mal in die libxrandr einlesen.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Ich weiß jetzt nicht genau, was Du mit
Zitat:
Anstatt die Bildschirmauflösung auf die Größe des Fensters zu setzen, vergrößert er das Fenster auf den ganzen Bildschirm.
meinst. XRandr brauchst Du meines Wissens nur, wenn Du die aktuelle Bildschirmauflösung verändern willst. Wenn Du aber einfach nur ein Fullscreen-Fenster haben willst, geht das mit "NET_WM_STATE_FULLSCREEN".
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Hehe, erstmal lese ich keine falschen Infos, also alle haben recht aber da fehlt noch einiges an input. Ich hab mich mit dem gleichen Problem rum geschlagen, als ich eine Präsentationssoftware in Vollbild schalten wollte.
Also erster wichtiger Nachtrag, es gibt bisher keine Lösung die auf allen Distributionen gleich funktioniert. Wenn du wirklich alle Linux Distributionen oder die meisten unterstützen willst, dann brauchst du mehrere möglichkeiten. Ich hatte damals KDE,Gnome, XFCE unter Fedora und Gentoo ausprobiert und wie zu erwarten ist mal wieder alles ein Problem der Distributoren, die immer alles ändern müssen, um ihre daseins berechtigung aufrecht zu erhalten(auch wenn es kein sinn macht zu ändern). Einige Lösungen können nicht über das Gnome panel zeichnen, andere verzweifeln das fenster größer als Screen-Panel zu vergrößern und dann noch die die einfach nicht gehen obwohl die Doku es sagt.
Die beste Lösung, die ich finden konnte war folgende.
Code:
class TKar_ScreenClass
{
protected:
unsigned int Width,Height;
unsigned char BitPerPixel;
private:
public:
virtual ~TKar_ScreenClass(){};
virtual void SetResolution(int w, int h, unsigned char bpp);
virtual int GetWidth();
virtual int GetHeight();
virtual unsigned char GetBitPerPixel();
virtual void Update()=0;
};
class TKar_XScreen:public TKar_ScreenClass { protected: int Screen; XF86VidModeModeInfo Mode; public: TKar_XScreen(); ~TKar_XScreen(); void Update(); };
Ein großes Problem ist das saubere schalten zwischen "ohne border" und "mit border". Hier passierte es bei Gnome, dass er das fenster nicht mehr über das panel drüber kommt. Daher ein Vollbild wechseln, beim erstellen des Fensters. Übrigens ist Graifk beschleunigung, also compiz, noch ne weitere story. Dort lief jede version, die ich im netz gefunden hab, problemlos ^^ .
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Hallo ich habe mich vor längerer Zeit auch mal mit der Problematik befasst. Ich hab damals die Methode aus Quake 3 genommen und ein bisschen angepasst. Wenn ich heute Abend zuhause bin schaue ich ob ich den Quellcode noch irgendwo rumliegen habe und Poste ihn dann.
Registriert: Mi Dez 03, 2008 12:01 Beiträge: 167 Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
@Traude: Das umschalten des Fensters in den Vollbildmodus funktioniert ja bereits. Das Problem ist nur folgendes: Wenn man z.B. ein Spiel wie Half-Life 2 spielt, auf einem PC bei dem die Auflösung standardmäßig 1280x1024 ist, hat aber die Auflösung des Spiels niedriger gestellt und das Spiel im Vollbildmodus, dann setzt das Spiel die Bildschirmauflösung auf die eingestellte Auflösung herunter. Unter X11 will ich jetzt genau das haben. Wenn ich das Fenster nämlich einfach nur auf Vollbild setze, scheint er das Fenster auf die Größe des Root-Fensters zu vergrößern. Was ich mit OpenGL rendere erscheint dann unten links. Einen Screenshot kann ich jetzt nicht zeigen, da ich 1. nicht zu Hause bin und 2. Mein Laptop unter Linux Netzwerkprobleme hat (irgendwann zwischen 1-40 Minuten reißt die Verbindung ab).
Ich muss also eigentlich nur noch die Auflösung des root-Fensters auf die Auflösung meines Fensters umstellen. Und das soll ja mir Randr gehen. Ich habe gehört, die Randr-Erweiterung funktioniere gut unter den meisten Distributionen.
@TAK2004: Bei mir konnte ich leider keine Header für XF86 finden (Kubuntu 10.10), deswegen bin ich erst auf Randr gestoßen.
_________________ Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Ja du hast recht, hab alten Code kopiert, vom XF86 Standard(veraltet und durch xrandr ersetzt). Also wo das setzen von der auflösung ist, find ich gerade nicht aber das holen aller verfügbaren und der aktuellen einstellung geht mit folgendem code.
Registriert: Mi Dez 03, 2008 12:01 Beiträge: 167 Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
Ah, vielen Dank ^^ Irgendwie wundert mich das aber auch, hab in letzter Zeit einige Artikel im OpenGL-Wiki angesehen und auch dort gesucht, aber nichts gefunden. Naja, ich werde es dann mal einbauen ^^
_________________ Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Tschuldigung, ich habe nicht ganz kapiert, dass Du wirklich die Video-Auflösung umschalten willst. Das Umschalten selber habe ich auch noch nicht gemacht (aus Faulheit), aber ich kann Dir meine Quelle sagen: viele solche Dinge kann man in Camilla Berglinds GLFW finden (das ist die Abkürzung von OpenGL-Framework, und im Prinzip benutzen das pratisch alle europäischen (und wahrscheinlich auch amerikanischen) Unis, das heißt, es ist praktisch ein Standard. Einfach googeln nach "GLFW", lad Dir den Code herunter und schau Dir die Datei "/lib/x11/x11_fullscreen.c" an.
Traude
Übrigens: sie wird es wahrscheinlich nicht lesen, aber ich habe großen Respekt vor Camilla Berglund. Das ist ein wirklich tolles Stück Code, das sie der Allgemeinheit zur Verfügung stellt.
So hier ist mal meine implementation. Es wird kein XRandr benutzt sondern rein XLib hat aber bisher immer gut funktioniert.
Code:
void Window::setFullscreen(bool pfullscreen) { //get all modes supported by the X server XF86VidModeGetAllModeLines(disp, DefaultScreen(disp), &num_vidmodes, &vidmodes);
if(pfullscreen) { int bestDisp = 99999999; int bestFit = -1; int x = 0; int y = 0; int dist = 0;
//look which mode supports our resulation best for(int i = 0; i < num_vidmodes; i++) { x = width - vidmodes[i]->hdisplay; y = height - vidmodes[i]->vdisplay; dist = (x * x) + (y * y);
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Das ist XF86, dieser Standard ist seit einigen Jahren am austerben, also wie die Deutschen Wälder. XF86 ist wie xrandr ein module, welche zu 99% nach installiert werden muss. XRandr ist die neue API die XF86 ersetzt hat aber SDL und GLFW nutzen noch teilweise alte API's, da man sowas nicht als 0815 Entwickler erfährt und sich freut, was im Netz gefunden zu haben. Es spricht nix dagegen, eine von beide zu verwenden, da beide das gleiche tun.
GLFW ist definitiv das bessere Framework, im vergleich zu SDL und da ist ne menger guter Code drin. Ich hab bei mir auf den Desktop einige Projekte rum zu liegen, um diese als Referenz zu nehmen. Ryzom,sfml2,pv,ogre,oglft,libsmbios,glm,freetype,dmidecode,clanlib und blender liegen aktuell auf mein Windows Desktop.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Mitglieder in diesem Forum: Bing [Bot] und 6 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.