📄 sdl_x11modes.c
字号:
/* 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 + -