/* 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; }
RENDER_PROC( int, SetActiveGLDisplay )( PVIDEO hDisplay ) { return SetActiveGLDisplayView( hDisplay, 0 ); }