home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Shareware 1999 March
/
PCShareware-3-99.iso
/
IMPLE
/
DJGPP.RAR
/
DJGPP2
/
XLIB-SR0.ZIP
/
SRC
/
XLIBEMU
/
OPENDISP.C
< prev
next >
Wrap
C/C++ Source or Header
|
1994-02-20
|
6KB
|
251 lines
/* $Id: opendisp.c 1.5 1994/02/20 20:00:55 ulrich Exp $ */
/*
* opendisp.c
*
* X library functions for open/close display.
*/
#include "Xlibemu.h"
#include <pc.h>
#include <dos.h>
#include <stdio.h>
#include <fcntl.h>
GrContext _WScreenContext;
#ifndef NO_TERM_RESTORE
static int _TermMode;
static int _TermSize;
static short * _TermSave;
static int _TermCurR;
static int _TermCurC;
#endif
static int _RootWindow = None;
int GxScreenDepth ()
{
int n, i;
n = GrNumColors ();
i = 0;
while (n > 1) { n >>= 1; i++; }
return i;
}
int
_WOpenConnection (Display* dpy)
{
int i;
for (i = 0; i < MAX_CONN; i++) {
if (_ConnTable[i] == 0) {
_ConnTable[i] = dpy;
return i;
}
}
return -1;
}
int
_WCloseConnection (Display* dpy)
{
int i;
for (i = 0; i < MAX_CONN; i++) {
if (_ConnTable[i] == dpy) {
_ConnTable[i] = 0;
return i;
}
}
return -1;
}
int
_WGetConnection (Display* dpy)
{
int i;
for (i = 0; i < MAX_CONN; i++) {
if (_ConnTable[i] == dpy) {
return i;
}
}
return -1;
}
#ifdef GO32_NO_DPMI
/* GO32 version 1.08 - 1.10 */
#define ScreenRetrieve(v) \
memcpy (_TermSave, ScreenPrimary, _TermSize)
#define ScreenUpdate(v) \
memcpy (ScreenPrimary, _TermSave, _TermSize);
#endif
Display *
XOpenDisplay (_Xconst char* display_name)
{
Display *dpy;
Screen *scr;
Window root;
Cursor cursor;
Pixmap bitmap;
XColor color;
int mode_flags = 0;
char *xsetroot;
/*
* If the display specifier string supplied as an argument to this
* routine is NULL or a pointer to NULL, read the DISPLAY variable.
*/
if (display_name == NULL || *display_name == '\0') {
display_name = getenv ("DISPLAY");
}
if (display_name == NULL) {
display_name = "";
}
if (GrCurrentMode() <= GR_biggest_text) {
int mode, width, height, colors;
#ifndef NO_TERM_RESTORE
/* Save current terminal mode and contents */
_TermMode = ScreenMode();
ScreenGetCursor (&_TermCurR, &_TermCurC);
_TermSize = ScreenRows() * ScreenCols() * sizeof (short);
_TermSave = (short *) Xmalloc (_TermSize);
ScreenRetrieve (_TermSave);
#endif
switch (sscanf ((char *) display_name,
"%dx%dx%d", &width, &height, &colors)) {
case 2:
mode = GR_width_height_graphics;
break;
case 3:
mode = GR_width_height_color_graphics;
break;
default:
mode = GR_default_graphics;
break;
}
GrSetMode (mode, width, height, colors);
if (GrCurrentMode() <= GR_biggest_text) {
fprintf (stderr, "Cannot open display %s\n", display_name);
exit(1);
}
GrSaveContext (&_WScreenContext);
_WQueueInit ();
_WMouseDisplayCursor ();
mode_flags = 1;
}
dpy = (Display *) Xcalloc (1, sizeof (Display));
if (dpy == (Display *) 0) return 0;
scr = (Screen *) Xcalloc (1, sizeof (Screen));
if (scr == (Screen *) 0) return 0;
scr->display = dpy;
scr->width = GrScreenX ();
scr->height = GrScreenY ();
/*
* display width 14 inch monitor == 250 mm, assume 640x480 standard resolution,
* for greater resolutions assume greater monitor.
*/
scr->mwidth = (250 * scr->width) / 640;
scr->mheight = (250 * scr->width) / 480;
scr->root_depth = GxScreenDepth ();
scr->root_visual = (Visual *) Xcalloc (1, sizeof (Visual));
scr->root_visual->class = PseudoColor;
scr->root_visual->map_entries = GrNumColors ();
scr->ndepths = 1;
scr->depths = (Depth *) Xmalloc (scr->ndepths * sizeof(Depth));
scr->depths[0].depth = GxScreenDepth();
scr->depths[0].nvisuals = 1;
scr->depths[0].visuals = scr->root_visual;
scr->white_pixel = GrWhite ();
scr->black_pixel = GrBlack ();
dpy->flags |= mode_flags;
dpy->display_name = (char *) Xmalloc (strlen (display_name) + 1);
strcpy (dpy->display_name, display_name);
dpy->nscreens = 1;
dpy->screens = scr;
DefaultRootWindow (dpy) = None;
dpy->free_funcs = (_XFreeFuncRec *) Xcalloc (1, sizeof(_XFreeFuncRec));
dpy->min_keycode = MIN_KEYCODE;
dpy->max_keycode = MAX_KEYCODE;
dpy->fd = _WOpenConnection (dpy);
if (_RootWindow == None) {
root = XCreateSimpleWindow (dpy, None, 0, 0, scr->width, scr->height,
0, scr->black_pixel, scr->black_pixel);
cursor = XCreateFontCursor (dpy, 0 /* XC_X_cursor */);
_WDefineCursor (cursor);
XDefineCursor (dpy, root, cursor);
xsetroot = getenv ("XSETROOT");
if (! xsetroot)
xsetroot = "solid black";
if (! strncmp (xsetroot, "solid ", 6)) {
if (XAllocNamedColor (dpy,
DefaultColormap (dpy, DefaultScreen (dpy)),
xsetroot + 6,
&color, &color)) {
XSetWindowBackground (dpy, root, color.pixel);
}
}
if (! strncmp (xsetroot, "bitmap ", 7)) {
unsigned int width, height;
int x_hot, y_hot;
if (BitmapSuccess ==
XReadBitmapFile (dpy, (Drawable) root,
xsetroot + 7,
&width, &height, &bitmap, &x_hot, &y_hot)) {
XSetWindowBackgroundPixmap (dpy, root, bitmap);
}
}
XMapWindow (dpy, root);
_RootWindow = root;
}
DefaultRootWindow (dpy) = _RootWindow;
return dpy;
}
int XCloseDisplay(Display* display)
{
if (display == NULL) return 0;
if (display->flags & 1) {
_WMouseEraseCursor();
_WQueueUnInit();
#ifdef NO_TERM_RESTORE
GrSetMode (GR_default_text);
#else
{
union REGS r;
r.h.al = _TermMode;
r.h.ah = 0;
int86 (0x10, &r, &r);
ScreenUpdate (_TermSave);
ScreenSetCursor (_TermCurR, _TermCurC);
}
#endif
}
_WCloseConnection (display);
XFree (display->screens);
XFree (display);
return 0;
}