X11/GLX - Fullscreen mode?

前端 未结 6 1989
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-02-05 11:50

I am trying to create a Linux application - a screensaver, in this case - and it is proving remarkably difficult to find information on the simple task of making a wind

6条回答
  •  迷失自我
    2021-02-05 12:30

    I found freeglut fullscreen works well, even when hosting shader based opengl application inside. Here the internal code that get called (X11 branch...). HTH

    #define _NET_WM_STATE_TOGGLE    2
    static int fghResizeFullscrToggle(void)
    {
        XWindowAttributes attributes;
    
        if(glutGet(GLUT_FULL_SCREEN)) {
            /* restore original window size */
            SFG_Window *win = fgStructure.CurrentWindow;
            fgStructure.CurrentWindow->State.NeedToResize = GL_TRUE;
            fgStructure.CurrentWindow->State.Width  = win->State.OldWidth;
            fgStructure.CurrentWindow->State.Height = win->State.OldHeight;
    
        } else {
            /* resize the window to cover the entire screen */
            XGetWindowAttributes(fgDisplay.Display,
                    fgStructure.CurrentWindow->Window.Handle,
                    &attributes);
    
            /*
             * The "x" and "y" members of "attributes" are the window's coordinates
             * relative to its parent, i.e. to the decoration window.
             */
            XMoveResizeWindow(fgDisplay.Display,
                    fgStructure.CurrentWindow->Window.Handle,
                    -attributes.x,
                    -attributes.y,
                    fgDisplay.ScreenWidth,
                    fgDisplay.ScreenHeight);
        }
        return 0;
    }
    
    static int fghEwmhFullscrToggle(void)
    {
        XEvent xev;
        long evmask = SubstructureRedirectMask | SubstructureNotifyMask;
    
        if(!fgDisplay.State || !fgDisplay.StateFullScreen) {
            return -1;
        }
    
        xev.type = ClientMessage;
        xev.xclient.window = fgStructure.CurrentWindow->Window.Handle;
        xev.xclient.message_type = fgDisplay.State;
        xev.xclient.format = 32;
        xev.xclient.data.l[0] = _NET_WM_STATE_TOGGLE;
        xev.xclient.data.l[1] = fgDisplay.StateFullScreen;
        xev.xclient.data.l[2] = 0;  /* no second property to toggle */
        xev.xclient.data.l[3] = 1;  /* source indication: application */
        xev.xclient.data.l[4] = 0;  /* unused */
    
        if(!XSendEvent(fgDisplay.Display, fgDisplay.RootWindow, 0, evmask, &xev)) {
            return -1;
        }
        return 0;
    }
    
    static int fghToggleFullscreen(void)
    {
        /* first try the EWMH (_NET_WM_STATE) method ... */
        if(fghEwmhFullscrToggle() != -1) {
            return 0;
        }
    
        /* fall back to resizing the window */
        if(fghResizeFullscrToggle() != -1) {
            return 0;
        }
        return -1;
    }
    
    
    #endif  /* TARGET_HOST_POSIX_X11 */
    

提交回复
热议问题