Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Jul 14, 2025 11:23

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: X11 Fenster fullscreen
BeitragVerfasst: Mi Jan 19, 2011 20:57 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: X11 Fenster fullscreen
BeitragVerfasst: Mi Jan 19, 2011 21:15 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: X11 Fenster fullscreen
BeitragVerfasst: Do Jan 20, 2011 00:16 
Offline
DGL Member
Benutzeravatar

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".


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: X11 Fenster fullscreen
BeitragVerfasst: Do Jan 20, 2011 10:30 
Offline
DGL Member
Benutzeravatar

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();
  };

   TKar_XScreen::TKar_XScreen()
   {
      Width=640;
      Height=480;
      BitPerPixel=32;
      Screen=XDefaultScreen(Application.GetDisplay());
   }

   TKar_XScreen::~TKar_XScreen()
   {
      if (XF86VidModeSwitchToMode(Application.GetDisplay(),Screen,&Mode))
         XF86VidModeSetViewPort(Application.GetDisplay(),Screen,0,0);
   }

   void TKar_XScreen::Update()
   {
      XF86VidModeModeInfo **Modes;
      int ModeCount;

      XF86VidModeGetAllModeLines(Application.GetDisplay(), Screen, &ModeCount, &Modes);

      Mode=*Modes[0];
      for (int i=0;i<ModeCount;i++)
         if ((Modes[i]->hdisplay==Width) && (Modes[i]->vdisplay==Height))
         {
            if (XF86VidModeSwitchToMode(Application.GetDisplay(), Screen, Modes[i]))
                   XF86VidModeSetViewPort(Application.GetDisplay(), Screen, 0, 0);
         }
      XFree(Modes);
   }

//fenster erstellen
XSetWindowAttributes attr;
      attr.border_pixel=0;
      attr.override_redirect=not BorderVisible;
      attr.event_mask=ExposureMask | ButtonPressMask | ButtonReleaseMask | KeyPressMask | KeyReleaseMask | PointerMotionMask | StructureNotifyMask;
      Handle=XCreateSimpleWindow(Application.GetDisplay(),DefaultRootWindow(Application.GetDisplay()),0,0,Width,Height,0,0,BlackPixel(Application.GetDisplay(),XDefaultScreen(Application.GetDisplay())));
      XChangeWindowAttributes(Application.GetDisplay(),Handle,CWBorderPixel | CWEventMask | CWOverrideRedirect,&attr);

      if (BorderVisible)
      {
         wmDelete=XInternAtom(Application.GetDisplay(),"WM_DELETE_WINDOW",true);
         XSetWMProtocols(Application.GetDisplay(),Handle,&wmDelete,1);
         XStoreName(Application.GetDisplay(),Handle,m_sTitle.c_str());
      }

      XMapWindow(Application.GetDisplay(),Handle);

      //create emptyCursor
      char data=0;
      XColor dummy;
       Pixmap blank=XCreateBitmapFromData(Application.GetDisplay(), Handle, &data, 1, 1);
       InvisibleCursor=XCreatePixmapCursor(Application.GetDisplay(), blank, blank, &dummy, &dummy, 0, 0);
       XFreePixmap(Application.GetDisplay(), blank);
      XUndefineCursor(Application.GetDisplay(),Handle);
      XFlush(Application.GetDisplay());

      XMoveWindow(Application.GetDisplay(),Handle,Left,Top);
      XFlush(Application.GetDisplay());


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

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: X11 Fenster fullscreen
BeitragVerfasst: Do Jan 20, 2011 10:37 
Offline
DGL Member

Registriert: Mi Jan 21, 2009 09:05
Beiträge: 13
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: X11 Fenster fullscreen
BeitragVerfasst: Do Jan 20, 2011 11:31 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: X11 Fenster fullscreen
BeitragVerfasst: Do Jan 20, 2011 12:03 
Offline
DGL Member
Benutzeravatar

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.
Code:
Size X11WindowService::ScreenResolution()
{
    int ModeCount;
    XRRScreenSize *xrrs = XRRSizes(((X11Application*)m_Application)->GetDisplay(), 0, &ModeCount);
    Window root = RootWindow(((X11Application*)m_Application)->GetDisplay(), 0);
    XRRScreenConfiguration *conf = XRRGetScreenInfo(((X11Application*)m_Application)->GetDisplay(), root);
    Rotation original_rotation;
    SizeID original_size_id = XRRConfigCurrentConfiguration(conf, &original_rotation);

    return Size(xrrs[original_size_id].width,xrrs[original_size_id].height);
}

