⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdl_x11modes.c

📁 Simple DirectMedia Layer - Simple DirectMedia Layer 是一个跨平台的多媒体库设计用来提供快速图形framebuffer和音频驱动。应用MPEG为软件
💻 C
📖 第 1 页 / 共 2 页
字号:
        /* not there. Bummer. */        xme_major = xme_minor = 0;    }    modelist = NULL;    if (xme_major >= 2 && (nummodes = XiGMiscQueryResolutions(SDL_Display,                                             SDL_Screen,                                            0, /* view */                                            &ractive,                                             &modelist)) > 1)    {                                /* then we actually have some */        int j;#ifdef XIG_DEBUG        fprintf(stderr, "XME: nummodes = %d, active mode = %d\n",                nummodes, ractive);#endif        SDL_modelist = (SDL_Rect **)malloc((nummodes+1)*sizeof(SDL_Rect *));                                /* we get the list already sorted in */                                /* descending order.  We'll copy it in */                                /* reverse order so SDL is happy */        if (SDL_modelist) {            for ( i=0, j=nummodes-1; j>=0; i++, j-- ) {                if ((SDL_modelist[i] =                      (SDL_Rect *)malloc(sizeof(SDL_Rect))) == NULL)                  break;#ifdef XIG_DEBUG                fprintf(stderr, "XME: mode = %4d, w = %4d, h = %4d\n",                       i, modelist[i].width, modelist[i].height);#endif                                SDL_modelist[i]->x = 0;                SDL_modelist[i]->y = 0;                SDL_modelist[i]->w = modelist[j].width;                SDL_modelist[i]->h = modelist[j].height;                            }            SDL_modelist[i] = NULL; /* terminator */        }        use_xme = 1;        saved_res = modelist[ractive]; /* save the current resolution */    } else {        use_xme = 0;    }    if ( modelist ) {        XFree(modelist);    }#endif /* HAVE_XIGXME */    {        static int depth_list[] = { 32, 24, 16, 15, 8 };        int j, np;        int use_directcolor = 1;        XPixmapFormatValues *pf;        /* Search for the visuals in deepest-first order, so that the first           will be the richest one */        if ( getenv("SDL_VIDEO_X11_NODIRECTCOLOR") ) {                use_directcolor = 0;        }        this->hidden->nvisuals = 0;        if ( ! add_visual_byid(this, getenv("SDL_VIDEO_X11_VISUALID")) ) {                for ( i=0; i<SDL_TABLESIZE(depth_list); ++i ) {                        if ( depth_list[i] > 8 ) {                                if ( use_directcolor ) {                                        add_visual(this, depth_list[i], DirectColor);                                }                                add_visual(this, depth_list[i], TrueColor);                        } else {                                add_visual(this, depth_list[i], PseudoColor);                                add_visual(this, depth_list[i], StaticColor);                        }                }        }        if ( this->hidden->nvisuals == 0 ) {            SDL_SetError("Found no sufficiently capable X11 visuals");            return -1;        }                    /* look up the pixel quantum for each depth */        pf = XListPixmapFormats(SDL_Display, &np);        for(i = 0; i < this->hidden->nvisuals; i++) {            int d = this->hidden->visuals[i].depth;            for(j = 0; j < np; j++)                if(pf[j].depth == d)                    break;            this->hidden->visuals[i].bpp = j < np ? pf[j].bits_per_pixel : d;        }        XFree(pf);    }    if ( SDL_modelist == NULL ) {        SDL_modelist = (SDL_Rect **)malloc((1+1)*sizeof(SDL_Rect *));        if ( SDL_modelist ) {            n = 0;            SDL_modelist[n] = (SDL_Rect *)malloc(sizeof(SDL_Rect));            if ( SDL_modelist[n] ) {                SDL_modelist[n]->x = 0;                SDL_modelist[n]->y = 0;                SDL_modelist[n]->w = screen_w;                SDL_modelist[n]->h = screen_h;                ++n;            }            SDL_modelist[n] = NULL;        }    }#if defined(XFREE86_DEBUG) || defined(XIG_DEBUG)    if ( use_vidmode ) {        printf("XFree86 VidMode is enabled\n");    }#ifdef HAVE_XIGXME    if ( use_xme )      printf("Xi Graphics XME fullscreen is enabled\n");    else      printf("Xi Graphics XME fullscreen is not available\n");#endif     if ( SDL_modelist ) {        printf("X11 video mode list:\n");        for ( i=0; SDL_modelist[i]; ++i ) {            printf("\t%dx%d\n", SDL_modelist[i]->w, SDL_modelist[i]->h);        }    }#endif /* XFREE86_DEBUG || XIG_DEBUG */    /* The default X/Y fullscreen offset is 0/0 */    xinerama_x = 0;    xinerama_y = 0;#ifdef HAVE_XINERAMA    /* Query Xinerama extention */    if ( SDL_NAME(XineramaQueryExtension)(SDL_Display, &i, &i) &&         SDL_NAME(XineramaIsActive)(SDL_Display) ) {        /* Find out which screen is the desired one */        int desired = 0;        int screens;        SDL_NAME(XineramaScreenInfo) *xinerama;#ifdef XINERAMA_DEBUG        printf("X11 detected Xinerama:\n");#endif#if 0 /* Apparently the vidmode extension doesn't work with Xinerama */        const char *variable = getenv("SDL_VIDEO_X11_XINERAMA_SCREEN");        if ( variable ) {                desired = atoi(variable);        }#endif        xinerama = SDL_NAME(XineramaQueryScreens)(SDL_Display, &screens);        for ( i = 0; i < screens; i++ ) {#ifdef XINERAMA_DEBUG            printf("xinerama %d: %dx%d+%d+%d\n",                xinerama[i].screen_number,                xinerama[i].width, xinerama[i].height,                xinerama[i].x_org, xinerama[i].y_org);#endif            if ( xinerama[i].screen_number == desired ) {                xinerama_x = xinerama[i].x_org;                xinerama_y = xinerama[i].y_org;            }        }        XFree(xinerama);    }#endif /* HAVE_XINERAMA */    return 0;}int X11_SupportedVisual(_THIS, SDL_PixelFormat *format){    int i;    for(i = 0; i < this->hidden->nvisuals; i++)        if(this->hidden->visuals[i].bpp == format->BitsPerPixel)            return 1;    return 0;}SDL_Rect **X11_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags){    if ( X11_SupportedVisual(this, format) ) {        if ( flags & SDL_FULLSCREEN ) {            return(SDL_modelist);        } else {            return((SDL_Rect **)-1);        }    } else {        return((SDL_Rect **)0);    }}void X11_FreeVideoModes(_THIS){    int i;    if ( SDL_modelist ) {        for ( i=0; SDL_modelist[i]; ++i ) {            free(SDL_modelist[i]);        }        free(SDL_modelist);        SDL_modelist = NULL;    }}int X11_ResizeFullScreen(_THIS){    int x, y;    int real_w, real_h;    int screen_w;    int screen_h;    screen_w = DisplayWidth(SDL_Display, SDL_Screen);    screen_h = DisplayHeight(SDL_Display, SDL_Screen);    x = xinerama_x;    y = xinerama_y;    if ( currently_fullscreen ) {        /* Switch resolution and cover it with the FSwindow */        move_cursor_to(this, x, y);        set_best_resolution(this, current_w, current_h);        move_cursor_to(this, x, y);        get_real_resolution(this, &real_w, &real_h);        if ( current_w > real_w ) {            real_w = MAX(real_w, screen_w);        }        if ( current_h > real_h ) {            real_h = MAX(real_h, screen_h);        }        XMoveResizeWindow(SDL_Display, FSwindow, x, y, real_w, real_h);        move_cursor_to(this, real_w/2, real_h/2);        /* Center and reparent the drawing window */        x = (real_w - current_w)/2;        y = (real_h - current_h)/2;        XReparentWindow(SDL_Display, SDL_Window, FSwindow, x, y);        /* FIXME: move the mouse to the old relative location */        XSync(SDL_Display, True);   /* Flush spurious mode change events */    }    return(1);}void X11_QueueEnterFullScreen(_THIS){    switch_waiting = 0x01 | SDL_FULLSCREEN;    switch_time = SDL_GetTicks() + 1500;#if 0 /* This causes a BadMatch error if the window is iconified (not needed) */    XSetInputFocus(SDL_Display, WMwindow, RevertToNone, CurrentTime);#endif}int X11_EnterFullScreen(_THIS){    int okay;#if 0    Window tmpwin, *windows;    int i, nwindows;#endif    int real_w, real_h;    int screen_w;    int screen_h;    okay = 1;    if ( currently_fullscreen ) {        return(okay);    }    /* Ungrab the input so that we can move the mouse around */    X11_GrabInputNoLock(this, SDL_GRAB_OFF);    /* Map the fullscreen window to blank the screen */    screen_w = DisplayWidth(SDL_Display, SDL_Screen);    screen_h = DisplayHeight(SDL_Display, SDL_Screen);    get_real_resolution(this, &real_w, &real_h);    if ( current_w > real_w ) {        real_w = MAX(real_w, screen_w);    }    if ( current_h > real_h ) {        real_h = MAX(real_h, screen_h);    }    XMoveResizeWindow(SDL_Display, FSwindow,                      xinerama_x, xinerama_y, real_w, real_h);    XMapRaised(SDL_Display, FSwindow);    X11_WaitMapped(this, FSwindow);#if 0 /* This seems to break WindowMaker in focus-follows-mouse mode */    /* Make sure we got to the top of the window stack */    if ( XQueryTree(SDL_Display, SDL_Root, &tmpwin, &tmpwin,                            &windows, &nwindows) && windows ) {        /* If not, try to put us there - if fail... oh well */        if ( windows[nwindows-1] != FSwindow ) {            tmpwin = windows[nwindows-1];            for ( i=0; i<nwindows; ++i ) {                if ( windows[i] == FSwindow ) {                    memcpy(&windows[i], &windows[i+1],                           (nwindows-i-1)*sizeof(windows[i]));                    break;                }            }            windows[nwindows-1] = FSwindow;            XRestackWindows(SDL_Display, windows, nwindows);            XSync(SDL_Display, False);        }        XFree(windows);    }#else    XRaiseWindow(SDL_Display, FSwindow);#endif#ifdef XFREE86_VM    /* Save the current video mode */    if ( use_vidmode ) {        SDL_NAME(XF86VidModeLockModeSwitch)(SDL_Display, SDL_Screen, True);    }#endif    currently_fullscreen = 1;    /* Set the new resolution */    okay = X11_ResizeFullScreen(this);    if ( ! okay ) {        X11_LeaveFullScreen(this);    }    /* Set the colormap */    if ( SDL_XColorMap ) {        XInstallColormap(SDL_Display, SDL_XColorMap);    }    if ( okay )        X11_GrabInputNoLock(this, this->input_grab | SDL_GRAB_FULLSCREEN);    /* We may need to refresh the screen at this point (no backing store)       We also don't get an event, which is why we explicitly refresh. */    if ( this->screen ) {        if ( this->screen->flags & SDL_OPENGL ) {            SDL_PrivateExpose();        } else {            X11_RefreshDisplay(this);        }    }    return(okay);}int X11_LeaveFullScreen(_THIS){    if ( currently_fullscreen ) {        XReparentWindow(SDL_Display, SDL_Window, WMwindow, 0, 0);#ifdef XFREE86_VM        if ( use_vidmode ) {            restore_mode(this);            SDL_NAME(XF86VidModeLockModeSwitch)(SDL_Display, SDL_Screen, False);        }#endif#ifdef HAVE_XIGXME        if ( use_xme ) {            int rw, rh;                                /* check current mode so we can avoid uneccessary mode changes */            get_real_resolution(this, &rw, &rh);            if (rw != saved_res.width || rh != saved_res.height) {                XiGMiscChangeResolution(SDL_Display,                                         SDL_Screen,                                        0, /* view */                                        saved_res.width,                                         saved_res.height,                                        0);                XSync(SDL_Display, False);            }        }#endif        XUnmapWindow(SDL_Display, FSwindow);        X11_WaitUnmapped(this, FSwindow);        XSync(SDL_Display, True);   /* Flush spurious mode change events */        currently_fullscreen = 0;    }    /* If we get popped out of fullscreen mode for some reason, input_grab       will still have the SDL_GRAB_FULLSCREEN flag set, since this is only       temporary.  In this case, release the grab unless the input has been       explicitly grabbed.     */    X11_GrabInputNoLock(this, this->input_grab & ~SDL_GRAB_FULLSCREEN);    /* We may need to refresh the screen at this point (no backing store)       We also don't get an event, which is why we explicitly refresh. */    if ( this->screen ) {        if ( this->screen->flags & SDL_OPENGL ) {            SDL_PrivateExpose();        } else {            X11_RefreshDisplay(this);        }    }    return(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -