/* * Copyright (c) 2001 by The XFree86 Project, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * Except as contained in this notice, the name of the XFree86 Project shall * not be used in advertising or otherwise to promote the sale, use or other * dealings in this Software without prior written authorization from the * XFree86 Project. * * Author: Paulo César Pereira de Andrade */ /* $XFree86$ */ #include #include #include "lisp/internal.h" #include "lisp/private.h" #include /* * Prototypes */ int x11LoadModule(void); LispObj *Lisp_XOpenDisplay(LispBuiltin *builtin); LispObj *Lisp_XCloseDisplay(LispBuiltin *builtin); LispObj *Lisp_XDefaultRootWindow(LispBuiltin *builtin); LispObj *Lisp_XDefaultScreen(LispBuiltin *builtin); LispObj *Lisp_XDefaultScreenOfDisplay(LispBuiltin *builtin); LispObj *Lisp_XBlackPixel(LispBuiltin *builtin); LispObj *Lisp_XBlackPixelOfScreen(LispBuiltin *builtin); LispObj *Lisp_XWidthOfScreen(LispBuiltin *builtin); LispObj *Lisp_XHeightOfScreen(LispBuiltin *builtin); LispObj *Lisp_XWhitePixel(LispBuiltin *builtin); LispObj *Lisp_XWhitePixelOfScreen(LispBuiltin *builtin); LispObj *Lisp_XDefaultGC(LispBuiltin *builtin); LispObj *Lisp_XDefaultGCOfScreen(LispBuiltin *builtin); LispObj *Lisp_XCreateSimpleWindow(LispBuiltin *builtin); LispObj *Lisp_XMapWindow(LispBuiltin *builtin); LispObj *Lisp_XDestroyWindow(LispBuiltin *builtin); LispObj *Lisp_XFlush(LispBuiltin *builtin); LispObj *Lisp_XRaiseWindow(LispBuiltin *builtin); LispObj *Lisp_XBell(LispBuiltin *builtin); LispObj *Lisp_XDrawLine(LispBuiltin *builtin); /* * Initialization */ static LispBuiltin lispbuiltins[] = { {LispFunction, Lisp_XOpenDisplay, "x-open-display &optional display-name"}, {LispFunction, Lisp_XCloseDisplay, "x-close-display display"}, {LispFunction, Lisp_XDefaultRootWindow, "x-default-root-window display"}, {LispFunction, Lisp_XDefaultScreen, "x-default-screen display"}, {LispFunction, Lisp_XDefaultScreenOfDisplay, "x-default-screen-of-display display"}, {LispFunction, Lisp_XBlackPixel, "x-black-pixel display &optional screen"}, {LispFunction, Lisp_XBlackPixelOfScreen, "x-black-pixel-of-screen screen"}, {LispFunction, Lisp_XWhitePixel, "x-white-pixel display &optional screen"}, {LispFunction, Lisp_XWhitePixelOfScreen, "x-white-pixel-of-screen screen"}, {LispFunction, Lisp_XDefaultGC, "x-default-gc display &optional screen"}, {LispFunction, Lisp_XDefaultGCOfScreen, "x-default-gc-of-screen screen"}, {LispFunction, Lisp_XCreateSimpleWindow, "x-create-simple-window display parent x y width height &optional border-width border background"}, {LispFunction, Lisp_XMapWindow, "x-map-window display window"}, {LispFunction, Lisp_XDestroyWindow, "X-DESTROY-WINDOW"}, {LispFunction, Lisp_XFlush, "x-flush display"}, {LispFunction, Lisp_XDrawLine, "x-draw-line display drawable gc x1 y1 x2 y2"}, {LispFunction, Lisp_XBell, "x-bell display &optional percent"}, {LispFunction, Lisp_XRaiseWindow, "x-raise-window display window"}, {LispFunction, Lisp_XWidthOfScreen, "x-width-of-screen screen"}, {LispFunction, Lisp_XHeightOfScreen, "x-height-of-screen screen"}, }; LispModuleData x11LispModuleData = { LISP_MODULE_VERSION, x11LoadModule }; static int x11Display_t, x11Screen_t, x11Window_t, x11GC_t; /* * Implementation */ int x11LoadModule(void) { int i; x11Display_t = LispRegisterOpaqueType("Display*"); x11Screen_t = LispRegisterOpaqueType("Screen*"); x11Window_t = LispRegisterOpaqueType("Window"); x11GC_t = LispRegisterOpaqueType("GC"); for (i = 0; i < sizeof(lispbuiltins) / sizeof(lispbuiltins[0]); i++) LispAddBuiltinFunction(&lispbuiltins[i]); return (1); } LispObj * Lisp_XOpenDisplay(LispBuiltin *builtin) /* x-open-display &optional display-name */ { LispObj *display_name; char *dname; display_name = ARGUMENT(0); if (display_name == UNSPEC) dname = NULL; else { CHECK_STRING(display_name); dname = THESTR(display_name); } return (OPAQUE(XOpenDisplay(dname), x11Display_t)); } LispObj * Lisp_XCloseDisplay(LispBuiltin *builtin) /* x-close-display display */ { LispObj *display; display = ARGUMENT(0); if (!CHECKO(display, x11Display_t)) LispDestroy("%s: cannot convert %s to Display*", STRFUN(builtin), STROBJ(display)); XCloseDisplay((Display*)(display->data.opaque.data)); return (NIL); } LispObj * Lisp_XDefaultRootWindow(LispBuiltin *builtin) /* x-default-root-window display */ { LispObj *display; display = ARGUMENT(0); if (!CHECKO(display, x11Display_t)) LispDestroy("%s: cannot convert %s to Display*", STRFUN(builtin), STROBJ(display)); return (OPAQUE(DefaultRootWindow((Display*)(display->data.opaque.data)), x11Window_t)); } LispObj * Lisp_XDefaultScreen(LispBuiltin *builtin) /* x-default-screen display */ { LispObj *display; display = ARGUMENT(0); if (!CHECKO(display, x11Display_t)) LispDestroy("%s: cannot convert %s to Display*", STRFUN(builtin), STROBJ(display)); return (INTEGER(DefaultScreen((Display*)(display->data.opaque.data)))); } LispObj * Lisp_XDefaultScreenOfDisplay(LispBuiltin *builtin) /* x-default-screen-of-display display */ { LispObj *display; display = ARGUMENT(0); if (!CHECKO(display, x11Display_t)) LispDestroy("%s: cannot convert %s to Display*", STRFUN(builtin), STROBJ(display)); return (OPAQUE(DefaultScreenOfDisplay((Display*)(display->data.opaque.data)), x11Screen_t)); } LispObj * Lisp_XBlackPixel(LispBuiltin *builtin) /* x-black-pixel display &optional screen */ { Display *display; int screen; LispObj *odisplay, *oscreen; oscreen = ARGUMENT(1); odisplay = ARGUMENT(0); if (!CHECKO(odisplay, x11Display_t)) LispDestroy("%s: cannot convert %s to Display*", STRFUN(builtin), STROBJ(odisplay)); display = (Display*)(odisplay->data.opaque.data); if (oscreen == UNSPEC) screen = DefaultScreen(display); else { CHECK_INDEX(oscreen); screen = FIXNUM_VALUE(oscreen); } if (screen >= ScreenCount(display)) LispDestroy("%s: screen index %d too large, %d screens available", STRFUN(builtin), screen, ScreenCount(display)); return (INTEGER(BlackPixel(display, screen))); } LispObj * Lisp_XBlackPixelOfScreen(LispBuiltin *builtin) /* x-black-pixel-of-screen screen */ { LispObj *screen; screen = ARGUMENT(0); if (!CHECKO(screen, x11Screen_t)) LispDestroy("%s: cannot convert %s to Screen*", STRFUN(builtin), STROBJ(screen)); return (INTEGER(XBlackPixelOfScreen((Screen*)(screen->data.opaque.data)))); } LispObj * Lisp_XWhitePixel(LispBuiltin *builtin) /* x-white-pixel display &optional screen */ { Display *display; int screen; LispObj *odisplay, *oscreen; oscreen = ARGUMENT(1); odisplay = ARGUMENT(0); if (!CHECKO(odisplay, x11Display_t)) LispDestroy("%s: cannot convert %s to Display*", STRFUN(builtin), STROBJ(odisplay)); display = (Display*)(odisplay->data.opaque.data); if (oscreen == UNSPEC) screen = DefaultScreen(display); else { CHECK_FIXNUM(oscreen); screen = FIXNUM_VALUE(oscreen); } if (screen >= ScreenCount(display)) LispDestroy("%s: screen index %d too large, %d screens available", STRFUN(builtin), screen, ScreenCount(display)); return (INTEGER(WhitePixel(display, screen))); } LispObj * Lisp_XWhitePixelOfScreen(LispBuiltin *builtin) /* x-white-pixel-of-screen screen */ { LispObj *screen; screen = ARGUMENT(0); if (!CHECKO(screen, x11Screen_t)) LispDestroy("%s: cannot convert %s to Screen*", STRFUN(builtin), STROBJ(screen)); return (INTEGER(WhitePixelOfScreen((Screen*)(screen->data.opaque.data)))); } LispObj * Lisp_XDefaultGC(LispBuiltin *builtin) /* x-default-gc display &optional screen */ { Display *display; int screen; LispObj *odisplay, *oscreen; oscreen = ARGUMENT(1); odisplay = ARGUMENT(0); if (!CHECKO(odisplay, x11Display_t)) LispDestroy("%s: cannot convert %s to Display*", STRFUN(builtin), STROBJ(odisplay)); display = (Display*)(odisplay->data.opaque.data); if (oscreen == UNSPEC) screen = DefaultScreen(display); else { CHECK_FIXNUM(oscreen); screen = FIXNUM_VALUE(oscreen); } if (screen >= ScreenCount(display)) LispDestroy("%s: screen index %d too large, %d screens available", STRFUN(builtin), screen, ScreenCount(display)); return (OPAQUE(DefaultGC(display, screen), x11GC_t)); } LispObj * Lisp_XDefaultGCOfScreen(LispBuiltin *builtin) /* x-default-gc-of-screen screen */ { LispObj *screen; screen = ARGUMENT(0); if (!CHECKO(screen, x11Screen_t)) LispDestroy("%s: cannot convert %s to Screen*", STRFUN(builtin), STROBJ(screen)); return (OPAQUE(DefaultGCOfScreen((Screen*)(screen->data.opaque.data)), x11GC_t)); } LispObj * Lisp_XCreateSimpleWindow(LispBuiltin *builtin) /* x-create-simple-window display parent x y width height &optional border-width border background */ { Display *display; Window parent; int x, y; unsigned int width, height, border_width; unsigned long border, background; LispObj *odisplay, *oparent, *ox, *oy, *owidth, *oheight, *oborder_width, *oborder, *obackground; obackground = ARGUMENT(8); oborder = ARGUMENT(7); oborder_width = ARGUMENT(6); oheight = ARGUMENT(5); owidth = ARGUMENT(4); oy = ARGUMENT(3); ox = ARGUMENT(2); oparent = ARGUMENT(1); odisplay = ARGUMENT(0); if (!CHECKO(odisplay, x11Display_t)) LispDestroy("%s: cannot convert %s to Display*", STRFUN(builtin), STROBJ(odisplay)); display = (Display*)(odisplay->data.opaque.data); if (!CHECKO(oparent, x11Window_t)) LispDestroy("%s: cannot convert %s to Window", STRFUN(builtin), STROBJ(oparent)); parent = (Window)(oparent->data.opaque.data); CHECK_FIXNUM(ox); x = FIXNUM_VALUE(ox); CHECK_FIXNUM(oy); y = FIXNUM_VALUE(oy); CHECK_INDEX(owidth); width = FIXNUM_VALUE(owidth); CHECK_INDEX(oheight); height = FIXNUM_VALUE(oheight); /* check &OPTIONAL parameters */ if (oborder_width == UNSPEC) border_width = 1; else { CHECK_INDEX(oborder_width); border_width = FIXNUM_VALUE(oborder_width); } if (oborder == UNSPEC) border = BlackPixel(display, DefaultScreen(display)); else { CHECK_LONGINT(oborder); border = LONGINT_VALUE(oborder); } if (obackground == UNSPEC) background = WhitePixel(display, DefaultScreen(display)); else { CHECK_LONGINT(obackground); background = LONGINT_VALUE(obackground); } return (OPAQUE( XCreateSimpleWindow(display, parent, x, y, width, height, border_width, border, background), x11Window_t)); } LispObj * Lisp_XMapWindow(LispBuiltin *builtin) /* x-map-window display window */ { Display *display; Window window; LispObj *odisplay, *owindow; owindow = ARGUMENT(1); odisplay = ARGUMENT(0); if (!CHECKO(odisplay, x11Display_t)) LispDestroy("%s: cannot convert %s to Display*", STRFUN(builtin), STROBJ(odisplay)); display = (Display*)(odisplay->data.opaque.data); if (!CHECKO(owindow, x11Window_t)) LispDestroy("%s: cannot convert %s to Window", STRFUN(builtin), STROBJ(owindow)); window = (Window)(owindow->data.opaque.data); XMapWindow(display, window); return (owindow); } LispObj * Lisp_XDestroyWindow(LispBuiltin *builtin) /* x-destroy-window display window */ { Display *display; Window window; LispObj *odisplay, *owindow; owindow = ARGUMENT(1); odisplay = ARGUMENT(0); if (!CHECKO(odisplay, x11Display_t)) LispDestroy("%s: cannot convert %s to Display*", STRFUN(builtin), STROBJ(odisplay)); display = (Display*)(odisplay->data.opaque.data); if (!CHECKO(owindow, x11Window_t)) LispDestroy("%s: cannot convert %s to Window", STRFUN(builtin), STROBJ(owindow)); window = (Window)(owindow->data.opaque.data); XDestroyWindow(display, window); return (NIL); } LispObj * Lisp_XFlush(LispBuiltin *builtin) /* x-flush display */ { Display *display; LispObj *odisplay; odisplay = ARGUMENT(0); if (!CHECKO(odisplay, x11Display_t)) LispDestroy("%s: cannot convert %s to Display*", STRFUN(builtin), STROBJ(odisplay)); display = (Display*)(odisplay->data.opaque.data); XFlush(display); return (odisplay); } LispObj * Lisp_XDrawLine(LispBuiltin *builtin) /* x-draw-line display drawable gc x1 y1 x2 y2 */ { Display *display; Drawable drawable; GC gc; int x1, y1, x2, y2; LispObj *odisplay, *odrawable, *ogc, *ox1, *oy1, *ox2, *oy2; oy2 = ARGUMENT(6); ox2 = ARGUMENT(5); oy1 = ARGUMENT(4); ox1 = ARGUMENT(3); ogc = ARGUMENT(2); odrawable = ARGUMENT(1); odisplay = ARGUMENT(0); if (!CHECKO(odisplay, x11Display_t)) LispDestroy("%s: cannot convert %s to Display*", STRFUN(builtin), STROBJ(odisplay)); display = (Display*)(odisplay->data.opaque.data); /* XXX correct check when drawing to pixmaps implemented */ if (!CHECKO(odrawable, x11Window_t)) LispDestroy("%s: cannot convert %s to Drawable", STRFUN(builtin), STROBJ(odrawable)); drawable = (Drawable)(odrawable->data.opaque.data); if (!CHECKO(ogc, x11GC_t)) LispDestroy("%s: cannot convert %s to Display*", STRFUN(builtin), STROBJ(ogc)); gc = (GC)(ogc->data.opaque.data); CHECK_FIXNUM(ox1); x1 = FIXNUM_VALUE(ox1); CHECK_FIXNUM(oy1); y1 = FIXNUM_VALUE(oy1); CHECK_FIXNUM(ox2); x2 = FIXNUM_VALUE(ox2); CHECK_FIXNUM(oy2); y2 = FIXNUM_VALUE(oy2); XDrawLine(display, drawable, gc, x1, y1, x2, y2); return (odrawable); } LispObj * Lisp_XBell(LispBuiltin *builtin) /* x-bell &optional percent */ { Display *display; int percent; LispObj *odisplay, *opercent; opercent = ARGUMENT(1); odisplay = ARGUMENT(0); if (!CHECKO(odisplay, x11Display_t)) LispDestroy("%s: cannot convert %s to Display*", STRFUN(builtin), STROBJ(odisplay)); display = (Display*)(odisplay->data.opaque.data); if (opercent == UNSPEC) percent = 0; else { CHECK_FIXNUM(opercent); percent = FIXNUM_VALUE(opercent); } if (percent < -100 || percent > 100) LispDestroy("%s: percent value %d out of range -100 to 100", STRFUN(builtin), percent); XBell(display, percent); return (odisplay); } LispObj * Lisp_XRaiseWindow(LispBuiltin *builtin) /* x-raise-window display window */ { Display *display; Window window; LispObj *odisplay, *owindow; owindow = ARGUMENT(1); odisplay = ARGUMENT(0); if (!CHECKO(odisplay, x11Display_t)) LispDestroy("%s: cannot convert %s to Display*", STRFUN(builtin), STROBJ(odisplay)); display = (Display*)(odisplay->data.opaque.data); if (!CHECKO(owindow, x11Window_t)) LispDestroy("%s: cannot convert %s to Window", STRFUN(builtin), STROBJ(owindow)); window = (Window)(owindow->data.opaque.data); XRaiseWindow(display, window); return (owindow); } LispObj * Lisp_XWidthOfScreen(LispBuiltin *builtin) /* x-width-of-screen screen */ { LispObj *screen; screen = ARGUMENT(0); if (!CHECKO(screen, x11Screen_t)) LispDestroy("%s: cannot convert %s to Screen*", STRFUN(builtin), STROBJ(screen)); return (FIXNUM(WidthOfScreen((Screen*)(screen->data.opaque.data)))); } LispObj * Lisp_XHeightOfScreen(LispBuiltin *builtin) /* x-height-of-screen screen */ { LispObj *screen; screen = ARGUMENT(0); if (!CHECKO(screen, x11Screen_t)) LispDestroy("%s: cannot convert %s to Screen*", STRFUN(builtin), STROBJ(screen)); return (FIXNUM(HeightOfScreen((Screen*)(screen->data.opaque.data)))); }