/* Assumes a Pseudo graphic display. */ void init_colormaps (Display *dpy) { screen = XDefaultScreen (dpy); fprintf(stderr, "Number of display cells = %d\n", XDisplayCells(dpy, screen)); fprintf(stderr, "Number of display planes = %d\n", XDisplayPlanes(dpy, screen)); colormap = XDefaultColormap(dpy, screen); while (XAllocColorCells(display_, colormap, False, NULL, 0, &(pixels[cmapsize]), 1)) cmapsize++; cmapsize = (cmapsize > 60) ? 60 : cmapsize; fprintf(stderr, "Number of colors available = %d\n", cmapsize); if (cmapsize<5) { fprintf(stderr, "Number of colors available = %d\n", cmapsize); fprintf(stderr, "This is too few to run the display software.\n"); fprintf(stderr, "Shut down windows, or restart X server.\n"); exit(-1); } /* build a grey scale colormap as a default, so that other programs */ /* can't grab the colors*/ { XColor xcolor; int i; xcolor.flags= DoRed | DoGreen | DoBlue; for (i = 0 ; i < cmapsize; i++) { xcolor.pixel = pixels[i]; xcolor.red = (unsigned short) (i<<8); xcolor.green = (unsigned short) (i<<8); xcolor.blue = (unsigned short) (i<<8); XStoreColor (display_, colormap, &xcolor); } } /* Generate global gamma correction table for this display */ { Pixel index; double gamma = 1.0/1.0; for(index =0; index < 255; index++) { GammaCorrect[index] = (Pixel)(0.5 + 255.0 * (double) pow((double)(index)/255.0, gamma)); } } /* Set up the internal histogram tables*/ translate_init(); return; }
void SDesktop::init(){ dpy = XOpenDisplay(NULL); scr = DefaultScreen(dpy); width = XDisplayWidth(dpy, scr); height = XDisplayHeight(dpy, scr); GLint att[]={ GLX_RGBA, True, GLX_DEPTH_SIZE, XDisplayPlanes(dpy, scr), GLX_DOUBLEBUFFER, True, None }; vi = glXChooseVisual(dpy, scr, att); XSetWindowAttributes swa; swa.background_pixel = 0; swa.colormap = XCreateColormap(dpy, DefaultRootWindow(dpy), vi->visual, AllocNone); swa.event_mask = ExposureMask | KeyPressMask | ButtonPressMask | PointerMotionMask; win = XCreateWindow(dpy, DefaultRootWindow(dpy), 0, 0, width, height, 0, vi->depth, InputOutput, vi->visual, CWColormap | CWEventMask | CWBackPixel, &swa); //Atom atoms[2]={XInternAtom(dpy,"_NET_WM_STATE_FULLSCREEN",False), None}; //XChangeProperty(dpy,win,XInternAtom(dpy,"_NET_WM_STATE",False),XA_ATOM,32,PropModeReplace,(const unsigned char *)atoms,1); glc = glXCreateContext(dpy, vi, NULL, GL_TRUE); glXMakeCurrent(dpy, win, glc); play = false; glEnable(GL_DEPTH_TEST); pointer = new Pointer(); // desktop = this; }
ImageDisplay* MakeDisplay (Widget parent, Widget shell) /* Make image display widget */ { Widget display; /* return display widget */ ImageDisplay *IDdata; /* display data structure */ int i; Dimension cwid, chei; int sbar_width = SBAR_WIDTH; IDdata = (ImageDisplay*) XtMalloc (sizeof (ImageDisplay)); /* set size */ /* maximum display size */ XtVaGetValues (parent, XmNwidth, &cwid, XmNheight, &chei, NULL); cwid = cwid - CONTROLWIDTH; /* leave room for control panel */ /* chei = chei - 40; */ IDdata->disp_wid = cwid; IDdata->disp_hei = chei; /* save main window */ IDdata->parent = parent; /* set top level form */ IDdata->shell = shell; /* make Form widget for display */ IDdata->display = XtVaCreateManagedWidget ("display", xmFormWidgetClass, parent, /* add extra pixels for scroll bars */ XmNwidth, IDdata->disp_wid+sbar_width, XmNheight, IDdata->disp_hei+sbar_width, XmNtopAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); /* drawing canvas */ IDdata->canvas = XtVaCreateManagedWidget ("canvas", xmDrawingAreaWidgetClass, IDdata->display, /* XmNwidth, IDdata->disp_wid-sbar_width, XmNheight, IDdata->disp_hei-sbar_width,*/ XmNwidth, 1, XmNheight, 1, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, NULL); /* Add callbacks to handle resize and exposures. */ XtAddCallback (IDdata->canvas, XmNexposeCallback, ImageRedispCB, (XtPointer)IDdata); /* trap button press */ XtAddEventHandler (IDdata->canvas, ButtonPressMask, FALSE, (XtEventHandler)ButtonEH, (XtPointer)IDdata); /* add horizonal scroll bar ("scale" in X-Windows) */ IDdata->hscroll = XtVaCreateManagedWidget ("hscroll", xmScrollBarWidgetClass, IDdata->display, XmNwidth, IDdata->disp_wid, XmNheight, sbar_width, XmNmaximum, IDdata->disp_wid, XmNminimum, 1, XmNvalue, 1, XmNshowValue, False, XmNorientation, XmHORIZONTAL, XmNprocessingDirection, XmMAX_ON_RIGHT, /* XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, IDdata->canvas,*/ XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNrightOffset, sbar_width, NULL); IDdata->hscr_vis = 1; /* it's visible */ /* add call backs */ XtAddCallback(IDdata->hscroll, XmNvalueChangedCallback, hscrollCB, (XtPointer) IDdata); /* XtAddCallback(IDdata->hscroll, XmNdragCallback, hscrollCB, (XtPointer) IDdata); */ /* add vertical scroll bar */ IDdata->vscroll = XtVaCreateManagedWidget ("vscroll", xmScrollBarWidgetClass, IDdata->display, XmNheight, IDdata->disp_hei, XmNwidth, sbar_width, XmNmaximum, IDdata->disp_hei, XmNminimum, 1, XmNvalue, 1, XmNshowValue, False, XmNorientation, XmVERTICAL, XmNprocessingDirection, XmMAX_ON_BOTTOM, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNbottomOffset, sbar_width, XmNrightAttachment, XmATTACH_FORM, /* XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, IDdata->canvas,*/ NULL); IDdata->vscr_vis = 1; /* it's visible */ /* add call back */ XtAddCallback(IDdata->vscroll, XmNvalueChangedCallback, vscrollCB, (XtPointer) IDdata); /* XtAddCallback(IDdata->vscroll, XmNdragCallback, vscrollCB, (XtPointer) */ /* make dummy widget the size of the display which can detect when it's size has changed */ IDdata->goober = XtVaCreateManagedWidget ("goober", xmDrawingAreaWidgetClass, IDdata->display, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); /* go boom XtUnmapWidget (IDdata->goober); make invisible */ XtAddCallback (IDdata->goober, XmNresizeCallback, ImageResizeCB, (XtPointer)IDdata); /* number of colors */ IDdata->ncolors = XDisplayCells (XtDisplay (IDdata->display), XDefaultScreen (XtDisplay (IDdata->display))); if (IDdata->ncolors>MAXCOLOR) IDdata->ncolors = MAXCOLOR; for (i=0; i<MAXCOLOR; i++) {IDdata->colut[i]=0; IDdata->red[i]=0; IDdata->green[i]=0; IDdata->blue[i]=0;} /* bit planes in display */ IDdata->depth = XDisplayPlanes (XtDisplay (IDdata->display), XDefaultScreen (XtDisplay (IDdata->display))); /* context */ IDdata->gc = XCreateGC (XtDisplay (IDdata->display), DefaultRootWindow (XtDisplay(IDdata->display)), 0, NULL ); /* init image */ IDdata->work = NULL; IDdata->zoom = 1; IDdata->scrollx = 0; IDdata->scrolly = 0; IDdata->iXCorn = 0; IDdata->iYCorn = 0; /* no color map yet */ IDdata->cmap = 0; /* no slider controls yet */ IDdata->BriScroll = NULL; IDdata->ConScroll = NULL; IDdata->value[0] = 0; IDdata->value[1] = 0; IDdata->Info1 = NULL; IDdata->Info2 = NULL; IDdata->Info3 = NULL; IDdata->Info4 = NULL; IDdata->Info5 = NULL; IDdata->Info6 = NULL; IDdata->Info7 = NULL; IDdata->showInfo = 0; /* return Image display structure */ return IDdata; } /* end MakeDisplay */
int ga_xwin_init(const char *displayname, gaImage *gaimg) { int ignore = 0; // bzero(&__xshminfo, sizeof(__xshminfo)); // open display if((display = XOpenDisplay(displayname)) == NULL) { ga_error("cannot open display \"%s\"\n", displayname ? displayname : "DEFAULT"); return -1; } // check MIT extension if(XQueryExtension(display, "MIT-SHM", &ignore, &ignore, &ignore) ) { int major, minor; Bool pixmaps; if(XShmQueryVersion(display, &major, &minor, &pixmaps) == True) { ga_error("XShm extention version %d.%d %s shared pixmaps\n", major, minor, (pixmaps==True) ? "with" : "without"); } else { ga_error("XShm extension not supported.\n"); goto xcap_init_error; } } // get default screen screenNumber = XDefaultScreen(display); if((screen = XScreenOfDisplay(display, screenNumber)) == NULL) { ga_error("cannot obtain screen #%d\n", screenNumber); goto xcap_init_error; } // width = XDisplayWidth(display, screenNumber); height = XDisplayHeight(display, screenNumber); depth = XDisplayPlanes(display, screenNumber); ga_error("X-Window-init: dimension: %dx%dx%d @ %d/%d\n", width, height, depth, screenNumber, XScreenCount(display)); // if((image = XShmCreateImage(display, XDefaultVisual(display, screenNumber), depth, ZPixmap, NULL, &__xshminfo, width, height)) == NULL) { ga_error("XShmCreateImage failed.\n"); goto xcap_init_error; } // if((__xshminfo.shmid = shmget(IPC_PRIVATE, image->bytes_per_line*image->height, IPC_CREAT | 0777)) < 0) { perror("shmget"); goto xcap_init_error; } // __xshminfo.shmaddr = image->data = (char*) shmat(__xshminfo.shmid, 0, 0); __xshminfo.readOnly = False; if(XShmAttach(display, &__xshminfo) == 0) { ga_error("XShmAttach failed.\n"); goto xcap_init_error; } // __xshmattached = true; rootWindow = XRootWindow(display, screenNumber); gaimg->width = image->width; gaimg->height = image->height; gaimg->bytes_per_line = image->bytes_per_line; // return 0; // xcap_init_error: ga_xwin_deinit(); return -1; }