Wegen setzen müsste ich zuhause mal gucken aber hier ist nen artikel das geht glaube schneller, als wenn ich noch nach gucke.

http://www.opengl.org/wiki/Programming_ ... Resolution

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: X11 Fenster fullscreen
BeitragVerfasst: Do Jan 20, 2011 15:28 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: X11 Fenster fullscreen
BeitragVerfasst: Do Jan 20, 2011 15:40 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: X11 Fenster fullscreen
BeitragVerfasst: Do Jan 20, 2011 18:25 
Offline
DGL Member

Registriert: Mi Jan 21, 2009 09:05
Beiträge: 13
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);

        if(dist < bestDisp)
        {
          bestDisp = dist;
          bestFit = i;
        }
      }

      //change resulotion if needed
      if(vidmodes[bestFit] != vidmodes[0])
      {
        if(bestFit != -1)
        {
          width = vidmodes[bestFit]->hdisplay;
          height = vidmodes[bestFit]->vdisplay;

          //set new size
          XResizeWindow(disp, win, width, height);

          XSizeHints *hints = XAllocSizeHints();
          hints->flags = PMinSize;
          hints->min_width = width;
          hints->min_height = height;
          hints->max_width = width;
          hints->max_height = height;
          XSetWMNormalHints(disp, win, hints);
          XFree(hints);

          XF86VidModeSwitchToMode(disp, DefaultScreen(disp), vidmodes[bestFit]);
        }
      }
      else
      {
        //tell window manager to go fullscreen
        XEvent event;
        Atom wmState = XInternAtom(disp, "_NET_WM_STATE", False);
        Atom wmFullscreen = XInternAtom(disp, "_NET_WM_STATE_FULLSCREEN", False);

        memset(&event, 0, sizeof(event) );
        event.type = ClientMessage;
        event.xclient.window = win;
        event.xclient.message_type = wmState;
        event.xclient.format = 32;
        event.xclient.data.l[0] = 1;
        event.xclient.data.l[1] = wmFullscreen;
        event.xclient.data.l[2] = 0;

        XSendEvent(disp, DefaultRootWindow(disp), False,
                   SubstructureNotifyMask, &event);
      }

      //move the viewport to the virtual screen
      Window tmp;
      int winX = 0;
      int winY = 0;
      XTranslateCoordinates(disp, win, DefaultRootWindow(disp), 0, 0,
                            &winX, &winY, &tmp);
      XF86VidModeSetViewPort(disp, DefaultScreen(disp), winX, winY);

      //grab the mouse to our window
      XGrabPointer(disp, win, true, 0, GrabModeAsync, GrabModeAsync, win,
                   None, CurrentTime);
    }
    else
    {
      //switch resolution back to original
      XF86VidModeSwitchToMode(disp, DefaultScreen(disp), vidmodes[0]);

      //tell window manager to leave fullscreen
      XEvent event;
      Atom wmState = XInternAtom(disp, "_NET_WM_STATE", False);
      Atom wmFullscreen = XInternAtom(disp, "_NET_WM_STATE_FULLSCREEN", False);

      memset(&event, 0, sizeof(event) );
      event.type = ClientMessage;
      event.xclient.window = win;
      event.xclient.message_type = wmState;
      event.xclient.format = 32;
      event.xclient.data.l[0] = 0;
      event.xclient.data.l[1] = wmFullscreen;
      event.xclient.data.l[2] = 0;

      XSendEvent(disp, DefaultRootWindow(disp), False,
                 SubstructureNotifyMask, &event);

      //restore viewport
      XF86VidModeSetViewPort(disp, DefaultScreen(disp), 0, 0);

      //release the grabbed mouse
      XUngrabPointer(disp, CurrentTime);
    }

    fullscreen = pfullscreen;
  }


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: X11 Fenster fullscreen
BeitragVerfasst: Do Jan 20, 2011 20:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Dez 03, 2008 12:01
Beiträge: 167
Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
@Archaon: Deine erste Zeile normaler Code widerspricht dir schon ;)
@Traude: Werd ich mir auch mal ansehen ;)

_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: X11 Fenster fullscreen
BeitragVerfasst: Fr Jan 21, 2011 12:59 
Offline
DGL Member
Benutzeravatar

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

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 17 Queries | GZIP : On ]