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

📄 sdl_x11modes.c

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 C
📖 第 1 页 / 共 2 页
字号:
"XME: get the libXext update from our ftp site before fullscreen switching\n"
"XME: will work.  Fullscreen switching is only supported on Summit Servers\n");
	  }
    } else {
        /* 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 zero'th one */
        int screens;
        SDL_NAME(XineramaScreenInfo) *xinerama;

#ifdef XINERAMA_DEBUG
        printf("X11 detected Xinerama:\n");
#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 == 0 ) {
                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, 0, 0, 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 + -