Пример #1
0
/* FIXME: bits is currently unused */
GLWindow * createGLWindow(struct display_camera *camera)
{
	GLWindow *x11_gl_window = New( GLWindow );
	XVisualInfo *vi;
	Colormap cmap;
	int dpyWidth, dpyHeight;
	int i;
	int glxMajorVersion, glxMinorVersion;
	int vidModeMajorVersion, vidModeMinorVersion;
	XF86VidModeModeInfo **modes;
	int modeNum;
	int bestMode;
	Atom wmDelete;
	Window winDummy;
	unsigned int borderDummy;
	MemSet( x11_gl_window, 0, sizeof( GLWindow ) );
	camera->hVidCore->x11_gl_window = x11_gl_window;
	x11_gl_window->fs = 0;//fullscreenflag;
	/* set best mode to current */
	bestMode = 0;
	/* get a connection */
	x11_gl_window->dpy = XOpenDisplay(0);
	if( x11_gl_window->dpy )
	{
		x11_gl_window->screen = DefaultScreen(x11_gl_window->dpy);
#if 0
		x11_gl_window->atom_create = XInternAtom( x11_gl_window->dpy, "UserCreateWindow", 0 );

		XF86VidModeQueryVersion(x11_gl_window->dpy, &vidModeMajorVersion,
										&vidModeMinorVersion);
		printf("XF86VidModeExtension-Version %d.%d\n", vidModeMajorVersion,
				 vidModeMinorVersion);
		if( x11_gl_window->fs )
		{
			XF86VidModeGetAllModeLines(x11_gl_window->dpy, x11_gl_window->screen, &modeNum, &modes);
			/* save desktop-resolution before switching modes */
			x11_gl_window->deskMode = *modes[0];
			/* look for mode with requested resolution */
			for (i = 0; i < modeNum; i++)
			{
				if ((modes[i]->hdisplay == camera->w) && (modes[i]->vdisplay == camera->h))
				{
					bestMode = i;
				}
			}
		}
#endif
		/* get an appropriate visual */
		vi = glXChooseVisual(x11_gl_window->dpy, x11_gl_window->screen, attrListDbl);
		if (vi == NULL)
		{
			vi = glXChooseVisual(x11_gl_window->dpy, x11_gl_window->screen, attrListSgl);
			x11_gl_window->doubleBuffered = False;
			printf("Only Singlebuffered Visual!\n");
		}
		else
		{
			x11_gl_window->doubleBuffered = True;
			printf("Got Doublebuffered Visual!\n");
		}
		glXQueryVersion(x11_gl_window->dpy, &glxMajorVersion, &glxMinorVersion);
		printf("glX-Version %d.%d\n", glxMajorVersion, glxMinorVersion);
		/* create a GLX context */
		x11_gl_window->ctx = glXCreateContext(x11_gl_window->dpy, vi, 0, GL_TRUE);
		/* create a color map */
		lprintf( "colormap..." );
		cmap = XCreateColormap(x11_gl_window->dpy, RootWindow(x11_gl_window->dpy, vi->screen),
									  vi->visual, AllocNone);
		x11_gl_window->attr.colormap = cmap;
		x11_gl_window->attr.border_pixel = 0;

		x11_gl_window->attr.event_mask = ExposureMask
			| KeyPressMask
			| KeyReleaseMask
			| ButtonPressMask
			| ButtonReleaseMask
			| ButtonMotionMask
			| PointerMotionMask
			| StructureNotifyMask;

		if (x11_gl_window->fs)
		{
			XF86VidModeSwitchToMode(x11_gl_window->dpy, x11_gl_window->screen, modes[bestMode]);
			XF86VidModeSetViewPort(x11_gl_window->dpy, x11_gl_window->screen, 0, 0);
			dpyWidth = modes[bestMode]->hdisplay;
			dpyHeight = modes[bestMode]->vdisplay;
			printf("Resolution %dx%d\n", dpyWidth, dpyHeight);
			XFree(modes);

			/* create a fullscreen window */
			x11_gl_window->attr.override_redirect = True;
			x11_gl_window->win = XCreateWindow(x11_gl_window->dpy, RootWindow(x11_gl_window->dpy, vi->screen),
														  0, 0, dpyWidth, dpyHeight, 0, vi->depth, InputOutput, vi->visual,
														  CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect,
														  &x11_gl_window->attr);
			XWarpPointer(x11_gl_window->dpy, None, x11_gl_window->win, 0, 0, 0, 0, 0, 0);
			XMapRaised(x11_gl_window->dpy, x11_gl_window->win);
			XGrabKeyboard(x11_gl_window->dpy, x11_gl_window->win, True, GrabModeAsync,
							  GrabModeAsync, CurrentTime);
			XGrabPointer(x11_gl_window->dpy, x11_gl_window->win, True, ButtonPressMask,
							 GrabModeAsync, GrabModeAsync, x11_gl_window->win, None, CurrentTime);

		}
		else
		{
			/* create a window in window mode*/
			lprintf( "create window... %d,%d  %d", camera->w, camera->h, vi->depth );
			x11_gl_window->win = XCreateWindow(x11_gl_window->dpy, RootWindow(x11_gl_window->dpy, vi->screen),
														  0, 0, camera->w, camera->h, 0, vi->depth, InputOutput, vi->visual,
														  CWBorderPixel | CWColormap | CWEventMask, &x11_gl_window->attr);
			/* only set window title and handle wm_delete_events if in windowed mode */
			wmDelete = XInternAtom(x11_gl_window->dpy, "WM_DELETE_WINDOW", True);
			XSetWMProtocols(x11_gl_window->dpy, x11_gl_window->win, &wmDelete, 1);
			XSetStandardProperties(x11_gl_window->dpy, x11_gl_window->win, "No Title",
										  "No Title", None, NULL, 0, NULL);
			XMapRaised(x11_gl_window->dpy, x11_gl_window->win);
		}
		/* connect the glx-context to the window */
      SetActiveGLDisplayView( camera, 0 );
		//glXMakeCurrent(x11_gl_window->dpy, x11_gl_window->win, x11_gl_window->ctx);
		XGetGeometry(x11_gl_window->dpy, x11_gl_window->win, &winDummy, &x11_gl_window->x, &x11_gl_window->y,
						 &x11_gl_window->width, &x11_gl_window->height, &borderDummy, &x11_gl_window->depth);
		printf("Depth %d\n", x11_gl_window->depth);
		if (glXIsDirect(x11_gl_window->dpy, x11_gl_window->ctx))
			printf("Congrats, you have Direct Rendering!\n");
		else
			printf("Sorry, no Direct Rendering possible!\n");
	}
	else
	{
		lprintf( "Failed to open display" );
		return NULL;
	}
	return x11_gl_window;
}
Пример #2
0
RENDER_PROC( int, SetActiveGLDisplay )( PVIDEO hDisplay )
{
   return SetActiveGLDisplayView( hDisplay, 0 );
}