2
* Copyright (c) 2001 by The XFree86 Project, Inc.
4
* Permission is hereby granted, free of charge, to any person obtaining a
5
* copy of this software and associated documentation files (the "Software"),
6
* to deal in the Software without restriction, including without limitation
7
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
* and/or sell copies of the Software, and to permit persons to whom the
9
* Software is furnished to do so, subject to the following conditions:
11
* The above copyright notice and this permission notice shall be included in
12
* all copies or substantial portions of the Software.
14
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17
* THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
* Except as contained in this notice, the name of the XFree86 Project shall
23
* not be used in advertising or otherwise to promote the sale, use or other
24
* dealings in this Software without prior written authorization from the
27
* Author: Paulo C�sar Pereira de Andrade
30
/* $XFree86: xc/programs/xedit/lisp/modules/x11.c,v 1.10 2002/11/23 08:26:52 paulo Exp $ */
41
int x11LoadModule(void);
43
LispObj *Lisp_XOpenDisplay(LispBuiltin *builtin);
44
LispObj *Lisp_XCloseDisplay(LispBuiltin *builtin);
45
LispObj *Lisp_XDefaultRootWindow(LispBuiltin *builtin);
46
LispObj *Lisp_XDefaultScreen(LispBuiltin *builtin);
47
LispObj *Lisp_XDefaultScreenOfDisplay(LispBuiltin *builtin);
48
LispObj *Lisp_XBlackPixel(LispBuiltin *builtin);
49
LispObj *Lisp_XBlackPixelOfScreen(LispBuiltin *builtin);
50
LispObj *Lisp_XWidthOfScreen(LispBuiltin *builtin);
51
LispObj *Lisp_XHeightOfScreen(LispBuiltin *builtin);
52
LispObj *Lisp_XWhitePixel(LispBuiltin *builtin);
53
LispObj *Lisp_XWhitePixelOfScreen(LispBuiltin *builtin);
54
LispObj *Lisp_XDefaultGC(LispBuiltin *builtin);
55
LispObj *Lisp_XDefaultGCOfScreen(LispBuiltin *builtin);
56
LispObj *Lisp_XCreateSimpleWindow(LispBuiltin *builtin);
57
LispObj *Lisp_XMapWindow(LispBuiltin *builtin);
58
LispObj *Lisp_XDestroyWindow(LispBuiltin *builtin);
59
LispObj *Lisp_XFlush(LispBuiltin *builtin);
60
LispObj *Lisp_XRaiseWindow(LispBuiltin *builtin);
61
LispObj *Lisp_XBell(LispBuiltin *builtin);
63
LispObj *Lisp_XDrawLine(LispBuiltin *builtin);
68
static LispBuiltin lispbuiltins[] = {
69
{LispFunction, Lisp_XOpenDisplay, "x-open-display &optional display-name"},
70
{LispFunction, Lisp_XCloseDisplay, "x-close-display display"},
71
{LispFunction, Lisp_XDefaultRootWindow, "x-default-root-window display"},
72
{LispFunction, Lisp_XDefaultScreen, "x-default-screen display"},
73
{LispFunction, Lisp_XDefaultScreenOfDisplay, "x-default-screen-of-display display"},
74
{LispFunction, Lisp_XBlackPixel, "x-black-pixel display &optional screen"},
75
{LispFunction, Lisp_XBlackPixelOfScreen, "x-black-pixel-of-screen screen"},
76
{LispFunction, Lisp_XWhitePixel, "x-white-pixel display &optional screen"},
77
{LispFunction, Lisp_XWhitePixelOfScreen, "x-white-pixel-of-screen screen"},
78
{LispFunction, Lisp_XDefaultGC, "x-default-gc display &optional screen"},
79
{LispFunction, Lisp_XDefaultGCOfScreen, "x-default-gc-of-screen screen"},
80
{LispFunction, Lisp_XCreateSimpleWindow, "x-create-simple-window display parent x y width height &optional border-width border background"},
81
{LispFunction, Lisp_XMapWindow, "x-map-window display window"},
82
{LispFunction, Lisp_XDestroyWindow, "X-DESTROY-WINDOW"},
83
{LispFunction, Lisp_XFlush, "x-flush display"},
84
{LispFunction, Lisp_XDrawLine, "x-draw-line display drawable gc x1 y1 x2 y2"},
85
{LispFunction, Lisp_XBell, "x-bell display &optional percent"},
86
{LispFunction, Lisp_XRaiseWindow, "x-raise-window display window"},
87
{LispFunction, Lisp_XWidthOfScreen, "x-width-of-screen screen"},
88
{LispFunction, Lisp_XHeightOfScreen, "x-height-of-screen screen"},
91
LispModuleData x11LispModuleData = {
96
static int x11Display_t, x11Screen_t, x11Window_t, x11GC_t;
106
x11Display_t = LispRegisterOpaqueType("Display*");
107
x11Screen_t = LispRegisterOpaqueType("Screen*");
108
x11Window_t = LispRegisterOpaqueType("Window");
109
x11GC_t = LispRegisterOpaqueType("GC");
111
for (i = 0; i < sizeof(lispbuiltins) / sizeof(lispbuiltins[0]); i++)
112
LispAddBuiltinFunction(&lispbuiltins[i]);
118
Lisp_XOpenDisplay(LispBuiltin *builtin)
120
x-open-display &optional display-name
123
LispObj *display_name;
126
display_name = ARGUMENT(0);
128
if (display_name == UNSPEC)
131
CHECK_STRING(display_name);
132
dname = THESTR(display_name);
135
return (OPAQUE(XOpenDisplay(dname), x11Display_t));
139
Lisp_XCloseDisplay(LispBuiltin *builtin)
141
x-close-display display
146
display = ARGUMENT(0);
148
if (!CHECKO(display, x11Display_t))
149
LispDestroy("%s: cannot convert %s to Display*",
150
STRFUN(builtin), STROBJ(display));
152
XCloseDisplay((Display*)(display->data.opaque.data));
158
Lisp_XDefaultRootWindow(LispBuiltin *builtin)
160
x-default-root-window display
165
display = ARGUMENT(0);
167
if (!CHECKO(display, x11Display_t))
168
LispDestroy("%s: cannot convert %s to Display*",
169
STRFUN(builtin), STROBJ(display));
171
return (OPAQUE(DefaultRootWindow((Display*)(display->data.opaque.data)),
176
Lisp_XDefaultScreen(LispBuiltin *builtin)
178
x-default-screen display
183
display = ARGUMENT(0);
185
if (!CHECKO(display, x11Display_t))
186
LispDestroy("%s: cannot convert %s to Display*",
187
STRFUN(builtin), STROBJ(display));
189
return (INTEGER(DefaultScreen((Display*)(display->data.opaque.data))));
193
Lisp_XDefaultScreenOfDisplay(LispBuiltin *builtin)
195
x-default-screen-of-display display
200
display = ARGUMENT(0);
202
if (!CHECKO(display, x11Display_t))
203
LispDestroy("%s: cannot convert %s to Display*",
204
STRFUN(builtin), STROBJ(display));
206
return (OPAQUE(DefaultScreenOfDisplay((Display*)(display->data.opaque.data)),
211
Lisp_XBlackPixel(LispBuiltin *builtin)
213
x-black-pixel display &optional screen
219
LispObj *odisplay, *oscreen;
221
oscreen = ARGUMENT(1);
222
odisplay = ARGUMENT(0);
224
if (!CHECKO(odisplay, x11Display_t))
225
LispDestroy("%s: cannot convert %s to Display*",
226
STRFUN(builtin), STROBJ(odisplay));
227
display = (Display*)(odisplay->data.opaque.data);
229
if (oscreen == UNSPEC)
230
screen = DefaultScreen(display);
232
CHECK_INDEX(oscreen);
234
screen = FIXNUM_VALUE(oscreen);
236
if (screen >= ScreenCount(display))
237
LispDestroy("%s: screen index %d too large, %d screens available",
238
STRFUN(builtin), screen, ScreenCount(display));
240
return (INTEGER(BlackPixel(display, screen)));
244
Lisp_XBlackPixelOfScreen(LispBuiltin *builtin)
246
x-black-pixel-of-screen screen
251
screen = ARGUMENT(0);
253
if (!CHECKO(screen, x11Screen_t))
254
LispDestroy("%s: cannot convert %s to Screen*",
255
STRFUN(builtin), STROBJ(screen));
257
return (INTEGER(XBlackPixelOfScreen((Screen*)(screen->data.opaque.data))));
261
Lisp_XWhitePixel(LispBuiltin *builtin)
263
x-white-pixel display &optional screen
269
LispObj *odisplay, *oscreen;
271
oscreen = ARGUMENT(1);
272
odisplay = ARGUMENT(0);
274
if (!CHECKO(odisplay, x11Display_t))
275
LispDestroy("%s: cannot convert %s to Display*",
276
STRFUN(builtin), STROBJ(odisplay));
277
display = (Display*)(odisplay->data.opaque.data);
279
if (oscreen == UNSPEC)
280
screen = DefaultScreen(display);
282
CHECK_FIXNUM(oscreen);
284
screen = FIXNUM_VALUE(oscreen);
286
if (screen >= ScreenCount(display))
287
LispDestroy("%s: screen index %d too large, %d screens available",
288
STRFUN(builtin), screen, ScreenCount(display));
290
return (INTEGER(WhitePixel(display, screen)));
294
Lisp_XWhitePixelOfScreen(LispBuiltin *builtin)
296
x-white-pixel-of-screen screen
301
screen = ARGUMENT(0);
303
if (!CHECKO(screen, x11Screen_t))
304
LispDestroy("%s: cannot convert %s to Screen*",
305
STRFUN(builtin), STROBJ(screen));
307
return (INTEGER(WhitePixelOfScreen((Screen*)(screen->data.opaque.data))));
311
Lisp_XDefaultGC(LispBuiltin *builtin)
313
x-default-gc display &optional screen
319
LispObj *odisplay, *oscreen;
321
oscreen = ARGUMENT(1);
322
odisplay = ARGUMENT(0);
324
if (!CHECKO(odisplay, x11Display_t))
325
LispDestroy("%s: cannot convert %s to Display*",
326
STRFUN(builtin), STROBJ(odisplay));
327
display = (Display*)(odisplay->data.opaque.data);
329
if (oscreen == UNSPEC)
330
screen = DefaultScreen(display);
332
CHECK_FIXNUM(oscreen);
334
screen = FIXNUM_VALUE(oscreen);
336
if (screen >= ScreenCount(display))
337
LispDestroy("%s: screen index %d too large, %d screens available",
338
STRFUN(builtin), screen, ScreenCount(display));
340
return (OPAQUE(DefaultGC(display, screen), x11GC_t));
344
Lisp_XDefaultGCOfScreen(LispBuiltin *builtin)
346
x-default-gc-of-screen screen
351
screen = ARGUMENT(0);
353
if (!CHECKO(screen, x11Screen_t))
354
LispDestroy("%s: cannot convert %s to Screen*",
355
STRFUN(builtin), STROBJ(screen));
357
return (OPAQUE(DefaultGCOfScreen((Screen*)(screen->data.opaque.data)),
362
Lisp_XCreateSimpleWindow(LispBuiltin *builtin)
364
x-create-simple-window display parent x y width height &optional border-width border background
370
unsigned int width, height, border_width;
371
unsigned long border, background;
373
LispObj *odisplay, *oparent, *ox, *oy, *owidth, *oheight,
374
*oborder_width, *oborder, *obackground;
376
obackground = ARGUMENT(8);
377
oborder = ARGUMENT(7);
378
oborder_width = ARGUMENT(6);
379
oheight = ARGUMENT(5);
380
owidth = ARGUMENT(4);
383
oparent = ARGUMENT(1);
384
odisplay = ARGUMENT(0);
386
if (!CHECKO(odisplay, x11Display_t))
387
LispDestroy("%s: cannot convert %s to Display*",
388
STRFUN(builtin), STROBJ(odisplay));
389
display = (Display*)(odisplay->data.opaque.data);
391
if (!CHECKO(oparent, x11Window_t))
392
LispDestroy("%s: cannot convert %s to Window",
393
STRFUN(builtin), STROBJ(oparent));
394
parent = (Window)(oparent->data.opaque.data);
397
x = FIXNUM_VALUE(ox);
400
y = FIXNUM_VALUE(oy);
403
width = FIXNUM_VALUE(owidth);
405
CHECK_INDEX(oheight);
406
height = FIXNUM_VALUE(oheight);
408
/* check &OPTIONAL parameters */
409
if (oborder_width == UNSPEC)
412
CHECK_INDEX(oborder_width);
414
border_width = FIXNUM_VALUE(oborder_width);
416
if (oborder == UNSPEC)
417
border = BlackPixel(display, DefaultScreen(display));
419
CHECK_LONGINT(oborder);
421
border = LONGINT_VALUE(oborder);
423
if (obackground == UNSPEC)
424
background = WhitePixel(display, DefaultScreen(display));
426
CHECK_LONGINT(obackground);
428
background = LONGINT_VALUE(obackground);
431
XCreateSimpleWindow(display, parent, x, y, width, height,
432
border_width, border, background),
437
Lisp_XMapWindow(LispBuiltin *builtin)
439
x-map-window display window
445
LispObj *odisplay, *owindow;
447
owindow = ARGUMENT(1);
448
odisplay = ARGUMENT(0);
450
if (!CHECKO(odisplay, x11Display_t))
451
LispDestroy("%s: cannot convert %s to Display*",
452
STRFUN(builtin), STROBJ(odisplay));
453
display = (Display*)(odisplay->data.opaque.data);
455
if (!CHECKO(owindow, x11Window_t))
456
LispDestroy("%s: cannot convert %s to Window",
457
STRFUN(builtin), STROBJ(owindow));
458
window = (Window)(owindow->data.opaque.data);
460
XMapWindow(display, window);
466
Lisp_XDestroyWindow(LispBuiltin *builtin)
468
x-destroy-window display window
474
LispObj *odisplay, *owindow;
476
owindow = ARGUMENT(1);
477
odisplay = ARGUMENT(0);
479
if (!CHECKO(odisplay, x11Display_t))
480
LispDestroy("%s: cannot convert %s to Display*",
481
STRFUN(builtin), STROBJ(odisplay));
482
display = (Display*)(odisplay->data.opaque.data);
484
if (!CHECKO(owindow, x11Window_t))
485
LispDestroy("%s: cannot convert %s to Window",
486
STRFUN(builtin), STROBJ(owindow));
487
window = (Window)(owindow->data.opaque.data);
489
XDestroyWindow(display, window);
495
Lisp_XFlush(LispBuiltin *builtin)
504
odisplay = ARGUMENT(0);
506
if (!CHECKO(odisplay, x11Display_t))
507
LispDestroy("%s: cannot convert %s to Display*",
508
STRFUN(builtin), STROBJ(odisplay));
509
display = (Display*)(odisplay->data.opaque.data);
517
Lisp_XDrawLine(LispBuiltin *builtin)
519
x-draw-line display drawable gc x1 y1 x2 y2
527
LispObj *odisplay, *odrawable, *ogc, *ox1, *oy1, *ox2, *oy2;
534
odrawable = ARGUMENT(1);
535
odisplay = ARGUMENT(0);
537
if (!CHECKO(odisplay, x11Display_t))
538
LispDestroy("%s: cannot convert %s to Display*",
539
STRFUN(builtin), STROBJ(odisplay));
540
display = (Display*)(odisplay->data.opaque.data);
542
/* XXX correct check when drawing to pixmaps implemented */
543
if (!CHECKO(odrawable, x11Window_t))
544
LispDestroy("%s: cannot convert %s to Drawable",
545
STRFUN(builtin), STROBJ(odrawable));
546
drawable = (Drawable)(odrawable->data.opaque.data);
548
if (!CHECKO(ogc, x11GC_t))
549
LispDestroy("%s: cannot convert %s to Display*",
550
STRFUN(builtin), STROBJ(ogc));
551
gc = (GC)(ogc->data.opaque.data);
554
x1 = FIXNUM_VALUE(ox1);
557
y1 = FIXNUM_VALUE(oy1);
560
x2 = FIXNUM_VALUE(ox2);
563
y2 = FIXNUM_VALUE(oy2);
565
XDrawLine(display, drawable, gc, x1, y1, x2, y2);
571
Lisp_XBell(LispBuiltin *builtin)
573
x-bell &optional percent
579
LispObj *odisplay, *opercent;
581
opercent = ARGUMENT(1);
582
odisplay = ARGUMENT(0);
584
if (!CHECKO(odisplay, x11Display_t))
585
LispDestroy("%s: cannot convert %s to Display*",
586
STRFUN(builtin), STROBJ(odisplay));
587
display = (Display*)(odisplay->data.opaque.data);
589
if (opercent == UNSPEC)
592
CHECK_FIXNUM(opercent);
594
percent = FIXNUM_VALUE(opercent);
596
if (percent < -100 || percent > 100)
597
LispDestroy("%s: percent value %d out of range -100 to 100",
598
STRFUN(builtin), percent);
600
XBell(display, percent);
606
Lisp_XRaiseWindow(LispBuiltin *builtin)
608
x-raise-window display window
614
LispObj *odisplay, *owindow;
616
owindow = ARGUMENT(1);
617
odisplay = ARGUMENT(0);
619
if (!CHECKO(odisplay, x11Display_t))
620
LispDestroy("%s: cannot convert %s to Display*",
621
STRFUN(builtin), STROBJ(odisplay));
622
display = (Display*)(odisplay->data.opaque.data);
624
if (!CHECKO(owindow, x11Window_t))
625
LispDestroy("%s: cannot convert %s to Window",
626
STRFUN(builtin), STROBJ(owindow));
627
window = (Window)(owindow->data.opaque.data);
629
XRaiseWindow(display, window);
635
Lisp_XWidthOfScreen(LispBuiltin *builtin)
637
x-width-of-screen screen
642
screen = ARGUMENT(0);
644
if (!CHECKO(screen, x11Screen_t))
645
LispDestroy("%s: cannot convert %s to Screen*",
646
STRFUN(builtin), STROBJ(screen));
648
return (FIXNUM(WidthOfScreen((Screen*)(screen->data.opaque.data))));
652
Lisp_XHeightOfScreen(LispBuiltin *builtin)
654
x-height-of-screen screen
659
screen = ARGUMENT(0);
661
if (!CHECKO(screen, x11Screen_t))
662
LispDestroy("%s: cannot convert %s to Screen*",
663
STRFUN(builtin), STROBJ(screen));
665
return (FIXNUM(HeightOfScreen((Screen*)(screen->data.opaque.data))));