Unmodified C files from elk.
This commit is contained in:
		
						commit
						f4b9866a6b
					
				| 
						 | 
				
			
			@ -0,0 +1,28 @@
 | 
			
		|||
# CVS default ignores begin
 | 
			
		||||
tags
 | 
			
		||||
TAGS
 | 
			
		||||
.make.state
 | 
			
		||||
.nse_depinfo
 | 
			
		||||
*~
 | 
			
		||||
\#*
 | 
			
		||||
.#*
 | 
			
		||||
,*
 | 
			
		||||
_$*
 | 
			
		||||
*$
 | 
			
		||||
*.old
 | 
			
		||||
*.bak
 | 
			
		||||
*.BAK
 | 
			
		||||
*.orig
 | 
			
		||||
*.rej
 | 
			
		||||
.del-*
 | 
			
		||||
*.a
 | 
			
		||||
*.olb
 | 
			
		||||
*.o
 | 
			
		||||
*.obj
 | 
			
		||||
*.so
 | 
			
		||||
*.exe
 | 
			
		||||
*.Z
 | 
			
		||||
*.elc
 | 
			
		||||
*.ln
 | 
			
		||||
core
 | 
			
		||||
# CVS default ignores end
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,390 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
static Object Sym_Wm_Hints, Sym_Size_Hints;
 | 
			
		||||
 | 
			
		||||
static Object P_Iconify_Window (w, scr) Object w, scr; {
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    if (!XIconifyWindow (WINDOW(w)->dpy, WINDOW(w)->win,
 | 
			
		||||
	    Get_Screen_Number (WINDOW(w)->dpy, scr)))
 | 
			
		||||
	Primitive_Error ("cannot iconify window");
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Withdraw_Window (w, scr) Object w, scr; {
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    if (!XWithdrawWindow (WINDOW(w)->dpy, WINDOW(w)->win,
 | 
			
		||||
	    Get_Screen_Number (WINDOW(w)->dpy, scr)))
 | 
			
		||||
	Primitive_Error ("cannot withdraw window");
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Reconfigure_Wm_Window (w, scr, conf) Object w, scr, conf; {
 | 
			
		||||
    unsigned long mask;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    mask = Vector_To_Record (conf, Conf_Size, Sym_Conf, Conf_Rec);
 | 
			
		||||
    if (!XReconfigureWMWindow (WINDOW(w)->dpy, WINDOW(w)->win,
 | 
			
		||||
	    Get_Screen_Number (WINDOW(w)->dpy, scr), mask, &WC))
 | 
			
		||||
	Primitive_Error ("cannot reconfigure window");
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Wm_Command (w) Object w; {
 | 
			
		||||
    int i, ac;
 | 
			
		||||
    char **av;
 | 
			
		||||
    Object s, ret, t;
 | 
			
		||||
    GC_Node2;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    if (!XGetCommand (WINDOW(w)->dpy, WINDOW(w)->win, &av, &ac))
 | 
			
		||||
	ac = 0;
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    ret = t = P_Make_List (Make_Integer (ac), Null);
 | 
			
		||||
    GC_Link2 (ret, t);
 | 
			
		||||
    for (i = 0; i < ac; i++, t = Cdr (t)) {
 | 
			
		||||
	s = Make_String (av[i], strlen (av[i]));
 | 
			
		||||
	Car (t) = s;
 | 
			
		||||
    }
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    if (ac) XFreeStringList (av);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static String_List_To_Text_Property (x, ret) Object x; XTextProperty *ret; {
 | 
			
		||||
    register i, n;
 | 
			
		||||
    register char **s;
 | 
			
		||||
    Object t;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_List (x);
 | 
			
		||||
    n = Fast_Length (x);
 | 
			
		||||
    Alloca (s, char**, n * sizeof (char *));
 | 
			
		||||
    for (i = 0; i < n; i++, x = Cdr (x)) {
 | 
			
		||||
	t = Car (x);
 | 
			
		||||
	Get_Strsym_Stack (t, s[i]);
 | 
			
		||||
    }
 | 
			
		||||
    if (!XStringListToTextProperty (s, n, ret))
 | 
			
		||||
	Primitive_Error ("cannot create text property");
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object Text_Property_To_String_List (p) XTextProperty *p; {
 | 
			
		||||
    int n;
 | 
			
		||||
    register i;
 | 
			
		||||
    char **s;
 | 
			
		||||
    Object x, ret, t;
 | 
			
		||||
    GC_Node2;
 | 
			
		||||
 | 
			
		||||
    if (!XTextPropertyToStringList (p, &s, &n))
 | 
			
		||||
	Primitive_Error ("cannot convert from text property");
 | 
			
		||||
    ret = t = P_Make_List (Make_Integer (n), Null);
 | 
			
		||||
    GC_Link2 (ret, t);
 | 
			
		||||
    for (i = 0; i < n; i++, t = Cdr (t)) {
 | 
			
		||||
	x = Make_String (s[i], strlen (s[i]));
 | 
			
		||||
	Car (t) = x;
 | 
			
		||||
    }
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    XFreeStringList (s);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Get_Text_Property (w, a) Object w, a; {
 | 
			
		||||
    XTextProperty ret;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    Check_Type (a, T_Atom);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    if (!XGetTextProperty (WINDOW(w)->dpy, WINDOW(w)->win, &ret,
 | 
			
		||||
	    ATOM(a)->atom)) {
 | 
			
		||||
	Enable_Interrupts;
 | 
			
		||||
	return False;
 | 
			
		||||
    }
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    return Text_Property_To_String_List (&ret);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Set_Text_Property (w, prop, a) Object w, prop, a; {
 | 
			
		||||
    XTextProperty p;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    Check_Type (a, T_Atom);
 | 
			
		||||
    String_List_To_Text_Property (prop, &p);
 | 
			
		||||
    XSetTextProperty (WINDOW(w)->dpy, WINDOW(w)->win, &p, ATOM(a)->atom);
 | 
			
		||||
    XFree ((char *)p.value);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Wm_Protocols (w) Object w; {
 | 
			
		||||
    Atom *p;
 | 
			
		||||
    int i, n;
 | 
			
		||||
    Object ret;
 | 
			
		||||
    GC_Node;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    if (!XGetWMProtocols (WINDOW(w)->dpy, WINDOW(w)->win, &p, &n))
 | 
			
		||||
	Primitive_Error ("cannot get WM protocols");
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    ret = Make_Vector (n, Null);
 | 
			
		||||
    GC_Link (ret);
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	Object a;
 | 
			
		||||
	
 | 
			
		||||
	a = Make_Atom (p[i]);
 | 
			
		||||
	VECTOR(ret)->data[i] = a;
 | 
			
		||||
    }
 | 
			
		||||
    XFree ((char *)p);
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Set_Wm_Protocols (w, v) Object w, v; {
 | 
			
		||||
    Atom *p;
 | 
			
		||||
    int i, n;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    Check_Type (v, T_Vector);
 | 
			
		||||
    n = VECTOR(v)->size;
 | 
			
		||||
    Alloca (p, Atom*, n * sizeof (Atom));
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	Object a;
 | 
			
		||||
	a = VECTOR(v)->data[i];
 | 
			
		||||
	Check_Type (a, T_Atom);
 | 
			
		||||
	p[i] = ATOM(a)->atom;
 | 
			
		||||
    }
 | 
			
		||||
    if (!XSetWMProtocols (WINDOW(w)->dpy, WINDOW(w)->win, p, n))
 | 
			
		||||
	Primitive_Error ("cannot set WM protocols");
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Wm_Class (w) Object w; {
 | 
			
		||||
    Object ret, x;
 | 
			
		||||
    XClassHint c;
 | 
			
		||||
    GC_Node;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    /*
 | 
			
		||||
     * In X11.2 XGetClassHint() returns either 0 or Success, which happens
 | 
			
		||||
     * to be defined as 0.  So until this bug is fixed, we must
 | 
			
		||||
     * explicitly check whether the XClassHint structure has been filled.
 | 
			
		||||
     */
 | 
			
		||||
    c.res_name = c.res_class = 0;
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    (void)XGetClassHint (WINDOW(w)->dpy, WINDOW(w)->win, &c);
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    ret = Cons (False, False);
 | 
			
		||||
    GC_Link (ret);
 | 
			
		||||
    if (c.res_name) {
 | 
			
		||||
	x = Make_String (c.res_name, strlen (c.res_name));
 | 
			
		||||
	Car (ret) = x;
 | 
			
		||||
	XFree (c.res_name);
 | 
			
		||||
    }
 | 
			
		||||
    if (c.res_class) {
 | 
			
		||||
	x = Make_String (c.res_class, strlen (c.res_class));
 | 
			
		||||
	Cdr (ret) = x;
 | 
			
		||||
	XFree (c.res_class);
 | 
			
		||||
    }
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Set_Wm_Class (w, name, class) Object w, name, class; {
 | 
			
		||||
    XClassHint c;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    c.res_name = Get_Strsym (name);
 | 
			
		||||
    c.res_class = Get_Strsym (class);
 | 
			
		||||
    XSetClassHint (WINDOW(w)->dpy, WINDOW(w)->win, &c);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Set_Wm_Command (w, cmd) Object w, cmd; {
 | 
			
		||||
    register i, n;
 | 
			
		||||
    register char **argv;
 | 
			
		||||
    Object c;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    Check_List (cmd);
 | 
			
		||||
    n = Fast_Length (cmd);
 | 
			
		||||
    Alloca (argv, char**, n * sizeof (char *));
 | 
			
		||||
    for (i = 0; i < n; i++, cmd = Cdr (cmd)) {
 | 
			
		||||
	c = Car (cmd);
 | 
			
		||||
	Get_Strsym_Stack (c, argv[i]);
 | 
			
		||||
    }
 | 
			
		||||
    XSetCommand (WINDOW(w)->dpy, WINDOW(w)->win, argv, n);
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Wm_Hints (w) Object w; {
 | 
			
		||||
    XWMHints *p;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    p = XGetWMHints (WINDOW(w)->dpy, WINDOW(w)->win);
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    if (p) {
 | 
			
		||||
	WMH = *p;
 | 
			
		||||
	XFree ((char *)p);
 | 
			
		||||
    } else {
 | 
			
		||||
	WMH.flags = 0;
 | 
			
		||||
    }
 | 
			
		||||
    return Record_To_Vector (Wm_Hints_Rec, Wm_Hints_Size, Sym_Wm_Hints,
 | 
			
		||||
	WINDOW(w)->dpy, (unsigned long)WMH.flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Set_Wm_Hints (w, h) Object w, h; {
 | 
			
		||||
    unsigned long mask;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    mask = Vector_To_Record (h, Wm_Hints_Size, Sym_Wm_Hints, Wm_Hints_Rec);
 | 
			
		||||
    WMH.flags = mask;
 | 
			
		||||
    XSetWMHints (WINDOW(w)->dpy, WINDOW(w)->win, &WMH);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Size_Hints (w, a) Object w, a; {
 | 
			
		||||
    long supplied;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    Check_Type (a, T_Atom);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    if (!XGetWMSizeHints (WINDOW(w)->dpy, WINDOW(w)->win, &SZH, &supplied,
 | 
			
		||||
	    ATOM(a)->atom))
 | 
			
		||||
	SZH.flags = 0;
 | 
			
		||||
    if (!(supplied & PBaseSize))
 | 
			
		||||
	SZH.flags &= ~PBaseSize;
 | 
			
		||||
    if (!(supplied & PWinGravity))
 | 
			
		||||
	SZH.flags &= ~PWinGravity;
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    if ((SZH.flags & (PPosition|USPosition)) == (PPosition|USPosition))
 | 
			
		||||
	SZH.flags &= ~PPosition;
 | 
			
		||||
    if ((SZH.flags & (PSize|USSize)) == (PSize|USSize))
 | 
			
		||||
	SZH.flags &= ~PSize;
 | 
			
		||||
    return Record_To_Vector (Size_Hints_Rec, Size_Hints_Size, Sym_Size_Hints,
 | 
			
		||||
	WINDOW(w)->dpy, (unsigned long)SZH.flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Set_Size_Hints (w, a, h) Object w, a, h; {
 | 
			
		||||
    unsigned long mask;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    Check_Type (a, T_Atom);
 | 
			
		||||
    bzero ((char *)&SZH, sizeof (SZH));        /* Not portable? */
 | 
			
		||||
    mask = Vector_To_Record (h, Size_Hints_Size, Sym_Size_Hints,
 | 
			
		||||
	Size_Hints_Rec);
 | 
			
		||||
    if ((mask & (PPosition|USPosition)) == (PPosition|USPosition))
 | 
			
		||||
	mask &= ~PPosition;
 | 
			
		||||
    if ((mask & (PSize|USSize)) == (PSize|USSize))
 | 
			
		||||
	mask &= ~PSize;
 | 
			
		||||
    SZH.flags = mask;
 | 
			
		||||
    XSetWMSizeHints (WINDOW(w)->dpy, WINDOW(w)->win, &SZH, ATOM(a)->atom);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Icon_Sizes (w) Object w; {
 | 
			
		||||
    XIconSize *p;
 | 
			
		||||
    int i, n;
 | 
			
		||||
    Object v;
 | 
			
		||||
    GC_Node;
 | 
			
		||||
    
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    if (!XGetIconSizes (WINDOW(w)->dpy, WINDOW(w)->win, &p, &n))
 | 
			
		||||
	n = 0;
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    v = Make_Vector (n, Null);
 | 
			
		||||
    GC_Link (v);
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	register XIconSize *q = &p[i];
 | 
			
		||||
	Object t;
 | 
			
		||||
 | 
			
		||||
	t = P_Make_List (Make_Integer (6), Null);
 | 
			
		||||
	VECTOR(v)->data[i] = t;
 | 
			
		||||
	Car (t) = Make_Integer (q->min_width); t = Cdr (t);
 | 
			
		||||
	Car (t) = Make_Integer (q->min_height); t = Cdr (t);
 | 
			
		||||
	Car (t) = Make_Integer (q->max_width); t = Cdr (t);
 | 
			
		||||
	Car (t) = Make_Integer (q->max_height); t = Cdr (t);
 | 
			
		||||
	Car (t) = Make_Integer (q->width_inc); t = Cdr (t);
 | 
			
		||||
	Car (t) = Make_Integer (q->height_inc);
 | 
			
		||||
    }
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    if (n > 0)
 | 
			
		||||
	XFree ((char *)p);
 | 
			
		||||
    return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Set_Icon_Sizes (w, v) Object w, v; {
 | 
			
		||||
    register i, n;
 | 
			
		||||
    XIconSize *p;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    Check_Type (v, T_Vector);
 | 
			
		||||
    n = VECTOR(v)->size;
 | 
			
		||||
    Alloca (p, XIconSize*, n * sizeof (XIconSize));
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	register XIconSize *q = &p[i];
 | 
			
		||||
	Object t;
 | 
			
		||||
 | 
			
		||||
	t = VECTOR(v)->data[i];
 | 
			
		||||
	Check_List (t);
 | 
			
		||||
	if (Fast_Length (t) != 6)
 | 
			
		||||
	    Primitive_Error ("invalid argument: ~s", t);
 | 
			
		||||
	q->min_width = Get_Integer (Car (t)); t = Cdr (t);
 | 
			
		||||
	q->min_height = Get_Integer (Car (t)); t = Cdr (t);
 | 
			
		||||
	q->max_width = Get_Integer (Car (t)); t = Cdr (t);
 | 
			
		||||
	q->max_height = Get_Integer (Car (t)); t = Cdr (t);
 | 
			
		||||
	q->width_inc = Get_Integer (Car (t)); t = Cdr (t);
 | 
			
		||||
	q->height_inc = Get_Integer (Car (t));
 | 
			
		||||
    }
 | 
			
		||||
    XSetIconSizes (WINDOW(w)->dpy, WINDOW(w)->win, p, n);
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Transient_For (w) Object w; {
 | 
			
		||||
    Window win;
 | 
			
		||||
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    if (!XGetTransientForHint (WINDOW(w)->dpy, WINDOW(w)->win, &win))
 | 
			
		||||
	win = None;
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    return Make_Window (0, WINDOW(w)->dpy, win);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Set_Transient_For (w, pw) Object w, pw; {
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    XSetTransientForHint (WINDOW(w)->dpy, WINDOW(w)->win, Get_Window (pw));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_client () {
 | 
			
		||||
    Define_Symbol (&Sym_Wm_Hints, "wm-hints");
 | 
			
		||||
    Define_Symbol (&Sym_Size_Hints, "size-hints");
 | 
			
		||||
    Define_Primitive (P_Iconify_Window,   "iconify-window",    2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Withdraw_Window,  "withdraw-window",   2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Reconfigure_Wm_Window, 
 | 
			
		||||
			"xlib-reconfigure-wm-window",          3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Wm_Command,       "wm-command",        1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Get_Text_Property,"get-text-property", 2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Set_Text_Property,"set-text-property!",3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Wm_Protocols,     "wm-protocols",      1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Set_Wm_Protocols, "set-wm-protocols!", 2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Wm_Class,         "wm-class",          1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Set_Wm_Class,     "set-wm-class!",     3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Set_Wm_Command,   "set-wm-command!",   2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Wm_Hints,         "xlib-wm-hints",     1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Set_Wm_Hints,     "xlib-set-wm-hints!",2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Size_Hints,       "xlib-wm-size-hints",2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Set_Size_Hints,   
 | 
			
		||||
			"xlib-set-wm-size-hints!",             3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Icon_Sizes,       "icon-sizes",        1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Set_Icon_Sizes,   "set-icon-sizes!",   2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Transient_For,    "transient-for",     1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Set_Transient_For,"set-transient-for!",2, 2, EVAL);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,129 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
Generic_Predicate (Color)
 | 
			
		||||
 | 
			
		||||
static Color_Equal (x, y) Object x, y; {
 | 
			
		||||
    register XColor *p = &COLOR(x)->c, *q = &COLOR(y)->c;
 | 
			
		||||
    return p->red == q->red && p->green == q->green && p->blue == q->blue;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Generic_Print (Color, "#[color %lu]", POINTER(x))
 | 
			
		||||
 | 
			
		||||
Object Make_Color (r, g, b) unsigned int r, g, b; {
 | 
			
		||||
    Object c;
 | 
			
		||||
 | 
			
		||||
    c = Find_Object (T_Color, (GENERIC)0, Match_X_Obj, r, g, b);
 | 
			
		||||
    if (Nullp (c)) {
 | 
			
		||||
	c = Alloc_Object (sizeof (struct S_Color), T_Color, 0);
 | 
			
		||||
	COLOR(c)->tag = Null;
 | 
			
		||||
	COLOR(c)->c.red = r;
 | 
			
		||||
	COLOR(c)->c.green = g;
 | 
			
		||||
	COLOR(c)->c.blue = b;
 | 
			
		||||
	Register_Object (c, (GENERIC)0, (PFO)0, 0);
 | 
			
		||||
    }
 | 
			
		||||
    return c;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
XColor *Get_Color (c) Object c; {
 | 
			
		||||
    Check_Type (c, T_Color);
 | 
			
		||||
    return &COLOR(c)->c;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static unsigned short Get_RGB_Value (x) Object x; {
 | 
			
		||||
    double d;
 | 
			
		||||
 | 
			
		||||
    d = Get_Double (x);
 | 
			
		||||
    if (d < 0.0 || d > 1.0)
 | 
			
		||||
	Primitive_Error ("bad RGB value: ~s", x);
 | 
			
		||||
    return (unsigned short)(d * 65535);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Make_Color (r, g, b) Object r, g, b; {
 | 
			
		||||
    return Make_Color (Get_RGB_Value (r), Get_RGB_Value (g), Get_RGB_Value (b));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Color_Rgb_Values (c) Object c; {
 | 
			
		||||
    Object ret, t, x;
 | 
			
		||||
    GC_Node3;
 | 
			
		||||
 | 
			
		||||
    Check_Type (c, T_Color);
 | 
			
		||||
    ret = t = Null;
 | 
			
		||||
    GC_Link3 (c, ret, t);
 | 
			
		||||
    t = ret = P_Make_List (Make_Integer (3), Null);
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    x = Make_Reduced_Flonum ((double)COLOR(c)->c.red / 65535.0);
 | 
			
		||||
    Car (t) = x; t = Cdr (t);
 | 
			
		||||
    x = Make_Reduced_Flonum ((double)COLOR(c)->c.green / 65535.0);
 | 
			
		||||
    Car (t) = x; t = Cdr (t);
 | 
			
		||||
    x = Make_Reduced_Flonum ((double)COLOR(c)->c.blue / 65535.0);
 | 
			
		||||
    Car (t) = x;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Query_Color (cmap, p) Object cmap, p; {
 | 
			
		||||
    XColor c;
 | 
			
		||||
    Colormap cm = Get_Colormap (cmap);
 | 
			
		||||
 | 
			
		||||
    c.pixel = Get_Pixel (p);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    XQueryColor (COLORMAP(cmap)->dpy, cm, &c);
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    return Make_Color (c.red, c.green, c.blue);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Query_Colors (cmap, v) Object cmap, v; {
 | 
			
		||||
    Colormap cm = Get_Colormap (cmap);
 | 
			
		||||
    register i, n;
 | 
			
		||||
    Object ret;
 | 
			
		||||
    register XColor *p;
 | 
			
		||||
    GC_Node;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_Type (v, T_Vector);
 | 
			
		||||
    n = VECTOR(v)->size;
 | 
			
		||||
    Alloca (p, XColor*, n * sizeof (XColor));
 | 
			
		||||
    for (i = 0; i < n; i++)
 | 
			
		||||
	p[i].pixel = Get_Pixel (VECTOR(v)->data[i]);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    XQueryColors (COLORMAP(cmap)->dpy, cm, p, n);
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    ret = Make_Vector (n, Null);
 | 
			
		||||
    GC_Link (ret);
 | 
			
		||||
    for (i = 0; i < n; i++, p++) {
 | 
			
		||||
	Object x;
 | 
			
		||||
	
 | 
			
		||||
	x = Make_Color (p->red, p->green, p->blue);
 | 
			
		||||
	VECTOR(ret)->data[i] = x;
 | 
			
		||||
    }
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Lookup_Color (cmap, name) Object cmap, name; {
 | 
			
		||||
    XColor visual, exact;
 | 
			
		||||
    Colormap cm = Get_Colormap (cmap);
 | 
			
		||||
    Object ret, x;
 | 
			
		||||
    GC_Node;
 | 
			
		||||
 | 
			
		||||
    if (!XLookupColor (COLORMAP(cmap)->dpy, cm, Get_Strsym (name),
 | 
			
		||||
	    &visual, &exact))
 | 
			
		||||
	Primitive_Error ("no such color: ~s", name);
 | 
			
		||||
    ret = Cons (Null, Null);
 | 
			
		||||
    GC_Link (ret);
 | 
			
		||||
    x = Make_Color (visual.red, visual.green, visual.blue);
 | 
			
		||||
    Car (ret) = x;
 | 
			
		||||
    x = Make_Color (exact.red, exact.green, exact.blue);
 | 
			
		||||
    Cdr (ret) = x;
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_color () {
 | 
			
		||||
    Generic_Define (Color, "color", "color?");
 | 
			
		||||
    Define_Primitive (P_Make_Color,       "make-color",       3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Color_Rgb_Values, "color-rgb-values", 1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Query_Color,      "query-color",      2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Query_Colors,     "query-colors",     2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Lookup_Color,     "lookup-color",     2, 2, EVAL);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,88 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
Generic_Predicate (Colormap)
 | 
			
		||||
 | 
			
		||||
Generic_Equal_Dpy (Colormap, COLORMAP, cm)
 | 
			
		||||
 | 
			
		||||
Generic_Print (Colormap, "#[colormap %lu]", COLORMAP(x)->cm)
 | 
			
		||||
 | 
			
		||||
Generic_Get_Display (Colormap, COLORMAP)
 | 
			
		||||
 | 
			
		||||
Object Make_Colormap (finalize, dpy, cmap) Display *dpy; Colormap cmap; {
 | 
			
		||||
    Object cm;
 | 
			
		||||
 | 
			
		||||
    if (cmap == None)
 | 
			
		||||
	return Sym_None;
 | 
			
		||||
    cm = Find_Object (T_Colormap, (GENERIC)dpy, Match_X_Obj, cmap);
 | 
			
		||||
    if (Nullp (cm)) {
 | 
			
		||||
	cm = Alloc_Object (sizeof (struct S_Colormap), T_Colormap, 0);
 | 
			
		||||
	COLORMAP(cm)->tag = Null;
 | 
			
		||||
	COLORMAP(cm)->cm = cmap;
 | 
			
		||||
	COLORMAP(cm)->dpy = dpy;
 | 
			
		||||
	COLORMAP(cm)->free = 0;
 | 
			
		||||
	Register_Object (cm, (GENERIC)dpy, finalize ? P_Free_Colormap :
 | 
			
		||||
	    (PFO)0, 0);
 | 
			
		||||
    }
 | 
			
		||||
    return cm;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Colormap Get_Colormap (c) Object c; {
 | 
			
		||||
    Check_Type (c, T_Colormap);
 | 
			
		||||
    return COLORMAP(c)->cm;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Object P_Free_Colormap (c) Object c; {
 | 
			
		||||
    Check_Type (c, T_Colormap);
 | 
			
		||||
    if (!COLORMAP(c)->free)
 | 
			
		||||
	XFreeColormap (COLORMAP(c)->dpy, COLORMAP(c)->cm);
 | 
			
		||||
    Deregister_Object (c);
 | 
			
		||||
    COLORMAP(c)->free = 1;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Alloc_Color (cmap, color) Object cmap, color; {
 | 
			
		||||
    XColor c;
 | 
			
		||||
    Colormap cm = Get_Colormap (cmap);
 | 
			
		||||
    int r;
 | 
			
		||||
    
 | 
			
		||||
    c = *Get_Color (color);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    r = XAllocColor (COLORMAP(cmap)->dpy, cm, &c);
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    if (!r)
 | 
			
		||||
	return False;
 | 
			
		||||
    return Make_Pixel (c.pixel);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Alloc_Named_Color (cmap, name) Object cmap, name; {
 | 
			
		||||
    Colormap cm = Get_Colormap (cmap);
 | 
			
		||||
    XColor screen, exact;
 | 
			
		||||
    int r;
 | 
			
		||||
    Object ret, t, x;
 | 
			
		||||
    GC_Node2;
 | 
			
		||||
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    r = XAllocNamedColor (COLORMAP(cmap)->dpy, cm, Get_Strsym (name),
 | 
			
		||||
	&screen, &exact);
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    if (!r)
 | 
			
		||||
	return False;
 | 
			
		||||
    t = ret = P_Make_List (Make_Integer (3), Null);
 | 
			
		||||
    GC_Link2 (t, ret);
 | 
			
		||||
    x = Make_Pixel (screen.pixel);
 | 
			
		||||
    Car (t) = x; t = Cdr (t);
 | 
			
		||||
    x = Make_Color (screen.red, screen.green, screen.blue);
 | 
			
		||||
    Car (t) = x; t = Cdr (t);
 | 
			
		||||
    x = Make_Color (exact.red, exact.green, exact.blue);
 | 
			
		||||
    Car (t) = x;
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_colormap () {
 | 
			
		||||
    Generic_Define (Colormap, "colormap", "colormap?");
 | 
			
		||||
    Define_Primitive (P_Colormap_Display, "colormap-display", 1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Free_Colormap,    "free-colormap",    1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Alloc_Color,      "alloc-color",      2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Alloc_Named_Color,"alloc-named-color",2, 2, EVAL);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,91 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
Generic_Predicate (Cursor)
 | 
			
		||||
 | 
			
		||||
Generic_Equal_Dpy (Cursor, CURSOR, cursor)
 | 
			
		||||
 | 
			
		||||
Generic_Print (Cursor, "#[cursor %lu]", CURSOR(x)->cursor)
 | 
			
		||||
 | 
			
		||||
Generic_Get_Display (Cursor, CURSOR)
 | 
			
		||||
 | 
			
		||||
static Object Internal_Make_Cursor (finalize, dpy, cursor)
 | 
			
		||||
	Display *dpy; Cursor cursor; {
 | 
			
		||||
    Object c;
 | 
			
		||||
 | 
			
		||||
    if (cursor == None)
 | 
			
		||||
	return Sym_None;
 | 
			
		||||
    c = Find_Object (T_Cursor, (GENERIC)dpy, Match_X_Obj, cursor);
 | 
			
		||||
    if (Nullp (c)) {
 | 
			
		||||
	c = Alloc_Object (sizeof (struct S_Cursor), T_Cursor, 0);
 | 
			
		||||
	CURSOR(c)->tag = Null;
 | 
			
		||||
	CURSOR(c)->cursor = cursor;
 | 
			
		||||
	CURSOR(c)->dpy = dpy;
 | 
			
		||||
	CURSOR(c)->free = 0;
 | 
			
		||||
	Register_Object (c, (GENERIC)dpy,
 | 
			
		||||
	    finalize ? P_Free_Cursor : (PFO)0, 0);
 | 
			
		||||
    }
 | 
			
		||||
    return c;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Backwards compatibility: */
 | 
			
		||||
Object Make_Cursor (dpy, cursor) Display *dpy; Cursor cursor; {
 | 
			
		||||
    return Internal_Make_Cursor (1, dpy, cursor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Object Make_Cursor_Foreign (dpy, cursor) Display *dpy; Cursor cursor; {
 | 
			
		||||
    return Internal_Make_Cursor (0, dpy, cursor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Cursor Get_Cursor (c) Object c; {
 | 
			
		||||
    if (EQ(c, Sym_None))
 | 
			
		||||
	return None;
 | 
			
		||||
    Check_Type (c, T_Cursor);
 | 
			
		||||
    return CURSOR(c)->cursor;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Object P_Free_Cursor (c) Object c; {
 | 
			
		||||
    Check_Type (c, T_Cursor);
 | 
			
		||||
    if (!CURSOR(c)->free)
 | 
			
		||||
	XFreeCursor (CURSOR(c)->dpy, CURSOR(c)->cursor);
 | 
			
		||||
    Deregister_Object (c);
 | 
			
		||||
    CURSOR(c)->free = 1;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Create_Cursor (srcp, maskp, x, y, f, b)
 | 
			
		||||
	Object srcp, maskp, x, y, f, b; {
 | 
			
		||||
    Pixmap sp = Get_Pixmap (srcp), mp;
 | 
			
		||||
    Display *d = PIXMAP(srcp)->dpy;
 | 
			
		||||
 | 
			
		||||
    mp = EQ(maskp, Sym_None) ? None : Get_Pixmap (maskp);
 | 
			
		||||
    return Make_Cursor (d, XCreatePixmapCursor (d, sp, mp,
 | 
			
		||||
	Get_Color (f), Get_Color (b), Get_Integer (x), Get_Integer (y)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Create_Glyph_Cursor (srcf, srcc, maskf, maskc, f, b)
 | 
			
		||||
	Object srcf, srcc, maskf, maskc, f, b; {
 | 
			
		||||
    Font sf = Get_Font (srcf), mf;
 | 
			
		||||
    Display *d = FONT(srcf)->dpy;
 | 
			
		||||
 | 
			
		||||
    mf = EQ(maskf, Sym_None) ? None : Get_Font (maskf);
 | 
			
		||||
    return Make_Cursor (d, XCreateGlyphCursor (d, sf, mf,
 | 
			
		||||
	Get_Integer (srcc), mf == None ? 0 : Get_Integer (maskc),
 | 
			
		||||
	Get_Color (f), Get_Color (b)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Recolor_Cursor (c, f, b) Object c, f, b; {
 | 
			
		||||
    Check_Type (c, T_Cursor);
 | 
			
		||||
    XRecolorCursor (CURSOR(c)->dpy, CURSOR(c)->cursor, Get_Color (f),
 | 
			
		||||
	Get_Color (b));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_cursor () {
 | 
			
		||||
    Generic_Define (Cursor, "cursor", "cursor?");
 | 
			
		||||
    Define_Primitive (P_Cursor_Display, "cursor-display", 1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Free_Cursor,    "free-cursor",    1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Create_Cursor,  "create-cursor",  6, 6, EVAL);
 | 
			
		||||
    Define_Primitive (P_Create_Glyph_Cursor, "create-glyph-cursor",
 | 
			
		||||
							  6, 6, EVAL);
 | 
			
		||||
    Define_Primitive (P_Recolor_Cursor, "recolor-cursor", 3, 3, EVAL);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,308 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
static Display_Visit (dp, f) Object *dp; int (*f)(); {
 | 
			
		||||
    (*f)(&DISPLAY(*dp)->after);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Generic_Predicate (Display)
 | 
			
		||||
 | 
			
		||||
Generic_Equal (Display, DISPLAY, dpy)
 | 
			
		||||
 | 
			
		||||
static Display_Print (d, port, raw, depth, length) Object d, port; {
 | 
			
		||||
    Printf (port, "#[display %lu %s]", (unsigned)DISPLAY(d)->dpy,
 | 
			
		||||
	DisplayString (DISPLAY(d)->dpy));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Object Make_Display (finalize, dpy) Display *dpy; {
 | 
			
		||||
    Object d;
 | 
			
		||||
 | 
			
		||||
    d = Find_Object (T_Display, (GENERIC)dpy, Match_X_Obj);
 | 
			
		||||
    if (Nullp (d)) {
 | 
			
		||||
	d = Alloc_Object (sizeof (struct S_Display), T_Display, 0);
 | 
			
		||||
	DISPLAY(d)->dpy = dpy;
 | 
			
		||||
	DISPLAY(d)->free = 0;
 | 
			
		||||
	DISPLAY(d)->after = False;
 | 
			
		||||
	Register_Object (d, (GENERIC)dpy, finalize ? P_Close_Display :
 | 
			
		||||
	    (PFO)0, 1);
 | 
			
		||||
    }
 | 
			
		||||
    return d;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Open_Display (argc, argv) Object *argv; {
 | 
			
		||||
    register char *s;
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
 | 
			
		||||
    if (argc == 1) {
 | 
			
		||||
	if ((dpy = XOpenDisplay (Get_Strsym (argv[0]))) == 0)
 | 
			
		||||
	    Primitive_Error ("cannot open display ~s", argv[0]);
 | 
			
		||||
    } else if ((dpy = XOpenDisplay ((char *)0)) == 0) {
 | 
			
		||||
	s = XDisplayName ((char *)0);
 | 
			
		||||
	Primitive_Error ("cannot open display ~s",
 | 
			
		||||
	    Make_String (s, strlen (s)));
 | 
			
		||||
    }
 | 
			
		||||
    return Make_Display (1, dpy);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Object P_Close_Display (d) Object d; {
 | 
			
		||||
    register struct S_Display *p;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    p = DISPLAY(d);
 | 
			
		||||
    if (!p->free) {
 | 
			
		||||
	Terminate_Group ((GENERIC)p->dpy);
 | 
			
		||||
	XCloseDisplay (p->dpy);
 | 
			
		||||
    }
 | 
			
		||||
    Deregister_Object (d);
 | 
			
		||||
    p->free = 1;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Default_Root_Window (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Make_Window (0, DISPLAY(d)->dpy,
 | 
			
		||||
	DefaultRootWindow (DISPLAY(d)->dpy));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Default_Colormap (d) Object d; {
 | 
			
		||||
    register Display *dpy;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    dpy = DISPLAY(d)->dpy;
 | 
			
		||||
    return Make_Colormap (0, dpy, DefaultColormap (dpy, DefaultScreen (dpy)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Default_Gcontext (d) Object d; {
 | 
			
		||||
    register Display *dpy;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    dpy = DISPLAY(d)->dpy;
 | 
			
		||||
    return Make_Gc (0, dpy, DefaultGC (dpy, DefaultScreen (dpy)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Default_Depth (d) Object d; {
 | 
			
		||||
    register Display *dpy;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    dpy = DISPLAY(d)->dpy;
 | 
			
		||||
    return Make_Integer (DefaultDepth (dpy, DefaultScreen (dpy)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Default_Screen_Number (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Make_Integer (DefaultScreen (DISPLAY(d)->dpy));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Get_Screen_Number (dpy, scr) Display *dpy; Object scr; {
 | 
			
		||||
    register s;
 | 
			
		||||
 | 
			
		||||
    if ((s = Get_Integer (scr)) < 0 || s > ScreenCount (dpy)-1)
 | 
			
		||||
	Primitive_Error ("invalid screen number");
 | 
			
		||||
    return s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Cells (d, scr) Object d, scr; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Make_Integer (DisplayCells (DISPLAY(d)->dpy,
 | 
			
		||||
	Get_Screen_Number (DISPLAY(d)->dpy, scr)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Planes (d, scr) Object d, scr; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Make_Integer (DisplayPlanes (DISPLAY(d)->dpy, 
 | 
			
		||||
	Get_Screen_Number (DISPLAY(d)->dpy, scr)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_String (d) Object d; {
 | 
			
		||||
    register char *s;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    s = DisplayString (DISPLAY(d)->dpy);
 | 
			
		||||
    return Make_String (s, strlen (s));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Vendor (d) Object d; {
 | 
			
		||||
    register char *s;
 | 
			
		||||
    Object ret, name;
 | 
			
		||||
    GC_Node;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    s = ServerVendor (DISPLAY(d)->dpy);
 | 
			
		||||
    name = Make_String (s, strlen (s));
 | 
			
		||||
    GC_Link (name);
 | 
			
		||||
    ret = Cons (Null, Make_Integer (VendorRelease (DISPLAY(d)->dpy)));
 | 
			
		||||
    Car (ret) = name;
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Protocol_Version (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Cons (Make_Integer (ProtocolVersion (DISPLAY(d)->dpy)),
 | 
			
		||||
	Make_Integer (ProtocolRevision (DISPLAY(d)->dpy)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Screen_Count (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Make_Integer (ScreenCount (DISPLAY(d)->dpy));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Image_Byte_Order (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Bits_To_Symbols ((unsigned long)ImageByteOrder (DISPLAY(d)->dpy),
 | 
			
		||||
	0, Byte_Order_Syms);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Bitmap_Unit (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Make_Integer (BitmapUnit (DISPLAY(d)->dpy));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Bitmap_Bit_Order (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Bits_To_Symbols ((unsigned long)BitmapBitOrder (DISPLAY(d)->dpy),
 | 
			
		||||
	0, Byte_Order_Syms);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Bitmap_Pad (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Make_Integer (BitmapPad (DISPLAY(d)->dpy));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Width (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Make_Integer (DisplayWidth (DISPLAY(d)->dpy,
 | 
			
		||||
	DefaultScreen (DISPLAY(d)->dpy)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Height (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Make_Integer (DisplayHeight (DISPLAY(d)->dpy,
 | 
			
		||||
	DefaultScreen (DISPLAY(d)->dpy)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Width_Mm (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Make_Integer (DisplayWidthMM (DISPLAY(d)->dpy,
 | 
			
		||||
	DefaultScreen (DISPLAY(d)->dpy)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Height_Mm (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Make_Integer (DisplayHeightMM (DISPLAY(d)->dpy,
 | 
			
		||||
	DefaultScreen (DISPLAY(d)->dpy)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Motion_Buffer_Size (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Make_Unsigned_Long (XDisplayMotionBufferSize (DISPLAY(d)->dpy));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Flush_Output (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    XFlush (DISPLAY(d)->dpy);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Wait_Output (d, discard) Object d, discard; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    Check_Type (discard, T_Boolean);
 | 
			
		||||
    XSync (DISPLAY(d)->dpy, EQ(discard, True));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_No_Op (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    XNoOp (DISPLAY(d)->dpy);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_List_Depths (d, scr) Object d, scr; {
 | 
			
		||||
    int num;
 | 
			
		||||
    register *p, i;
 | 
			
		||||
    Object ret;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    if (!(p = XListDepths (DISPLAY(d)->dpy,
 | 
			
		||||
	    Get_Screen_Number (DISPLAY(d)->dpy, scr), &num)))
 | 
			
		||||
	return False;
 | 
			
		||||
    ret = Make_Vector (num, Null);
 | 
			
		||||
    for (i = 0; i < num; i++)
 | 
			
		||||
	VECTOR(ret)->data[i] = Make_Integer (p[i]);
 | 
			
		||||
    XFree ((char *)p);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_List_Pixmap_Formats (d) Object d; {
 | 
			
		||||
    register XPixmapFormatValues *p;
 | 
			
		||||
    int num;
 | 
			
		||||
    register i;
 | 
			
		||||
    Object ret;
 | 
			
		||||
    GC_Node;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    if (!(p = XListPixmapFormats (DISPLAY(d)->dpy, &num)))
 | 
			
		||||
	return False;
 | 
			
		||||
    ret = Make_Vector (num, Null);
 | 
			
		||||
    GC_Link (ret);
 | 
			
		||||
    for (i = 0; i < num; i++) {
 | 
			
		||||
	Object t;
 | 
			
		||||
	
 | 
			
		||||
	t = P_Make_List (Make_Integer (3), Null);
 | 
			
		||||
	VECTOR(ret)->data[i] = t;
 | 
			
		||||
	Car (t) = Make_Integer (p[i].depth); t = Cdr (t);
 | 
			
		||||
	Car (t) = Make_Integer (p[i].bits_per_pixel); t = Cdr (t);
 | 
			
		||||
	Car (t) = Make_Integer (p[i].scanline_pad);
 | 
			
		||||
    }
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    XFree ((char *)p);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_display () {
 | 
			
		||||
    T_Display = Define_Type (0, "display", NOFUNC, sizeof (struct S_Display),
 | 
			
		||||
	Display_Equal, Display_Equal, Display_Print, Display_Visit);
 | 
			
		||||
    Define_Primitive (P_Displayp,        "display?",         1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Open_Display,    "open-display",     0, 1, VARARGS);
 | 
			
		||||
    Define_Primitive (P_Close_Display,   "close-display",    1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Default_Root_Window,
 | 
			
		||||
			"display-default-root-window",       1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Default_Colormap,
 | 
			
		||||
			"display-default-colormap",          1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Default_Gcontext,
 | 
			
		||||
			"display-default-gcontext",          1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Default_Depth,
 | 
			
		||||
			"display-default-depth",             1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Default_Screen_Number,
 | 
			
		||||
			"display-default-screen-number",     1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Cells,   "display-cells",    2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Planes,  "display-planes",   2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_String,  "display-string",   1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Vendor,  "display-vendor",   1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Protocol_Version,
 | 
			
		||||
			"display-protocol-version",          1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Screen_Count,
 | 
			
		||||
			"display-screen-count",              1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Image_Byte_Order,
 | 
			
		||||
			"display-image-byte-order",          1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Bitmap_Unit,
 | 
			
		||||
			"display-bitmap-unit",               1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Bitmap_Bit_Order,
 | 
			
		||||
			"display-bitmap-bit-order",          1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Bitmap_Pad,
 | 
			
		||||
			"display-bitmap-pad",                1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Width,   "display-width",    1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Height,  "display-height",   1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Width_Mm,"display-width-mm", 1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Height_Mm,
 | 
			
		||||
			"display-height-mm",                 1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Motion_Buffer_Size,
 | 
			
		||||
			"display-motion-buffer-size",        1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Flush_Output,
 | 
			
		||||
			"display-flush-output",              1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Wait_Output,
 | 
			
		||||
			"display-wait-output",               2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_No_Op,           "no-op",            1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_List_Depths,      "list-depths",     2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_List_Pixmap_Formats,
 | 
			
		||||
			"list-pixmap-formats",               1, 1, EVAL);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,92 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
static Object V_X_Error_Handler, V_X_Fatal_Error_Handler;
 | 
			
		||||
 | 
			
		||||
/* Default error handlers of the Xlib */
 | 
			
		||||
extern int _XDefaultIOError();   
 | 
			
		||||
extern int _XDefaultError();
 | 
			
		||||
 | 
			
		||||
static X_Fatal_Error (d) Display *d; {
 | 
			
		||||
    Object args, fun;
 | 
			
		||||
    GC_Node;
 | 
			
		||||
 | 
			
		||||
    Reset_IO (0);
 | 
			
		||||
    args = Make_Display (0, d);
 | 
			
		||||
    GC_Link (args);
 | 
			
		||||
    args = Cons (args, Null);
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    fun = Var_Get (V_X_Fatal_Error_Handler);
 | 
			
		||||
    if (TYPE(fun) == T_Compound)
 | 
			
		||||
	(void)Funcall (fun, args, 0);
 | 
			
		||||
    _XDefaultIOError (d);
 | 
			
		||||
    exit (1);         /* In case the default handler doesn't exit() */
 | 
			
		||||
    /*NOTREACHED*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static X_Error (d, ep) Display *d; XErrorEvent *ep; {
 | 
			
		||||
    Object args, a, fun;
 | 
			
		||||
    GC_Node;
 | 
			
		||||
 | 
			
		||||
    Reset_IO (0);
 | 
			
		||||
    args = Make_Unsigned_Long ((unsigned long)ep->resourceid);
 | 
			
		||||
    GC_Link (args);
 | 
			
		||||
    args = Cons (args, Null);
 | 
			
		||||
    a = Make_Unsigned (ep->minor_code);
 | 
			
		||||
    args = Cons (a, args);
 | 
			
		||||
    a = Make_Unsigned (ep->request_code);
 | 
			
		||||
    args = Cons (a, args);
 | 
			
		||||
    a = Bits_To_Symbols ((unsigned long)ep->error_code, 0, Error_Syms);
 | 
			
		||||
    if (Nullp (a))
 | 
			
		||||
	a = Make_Unsigned (ep->error_code);
 | 
			
		||||
    args = Cons (a, args);
 | 
			
		||||
    a = Make_Unsigned_Long (ep->serial);
 | 
			
		||||
    args = Cons (a, args);
 | 
			
		||||
    a = Make_Display (0, ep->display);
 | 
			
		||||
    args = Cons (a, args);
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    fun = Var_Get (V_X_Error_Handler);
 | 
			
		||||
    if (TYPE(fun) == T_Compound)
 | 
			
		||||
	(void)Funcall (fun, args, 0);
 | 
			
		||||
    else
 | 
			
		||||
	_XDefaultError (d, ep);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static X_After_Function (d) Display *d; {
 | 
			
		||||
    Object args;
 | 
			
		||||
    GC_Node;
 | 
			
		||||
 | 
			
		||||
    args = Make_Display (0, d);
 | 
			
		||||
    GC_Link (args);
 | 
			
		||||
    args = Cons (args, Null);
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    (void)Funcall (DISPLAY(Car (args))->after, args, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Set_After_Function (d, f) Object d, f; {
 | 
			
		||||
    Object old;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    if (EQ(f, False)) {
 | 
			
		||||
	(void)XSetAfterFunction (DISPLAY(d)->dpy, (int (*)())0);
 | 
			
		||||
    } else {
 | 
			
		||||
	Check_Procedure (f);
 | 
			
		||||
	(void)XSetAfterFunction (DISPLAY(d)->dpy, X_After_Function);
 | 
			
		||||
    }
 | 
			
		||||
    old = DISPLAY(d)->after;
 | 
			
		||||
    DISPLAY(d)->after = f;
 | 
			
		||||
    return old;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_After_Function (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return DISPLAY(d)->after;
 | 
			
		||||
}
 | 
			
		||||
    
 | 
			
		||||
elk_init_xlib_error () {
 | 
			
		||||
    Define_Variable (&V_X_Fatal_Error_Handler, "x-fatal-error-handler", Null);
 | 
			
		||||
    Define_Variable (&V_X_Error_Handler, "x-error-handler", Null);
 | 
			
		||||
    (void)XSetIOErrorHandler (X_Fatal_Error);
 | 
			
		||||
    (void)XSetErrorHandler (X_Error);
 | 
			
		||||
    Define_Primitive (P_Set_After_Function, "set-after-function!", 2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_After_Function,     "after-function",      1, 1, EVAL);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,514 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
#define MAX_ARGS 14
 | 
			
		||||
 | 
			
		||||
static Object Argl, Argv;
 | 
			
		||||
 | 
			
		||||
static struct event_desc {
 | 
			
		||||
    char *name;
 | 
			
		||||
    int argc;
 | 
			
		||||
} Event_Table[] = {
 | 
			
		||||
    { "event-0", 	     1 },
 | 
			
		||||
    { "event-1",             1 },
 | 
			
		||||
    { "key-press",          12 },
 | 
			
		||||
    { "key-release",        12 },
 | 
			
		||||
    { "button-press",       12 },
 | 
			
		||||
    { "button-release",     12 },
 | 
			
		||||
    { "motion-notify",      12 },
 | 
			
		||||
    { "enter-notify",       14 },
 | 
			
		||||
    { "leave-notify",       14 },
 | 
			
		||||
    { "focus-in",            4 },
 | 
			
		||||
    { "focus-out",           4 },
 | 
			
		||||
    { "keymap-notify",       3 },
 | 
			
		||||
    { "expose",              7 },
 | 
			
		||||
    { "graphics-expose",     9 },
 | 
			
		||||
    { "no-expose",           4 },
 | 
			
		||||
    { "visibility-notify",   3 },
 | 
			
		||||
    { "create-notify",       9 },
 | 
			
		||||
    { "destroy-notify",      3 },
 | 
			
		||||
    { "unmap-notify",        4 },
 | 
			
		||||
    { "map-notify",          4 },
 | 
			
		||||
    { "map-request",         3 },
 | 
			
		||||
    { "reparent-notify",     7 },
 | 
			
		||||
    { "configure-notify",   10 },
 | 
			
		||||
    { "configure-request",  11 },
 | 
			
		||||
    { "gravity-notify",      5 },
 | 
			
		||||
    { "resize-request",      4 },
 | 
			
		||||
    { "circulate-notify",    4 },
 | 
			
		||||
    { "circulate-request",   4 },
 | 
			
		||||
    { "property-notify",     5 },
 | 
			
		||||
    { "selection-clear",     4 },
 | 
			
		||||
    { "selection-request",   7 },
 | 
			
		||||
    { "selection-notify",    6 },
 | 
			
		||||
    { "colormap-notify",     5 },
 | 
			
		||||
    { "client-message",      4 },
 | 
			
		||||
    { "mapping-notify",      4 },
 | 
			
		||||
    { 0,                     0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct predicate_arg {
 | 
			
		||||
    Object *funcs;
 | 
			
		||||
    Object *ret;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*ARGSUSED*/
 | 
			
		||||
static Event_Predicate (dpy, ep, ptr) Display *dpy; XEvent *ep;
 | 
			
		||||
#ifdef XLIB_RELEASE_5_OR_LATER
 | 
			
		||||
		XPointer ptr; {
 | 
			
		||||
#else
 | 
			
		||||
		char *ptr; {
 | 
			
		||||
#endif
 | 
			
		||||
    struct predicate_arg *ap = (struct predicate_arg *)ptr;
 | 
			
		||||
    register i;
 | 
			
		||||
    Object args;
 | 
			
		||||
    GC_Node;
 | 
			
		||||
 | 
			
		||||
    if ((i = ep->type) < LASTEvent && !Nullp (ap->funcs[i])) {
 | 
			
		||||
	args = Get_Event_Args (ep);
 | 
			
		||||
	GC_Link (args);
 | 
			
		||||
	*ap->ret = Funcall (ap->funcs[i], args, 0);
 | 
			
		||||
	Destroy_Event_Args (args);
 | 
			
		||||
	GC_Unlink;
 | 
			
		||||
    }
 | 
			
		||||
    return Truep (*ap->ret);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* (handle-events display discard? peek? clause...)
 | 
			
		||||
 * clause = (event function) or ((event...) function) or (else function)
 | 
			
		||||
 * loops/blocks until a function returns x != #f, then returns x.
 | 
			
		||||
 * discard?: discard unprocessed events.
 | 
			
		||||
 * peek?: don't discard processed events.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static Object P_Handle_Events (argl) Object argl; {
 | 
			
		||||
    Object next, clause, func, ret, funcs[LASTEvent], args;
 | 
			
		||||
    register i, discard, peek;
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    char *errmsg = "event occurs more than once";
 | 
			
		||||
    GC_Node3; struct gcnode gcv;
 | 
			
		||||
    TC_Prolog;
 | 
			
		||||
 | 
			
		||||
    TC_Disable;
 | 
			
		||||
    clause = args = Null;
 | 
			
		||||
    GC_Link3 (argl, clause, args);
 | 
			
		||||
    next = Eval (Car (argl));
 | 
			
		||||
    Check_Type (next, T_Display);
 | 
			
		||||
    dpy = DISPLAY(next)->dpy;
 | 
			
		||||
    argl = Cdr (argl);
 | 
			
		||||
    next = Eval (Car (argl));
 | 
			
		||||
    Check_Type (next, T_Boolean);
 | 
			
		||||
    discard = Truep (next);
 | 
			
		||||
    argl = Cdr (argl);
 | 
			
		||||
    next = Eval (Car (argl));
 | 
			
		||||
    Check_Type (next, T_Boolean);
 | 
			
		||||
    peek = Truep (next);
 | 
			
		||||
    for (i = 0; i < LASTEvent; i++)
 | 
			
		||||
	funcs[i] = Null;
 | 
			
		||||
    gcv.gclen = 1+LASTEvent; gcv.gcobj = funcs; gcv.next = &gc3; GC_List = &gcv;
 | 
			
		||||
    for (argl = Cdr (argl); !Nullp (argl); argl = Cdr (argl)) {
 | 
			
		||||
	clause = Car (argl);
 | 
			
		||||
	Check_List (clause);
 | 
			
		||||
	if (Fast_Length (clause) != 2)
 | 
			
		||||
	    Primitive_Error ("badly formed event clause");
 | 
			
		||||
	func = Eval (Car (Cdr (clause)));
 | 
			
		||||
	Check_Procedure (func);
 | 
			
		||||
	clause = Car (clause);
 | 
			
		||||
	if (EQ(clause, Sym_Else)) {
 | 
			
		||||
	    for (i = 0; i < LASTEvent; i++)
 | 
			
		||||
		if (Nullp (funcs[i])) funcs[i] = func;
 | 
			
		||||
	} else {
 | 
			
		||||
	    if (TYPE(clause) == T_Pair) {
 | 
			
		||||
		for (; !Nullp (clause); clause = Cdr (clause)) {
 | 
			
		||||
		    i = Encode_Event (Car (clause));
 | 
			
		||||
		    if (!Nullp (funcs[i]))
 | 
			
		||||
			Primitive_Error (errmsg);
 | 
			
		||||
		    funcs[i] = func;
 | 
			
		||||
		}
 | 
			
		||||
	    } else {
 | 
			
		||||
		i = Encode_Event (clause);
 | 
			
		||||
		if (!Nullp (funcs[i]))
 | 
			
		||||
		    Primitive_Error (errmsg);
 | 
			
		||||
		funcs[i] = func;
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    ret = False;
 | 
			
		||||
    while (!Truep (ret)) {
 | 
			
		||||
	XEvent e;
 | 
			
		||||
	if (discard) {
 | 
			
		||||
	    (peek ? XPeekEvent : XNextEvent) (dpy, &e);
 | 
			
		||||
	    if ((i = e.type) < LASTEvent && !Nullp (funcs[i])) {
 | 
			
		||||
		args = Get_Event_Args (&e);
 | 
			
		||||
		ret = Funcall (funcs[i], args, 0);
 | 
			
		||||
		Destroy_Event_Args (args);
 | 
			
		||||
	    } else {
 | 
			
		||||
		if (peek)
 | 
			
		||||
		    XNextEvent (dpy, &e);  /* discard it */
 | 
			
		||||
	    }
 | 
			
		||||
	} else {
 | 
			
		||||
	    struct predicate_arg a;
 | 
			
		||||
	    a.funcs = funcs;
 | 
			
		||||
	    a.ret = &ret;
 | 
			
		||||
	    (peek ? XPeekIfEvent : XIfEvent) (dpy, &e, Event_Predicate,
 | 
			
		||||
#ifdef XLIB_RELEASE_5_OR_LATER
 | 
			
		||||
		(XPointer)&a);
 | 
			
		||||
#else
 | 
			
		||||
		(char *)&a);
 | 
			
		||||
#endif
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    TC_Enable;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object Get_Time_Arg (t) Time t; {
 | 
			
		||||
    return t == CurrentTime ? Sym_Now : Make_Unsigned_Long ((unsigned long)t);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Object Get_Event_Args (ep) XEvent *ep; {
 | 
			
		||||
    Object tmpargs[MAX_ARGS];
 | 
			
		||||
    register e, i;
 | 
			
		||||
    register Object *a, *vp;
 | 
			
		||||
    struct gcnode gcv;
 | 
			
		||||
    Object dummy;
 | 
			
		||||
    GC_Node;
 | 
			
		||||
 | 
			
		||||
    e = ep->type;
 | 
			
		||||
    dummy = Null;
 | 
			
		||||
    a = tmpargs;
 | 
			
		||||
    for (i = 0; i < MAX_ARGS; i++)
 | 
			
		||||
	a[i] = Null;
 | 
			
		||||
    GC_Link (dummy);
 | 
			
		||||
    gcv.gclen = 1 + MAX_ARGS; gcv.gcobj = a; gcv.next = &gc1; GC_List = &gcv;
 | 
			
		||||
    switch (e) {
 | 
			
		||||
    case KeyPress: case KeyRelease:
 | 
			
		||||
    case ButtonPress: case ButtonRelease:
 | 
			
		||||
    case MotionNotify:
 | 
			
		||||
    case EnterNotify: case LeaveNotify: {
 | 
			
		||||
	register XKeyEvent *p = (XKeyEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[2] = Make_Window (0, p->display, p->root);
 | 
			
		||||
	a[3] = Make_Window (0, p->display, p->subwindow);
 | 
			
		||||
	a[4] = Get_Time_Arg (p->time);
 | 
			
		||||
	a[5] = Make_Integer (p->x);
 | 
			
		||||
	a[6] = Make_Integer (p->y);
 | 
			
		||||
	a[7] = Make_Integer (p->x_root);
 | 
			
		||||
	a[8] = Make_Integer (p->y_root);
 | 
			
		||||
	if (e == KeyPress || e == KeyRelease) {
 | 
			
		||||
	    a[9] = Bits_To_Symbols ((unsigned long)p->state, 1, State_Syms);
 | 
			
		||||
	    a[10] = Make_Integer (p->keycode);
 | 
			
		||||
	    a[11] = p->same_screen ? True : False;
 | 
			
		||||
	} else if (e == ButtonPress || e == ButtonRelease) {
 | 
			
		||||
	    register XButtonEvent *q = (XButtonEvent *)ep;
 | 
			
		||||
	    a[9] = Bits_To_Symbols ((unsigned long)q->state, 1, State_Syms);
 | 
			
		||||
	    a[10] = Bits_To_Symbols ((unsigned long)q->button, 0, Button_Syms);
 | 
			
		||||
	    a[11] = q->same_screen ? True : False;
 | 
			
		||||
	} else if (e == MotionNotify) {
 | 
			
		||||
	    register XMotionEvent *q = (XMotionEvent *)ep;
 | 
			
		||||
	    a[9] = Bits_To_Symbols ((unsigned long)q->state, 1, State_Syms);
 | 
			
		||||
	    a[10] = q->is_hint ? True : False;
 | 
			
		||||
	    a[11] = q->same_screen ? True : False;
 | 
			
		||||
	} else {
 | 
			
		||||
	    register XCrossingEvent *q = (XCrossingEvent *)ep;
 | 
			
		||||
	    a[9] = Bits_To_Symbols ((unsigned long)q->mode, 0, Cross_Mode_Syms);
 | 
			
		||||
	    a[10] = Bits_To_Symbols ((unsigned long)q->detail, 0,
 | 
			
		||||
		Cross_Detail_Syms);
 | 
			
		||||
	    a[11] = q->same_screen ? True : False;
 | 
			
		||||
	    a[12] = q->focus ? True : False;
 | 
			
		||||
	    a[13] = Bits_To_Symbols ((unsigned long)q->state, 1, Button_Syms);
 | 
			
		||||
	}
 | 
			
		||||
    } break;
 | 
			
		||||
    case FocusIn: case FocusOut: {
 | 
			
		||||
	register XFocusChangeEvent *p = (XFocusChangeEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[2] = Bits_To_Symbols ((unsigned long)p->mode, 0, Cross_Mode_Syms);
 | 
			
		||||
	a[3] = Bits_To_Symbols ((unsigned long)p->detail, 0, Focus_Detail_Syms);
 | 
			
		||||
    } break;
 | 
			
		||||
    case KeymapNotify: {
 | 
			
		||||
	register XKeymapEvent *p = (XKeymapEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[2] = Make_String (p->key_vector, 32);
 | 
			
		||||
    } break;
 | 
			
		||||
    case Expose: {
 | 
			
		||||
	register XExposeEvent *p = (XExposeEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[2] = Make_Integer (p->x);
 | 
			
		||||
	a[3] = Make_Integer (p->y);
 | 
			
		||||
	a[4] = Make_Integer (p->width);
 | 
			
		||||
	a[5] = Make_Integer (p->height);
 | 
			
		||||
	a[6] = Make_Integer (p->count);
 | 
			
		||||
    } break;
 | 
			
		||||
    case GraphicsExpose: {
 | 
			
		||||
	register XGraphicsExposeEvent *p = (XGraphicsExposeEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->drawable);
 | 
			
		||||
	a[2] = Make_Integer (p->x);
 | 
			
		||||
	a[3] = Make_Integer (p->y);
 | 
			
		||||
	a[4] = Make_Integer (p->width);
 | 
			
		||||
	a[5] = Make_Integer (p->height);
 | 
			
		||||
	a[6] = Make_Integer (p->count);
 | 
			
		||||
	a[7] = Make_Integer (p->major_code);
 | 
			
		||||
	a[8] = Make_Integer (p->minor_code);
 | 
			
		||||
    } break;
 | 
			
		||||
    case NoExpose: {
 | 
			
		||||
	register XNoExposeEvent *p = (XNoExposeEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->drawable);
 | 
			
		||||
	a[2] = Make_Integer (p->major_code);
 | 
			
		||||
	a[3] = Make_Integer (p->minor_code);
 | 
			
		||||
    } break;
 | 
			
		||||
    case VisibilityNotify: {
 | 
			
		||||
	register XVisibilityEvent *p = (XVisibilityEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[2] = Bits_To_Symbols ((unsigned long)p->state, 0, Visibility_Syms);
 | 
			
		||||
    } break;
 | 
			
		||||
    case CreateNotify: {
 | 
			
		||||
	register XCreateWindowEvent *p = (XCreateWindowEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->parent);
 | 
			
		||||
	a[2] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[3] = Make_Integer (p->x);
 | 
			
		||||
	a[4] = Make_Integer (p->y);
 | 
			
		||||
	a[5] = Make_Integer (p->width);
 | 
			
		||||
	a[6] = Make_Integer (p->height);
 | 
			
		||||
	a[7] = Make_Integer (p->border_width);
 | 
			
		||||
	a[8] = p->override_redirect ? True : False;
 | 
			
		||||
    } break;
 | 
			
		||||
    case DestroyNotify: {
 | 
			
		||||
	register XDestroyWindowEvent *p = (XDestroyWindowEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->event);
 | 
			
		||||
	a[2] = Make_Window (0, p->display, p->window);
 | 
			
		||||
    } break;
 | 
			
		||||
    case UnmapNotify: {
 | 
			
		||||
	register XUnmapEvent *p = (XUnmapEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->event);
 | 
			
		||||
	a[2] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[3] = p->from_configure ? True : False;
 | 
			
		||||
    } break;
 | 
			
		||||
    case MapNotify: {
 | 
			
		||||
	register XMapEvent *p = (XMapEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->event);
 | 
			
		||||
	a[2] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[3] = p->override_redirect ? True : False;
 | 
			
		||||
    } break;
 | 
			
		||||
    case MapRequest: {
 | 
			
		||||
	register XMapRequestEvent *p = (XMapRequestEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->parent);
 | 
			
		||||
	a[2] = Make_Window (0, p->display, p->window);
 | 
			
		||||
    } break;
 | 
			
		||||
    case ReparentNotify: {
 | 
			
		||||
	register XReparentEvent *p = (XReparentEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->event);
 | 
			
		||||
	a[2] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[3] = Make_Window (0, p->display, p->parent);
 | 
			
		||||
	a[4] = Make_Integer (p->x);
 | 
			
		||||
	a[5] = Make_Integer (p->y);
 | 
			
		||||
	a[6] = p->override_redirect ? True : False;
 | 
			
		||||
    } break;
 | 
			
		||||
    case ConfigureNotify: {
 | 
			
		||||
	register XConfigureEvent *p = (XConfigureEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->event);
 | 
			
		||||
	a[2] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[3] = Make_Integer (p->x);
 | 
			
		||||
	a[4] = Make_Integer (p->y);
 | 
			
		||||
	a[5] = Make_Integer (p->width);
 | 
			
		||||
	a[6] = Make_Integer (p->height);
 | 
			
		||||
	a[7] = Make_Integer (p->border_width);
 | 
			
		||||
	a[8] = Make_Window (0, p->display, p->above);
 | 
			
		||||
	a[9] = p->override_redirect ? True : False;
 | 
			
		||||
    } break;
 | 
			
		||||
    case ConfigureRequest: {
 | 
			
		||||
	register XConfigureRequestEvent *p = (XConfigureRequestEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->parent);
 | 
			
		||||
	a[2] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[3] = Make_Integer (p->x);
 | 
			
		||||
	a[4] = Make_Integer (p->y);
 | 
			
		||||
	a[5] = Make_Integer (p->width);
 | 
			
		||||
	a[6] = Make_Integer (p->height);
 | 
			
		||||
	a[7] = Make_Integer (p->border_width);
 | 
			
		||||
	a[8] = Make_Window (0, p->display, p->above);
 | 
			
		||||
	a[9] = Bits_To_Symbols ((unsigned long)p->detail, 0, Stack_Mode_Syms);
 | 
			
		||||
	a[10] = Make_Unsigned_Long (p->value_mask);
 | 
			
		||||
    } break;
 | 
			
		||||
    case GravityNotify: {
 | 
			
		||||
	register XGravityEvent *p = (XGravityEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->event);
 | 
			
		||||
	a[2] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[3] = Make_Integer (p->x);
 | 
			
		||||
	a[4] = Make_Integer (p->y);
 | 
			
		||||
    } break;
 | 
			
		||||
    case ResizeRequest: {
 | 
			
		||||
	register XResizeRequestEvent *p = (XResizeRequestEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[2] = Make_Integer (p->width);
 | 
			
		||||
	a[3] = Make_Integer (p->height);
 | 
			
		||||
    } break;
 | 
			
		||||
    case CirculateNotify: {
 | 
			
		||||
	register XCirculateEvent *p = (XCirculateEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->event);
 | 
			
		||||
	a[2] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[3] = Bits_To_Symbols ((unsigned long)p->place, 0, Place_Syms);
 | 
			
		||||
    } break;
 | 
			
		||||
    case CirculateRequest: {
 | 
			
		||||
	register XCirculateRequestEvent *p = (XCirculateRequestEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->parent);
 | 
			
		||||
	a[2] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[3] = Bits_To_Symbols ((unsigned long)p->place, 0, Place_Syms);
 | 
			
		||||
    } break;
 | 
			
		||||
    case PropertyNotify: {
 | 
			
		||||
	register XPropertyEvent *p = (XPropertyEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[2] = Make_Atom (p->atom);
 | 
			
		||||
	a[3] = Get_Time_Arg (p->time);
 | 
			
		||||
	a[4] = Bits_To_Symbols ((unsigned long)p->state, 0, Prop_Syms);
 | 
			
		||||
    } break;
 | 
			
		||||
    case SelectionClear: {
 | 
			
		||||
	register XSelectionClearEvent *p = (XSelectionClearEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[2] = Make_Atom (p->selection);
 | 
			
		||||
	a[3] = Get_Time_Arg (p->time);
 | 
			
		||||
    } break;
 | 
			
		||||
    case SelectionRequest: {
 | 
			
		||||
	register XSelectionRequestEvent *p = (XSelectionRequestEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->owner);
 | 
			
		||||
	a[2] = Make_Window (0, p->display, p->requestor);
 | 
			
		||||
	a[3] = Make_Atom (p->selection);
 | 
			
		||||
	a[4] = Make_Atom (p->target);
 | 
			
		||||
	a[5] = Make_Atom (p->property);
 | 
			
		||||
	a[6] = Get_Time_Arg (p->time);
 | 
			
		||||
    } break;
 | 
			
		||||
    case SelectionNotify: {
 | 
			
		||||
	register XSelectionEvent *p = (XSelectionEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->requestor);
 | 
			
		||||
	a[2] = Make_Atom (p->selection);
 | 
			
		||||
	a[3] = Make_Atom (p->target);
 | 
			
		||||
	a[4] = Make_Atom (p->property);
 | 
			
		||||
	a[5] = Get_Time_Arg (p->time);
 | 
			
		||||
    } break;
 | 
			
		||||
    case ColormapNotify: {
 | 
			
		||||
	register XColormapEvent *p = (XColormapEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[2] = Make_Colormap (0, p->display, p->colormap);
 | 
			
		||||
	a[3] = p->new ? True : False;
 | 
			
		||||
	a[4] = p->state == ColormapInstalled ? True : False;
 | 
			
		||||
    } break;
 | 
			
		||||
    case ClientMessage: {
 | 
			
		||||
	register XClientMessageEvent *p = (XClientMessageEvent *)ep;
 | 
			
		||||
	register i;
 | 
			
		||||
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[2] = Make_Atom (p->message_type);
 | 
			
		||||
	switch (p->format) {
 | 
			
		||||
	case 8:
 | 
			
		||||
	    a[3] = Make_String (p->data.b, 20);
 | 
			
		||||
	    break;
 | 
			
		||||
	case 16:
 | 
			
		||||
	    a[3] = Make_Vector (10, Null);
 | 
			
		||||
	    for (i = 0; i < 10; i++)
 | 
			
		||||
		VECTOR(a[3])->data[i] = Make_Integer (p->data.s[i]);
 | 
			
		||||
	    break;
 | 
			
		||||
	case 32:
 | 
			
		||||
	    a[3] = Make_Vector (5, Null);
 | 
			
		||||
	    for (i = 0; i < 5; i++)
 | 
			
		||||
		VECTOR(a[3])->data[i] = Make_Long (p->data.l[i]);
 | 
			
		||||
	    break;
 | 
			
		||||
	default:
 | 
			
		||||
	    a[3] = Make_Integer (p->format);   /* ??? */
 | 
			
		||||
	}
 | 
			
		||||
    } break;
 | 
			
		||||
    case MappingNotify: {
 | 
			
		||||
	register XMappingEvent *p = (XMappingEvent *)ep;
 | 
			
		||||
	a[1] = Make_Window (0, p->display, p->window);
 | 
			
		||||
	a[2] = Bits_To_Symbols ((unsigned long)p->request, 0, Mapping_Syms);
 | 
			
		||||
	a[3] = Make_Integer (p->first_keycode);
 | 
			
		||||
	a[4] = Make_Integer (p->count);
 | 
			
		||||
    } break;
 | 
			
		||||
    }
 | 
			
		||||
    a[0] = Intern (Event_Table[e].name);
 | 
			
		||||
    for (vp = VECTOR(Argv)->data, i = 0; i < Event_Table[e].argc; i++) {
 | 
			
		||||
	if (i) vp++;
 | 
			
		||||
	Car (*vp) = a[i];
 | 
			
		||||
	Cdr (*vp) = vp[1];
 | 
			
		||||
    }
 | 
			
		||||
    Cdr (*vp) = Null;
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    return Argl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Destroy_Event_Args (args) Object args; {
 | 
			
		||||
    Object t;
 | 
			
		||||
 | 
			
		||||
    for (t = args; !Nullp (t); t = Cdr (t))
 | 
			
		||||
	Car (t) = Null;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Encode_Event (e) Object e; {
 | 
			
		||||
    Object s;
 | 
			
		||||
    register char *p;
 | 
			
		||||
    register struct event_desc *ep;
 | 
			
		||||
    register n;
 | 
			
		||||
 | 
			
		||||
    Check_Type (e, T_Symbol);
 | 
			
		||||
    s = SYMBOL(e)->name;
 | 
			
		||||
    p = STRING(s)->data;
 | 
			
		||||
    n = STRING(s)->size;
 | 
			
		||||
    for (ep = Event_Table; ep->name; ep++)
 | 
			
		||||
	if (n && strncmp (ep->name, p, n) == 0) break;
 | 
			
		||||
    if (ep->name == 0)
 | 
			
		||||
	Primitive_Error ("no such event: ~s", e);
 | 
			
		||||
    return ep-Event_Table;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Get_Motion_Events (w, from, to) Object w, from, to; {
 | 
			
		||||
    XTimeCoord *p;
 | 
			
		||||
    int n;
 | 
			
		||||
    register i;
 | 
			
		||||
    Object e, ret;
 | 
			
		||||
    GC_Node2;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    p = XGetMotionEvents (WINDOW(w)->dpy, WINDOW(w)->win, Get_Time (from),
 | 
			
		||||
	Get_Time (to), &n);
 | 
			
		||||
    e = ret = Make_Vector (n, Null);
 | 
			
		||||
    GC_Link2 (ret, e);
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	e = P_Make_List (Make_Integer (3), Null);
 | 
			
		||||
	VECTOR(ret)->data[i] = e;
 | 
			
		||||
	Car (e) = Get_Time_Arg (p[i].time); e = Cdr (e);
 | 
			
		||||
	Car (e) = Make_Integer (p[i].x); e = Cdr (e);
 | 
			
		||||
	Car (e) = Make_Integer (p[i].y);
 | 
			
		||||
    }
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    XFree ((char *)p);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Event_Listen (d, wait_flag) Object d, wait_flag; {
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    register n;
 | 
			
		||||
    XEvent e;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    Check_Type (wait_flag, T_Boolean);
 | 
			
		||||
    dpy = DISPLAY(d)->dpy;
 | 
			
		||||
    n = XPending (dpy);
 | 
			
		||||
    if (n == 0 && EQ(wait_flag, True)) {
 | 
			
		||||
	XPeekEvent (dpy, &e);
 | 
			
		||||
	n = XPending (dpy);
 | 
			
		||||
    }
 | 
			
		||||
    return Make_Integer (n);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_event () {
 | 
			
		||||
    Object t;
 | 
			
		||||
    register i;
 | 
			
		||||
 | 
			
		||||
    Argl = P_Make_List (Make_Integer (MAX_ARGS), Null);
 | 
			
		||||
    Global_GC_Link (Argl);
 | 
			
		||||
    Argv = Make_Vector (MAX_ARGS, Null);
 | 
			
		||||
    Global_GC_Link (Argv);
 | 
			
		||||
    for (i = 0, t = Argl; i < MAX_ARGS; i++, t = Cdr (t))
 | 
			
		||||
	VECTOR(Argv)->data[i] = t;
 | 
			
		||||
    Define_Primitive (P_Handle_Events,   "handle-events",     3, MANY, NOEVAL);
 | 
			
		||||
    Define_Primitive (P_Get_Motion_Events,
 | 
			
		||||
			"get-motion-events",                  3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Event_Listen,    "event-listen",      2, 2, EVAL);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,48 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
static Object P_List_Extensions (d) Object d; {
 | 
			
		||||
    Object ret;
 | 
			
		||||
    int n;
 | 
			
		||||
    register i;
 | 
			
		||||
    register char **p;
 | 
			
		||||
    GC_Node;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    p = XListExtensions (DISPLAY(d)->dpy, &n);
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    ret = Make_Vector (n, Null);
 | 
			
		||||
    GC_Link (ret);
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	Object e;
 | 
			
		||||
	
 | 
			
		||||
	e = Make_String (p[i], strlen (p[i]));
 | 
			
		||||
	VECTOR(ret)->data[i] = e;
 | 
			
		||||
    }
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    XFreeExtensionList (p);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Query_Extension (d, name) Object d, name; {
 | 
			
		||||
    int opcode, event, error;
 | 
			
		||||
    Object ret, t;
 | 
			
		||||
    GC_Node2;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    if (!XQueryExtension (DISPLAY(d)->dpy, Get_Strsym (name), &opcode,
 | 
			
		||||
	    &event, &error))
 | 
			
		||||
	return False;
 | 
			
		||||
    t = ret = P_Make_List (Make_Integer (3), Null);
 | 
			
		||||
    GC_Link2 (ret, t);
 | 
			
		||||
    Car (t) = (opcode ? Make_Integer (opcode) : False); t = Cdr (t);
 | 
			
		||||
    Car (t) = (event ? Make_Integer (event) : False); t = Cdr (t);
 | 
			
		||||
    Car (t) = (error ? Make_Integer (error) : False);
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_extension () {
 | 
			
		||||
    Define_Primitive (P_List_Extensions,    "list-extensions",   1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Query_Extension,    "query-extension",   2, 2, EVAL);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,299 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
Object Sym_Char_Info;
 | 
			
		||||
static Object Sym_Font_Info, Sym_Min, Sym_Max;
 | 
			
		||||
 | 
			
		||||
Generic_Predicate (Font)
 | 
			
		||||
 | 
			
		||||
static Font_Equal (x, y) Object x, y; {
 | 
			
		||||
    Font id1 = FONT(x)->id, id2 = FONT(y)->id;
 | 
			
		||||
    if (id1 && id2)
 | 
			
		||||
	return id1 == id2 && FONT(x)->dpy == FONT(y)->dpy;
 | 
			
		||||
    else
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Generic_Print (Font, "#[font %lu]", FONT(x)->id ? FONT(x)->id : POINTER(x))
 | 
			
		||||
 | 
			
		||||
static Font_Visit (fp, f) Object *fp; int (*f)(); {
 | 
			
		||||
    (*f)(&FONT(*fp)->name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Generic_Get_Display (Font, FONT)
 | 
			
		||||
 | 
			
		||||
static Object Internal_Make_Font (finalize, dpy, name, id, info)
 | 
			
		||||
	Display *dpy; Object name; Font id; XFontStruct *info; {
 | 
			
		||||
    Object f;
 | 
			
		||||
    GC_Node;
 | 
			
		||||
 | 
			
		||||
    GC_Link (name);
 | 
			
		||||
    f = Alloc_Object (sizeof (struct S_Font), T_Font, 0);
 | 
			
		||||
    FONT(f)->dpy = dpy;
 | 
			
		||||
    if (TYPE(name) == T_Symbol)
 | 
			
		||||
	name = SYMBOL(name)->name;
 | 
			
		||||
    FONT(f)->name = name;
 | 
			
		||||
    FONT(f)->id = id;
 | 
			
		||||
    FONT(f)->info = info;
 | 
			
		||||
    if (id)
 | 
			
		||||
	Register_Object (f, (GENERIC)dpy, finalize ? P_Close_Font : (PFO)0, 0);
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    return f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Backwards compatibility: */
 | 
			
		||||
Object Make_Font (dpy, name, id, info)
 | 
			
		||||
	Display *dpy; Object name; Font id; XFontStruct *info; {
 | 
			
		||||
    return Internal_Make_Font (1, dpy, name, id, info);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Object Make_Font_Foreign (dpy, name, id, info)
 | 
			
		||||
	Display *dpy; Object name; Font id; XFontStruct *info; {
 | 
			
		||||
    return Internal_Make_Font (0, dpy, name, id, info);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Font Get_Font (f) Object f; {
 | 
			
		||||
    Check_Type (f, T_Font);
 | 
			
		||||
    Open_Font_Maybe (f);
 | 
			
		||||
    return FONT(f)->id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static XFontStruct *Internal_Open_Font (d, name) Display *d; Object name; {
 | 
			
		||||
    register char *s;
 | 
			
		||||
    XFontStruct *p;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Get_Strsym_Stack (name, s);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    if ((p = XLoadQueryFont (d, s)) == 0)
 | 
			
		||||
	Primitive_Error ("cannot open font: ~s", name);
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Open_Font (d, name) Object d, name; {
 | 
			
		||||
    XFontStruct *p;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display)
 | 
			
		||||
    p = Internal_Open_Font (DISPLAY(d)->dpy, name);
 | 
			
		||||
    return Make_Font (DISPLAY(d)->dpy, name, p->fid, p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Open_Font_Maybe (f) Object f; {
 | 
			
		||||
    Object name;
 | 
			
		||||
    XFontStruct *p;
 | 
			
		||||
 | 
			
		||||
    name = FONT(f)->name;
 | 
			
		||||
    if (!Truep (name))
 | 
			
		||||
	Primitive_Error ("invalid font");
 | 
			
		||||
    if (FONT(f)->id == 0) {
 | 
			
		||||
	p = Internal_Open_Font (FONT(f)->dpy, name);
 | 
			
		||||
	FONT(f)->id = p->fid;
 | 
			
		||||
	FONT(f)->info = p;
 | 
			
		||||
	Register_Object (f, (GENERIC)(FONT(f)->dpy), P_Close_Font, 0);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Object P_Close_Font (f) Object f; {
 | 
			
		||||
    Check_Type (f, T_Font);
 | 
			
		||||
    if (FONT(f)->id)
 | 
			
		||||
	XUnloadFont (FONT(f)->dpy, FONT(f)->id);
 | 
			
		||||
    FONT(f)->id = 0;
 | 
			
		||||
    Deregister_Object (f);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Font_Name (f) Object f; {
 | 
			
		||||
    Check_Type (f, T_Font);
 | 
			
		||||
    return FONT(f)->name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Gcontext_Font (g) Object g; {
 | 
			
		||||
    register struct S_Gc *p;
 | 
			
		||||
    register XFontStruct *info;
 | 
			
		||||
 | 
			
		||||
    Check_Type (g, T_Gc);
 | 
			
		||||
    p = GCONTEXT(g);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    info = XQueryFont (p->dpy, XGContextFromGC (p->gc));
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    return Make_Font_Foreign (p->dpy, False, (Font)0, info);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object Internal_List_Fonts (d, pat, with_info) Object d, pat; {
 | 
			
		||||
    char **ret;
 | 
			
		||||
    int n;
 | 
			
		||||
    XFontStruct *iret;
 | 
			
		||||
    register i;
 | 
			
		||||
    Object f, v;
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    GC_Node2;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    dpy = DISPLAY(d)->dpy;
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    if (with_info)
 | 
			
		||||
	ret = XListFontsWithInfo (dpy, Get_Strsym (pat), 65535, &n, &iret);
 | 
			
		||||
    else
 | 
			
		||||
	ret = XListFonts (dpy, Get_Strsym (pat), 65535, &n);
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    v = Make_Vector (n, Null);
 | 
			
		||||
    f = Null;
 | 
			
		||||
    GC_Link2 (f, v);
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	f = Make_String (ret[i], strlen (ret[i]));
 | 
			
		||||
	if (with_info)
 | 
			
		||||
	    f = Make_Font (dpy, f, (Font)0, &iret[i]);
 | 
			
		||||
	VECTOR(v)->data[i] = f;
 | 
			
		||||
    }
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    if (with_info)
 | 
			
		||||
	XFreeFontInfo (ret, (XFontStruct *)0, 0);
 | 
			
		||||
    else
 | 
			
		||||
	XFreeFontNames (ret);
 | 
			
		||||
    return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_List_Font_Names (d, pat) Object d, pat; {
 | 
			
		||||
    return Internal_List_Fonts (d, pat, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_List_Fonts (d, pat) Object d, pat; {
 | 
			
		||||
    return Internal_List_Fonts (d, pat, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Font_Info (f) Object f; {
 | 
			
		||||
    Check_Type (f, T_Font);
 | 
			
		||||
    FI = *FONT(f)->info;
 | 
			
		||||
    return Record_To_Vector (Font_Info_Rec, Font_Info_Size,
 | 
			
		||||
	Sym_Font_Info, FONT(f)->dpy, ~0L);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Char_Info (f, index) Object f, index; {
 | 
			
		||||
    register t = TYPE(index);
 | 
			
		||||
    register unsigned i;
 | 
			
		||||
    register XCharStruct *cp;
 | 
			
		||||
    register XFontStruct *p;
 | 
			
		||||
    char *msg = "argument must be integer, character, 'min, or 'max";
 | 
			
		||||
 | 
			
		||||
    Check_Type (f, T_Font);
 | 
			
		||||
    Open_Font_Maybe (f);
 | 
			
		||||
    p = FONT(f)->info;
 | 
			
		||||
    cp = &p->max_bounds;
 | 
			
		||||
    if (t == T_Symbol) {
 | 
			
		||||
	if (EQ(index, Sym_Min))
 | 
			
		||||
	    cp = &p->min_bounds;
 | 
			
		||||
	else if (!EQ(index, Sym_Max))
 | 
			
		||||
	    Primitive_Error (msg);
 | 
			
		||||
    } else {
 | 
			
		||||
	if (t == T_Character)
 | 
			
		||||
	    i = CHAR(index);
 | 
			
		||||
	else if (t == T_Fixnum || t == T_Bignum)
 | 
			
		||||
	    i = (unsigned)Get_Integer (index);
 | 
			
		||||
	else
 | 
			
		||||
	    Primitive_Error (msg);
 | 
			
		||||
	if (!p->min_byte1 && !p->max_byte1) {
 | 
			
		||||
	    if (i < p->min_char_or_byte2 || i > p->max_char_or_byte2)
 | 
			
		||||
		Range_Error (index);
 | 
			
		||||
	    i -= p->min_char_or_byte2;
 | 
			
		||||
	} else {
 | 
			
		||||
	    register unsigned b1 = i & 0xff, b2 = (i >> 8) & 0xff;
 | 
			
		||||
	    if (b1 < p->min_byte1 || b1 > p->max_byte1 ||
 | 
			
		||||
		    b2 < p->min_char_or_byte2 || b2 > p->max_char_or_byte2)
 | 
			
		||||
		Range_Error (index);
 | 
			
		||||
	    b1 -= p->min_byte1;
 | 
			
		||||
	    b2 -= p->min_char_or_byte2;
 | 
			
		||||
	    i = b1 * (p->max_char_or_byte2 - p->min_char_or_byte2 + 1) + b2;
 | 
			
		||||
	}
 | 
			
		||||
	if (p->per_char)
 | 
			
		||||
	    cp = p->per_char + i;
 | 
			
		||||
    }
 | 
			
		||||
    CI = *cp;
 | 
			
		||||
    return Record_To_Vector (Char_Info_Rec, Char_Info_Size,
 | 
			
		||||
	Sym_Char_Info, FONT(f)->dpy, ~0L);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Font_Properties (f) Object f; {
 | 
			
		||||
    register i, n;
 | 
			
		||||
    Object v, a, val, x;
 | 
			
		||||
    GC_Node4;
 | 
			
		||||
 | 
			
		||||
    Check_Type (f, T_Font);
 | 
			
		||||
    n = FONT(f)->info->n_properties;
 | 
			
		||||
    v = Make_Vector (n, Null);
 | 
			
		||||
    a = val = Null;
 | 
			
		||||
    GC_Link4 (v, a, val, f);
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	register XFontProp *p = FONT(f)->info->properties+i;
 | 
			
		||||
	a = Make_Atom (p->name);
 | 
			
		||||
	val = Make_Unsigned_Long ((unsigned long)p->card32);
 | 
			
		||||
	x = Cons (a, val);
 | 
			
		||||
	VECTOR(v)->data[i] = x;
 | 
			
		||||
    }
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Font_Path (d) Object d; {
 | 
			
		||||
    Object v;
 | 
			
		||||
    int i, n;
 | 
			
		||||
    char **ret;
 | 
			
		||||
    GC_Node;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    ret = XGetFontPath (DISPLAY(d)->dpy, &n);
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    v = Make_Vector (n, Null);
 | 
			
		||||
    GC_Link (v);
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	Object x;
 | 
			
		||||
	
 | 
			
		||||
	x = Make_String (ret[i], strlen (ret[i]));
 | 
			
		||||
	VECTOR(v)->data[i] = x;
 | 
			
		||||
    }
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    XFreeFontPath (ret);
 | 
			
		||||
    return P_Vector_To_List (v);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Set_Font_Path (d, p) Object d, p; {
 | 
			
		||||
    register char **path;
 | 
			
		||||
    register i, n;
 | 
			
		||||
    Object c;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    Check_List (p);
 | 
			
		||||
    n = Fast_Length (p);
 | 
			
		||||
    Alloca (path, char**, n * sizeof (char *));
 | 
			
		||||
    for (i = 0; i < n; i++, p = Cdr (p)) {
 | 
			
		||||
	c = Car (p);
 | 
			
		||||
	Get_Strsym_Stack (c, path[i]);
 | 
			
		||||
    }
 | 
			
		||||
    XSetFontPath (DISPLAY(d)->dpy, path, n);
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_font () {
 | 
			
		||||
    Define_Symbol (&Sym_Font_Info, "font-info");
 | 
			
		||||
    Define_Symbol (&Sym_Char_Info, "char-info");
 | 
			
		||||
    Define_Symbol (&Sym_Min, "min");
 | 
			
		||||
    Define_Symbol (&Sym_Max, "max");
 | 
			
		||||
    T_Font = Define_Type (0, "font", NOFUNC, sizeof (struct S_Font),
 | 
			
		||||
	Font_Equal, Font_Equal, Font_Print, Font_Visit);
 | 
			
		||||
    Define_Primitive (P_Fontp,           "font?",           1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Font_Display,    "font-display",    1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Open_Font,       "open-font",       2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Close_Font,      "close-font",      1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Font_Name,       "font-name",       1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Gcontext_Font,   "gcontext-font",   1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_List_Font_Names, "list-font-names", 2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_List_Fonts,      "list-fonts",      2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Font_Info,       "xlib-font-info",  1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Char_Info,       "xlib-char-info",  2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Font_Properties, "font-properties", 1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Font_Path,       "font-path",       1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Set_Font_Path,   "set-font-path!",  2, 2, EVAL);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,162 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
static Object Sym_Gc;
 | 
			
		||||
 | 
			
		||||
Generic_Predicate (Gc)
 | 
			
		||||
 | 
			
		||||
Generic_Equal_Dpy (Gc, GCONTEXT, gc)
 | 
			
		||||
 | 
			
		||||
Generic_Print (Gc, "#[gcontext %lu]", GCONTEXT(x)->gc)
 | 
			
		||||
 | 
			
		||||
Generic_Get_Display (Gc, GCONTEXT)
 | 
			
		||||
 | 
			
		||||
Object Make_Gc (finalize, dpy, g) Display *dpy; GC g; {
 | 
			
		||||
    Object gc;
 | 
			
		||||
 | 
			
		||||
    if (g == None)
 | 
			
		||||
	return Sym_None;
 | 
			
		||||
    gc = Find_Object (T_Gc, (GENERIC)dpy, Match_X_Obj, g);
 | 
			
		||||
    if (Nullp (gc)) {
 | 
			
		||||
	gc = Alloc_Object (sizeof (struct S_Gc), T_Gc, 0);
 | 
			
		||||
	GCONTEXT(gc)->tag = Null;
 | 
			
		||||
	GCONTEXT(gc)->gc = g;
 | 
			
		||||
	GCONTEXT(gc)->dpy = dpy;
 | 
			
		||||
	GCONTEXT(gc)->free = 0;
 | 
			
		||||
	Register_Object (gc, (GENERIC)dpy, finalize ? P_Free_Gc :
 | 
			
		||||
	    (PFO)0, 0);
 | 
			
		||||
    }
 | 
			
		||||
    return gc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Create_Gc (w, g) Object w, g; {
 | 
			
		||||
    unsigned long mask;
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    Drawable dr;
 | 
			
		||||
 | 
			
		||||
    dr = Get_Drawable (w, &dpy);
 | 
			
		||||
    mask = Vector_To_Record (g, GC_Size, Sym_Gc, GC_Rec);
 | 
			
		||||
    return Make_Gc (1, dpy, XCreateGC (dpy, dr, mask, &GCV));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Copy_Gc (gc, w) Object gc, w; {
 | 
			
		||||
    GC dst;
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    Drawable dr;
 | 
			
		||||
 | 
			
		||||
    Check_Type (gc, T_Gc);
 | 
			
		||||
    dr = Get_Drawable (w, &dpy);
 | 
			
		||||
    dst = XCreateGC (dpy, dr, 0L, &GCV);
 | 
			
		||||
    XCopyGC (dpy, GCONTEXT(gc)->gc, ~0L, dst);
 | 
			
		||||
    return Make_Gc (1, dpy, dst);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Change_Gc (gc, g) Object gc, g; {
 | 
			
		||||
    unsigned long mask;
 | 
			
		||||
 | 
			
		||||
    Check_Type (gc, T_Gc);
 | 
			
		||||
    mask = Vector_To_Record (g, GC_Size, Sym_Gc, GC_Rec);
 | 
			
		||||
    XChangeGC (GCONTEXT(gc)->dpy, GCONTEXT(gc)->gc, mask, &GCV);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Object P_Free_Gc (g) Object g; {
 | 
			
		||||
    Check_Type (g, T_Gc);
 | 
			
		||||
    if (!GCONTEXT(g)->free)
 | 
			
		||||
	XFreeGC (GCONTEXT(g)->dpy, GCONTEXT(g)->gc);
 | 
			
		||||
    Deregister_Object (g);
 | 
			
		||||
    GCONTEXT(g)->free = 1;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Query_Best_Size (d, w, h, shape) Object d, w, h, shape; {
 | 
			
		||||
    unsigned int rw, rh;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    if (!XQueryBestSize (DISPLAY(d)->dpy, Symbols_To_Bits (shape, 0,
 | 
			
		||||
	    Shape_Syms), DefaultRootWindow (DISPLAY(d)->dpy),
 | 
			
		||||
	    Get_Integer (w), Get_Integer (h), &rw, &rh))
 | 
			
		||||
	Primitive_Error ("cannot query best shape");
 | 
			
		||||
    return Cons (Make_Integer (rw), Make_Integer (rh));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Set_Gcontext_Clip_Rectangles (gc, x, y, v, ord)
 | 
			
		||||
	Object gc, x, y, v, ord; {
 | 
			
		||||
    register XRectangle *p;
 | 
			
		||||
    register i, n;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_Type (gc, T_Gc);
 | 
			
		||||
    Check_Type (v, T_Vector);
 | 
			
		||||
    n = VECTOR(v)->size;
 | 
			
		||||
    Alloca (p, XRectangle*, n * sizeof (XRectangle));
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	Object rect;
 | 
			
		||||
	
 | 
			
		||||
	rect = VECTOR(v)->data[i];
 | 
			
		||||
	Check_Type (rect, T_Pair);
 | 
			
		||||
	if (Fast_Length (rect) != 4)
 | 
			
		||||
	    Primitive_Error ("invalid rectangle: ~s", rect);
 | 
			
		||||
	p[i].x = Get_Integer (Car (rect)); rect = Cdr (rect);
 | 
			
		||||
	p[i].y = Get_Integer (Car (rect)); rect = Cdr (rect);
 | 
			
		||||
	p[i].width = Get_Integer (Car (rect)); rect = Cdr (rect);
 | 
			
		||||
	p[i].height = Get_Integer (Car (rect));
 | 
			
		||||
    }
 | 
			
		||||
    XSetClipRectangles (GCONTEXT(gc)->dpy, GCONTEXT(gc)->gc, Get_Integer (x),
 | 
			
		||||
	Get_Integer (y), p, n, Symbols_To_Bits (ord, 0, Ordering_Syms));
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Set_Gcontext_Dashlist (gc, off, v) Object gc, off, v; {
 | 
			
		||||
    register char *p;
 | 
			
		||||
    register i, n, d;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_Type (gc, T_Gc);
 | 
			
		||||
    Check_Type (v, T_Vector);
 | 
			
		||||
    n = VECTOR(v)->size;
 | 
			
		||||
    Alloca (p, char*, n);
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	d = Get_Integer (VECTOR(v)->data[i]);
 | 
			
		||||
	if (d < 0 || d > 255)
 | 
			
		||||
	    Range_Error (VECTOR(v)->data[i]);
 | 
			
		||||
	p[i] = d;
 | 
			
		||||
    }
 | 
			
		||||
    XSetDashes (GCONTEXT(gc)->dpy, GCONTEXT(gc)->gc, Get_Integer (off), p, n);
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define ValidGCValuesBits \
 | 
			
		||||
    (GCFunction | GCPlaneMask | GCForeground | GCBackground | GCLineWidth |\
 | 
			
		||||
    GCLineStyle | GCCapStyle | GCJoinStyle | GCFillStyle | GCFillRule |\
 | 
			
		||||
    GCTile | GCStipple | GCTileStipXOrigin | GCTileStipYOrigin | GCFont |\
 | 
			
		||||
    GCSubwindowMode | GCGraphicsExposures | GCClipXOrigin | GCClipYOrigin |\
 | 
			
		||||
    GCDashOffset | GCArcMode)
 | 
			
		||||
 | 
			
		||||
static Object P_Get_Gc_Values (gc) Object gc; {
 | 
			
		||||
    unsigned long mask = ValidGCValuesBits;
 | 
			
		||||
 | 
			
		||||
    Check_Type (gc, T_Gc);
 | 
			
		||||
    if (!XGetGCValues (GCONTEXT(gc)->dpy, GCONTEXT(gc)->gc, mask, &GCV))
 | 
			
		||||
	Primitive_Error ("cannot get gcontext values");
 | 
			
		||||
    return Record_To_Vector (GC_Rec, GC_Size, Sym_Gc, GCONTEXT(gc)->dpy,
 | 
			
		||||
	mask);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_gcontext () {
 | 
			
		||||
    Define_Symbol (&Sym_Gc, "gcontext");
 | 
			
		||||
    Generic_Define (Gc, "gcontext", "gcontext?");
 | 
			
		||||
    Define_Primitive (P_Gc_Display,      "gcontext-display",    1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Create_Gc,       "xlib-create-gcontext",2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Copy_Gc,         "copy-gcontext",       2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Change_Gc,       "xlib-change-gcontext",2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Free_Gc,         "free-gcontext",       1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Query_Best_Size, "query-best-size",     4, 4, EVAL);
 | 
			
		||||
    Define_Primitive (P_Set_Gcontext_Clip_Rectangles,
 | 
			
		||||
	"set-gcontext-clip-rectangles!",                        5, 5, EVAL);
 | 
			
		||||
    Define_Primitive (P_Set_Gcontext_Dashlist,
 | 
			
		||||
	"set-gcontext-dashlist!",                               3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Get_Gc_Values,
 | 
			
		||||
			"xlib-get-gcontext-values",             1, 1, EVAL);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,138 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
static Object Sym_Any;
 | 
			
		||||
 | 
			
		||||
Time Get_Time (time) Object time; {
 | 
			
		||||
    if (EQ(time, Sym_Now))
 | 
			
		||||
	return CurrentTime;
 | 
			
		||||
    return (Time)Get_Long (time);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Get_Mode (m) Object m; {
 | 
			
		||||
    Check_Type (m, T_Boolean);
 | 
			
		||||
    return EQ(m, True) ? GrabModeSync : GrabModeAsync;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Grab_Pointer (win, ownerp, events, psyncp, ksyncp, confine_to,
 | 
			
		||||
	cursor, time) Object win, ownerp, events, psyncp, ksyncp, confine_to,
 | 
			
		||||
	cursor, time; {
 | 
			
		||||
    Check_Type (win, T_Window);
 | 
			
		||||
    Check_Type (ownerp, T_Boolean);
 | 
			
		||||
    return Bits_To_Symbols ((unsigned long)XGrabPointer (WINDOW(win)->dpy,
 | 
			
		||||
	    WINDOW(win)->win,
 | 
			
		||||
	    EQ(ownerp, True), Symbols_To_Bits (events, 1, Event_Syms),
 | 
			
		||||
	    Get_Mode (psyncp), Get_Mode (ksyncp),
 | 
			
		||||
	    Get_Window (confine_to), Get_Cursor (cursor), Get_Time (time)),
 | 
			
		||||
	0, Grabstatus_Syms);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Ungrab_Pointer (d, time) Object d, time; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    XUngrabPointer (DISPLAY(d)->dpy, Get_Time (time));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Grab_Button (win, button, mods, ownerp, events, psyncp, ksyncp,
 | 
			
		||||
	confine_to, cursor) Object win, button, mods, ownerp, events,
 | 
			
		||||
	psyncp, ksyncp, confine_to, cursor; {
 | 
			
		||||
    Check_Type (win, T_Window);
 | 
			
		||||
    Check_Type (ownerp, T_Boolean);
 | 
			
		||||
    XGrabButton (WINDOW(win)->dpy, Symbols_To_Bits (button, 0, Button_Syms),
 | 
			
		||||
	Symbols_To_Bits (mods, 1, State_Syms), WINDOW(win)->win,
 | 
			
		||||
	EQ(ownerp, True), Symbols_To_Bits (events, 1, Event_Syms),
 | 
			
		||||
	Get_Mode (psyncp), Get_Mode (ksyncp),
 | 
			
		||||
	Get_Window (confine_to), Get_Cursor (cursor));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Ungrab_Button (win, button, mods) Object win, button, mods; {
 | 
			
		||||
    Check_Type (win, T_Window);
 | 
			
		||||
    XUngrabButton (WINDOW(win)->dpy, Symbols_To_Bits (button, 0, Button_Syms),
 | 
			
		||||
	Symbols_To_Bits (mods, 1, State_Syms), WINDOW(win)->win);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Change_Active_Pointer_Grab (d, events, cursor, time)
 | 
			
		||||
	Object d, events, cursor, time; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    XChangeActivePointerGrab (DISPLAY(d)->dpy, Symbols_To_Bits (events, 1,
 | 
			
		||||
	Event_Syms), Get_Cursor (cursor), Get_Time (time));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Grab_Keyboard (win, ownerp, psyncp, ksyncp, time) Object win,
 | 
			
		||||
	ownerp, psyncp, ksyncp, time; {
 | 
			
		||||
    Check_Type (win, T_Window);
 | 
			
		||||
    Check_Type (ownerp, T_Boolean);
 | 
			
		||||
    return Bits_To_Symbols ((unsigned long)XGrabKeyboard (WINDOW(win)->dpy,
 | 
			
		||||
	    WINDOW(win)->win, EQ(ownerp, True), Get_Mode (psyncp),
 | 
			
		||||
	    Get_Mode (ksyncp), Get_Time (time)),
 | 
			
		||||
	0, Grabstatus_Syms);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Ungrab_Keyboard (d, time) Object d, time; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    XUngrabKeyboard (DISPLAY(d)->dpy, Get_Time (time));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Grab_Key (win, key, mods, ownerp, psyncp, ksyncp) Object win,
 | 
			
		||||
	key, mods, ownerp, psyncp, ksyncp; {
 | 
			
		||||
    int keycode = AnyKey;
 | 
			
		||||
 | 
			
		||||
    Check_Type (win, T_Window);
 | 
			
		||||
    if (!EQ(key, Sym_Any))
 | 
			
		||||
	keycode = Get_Integer (key);
 | 
			
		||||
    Check_Type (ownerp, T_Boolean);
 | 
			
		||||
    XGrabKey (WINDOW(win)->dpy, keycode, Symbols_To_Bits (mods, 1, State_Syms),
 | 
			
		||||
	WINDOW(win)->win, EQ(ownerp, True), Get_Mode (psyncp),
 | 
			
		||||
	Get_Mode (ksyncp));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Ungrab_Key (win, key, mods) Object win, key, mods; {
 | 
			
		||||
    int keycode = AnyKey;
 | 
			
		||||
 | 
			
		||||
    Check_Type (win, T_Window);
 | 
			
		||||
    if (!EQ(key, Sym_Any))
 | 
			
		||||
	keycode = Get_Integer (key);
 | 
			
		||||
    XUngrabKey (WINDOW(win)->dpy, keycode,
 | 
			
		||||
	Symbols_To_Bits (mods, 1, State_Syms), WINDOW(win)->win);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Allow_Events (d, mode, time) Object d, mode, time; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    XAllowEvents (DISPLAY(d)->dpy, Symbols_To_Bits (mode, 0, 
 | 
			
		||||
	Allow_Events_Syms), Get_Time (time));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Grab_Server (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    XGrabServer (DISPLAY(d)->dpy);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Ungrab_Server (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    XUngrabServer (DISPLAY(d)->dpy);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_grab () {
 | 
			
		||||
    Define_Primitive (P_Grab_Pointer,    "grab-pointer",    8, 8, EVAL);
 | 
			
		||||
    Define_Primitive (P_Ungrab_Pointer,  "ungrab-pointer",  2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Grab_Button,     "grab-button",     9, 9, EVAL);
 | 
			
		||||
    Define_Primitive (P_Ungrab_Button,   "ungrab-button",   3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Change_Active_Pointer_Grab,
 | 
			
		||||
			     "change-active-pointer-grab",  4, 4, EVAL);
 | 
			
		||||
    Define_Primitive (P_Grab_Keyboard,   "grab-keyboard",   5, 5, EVAL);
 | 
			
		||||
    Define_Primitive (P_Ungrab_Keyboard, "ungrab-keyboard", 2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Grab_Key,        "grab-key",        6, 6, EVAL);
 | 
			
		||||
    Define_Primitive (P_Ungrab_Key,      "ungrab-key",      3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Allow_Events,    "allow-events",    3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Grab_Server,     "grab-server",     1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Ungrab_Server,   "ungrab-server",   1, 1, EVAL);
 | 
			
		||||
    Define_Symbol (&Sym_Any, "any");
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,267 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
extern XDrawPoints(), XDrawLines(), XDrawRectangle(), XFillRectangle();
 | 
			
		||||
extern XDrawRectangles(), XFillRectangles(), XDrawArc(), XFillArc();
 | 
			
		||||
extern XDrawArcs(), XFillArcs(), XFillPolygon();
 | 
			
		||||
 | 
			
		||||
static Object P_Clear_Area (win, x, y, w, h, e) Object win, x, y, w, h, e; {
 | 
			
		||||
    Check_Type (win, T_Window);
 | 
			
		||||
    Check_Type (e, T_Boolean);
 | 
			
		||||
    XClearArea (WINDOW(win)->dpy, WINDOW(win)->win, Get_Integer (x),
 | 
			
		||||
	Get_Integer (y), Get_Integer (w), Get_Integer (h), EQ(e, True));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Copy_Area (src, gc, sx, sy, w, h, dst, dx, dy) Object src, gc,
 | 
			
		||||
	sx, sy, w, h, dst, dx, dy; {
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    Drawable ddst = Get_Drawable (dst, &dpy), dsrc = Get_Drawable (src, &dpy);
 | 
			
		||||
 | 
			
		||||
    Check_Type (gc, T_Gc);
 | 
			
		||||
    XCopyArea (dpy, dsrc, ddst, GCONTEXT(gc)->gc, Get_Integer (sx),
 | 
			
		||||
	Get_Integer (sy), Get_Integer (w), Get_Integer (h),
 | 
			
		||||
	Get_Integer (dx), Get_Integer (dy));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Copy_Plane (src, gc, plane, sx, sy, w, h, dst, dx, dy)
 | 
			
		||||
	Object src, gc, plane, sx, sy, w, h, dst, dx, dy; {
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    Drawable ddst = Get_Drawable (dst, &dpy), dsrc = Get_Drawable (src, &dpy);
 | 
			
		||||
    register unsigned long p;
 | 
			
		||||
 | 
			
		||||
    Check_Type (gc, T_Gc);
 | 
			
		||||
    p = (unsigned long)Get_Long (plane);
 | 
			
		||||
    if (p & (p-1))
 | 
			
		||||
	Primitive_Error ("invalid plane: ~s", plane);
 | 
			
		||||
    XCopyPlane (dpy, dsrc, ddst, GCONTEXT(gc)->gc, Get_Integer (sx),
 | 
			
		||||
	Get_Integer (sy), Get_Integer (w), Get_Integer (h),
 | 
			
		||||
	Get_Integer (dx), Get_Integer (dy), p);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Draw_Point (d, gc, x, y) Object d, gc, x, y; {
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    Drawable dr = Get_Drawable (d, &dpy);
 | 
			
		||||
 | 
			
		||||
    Check_Type (gc, T_Gc);
 | 
			
		||||
    XDrawPoint (dpy, dr, GCONTEXT(gc)->gc, Get_Integer (x), Get_Integer (y));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object Internal_Draw_Points (d, gc, v, relative, func, shape)
 | 
			
		||||
	Object d, gc, v, relative, shape; int (*func)(); {
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    Drawable dr = Get_Drawable (d, &dpy);
 | 
			
		||||
    register XPoint *p;
 | 
			
		||||
    register i, n;
 | 
			
		||||
    int rel, sh;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_Type (gc, T_Gc);
 | 
			
		||||
    Check_Type (relative, T_Boolean);
 | 
			
		||||
    rel = EQ(relative, True) ? CoordModePrevious : CoordModeOrigin;
 | 
			
		||||
    if (func == XFillPolygon)
 | 
			
		||||
	sh = Symbols_To_Bits (shape, 0, Polyshape_Syms);
 | 
			
		||||
    n = VECTOR(v)->size;
 | 
			
		||||
    Alloca (p, XPoint*, n * sizeof (XPoint));
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	Object point;
 | 
			
		||||
	
 | 
			
		||||
	point = VECTOR(v)->data[i];
 | 
			
		||||
	Check_Type (point, T_Pair);
 | 
			
		||||
	p[i].x = Get_Integer (Car (point));
 | 
			
		||||
	p[i].y = Get_Integer (Cdr (point));
 | 
			
		||||
    }
 | 
			
		||||
    if (func == XFillPolygon)
 | 
			
		||||
	XFillPolygon (dpy, dr, GCONTEXT(gc)->gc, p, n, sh, rel);
 | 
			
		||||
    else
 | 
			
		||||
	(*func)(dpy, dr, GCONTEXT(gc)->gc, p, n, rel);
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Draw_Points (d, gc, v, relative) Object d, gc, v, relative; {
 | 
			
		||||
    return Internal_Draw_Points (d, gc, v, relative, XDrawPoints, Null);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Draw_Line (d, gc, x1, y1, x2, y2)
 | 
			
		||||
	Object d, gc, x1, y1, x2, y2; {
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    Drawable dr = Get_Drawable (d, &dpy);
 | 
			
		||||
 | 
			
		||||
    Check_Type (gc, T_Gc);
 | 
			
		||||
    XDrawLine (dpy, dr, GCONTEXT(gc)->gc, Get_Integer (x1), Get_Integer (y1),
 | 
			
		||||
	Get_Integer (x2), Get_Integer (y2));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Draw_Lines (d, gc, v, relative) Object d, gc, v, relative; {
 | 
			
		||||
    return Internal_Draw_Points (d, gc, v, relative, XDrawLines, Null);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Draw_Segments (d, gc, v) Object d, gc, v; {
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    Drawable dr = Get_Drawable (d, &dpy);
 | 
			
		||||
    register XSegment *p;
 | 
			
		||||
    register i, n;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_Type (gc, T_Gc);
 | 
			
		||||
    n = VECTOR(v)->size;
 | 
			
		||||
    Alloca (p, XSegment*, n * sizeof (XSegment));
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	Object seg;
 | 
			
		||||
	
 | 
			
		||||
	seg = VECTOR(v)->data[i];
 | 
			
		||||
	Check_Type (seg, T_Pair);
 | 
			
		||||
	if (Fast_Length (seg) != 4)
 | 
			
		||||
	    Primitive_Error ("invalid segment: ~s", seg);
 | 
			
		||||
	p[i].x1 = Get_Integer (Car (seg)); seg = Cdr (seg);
 | 
			
		||||
	p[i].y1 = Get_Integer (Car (seg)); seg = Cdr (seg);
 | 
			
		||||
	p[i].x2 = Get_Integer (Car (seg)); seg = Cdr (seg);
 | 
			
		||||
	p[i].y2 = Get_Integer (Car (seg));
 | 
			
		||||
    }
 | 
			
		||||
    XDrawSegments (dpy, dr, GCONTEXT(gc)->gc, p, n);
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object Internal_Draw_Rectangle (d, gc, x, y, w, h, func)
 | 
			
		||||
	Object d, gc, x, y, w, h; int (*func)(); {
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    Drawable dr = Get_Drawable (d, &dpy);
 | 
			
		||||
 | 
			
		||||
    Check_Type (gc, T_Gc);
 | 
			
		||||
    (*func)(dpy, dr, GCONTEXT(gc)->gc, Get_Integer (x),
 | 
			
		||||
	Get_Integer (y), Get_Integer (w), Get_Integer (h));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Draw_Rectangle (d, gc, x, y, w, h) Object d, gc, x, y, w, h; {
 | 
			
		||||
    return Internal_Draw_Rectangle (d, gc, x, y, w, h, XDrawRectangle);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Fill_Rectangle (d, gc, x, y, w, h) Object d, gc, x, y, w, h; {
 | 
			
		||||
    return Internal_Draw_Rectangle (d, gc, x, y, w, h, XFillRectangle);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object Internal_Draw_Rectangles (d, gc, v, func)
 | 
			
		||||
	Object d, gc, v; int (*func)(); {
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    Drawable dr = Get_Drawable (d, &dpy);
 | 
			
		||||
    register XRectangle *p;
 | 
			
		||||
    register i, n;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_Type (gc, T_Gc);
 | 
			
		||||
    n = VECTOR(v)->size;
 | 
			
		||||
    Alloca (p, XRectangle*, n * sizeof (XRectangle));
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	Object rect;
 | 
			
		||||
	
 | 
			
		||||
	rect = VECTOR(v)->data[i];
 | 
			
		||||
	Check_Type (rect, T_Pair);
 | 
			
		||||
	if (Fast_Length (rect) != 4)
 | 
			
		||||
	    Primitive_Error ("invalid rectangle: ~s", rect);
 | 
			
		||||
	p[i].x = Get_Integer (Car (rect)); rect = Cdr (rect);
 | 
			
		||||
	p[i].y = Get_Integer (Car (rect)); rect = Cdr (rect);
 | 
			
		||||
	p[i].width = Get_Integer (Car (rect)); rect = Cdr (rect);
 | 
			
		||||
	p[i].height = Get_Integer (Car (rect));
 | 
			
		||||
    }
 | 
			
		||||
    (*func)(dpy, dr, GCONTEXT(gc)->gc, p, n);
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Draw_Rectangles (d, gc, v) Object d, gc, v; {
 | 
			
		||||
    return Internal_Draw_Rectangles (d, gc, v, XDrawRectangles);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Fill_Rectangles (d, gc, v) Object d, gc, v; {
 | 
			
		||||
    return Internal_Draw_Rectangles (d, gc, v, XFillRectangles);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object Internal_Draw_Arc (d, gc, x, y, w, h, a1, a2, func)
 | 
			
		||||
	Object d, gc, x, y, w, h, a1, a2; int (*func)(); {
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    Drawable dr = Get_Drawable (d, &dpy);
 | 
			
		||||
 | 
			
		||||
    Check_Type (gc, T_Gc);
 | 
			
		||||
    (*func)(dpy, dr, GCONTEXT(gc)->gc, Get_Integer (x), Get_Integer (y),
 | 
			
		||||
	Get_Integer (w), Get_Integer (h), Get_Integer (a1), Get_Integer (a2));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Draw_Arc (d, gc, x, y, w, h, a1, a2)
 | 
			
		||||
	Object d, gc, x, y, w, h, a1, a2; {
 | 
			
		||||
    return Internal_Draw_Arc (d, gc, x, y, w, h, a1, a2, XDrawArc);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Fill_Arc (d, gc, x, y, w, h, a1, a2)
 | 
			
		||||
	Object d, gc, x, y, w, h, a1, a2; {
 | 
			
		||||
    return Internal_Draw_Arc (d, gc, x, y, w, h, a1, a2, XFillArc);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object Internal_Draw_Arcs (d, gc, v, func) Object d, gc, v;
 | 
			
		||||
	int (*func)(); {
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    Drawable dr = Get_Drawable (d, &dpy);
 | 
			
		||||
    register XArc *p;
 | 
			
		||||
    register i, n;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_Type (gc, T_Gc);
 | 
			
		||||
    n = VECTOR(v)->size;
 | 
			
		||||
    Alloca (p, XArc*, n * sizeof (XArc));
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	Object arc;
 | 
			
		||||
	
 | 
			
		||||
	arc = VECTOR(v)->data[i];
 | 
			
		||||
	Check_Type (arc, T_Pair);
 | 
			
		||||
	if (Fast_Length (arc) != 6)
 | 
			
		||||
	    Primitive_Error ("invalid arc: ~s", arc);
 | 
			
		||||
	p[i].x = Get_Integer (Car (arc)); arc = Cdr (arc);
 | 
			
		||||
	p[i].y = Get_Integer (Car (arc)); arc = Cdr (arc);
 | 
			
		||||
	p[i].width = Get_Integer (Car (arc)); arc = Cdr (arc);
 | 
			
		||||
	p[i].height = Get_Integer (Car (arc)); arc = Cdr (arc);
 | 
			
		||||
	p[i].angle1 = Get_Integer (Car (arc)); arc = Cdr (arc);
 | 
			
		||||
	p[i].angle2 = Get_Integer (Car (arc));
 | 
			
		||||
    }
 | 
			
		||||
    (*func)(dpy, dr, GCONTEXT(gc)->gc, p, n);
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Draw_Arcs (d, gc, v) Object d, gc, v; {
 | 
			
		||||
    return Internal_Draw_Arcs (d, gc, v, XDrawArcs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Fill_Arcs (d, gc, v) Object d, gc, v; {
 | 
			
		||||
    return Internal_Draw_Arcs (d, gc, v, XFillArcs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Fill_Polygon (d, gc, v, relative, shape)
 | 
			
		||||
	Object d, gc, v, relative, shape; {
 | 
			
		||||
    return Internal_Draw_Points (d, gc, v, relative, XFillPolygon, shape);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_graphics () {
 | 
			
		||||
    Define_Primitive (P_Clear_Area,        "clear-area",       6, 6, EVAL);
 | 
			
		||||
    Define_Primitive (P_Copy_Area,         "copy-area",        9, 9, EVAL);
 | 
			
		||||
    Define_Primitive (P_Copy_Plane,        "copy-plane",      10,10, EVAL);
 | 
			
		||||
    Define_Primitive (P_Draw_Point,        "draw-point",       4, 4, EVAL);
 | 
			
		||||
    Define_Primitive (P_Draw_Points,       "draw-points",      4, 4, EVAL);
 | 
			
		||||
    Define_Primitive (P_Draw_Line,         "draw-line",        6, 6, EVAL);
 | 
			
		||||
    Define_Primitive (P_Draw_Lines,        "draw-lines",       4, 4, EVAL);
 | 
			
		||||
    Define_Primitive (P_Draw_Segments,     "draw-segments",    3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Draw_Rectangle,    "draw-rectangle",   6, 6, EVAL);
 | 
			
		||||
    Define_Primitive (P_Fill_Rectangle,    "fill-rectangle",   6, 6, EVAL);
 | 
			
		||||
    Define_Primitive (P_Draw_Rectangles,   "draw-rectangles",  3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Fill_Rectangles,   "fill-rectangles",  3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Draw_Arc,          "draw-arc",         8, 8, EVAL);
 | 
			
		||||
    Define_Primitive (P_Fill_Arc,          "fill-arc",         8, 8, EVAL);
 | 
			
		||||
    Define_Primitive (P_Draw_Arcs,         "draw-arcs",        3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Fill_Arcs,         "fill-arcs",        3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Fill_Polygon,      "fill-polygon",     5, 5, EVAL);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,50 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
static Object P_Xlib_Release_4_Or_Laterp () {
 | 
			
		||||
    return True;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Xlib_Release_5_Or_Laterp () {
 | 
			
		||||
#ifdef XLIB_RELEASE_5_OR_LATER
 | 
			
		||||
    return True;
 | 
			
		||||
#else
 | 
			
		||||
    return False;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Xlib_Release_6_Or_Laterp () {
 | 
			
		||||
#ifdef XLIB_RELEASE_6_OR_LATER
 | 
			
		||||
    return True;
 | 
			
		||||
#else
 | 
			
		||||
    return False;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_init () {
 | 
			
		||||
    Define_Primitive (P_Xlib_Release_4_Or_Laterp,
 | 
			
		||||
			"xlib-release-4-or-later?",               0, 0, EVAL);
 | 
			
		||||
    Define_Primitive (P_Xlib_Release_5_Or_Laterp,
 | 
			
		||||
			"xlib-release-5-or-later?",               0, 0, EVAL);
 | 
			
		||||
    Define_Primitive (P_Xlib_Release_6_Or_Laterp,
 | 
			
		||||
			"xlib-release-6-or-later?",               0, 0, EVAL);
 | 
			
		||||
    P_Provide (Intern ("xlib.o"));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined(XLIB_RELEASE_5_OR_LATER) && (defined(sun) || defined(__sun__)) &&\
 | 
			
		||||
    defined(__svr4__)
 | 
			
		||||
/*
 | 
			
		||||
 * Stub interface to dynamic linker routines
 | 
			
		||||
 * that SunOS uses but didn't ship with 4.1.
 | 
			
		||||
 *
 | 
			
		||||
 * The C library routine wcstombs in SunOS 4.1 tries to dynamically
 | 
			
		||||
 * load some routines using the dlsym interface, described in dlsym(3x).
 | 
			
		||||
 * Unfortunately SunOS 4.1 does not include the necessary library, libdl.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
void *dlopen() { return 0; }
 | 
			
		||||
 | 
			
		||||
void *dlsym() { return 0; }
 | 
			
		||||
 | 
			
		||||
int dlclose() { return -1; }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,159 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
#ifdef XLIB_RELEASE_5_OR_LATER
 | 
			
		||||
 | 
			
		||||
/* I don't know if XDisplayKeycodes() was already there in X11R4.
 | 
			
		||||
 */
 | 
			
		||||
static Object P_Display_Min_Keycode (d) Object d; {
 | 
			
		||||
    int mink, maxk;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    XDisplayKeycodes(DISPLAY(d)->dpy, &mink, &maxk);
 | 
			
		||||
    return Make_Integer (mink);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Max_Keycode (d) Object d; {
 | 
			
		||||
    int mink, maxk;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    XDisplayKeycodes(DISPLAY(d)->dpy, &mink, &maxk);
 | 
			
		||||
    return Make_Integer (maxk);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
static Object P_Display_Min_Keycode (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Make_Integer (DISPLAY(d)->dpy->min_keycode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Display_Max_Keycode (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Make_Integer (DISPLAY(d)->dpy->max_keycode);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef XLIB_RELEASE_5_OR_LATER
 | 
			
		||||
 | 
			
		||||
/* I'm not sure if this works correctly in X11R4:
 | 
			
		||||
 */
 | 
			
		||||
static Object P_Display_Keysyms_Per_Keycode (d) Object d; {
 | 
			
		||||
    KeySym *ksyms;
 | 
			
		||||
    int mink, maxk, ksyms_per_kode;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    XDisplayKeycodes(DISPLAY(d)->dpy, &mink, &maxk);
 | 
			
		||||
    ksyms = XGetKeyboardMapping(DISPLAY(d)->dpy, (KeyCode)mink,
 | 
			
		||||
	maxk - mink + 1, &ksyms_per_kode);
 | 
			
		||||
    return Make_Integer (ksyms_per_kode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
static Object P_Display_Keysyms_Per_Keycode (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    /* Force initialization: */
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    (void)XKeycodeToKeysym (DISPLAY(d)->dpy, DISPLAY(d)->dpy->min_keycode, 0);
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    return Make_Integer (DISPLAY(d)->dpy->keysyms_per_keycode);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static Object P_String_To_Keysym (s) Object s; {
 | 
			
		||||
    KeySym k;
 | 
			
		||||
 | 
			
		||||
    k = XStringToKeysym (Get_Strsym (s));
 | 
			
		||||
    return k == NoSymbol ? False : Make_Unsigned_Long ((unsigned long)k);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Keysym_To_String (k) Object k; {
 | 
			
		||||
    register char *s;
 | 
			
		||||
 | 
			
		||||
    s = XKeysymToString ((KeySym)Get_Long (k));
 | 
			
		||||
    return s ? Make_String (s, strlen (s)) : False;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Keycode_To_Keysym (d, k, index) Object d, k, index; {
 | 
			
		||||
    Object ret;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    ret = Make_Unsigned_Long ((unsigned long)XKeycodeToKeysym (DISPLAY(d)->dpy,
 | 
			
		||||
	Get_Integer (k), Get_Integer (index)));
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Keysym_To_Keycode (d, k) Object d, k; {
 | 
			
		||||
    Object ret;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    ret = Make_Unsigned (XKeysymToKeycode (DISPLAY(d)->dpy,
 | 
			
		||||
	(KeySym)Get_Long (k)));
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Lookup_String (d, k, mask) Object d, k, mask; {
 | 
			
		||||
    XKeyEvent e;
 | 
			
		||||
    char buf[1024];
 | 
			
		||||
    register len;
 | 
			
		||||
    KeySym keysym_return;
 | 
			
		||||
    XComposeStatus status_return;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    e.display = DISPLAY(d)->dpy;
 | 
			
		||||
    e.keycode = Get_Integer (k);
 | 
			
		||||
    e.state = Symbols_To_Bits (mask, 1, State_Syms);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    len = XLookupString (&e, buf, 1024, &keysym_return, &status_return);
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    return Make_String (buf, len);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Rebind_Keysym (d, k, mods, str) Object d, k, mods, str; {
 | 
			
		||||
    KeySym *p;
 | 
			
		||||
    register i, n;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    Check_Type (str, T_String);
 | 
			
		||||
    Check_Type (mods, T_Vector);
 | 
			
		||||
    n = VECTOR(mods)->size;
 | 
			
		||||
    Alloca (p, KeySym*, n * sizeof (KeySym));
 | 
			
		||||
    for (i = 0; i < n; i++)
 | 
			
		||||
	p[i] = (KeySym)Get_Long (VECTOR(mods)->data[i]);
 | 
			
		||||
    XRebindKeysym (DISPLAY(d)->dpy, (KeySym)Get_Long (k), p, n, 
 | 
			
		||||
	(unsigned char *)STRING(str)->data, STRING(str)->size);
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Refresh_Keyboard_Mapping (w, event) Object w, event; {
 | 
			
		||||
    static XMappingEvent fake;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    fake.type = MappingNotify;
 | 
			
		||||
    fake.display = WINDOW(w)->dpy;
 | 
			
		||||
    fake.window = WINDOW(w)->win;
 | 
			
		||||
    fake.request = Symbols_To_Bits (event, 0, Mapping_Syms);
 | 
			
		||||
    XRefreshKeyboardMapping (&fake);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_key () {
 | 
			
		||||
    Define_Primitive (P_Display_Min_Keycode, "display-min-keycode",
 | 
			
		||||
							      1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Max_Keycode, "display-max-keycode",
 | 
			
		||||
							      1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Display_Keysyms_Per_Keycode,
 | 
			
		||||
			"display-keysyms-per-keycode",        1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_String_To_Keysym,  "string->keysym",  1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Keysym_To_String,  "keysym->string",  1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Keycode_To_Keysym, "keycode->keysym", 3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Keysym_To_Keycode, "keysym->keycode", 2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Lookup_String,     "lookup-string",   3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Rebind_Keysym,     "rebind-keysym",   4, 4, EVAL);
 | 
			
		||||
    Define_Primitive (P_Refresh_Keyboard_Mapping,
 | 
			
		||||
			"refresh-keyboard-mapping",           2, 2, EVAL);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,38 @@
 | 
			
		|||
#include <varargs.h>
 | 
			
		||||
 | 
			
		||||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
Object Sym_None;
 | 
			
		||||
 | 
			
		||||
int Match_X_Obj (x, v) Object x; va_list v; {
 | 
			
		||||
    register type = TYPE(x);
 | 
			
		||||
 | 
			
		||||
    if (type == T_Display) {
 | 
			
		||||
	return 1;
 | 
			
		||||
    } else if (type == T_Gc) {
 | 
			
		||||
	return va_arg (v, GC) == GCONTEXT(x)->gc;
 | 
			
		||||
    } else if (type == T_Pixel) {
 | 
			
		||||
	return va_arg (v, unsigned long) == PIXEL(x)->pix;
 | 
			
		||||
    } else if (type == T_Pixmap) {
 | 
			
		||||
	return va_arg (v, Pixmap) == PIXMAP(x)->pm;
 | 
			
		||||
    } else if (type == T_Window) {
 | 
			
		||||
	return va_arg (v, Window) == WINDOW(x)->win;
 | 
			
		||||
    } else if (type == T_Font) {
 | 
			
		||||
	return va_arg (v, Font) == FONT(x)->id;
 | 
			
		||||
    } else if (type == T_Colormap) {
 | 
			
		||||
	return va_arg (v, Colormap) == COLORMAP(x)->cm;
 | 
			
		||||
    } else if (type == T_Color) {
 | 
			
		||||
	return va_arg (v, unsigned int) == COLOR(x)->c.red
 | 
			
		||||
	    && va_arg (v, unsigned int) == COLOR(x)->c.green
 | 
			
		||||
	    && va_arg (v, unsigned int) == COLOR(x)->c.blue;
 | 
			
		||||
    } else if (type == T_Cursor) {
 | 
			
		||||
	return va_arg (v, Cursor) == CURSOR(x)->cursor;
 | 
			
		||||
    } else if (type == T_Atom) {
 | 
			
		||||
	return va_arg (v, Atom) == ATOM(x)->atom;
 | 
			
		||||
    } else Panic ("Match_X_Obj");
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_objects () {
 | 
			
		||||
    Define_Symbol (&Sym_None, "none");
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,48 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
Generic_Predicate (Pixel)
 | 
			
		||||
 | 
			
		||||
Generic_Simple_Equal (Pixel, PIXEL, pix)
 | 
			
		||||
 | 
			
		||||
Generic_Print (Pixel, "#[pixel 0x%lx]", PIXEL(x)->pix)
 | 
			
		||||
 | 
			
		||||
Object Make_Pixel (val) unsigned long val; {
 | 
			
		||||
    Object pix;
 | 
			
		||||
 | 
			
		||||
    pix = Find_Object (T_Pixel, (GENERIC)0, Match_X_Obj, val);
 | 
			
		||||
    if (Nullp (pix)) {
 | 
			
		||||
	pix = Alloc_Object (sizeof (struct S_Pixel), T_Pixel, 0);
 | 
			
		||||
	PIXEL(pix)->tag = Null;
 | 
			
		||||
	PIXEL(pix)->pix = val;
 | 
			
		||||
	Register_Object (pix, (GENERIC)0, (PFO)0, 0);
 | 
			
		||||
    }
 | 
			
		||||
    return pix;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned long Get_Pixel (p) Object p; {
 | 
			
		||||
    Check_Type (p, T_Pixel);
 | 
			
		||||
    return PIXEL(p)->pix;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Pixel_Value (p) Object p; {
 | 
			
		||||
    return Make_Unsigned_Long (Get_Pixel (p));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Black_Pixel (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Make_Pixel (BlackPixel (DISPLAY(d)->dpy,
 | 
			
		||||
	DefaultScreen (DISPLAY(d)->dpy)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_White_Pixel (d) Object d; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Make_Pixel (WhitePixel (DISPLAY(d)->dpy, 
 | 
			
		||||
	DefaultScreen (DISPLAY(d)->dpy)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_pixel () {
 | 
			
		||||
    Generic_Define (Pixel, "pixel", "pixel?");
 | 
			
		||||
    Define_Primitive (P_Pixel_Value,   "pixel-value",    1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Black_Pixel,   "black-pixel",    1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_White_Pixel,   "white-pixel",    1, 1, EVAL);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,148 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
Generic_Predicate (Pixmap)
 | 
			
		||||
 | 
			
		||||
Generic_Equal_Dpy (Pixmap, PIXMAP, pm)
 | 
			
		||||
 | 
			
		||||
Generic_Print (Pixmap, "#[pixmap %lu]", PIXMAP(x)->pm)
 | 
			
		||||
 | 
			
		||||
Generic_Get_Display (Pixmap, PIXMAP)
 | 
			
		||||
 | 
			
		||||
static Object Internal_Make_Pixmap (finalize, dpy, pix)
 | 
			
		||||
	Display *dpy; Pixmap pix; {
 | 
			
		||||
    Object pm;
 | 
			
		||||
 | 
			
		||||
    if (pix == None)
 | 
			
		||||
	return Sym_None;
 | 
			
		||||
    pm = Find_Object (T_Pixmap, (GENERIC)dpy, Match_X_Obj, pix);
 | 
			
		||||
    if (Nullp (pm)) {
 | 
			
		||||
	pm = Alloc_Object (sizeof (struct S_Pixmap), T_Pixmap, 0);
 | 
			
		||||
	PIXMAP(pm)->tag = Null;
 | 
			
		||||
	PIXMAP(pm)->pm = pix;
 | 
			
		||||
	PIXMAP(pm)->dpy = dpy;
 | 
			
		||||
	PIXMAP(pm)->free = 0;
 | 
			
		||||
	Register_Object (pm, (GENERIC)dpy,
 | 
			
		||||
	    finalize ? P_Free_Pixmap : (PFO)0, 0);
 | 
			
		||||
    }
 | 
			
		||||
    return pm;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Backwards compatibility: */
 | 
			
		||||
Object Make_Pixmap (dpy, pix) Display *dpy; Pixmap pix; {
 | 
			
		||||
    return Internal_Make_Pixmap (1, dpy, pix);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Object Make_Pixmap_Foreign (dpy, pix) Display *dpy; Pixmap pix; {
 | 
			
		||||
    return Internal_Make_Pixmap (0, dpy, pix);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Pixmap Get_Pixmap (p) Object p; {
 | 
			
		||||
    Check_Type (p, T_Pixmap);
 | 
			
		||||
    return PIXMAP(p)->pm;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Object P_Free_Pixmap (p) Object p; {
 | 
			
		||||
    Check_Type (p, T_Pixmap);
 | 
			
		||||
    if (!PIXMAP(p)->free)
 | 
			
		||||
	XFreePixmap (PIXMAP(p)->dpy, PIXMAP(p)->pm);
 | 
			
		||||
    Deregister_Object (p);
 | 
			
		||||
    PIXMAP(p)->free = 1;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Create_Pixmap (d, w, h, depth) Object d, w, h, depth; {
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    Drawable dr = Get_Drawable (d, &dpy);
 | 
			
		||||
 | 
			
		||||
    return Make_Pixmap (dpy, XCreatePixmap (dpy, dr, Get_Integer (w),
 | 
			
		||||
	Get_Integer (h), Get_Integer (depth)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Create_Bitmap_From_Data (win, data, pw, ph)
 | 
			
		||||
	Object win, data, pw, ph; {
 | 
			
		||||
    register w, h;
 | 
			
		||||
 | 
			
		||||
    Check_Type (win, T_Window);
 | 
			
		||||
    Check_Type (data, T_String);
 | 
			
		||||
    w = Get_Integer (pw);
 | 
			
		||||
    h = Get_Integer (ph);
 | 
			
		||||
    if (w * h > 8 * STRING(data)->size)
 | 
			
		||||
	Primitive_Error ("bitmap too small");
 | 
			
		||||
    return Make_Pixmap (WINDOW(win)->dpy,
 | 
			
		||||
	XCreateBitmapFromData (WINDOW(win)->dpy, WINDOW(win)->win,
 | 
			
		||||
	    STRING(data)->data, w, h));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Create_Pixmap_From_Bitmap_Data (win, data, pw, ph, fg, bg,
 | 
			
		||||
	depth) Object win, data, pw, ph, fg, bg, depth; {
 | 
			
		||||
    register w, h;
 | 
			
		||||
 | 
			
		||||
    Check_Type (win, T_Window);
 | 
			
		||||
    Check_Type (data, T_String);
 | 
			
		||||
    w = Get_Integer (pw);
 | 
			
		||||
    h = Get_Integer (ph);
 | 
			
		||||
    if (w * h > 8 * STRING(data)->size)
 | 
			
		||||
	Primitive_Error ("bitmap too small");
 | 
			
		||||
    return Make_Pixmap (WINDOW(win)->dpy,
 | 
			
		||||
	XCreatePixmapFromBitmapData (WINDOW(win)->dpy, WINDOW(win)->win,
 | 
			
		||||
	    STRING(data)->data, w, h, Get_Pixel (fg), Get_Pixel (bg),
 | 
			
		||||
		Get_Integer (depth)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Read_Bitmap_File (d, fn) Object d, fn; {
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    Drawable dr = Get_Drawable (d, &dpy);
 | 
			
		||||
    unsigned width, height;
 | 
			
		||||
    int r, xhot, yhot;
 | 
			
		||||
    Pixmap bitmap;
 | 
			
		||||
    Object t, ret, x;
 | 
			
		||||
    GC_Node2;
 | 
			
		||||
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    r = XReadBitmapFile (dpy, dr, Get_Strsym (fn), &width, &height, &bitmap,
 | 
			
		||||
	&xhot, &yhot);
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    if (r != BitmapSuccess)
 | 
			
		||||
	return Bits_To_Symbols ((unsigned long)r, 0, Bitmapstatus_Syms);
 | 
			
		||||
    t = ret = P_Make_List (Make_Integer (5), Null);
 | 
			
		||||
    GC_Link2 (ret, t);
 | 
			
		||||
    x = Make_Pixmap (dpy, bitmap);
 | 
			
		||||
    Car (t) = x; t = Cdr (t);
 | 
			
		||||
    Car (t) = Make_Integer (width); t = Cdr (t);
 | 
			
		||||
    Car (t) = Make_Integer (height); t = Cdr (t);
 | 
			
		||||
    Car (t) = Make_Integer (xhot); t = Cdr (t);
 | 
			
		||||
    Car (t) = Make_Integer (yhot);
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Write_Bitmap_File (argc, argv) Object *argv; {
 | 
			
		||||
    Pixmap pm;
 | 
			
		||||
    int ret, xhot = -1, yhot = -1;
 | 
			
		||||
 | 
			
		||||
    pm = Get_Pixmap (argv[1]);
 | 
			
		||||
    if (argc == 5)
 | 
			
		||||
	Primitive_Error ("both x-hot and y-hot must be specified");
 | 
			
		||||
    if (argc == 6) {
 | 
			
		||||
	xhot = Get_Integer (argv[4]);
 | 
			
		||||
	yhot = Get_Integer (argv[5]);
 | 
			
		||||
    }
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    ret = XWriteBitmapFile (PIXMAP(argv[1])->dpy, Get_Strsym (argv[0]), pm,
 | 
			
		||||
	Get_Integer (argv[2]), Get_Integer (argv[3]), xhot, yhot);
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    return Bits_To_Symbols ((unsigned long)ret, 0, Bitmapstatus_Syms);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_pixmap () {
 | 
			
		||||
    Generic_Define (Pixmap, "pixmap", "pixmap?");
 | 
			
		||||
    Define_Primitive (P_Pixmap_Display,    "pixmap-display",    1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Free_Pixmap,       "free-pixmap",       1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Create_Pixmap,     "create-pixmap",     4, 4, EVAL);
 | 
			
		||||
    Define_Primitive (P_Create_Bitmap_From_Data,
 | 
			
		||||
			"create-bitmap-from-data",              4, 4, EVAL);
 | 
			
		||||
    Define_Primitive (P_Create_Pixmap_From_Bitmap_Data,
 | 
			
		||||
			"create-pixmap-from-bitmap-data",       7, 7, EVAL);
 | 
			
		||||
    Define_Primitive (P_Read_Bitmap_File,  "read-bitmap-file",  2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Write_Bitmap_File, "write-bitmap-file", 4, 6, VARARGS);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,250 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
Object Sym_Now;
 | 
			
		||||
 | 
			
		||||
Generic_Predicate (Atom)
 | 
			
		||||
 | 
			
		||||
Generic_Simple_Equal (Atom, ATOM, atom)
 | 
			
		||||
 | 
			
		||||
Generic_Print (Atom, "#[atom %lu]", ATOM(x)->atom)
 | 
			
		||||
 | 
			
		||||
Object Make_Atom (a) Atom a; {
 | 
			
		||||
    Object atom;
 | 
			
		||||
 | 
			
		||||
    if (a == None)
 | 
			
		||||
	return Sym_None;
 | 
			
		||||
    atom = Find_Object (T_Atom, (GENERIC)0, Match_X_Obj, a);
 | 
			
		||||
    if (Nullp (atom)) {
 | 
			
		||||
	atom = Alloc_Object (sizeof (struct S_Atom), T_Atom, 0);
 | 
			
		||||
	ATOM(atom)->tag = Null;
 | 
			
		||||
	ATOM(atom)->atom = a;
 | 
			
		||||
	Register_Object (atom, (GENERIC)0, (PFO)0, 0);
 | 
			
		||||
    }
 | 
			
		||||
    return atom;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Should be used with care */
 | 
			
		||||
static Object P_Make_Atom (n) Object n; {
 | 
			
		||||
    return Make_Atom ((Atom)Get_Long (n));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Intern_Atom (d, name) Object d, name; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Make_Atom (XInternAtom (DISPLAY(d)->dpy, Get_Strsym (name), 0));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Find_Atom (d, name) Object d, name; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    return Make_Atom (XInternAtom (DISPLAY(d)->dpy, Get_Strsym (name), 1));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Atom_Name (d, a) Object d, a; {
 | 
			
		||||
    register char *s;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    Check_Type (a, T_Atom);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    s = XGetAtomName (DISPLAY(d)->dpy, ATOM(a)->atom);
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    return Make_String (s, strlen (s));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_List_Properties (w) Object w; {
 | 
			
		||||
    register i;
 | 
			
		||||
    int n;
 | 
			
		||||
    register Atom *ap;
 | 
			
		||||
    Object v;
 | 
			
		||||
    GC_Node;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    ap = XListProperties (WINDOW(w)->dpy, WINDOW(w)->win, &n);
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    v = Make_Vector (n, Null);
 | 
			
		||||
    GC_Link (v);
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	Object x;
 | 
			
		||||
	
 | 
			
		||||
	x = Make_Atom (ap[i]);
 | 
			
		||||
	VECTOR(v)->data[i] = x;
 | 
			
		||||
    }
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    XFree ((char *)ap);
 | 
			
		||||
    return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Get_Property (w, prop, type, start, len, deletep)
 | 
			
		||||
	Object w, prop, type, start, len, deletep; {
 | 
			
		||||
    Atom req_type = AnyPropertyType, actual_type;
 | 
			
		||||
    int format;
 | 
			
		||||
    unsigned long nitems, bytes_left;
 | 
			
		||||
    unsigned char *data;
 | 
			
		||||
    Object ret, t, x;
 | 
			
		||||
    register i;
 | 
			
		||||
    GC_Node2;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    Check_Type (prop, T_Atom);
 | 
			
		||||
    if (!EQ(type, False)) {
 | 
			
		||||
	Check_Type (type, T_Atom);
 | 
			
		||||
	req_type = ATOM(type)->atom;
 | 
			
		||||
    }
 | 
			
		||||
    Check_Type (deletep, T_Boolean);
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    if (XGetWindowProperty (WINDOW(w)->dpy, WINDOW(w)->win, ATOM(prop)->atom,
 | 
			
		||||
	    Get_Long (start), Get_Long (len),
 | 
			
		||||
	    EQ(deletep, True), req_type, &actual_type, &format,
 | 
			
		||||
	    &nitems, &bytes_left, &data) != Success)
 | 
			
		||||
	Primitive_Error ("cannot get property");
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    ret = t = P_Make_List (Make_Integer (4), Null);
 | 
			
		||||
    GC_Link2 (ret, t);
 | 
			
		||||
    x = Make_Atom (actual_type);
 | 
			
		||||
    Car (t) = x; t = Cdr (t);
 | 
			
		||||
    x = Make_Integer (format);
 | 
			
		||||
    Car (t) = x; t = Cdr (t);
 | 
			
		||||
    if (nitems) {
 | 
			
		||||
	if (format == 8) {
 | 
			
		||||
	    Object s;
 | 
			
		||||
	    x = Make_String ((char *)0, (int)nitems);
 | 
			
		||||
	    s = Car (t) = x;
 | 
			
		||||
	    bcopy ((char *)data, STRING(s)->data, (int)nitems);
 | 
			
		||||
	} else {
 | 
			
		||||
	    Object v;
 | 
			
		||||
	    GC_Node;
 | 
			
		||||
	    /* Assumes short is 16 bits and int is 32 bits.
 | 
			
		||||
	     */
 | 
			
		||||
	    v = Make_Vector ((int)nitems, Null);
 | 
			
		||||
	    GC_Link (v);
 | 
			
		||||
	    for (i = 0; i < nitems; i++) {
 | 
			
		||||
		x = Make_Unsigned (format == 16 ?
 | 
			
		||||
		    *((short *)data + i) : *((int *)data + i));
 | 
			
		||||
		VECTOR(v)->data[i] = x;
 | 
			
		||||
	    }
 | 
			
		||||
	    Car (t) = v;
 | 
			
		||||
	    GC_Unlink;
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    t = Cdr (t); 
 | 
			
		||||
    x = Make_Unsigned_Long (bytes_left);
 | 
			
		||||
    Car (t) = x;
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Change_Property (w, prop, type, format, mode, data)
 | 
			
		||||
	Object w, prop, type, format, mode, data; {
 | 
			
		||||
    register i, m, x, nitems, f;
 | 
			
		||||
    char *buf;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    Check_Type (prop, T_Atom);
 | 
			
		||||
    Check_Type (type, T_Atom);
 | 
			
		||||
    m = Symbols_To_Bits (mode, 0, Propmode_Syms);
 | 
			
		||||
    switch (f = Get_Integer (format)) {
 | 
			
		||||
    case 8:
 | 
			
		||||
	Check_Type (data, T_String);
 | 
			
		||||
	buf = STRING(data)->data;
 | 
			
		||||
	nitems = STRING(data)->size;
 | 
			
		||||
	break;
 | 
			
		||||
    case 16: case 32:
 | 
			
		||||
	Check_Type (data, T_Vector);
 | 
			
		||||
	nitems = VECTOR(data)->size;
 | 
			
		||||
	Alloca (buf, char*, nitems * (f / sizeof (char)));
 | 
			
		||||
	for (i = 0; i < nitems; i++) {
 | 
			
		||||
	    x = Get_Integer (VECTOR(data)->data[i]);
 | 
			
		||||
	    if (f == 16) {
 | 
			
		||||
		if (x > 65535)
 | 
			
		||||
		    Primitive_Error ("format mismatch");
 | 
			
		||||
		*((short *)buf + i) = x;     /* Assumes short is 16 bits */
 | 
			
		||||
	    } else *((int *)buf + i) = x;    /*   and int is 32 bits. */
 | 
			
		||||
	}
 | 
			
		||||
	break;
 | 
			
		||||
    default:
 | 
			
		||||
	Primitive_Error ("invalid format: ~s", format);
 | 
			
		||||
    }
 | 
			
		||||
    XChangeProperty (WINDOW(w)->dpy, WINDOW(w)->win, ATOM(prop)->atom,
 | 
			
		||||
	ATOM(type)->atom, f, m, (unsigned char *)buf, nitems);
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Delete_Property (w, prop) Object w, prop; {
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    Check_Type (prop, T_Atom);
 | 
			
		||||
    XDeleteProperty (WINDOW(w)->dpy, WINDOW(w)->win, ATOM(prop)->atom);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Rotate_Properties (w, v, delta) Object w, v, delta; {
 | 
			
		||||
    Atom *p;
 | 
			
		||||
    register i, n;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    Check_Type (v, T_Vector);
 | 
			
		||||
    n = VECTOR(v)->size;
 | 
			
		||||
    Alloca (p, Atom*, n * sizeof (Atom));
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	Object a;
 | 
			
		||||
	
 | 
			
		||||
	a = VECTOR(v)->data[i];
 | 
			
		||||
	Check_Type (a, T_Atom);
 | 
			
		||||
	p[i] = ATOM(a)->atom;
 | 
			
		||||
    }
 | 
			
		||||
    XRotateWindowProperties (WINDOW(w)->dpy, WINDOW(w)->win, p, n,
 | 
			
		||||
	Get_Integer (delta));
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Set_Selection_Owner (d, s, owner, time) Object d, s, owner,
 | 
			
		||||
	time; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    Check_Type (s, T_Atom);
 | 
			
		||||
    XSetSelectionOwner (DISPLAY(d)->dpy, ATOM(s)->atom, Get_Window (owner),
 | 
			
		||||
	Get_Time (time));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Selection_Owner (d, s) Object d, s; {
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    Check_Type (s, T_Atom);
 | 
			
		||||
    return Make_Window (0, DISPLAY(d)->dpy,
 | 
			
		||||
	XGetSelectionOwner (DISPLAY(d)->dpy, ATOM(s)->atom));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Convert_Selection (s, target, prop, w, time)
 | 
			
		||||
	Object s, target, prop, w, time; {
 | 
			
		||||
    Atom p = None;
 | 
			
		||||
 | 
			
		||||
    Check_Type (s, T_Atom);
 | 
			
		||||
    Check_Type (target, T_Atom);
 | 
			
		||||
    if (!EQ(prop, Sym_None)) {
 | 
			
		||||
	Check_Type (prop, T_Atom);
 | 
			
		||||
	p = ATOM(prop)->atom;
 | 
			
		||||
    }
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    XConvertSelection (WINDOW(w)->dpy, ATOM(s)->atom, ATOM(target)->atom,
 | 
			
		||||
	p, WINDOW(w)->win, Get_Time (time));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_property () {
 | 
			
		||||
    Define_Symbol (&Sym_Now, "now");
 | 
			
		||||
    Generic_Define (Atom, "atom", "atom?");
 | 
			
		||||
    Define_Primitive (P_Make_Atom,         "make-atom",          1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Intern_Atom,       "intern-atom",        2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Find_Atom,         "find-atom",          2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Atom_Name,         "atom-name",          2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_List_Properties,   "list-properties",    1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Get_Property,      "get-property",       6, 6, EVAL);
 | 
			
		||||
    Define_Primitive (P_Change_Property,   "change-property",    6, 6, EVAL);
 | 
			
		||||
    Define_Primitive (P_Delete_Property,   "delete-property",    2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Rotate_Properties, "rotate-properties",  3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Set_Selection_Owner, "set-selection-owner!",
 | 
			
		||||
								 4, 4, EVAL);
 | 
			
		||||
    Define_Primitive (P_Selection_Owner,   "selection-owner",    2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Convert_Selection, "convert-selection",  5, 5, EVAL);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,180 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
extern XDrawText(), XDrawText16();
 | 
			
		||||
static Object Sym_1byte, Sym_2byte;
 | 
			
		||||
 | 
			
		||||
static Two_Byte (format) Object format; {
 | 
			
		||||
    Check_Type (format, T_Symbol);
 | 
			
		||||
    if (EQ(format, Sym_1byte))
 | 
			
		||||
	return 0;
 | 
			
		||||
    else if (EQ(format, Sym_2byte))
 | 
			
		||||
	return 1;
 | 
			
		||||
    Primitive_Error ("index format must be '1-byte or '2-byte");
 | 
			
		||||
    /*NOTREACHED*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Get_1_Byte_Char (x) Object x; {
 | 
			
		||||
    register c = Get_Integer (x);
 | 
			
		||||
    if (c < 0 || c > 255)
 | 
			
		||||
	Range_Error (x);
 | 
			
		||||
    return c;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Get_2_Byte_Char (x) Object x; {
 | 
			
		||||
    register c = Get_Integer (x);
 | 
			
		||||
    if (c < 0 || c > 65535)
 | 
			
		||||
	Range_Error (x);
 | 
			
		||||
    return c;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Calculation of text widths and extents should not be done using
 | 
			
		||||
 * the Xlib functions.  For instance, the values returned by
 | 
			
		||||
 * XTextExtents() are only shorts and can therefore overflow for
 | 
			
		||||
 * long strings.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static Object Internal_Text_Metrics (font, t, f, width) Object font, t, f; {
 | 
			
		||||
    char *s;
 | 
			
		||||
    XChar2b *s2;
 | 
			
		||||
    XFontStruct *info;
 | 
			
		||||
    Object *data;
 | 
			
		||||
    register i, n;
 | 
			
		||||
    int dir, fasc, fdesc;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_Type (font, T_Font);
 | 
			
		||||
    info = FONT(font)->info;
 | 
			
		||||
    Check_Type (t, T_Vector);
 | 
			
		||||
    n = VECTOR(t)->size;
 | 
			
		||||
    data = VECTOR(t)->data;
 | 
			
		||||
    if (Two_Byte (f)) {
 | 
			
		||||
	Alloca (s2, XChar2b*, n * sizeof (XChar2b));
 | 
			
		||||
	for (i = 0; i < n; i++) {
 | 
			
		||||
	    register c = Get_2_Byte_Char (data[i]);
 | 
			
		||||
	    s2[i].byte1 = (c >> 8) & 0xff;
 | 
			
		||||
	    s2[i].byte2 = c & 0xff;
 | 
			
		||||
	}
 | 
			
		||||
	if (width)
 | 
			
		||||
	    i = XTextWidth16 (info, s2, n);
 | 
			
		||||
	else
 | 
			
		||||
	    XTextExtents16 (info, s2, n, &dir, &fasc, &fdesc, &CI);
 | 
			
		||||
    } else {
 | 
			
		||||
	Alloca (s, char*, n);
 | 
			
		||||
	for (i = 0; i < n; i++)
 | 
			
		||||
	    s[i] = Get_1_Byte_Char (data[i]);
 | 
			
		||||
	if (width)
 | 
			
		||||
	    i = XTextWidth (info, s, n);
 | 
			
		||||
	else
 | 
			
		||||
	    XTextExtents (info, s, n, &dir, &fasc, &fdesc, &CI);
 | 
			
		||||
    }
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return width ? Make_Integer (i) : Record_To_Vector (Char_Info_Rec,
 | 
			
		||||
	Char_Info_Size, Sym_Char_Info, FONT(font)->dpy, ~0L);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Text_Width (font, t, f) Object font, t, f; {
 | 
			
		||||
    return Internal_Text_Metrics (font, t, f, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Text_Extents (font, t, f) Object font, t, f; {
 | 
			
		||||
    return Internal_Text_Metrics (font, t, f, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Draw_Image_Text (d, gc, x, y, t, f) Object d, gc, x, y, t, f; {
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    Drawable dr = Get_Drawable (d, &dpy);
 | 
			
		||||
    Object *data;
 | 
			
		||||
    register i, n;
 | 
			
		||||
    char *s;
 | 
			
		||||
    XChar2b *s2;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_Type (gc, T_Gc);
 | 
			
		||||
    Check_Type (t, T_Vector);
 | 
			
		||||
    n = VECTOR(t)->size;
 | 
			
		||||
    data = VECTOR(t)->data;
 | 
			
		||||
    if (Two_Byte (f)) {
 | 
			
		||||
	Alloca (s2, XChar2b*, n * sizeof (XChar2b));
 | 
			
		||||
	for (i = 0; i < n; i++) {
 | 
			
		||||
	    register c = Get_2_Byte_Char (data[i]);
 | 
			
		||||
	    s2[i].byte1 = (c >> 8) & 0xff;
 | 
			
		||||
	    s2[i].byte2 = c & 0xff;
 | 
			
		||||
	}
 | 
			
		||||
	XDrawImageString16 (dpy, dr, GCONTEXT(gc)->gc, Get_Integer (x),
 | 
			
		||||
	    Get_Integer (y), s2, n);
 | 
			
		||||
    } else {
 | 
			
		||||
	Alloca (s, char*, n);
 | 
			
		||||
	for (i = 0; i < n; i++)
 | 
			
		||||
	    s[i] = Get_1_Byte_Char (data[i]);
 | 
			
		||||
	XDrawImageString (dpy, dr, GCONTEXT(gc)->gc, Get_Integer (x),
 | 
			
		||||
	    Get_Integer (y), s, n);
 | 
			
		||||
    }
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Draw_Poly_Text (d, gc, x, y, t, f) Object d, gc, x, y, t, f; {
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    Drawable dr = Get_Drawable (d, &dpy);
 | 
			
		||||
    Object *data;
 | 
			
		||||
    register i, n, j, k;
 | 
			
		||||
    int twobyte, nitems;
 | 
			
		||||
    XTextItem *items;
 | 
			
		||||
    int (*func)();
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_Type (gc, T_Gc);
 | 
			
		||||
    twobyte = Two_Byte (f);
 | 
			
		||||
    func = twobyte ? (int(*)())XDrawText16 : (int(*)())XDrawText;
 | 
			
		||||
    Check_Type (t, T_Vector);
 | 
			
		||||
    if ((n = VECTOR(t)->size) == 0)
 | 
			
		||||
	return Void;
 | 
			
		||||
    for (data = VECTOR(t)->data, i = 0, nitems = 1; i < n; i++)
 | 
			
		||||
	if (TYPE(data[i]) == T_Font) nitems++;
 | 
			
		||||
    Alloca (items, XTextItem*, nitems * sizeof (XTextItem));
 | 
			
		||||
    items[0].delta = 0;
 | 
			
		||||
    items[0].font = None;
 | 
			
		||||
    for (j = k = i = 0; i <= n; i++) {
 | 
			
		||||
	if (i == n || TYPE(data[i]) == T_Font) {
 | 
			
		||||
	    items[j].nchars = i-k;
 | 
			
		||||
	    if (twobyte) {
 | 
			
		||||
		register XChar2b *p;
 | 
			
		||||
 | 
			
		||||
		Alloca (p, XChar2b*, (i-k) * sizeof (XChar2b));
 | 
			
		||||
		((XTextItem16 *)items)[j].chars = p;
 | 
			
		||||
		for ( ; k < i; k++, p++) {
 | 
			
		||||
		    register c = Get_2_Byte_Char (data[k]);
 | 
			
		||||
		    p->byte1 = (c >> 8) & 0xff;
 | 
			
		||||
		    p->byte2 = c & 0xff;
 | 
			
		||||
		}
 | 
			
		||||
	    } else {
 | 
			
		||||
		register char *p;
 | 
			
		||||
 | 
			
		||||
		Alloca (p, char*, i-k);
 | 
			
		||||
		items[j].chars = p;
 | 
			
		||||
		for ( ; k < i; k++)
 | 
			
		||||
		    *p++ = Get_1_Byte_Char (data[k]);
 | 
			
		||||
	    }
 | 
			
		||||
	    k++;
 | 
			
		||||
	    j++;
 | 
			
		||||
	    if (i < n) {
 | 
			
		||||
		items[j].delta = 0;
 | 
			
		||||
		Open_Font_Maybe (data[i]);
 | 
			
		||||
		items[j].font = FONT(data[i])->id;
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
    (*func)(dpy, dr, GCONTEXT(gc)->gc, Get_Integer (x), Get_Integer (y),
 | 
			
		||||
	items, nitems);
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_text () {
 | 
			
		||||
    Define_Primitive (P_Text_Width,       "text-width",        3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Text_Extents,     "xlib-text-extents", 3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Draw_Image_Text,  "draw-image-text",   6, 6, EVAL);
 | 
			
		||||
    Define_Primitive (P_Draw_Poly_Text,   "draw-poly-text",    6, 6, EVAL);
 | 
			
		||||
    Define_Symbol (&Sym_1byte, "1-byte");
 | 
			
		||||
    Define_Symbol (&Sym_2byte, "2-byte");
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,803 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
static Object Set_Attr_Slots; 
 | 
			
		||||
static Object Conf_Slots;
 | 
			
		||||
static Object GC_Slots;
 | 
			
		||||
static Object Geometry_Slots;
 | 
			
		||||
static Object Win_Attr_Slots;
 | 
			
		||||
static Object Font_Info_Slots;
 | 
			
		||||
static Object Char_Info_Slots;
 | 
			
		||||
static Object Wm_Hints_Slots;
 | 
			
		||||
static Object Size_Hints_Slots;
 | 
			
		||||
 | 
			
		||||
static Object Sym_Parent_Relative, Sym_Copy_From_Parent;
 | 
			
		||||
 | 
			
		||||
XSetWindowAttributes SWA;
 | 
			
		||||
RECORD Set_Attr_Rec[] = {
 | 
			
		||||
    { (char *)&SWA.background_pixmap,     "background-pixmap",     T_BACKGROUND,
 | 
			
		||||
	0,                  CWBackPixmap },
 | 
			
		||||
    { (char *)&SWA.background_pixel,      "background-pixel",      T_PIXEL,
 | 
			
		||||
	0,                  CWBackPixel },
 | 
			
		||||
    { (char *)&SWA.border_pixmap,         "border-pixmap",         T_BORDER,
 | 
			
		||||
	0,                  CWBorderPixmap },
 | 
			
		||||
    { (char *)&SWA.border_pixel,          "border-pixel",          T_PIXEL,
 | 
			
		||||
	0,                  CWBorderPixel },
 | 
			
		||||
    { (char *)&SWA.bit_gravity,           "bit-gravity",           T_SYM,
 | 
			
		||||
	Bit_Grav_Syms,      CWBitGravity },
 | 
			
		||||
    { (char *)&SWA.win_gravity,           "gravity",               T_SYM,
 | 
			
		||||
	Grav_Syms,          CWWinGravity },
 | 
			
		||||
    { (char *)&SWA.backing_store,         "backing-store",         T_SYM,
 | 
			
		||||
	Backing_Store_Syms, CWBackingStore },
 | 
			
		||||
    { (char *)&SWA.backing_planes,        "backing-planes",        T_PIXEL,
 | 
			
		||||
	0,                  CWBackingPlanes },
 | 
			
		||||
    { (char *)&SWA.backing_pixel,         "backing-pixel",         T_PIXEL,
 | 
			
		||||
	0,                  CWBackingPixel },
 | 
			
		||||
    { (char *)&SWA.save_under,            "save-under",            T_BOOL,
 | 
			
		||||
	0,                  CWSaveUnder },
 | 
			
		||||
    { (char *)&SWA.event_mask,            "event-mask",            T_MASK,
 | 
			
		||||
	Event_Syms,         CWEventMask },
 | 
			
		||||
    { (char *)&SWA.do_not_propagate_mask, "do-not-propagate-mask", T_MASK,
 | 
			
		||||
	Event_Syms,         CWDontPropagate },
 | 
			
		||||
    { (char *)&SWA.override_redirect,     "override-redirect",     T_BOOL,
 | 
			
		||||
	0,                  CWOverrideRedirect },
 | 
			
		||||
    { (char *)&SWA.colormap,              "colormap",              T_COLORMAP,
 | 
			
		||||
	0,                  CWColormap },
 | 
			
		||||
    { (char *)&SWA.cursor,                "cursor",                T_CURSOR,
 | 
			
		||||
	0,                  CWCursor },
 | 
			
		||||
    { 0, 0, T_NONE, 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
int Set_Attr_Size = sizeof Set_Attr_Rec / sizeof (RECORD);
 | 
			
		||||
 | 
			
		||||
XWindowChanges WC;
 | 
			
		||||
RECORD Conf_Rec[] = {
 | 
			
		||||
    { (char *)&WC.x,            "x",            T_INT,     0, CWX },
 | 
			
		||||
    { (char *)&WC.y,            "y",            T_INT,     0, CWY },
 | 
			
		||||
    { (char *)&WC.width,        "width",        T_INT,     0, CWWidth },
 | 
			
		||||
    { (char *)&WC.height,       "height",       T_INT,     0, CWHeight },
 | 
			
		||||
    { (char *)&WC.border_width, "border-width", T_INT,     0, CWBorderWidth },
 | 
			
		||||
    { (char *)&WC.sibling,      "sibling",      T_WINDOW,  0, CWSibling },
 | 
			
		||||
    { (char *)&WC.stack_mode,   "stack-mode",   T_SYM,     Stack_Mode_Syms,
 | 
			
		||||
	CWStackMode },
 | 
			
		||||
    { 0, 0, T_NONE, 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
int Conf_Size = sizeof Conf_Rec / sizeof (RECORD);
 | 
			
		||||
 | 
			
		||||
XGCValues GCV;
 | 
			
		||||
RECORD GC_Rec[] = {
 | 
			
		||||
    { (char *)&GCV.function,           "function",       T_SYM,
 | 
			
		||||
	Func_Syms,        GCFunction },
 | 
			
		||||
    { (char *)&GCV.plane_mask,         "plane-mask",     T_PIXEL,
 | 
			
		||||
	0,                GCPlaneMask },
 | 
			
		||||
    { (char *)&GCV.foreground,         "foreground",     T_PIXEL,
 | 
			
		||||
	0,                GCForeground },
 | 
			
		||||
    { (char *)&GCV.background,         "background",     T_PIXEL,
 | 
			
		||||
	0,                GCBackground },
 | 
			
		||||
    { (char *)&GCV.line_width,         "line-width",     T_INT,
 | 
			
		||||
	0,                GCLineWidth },
 | 
			
		||||
    { (char *)&GCV.line_style,         "line-style",     T_SYM,
 | 
			
		||||
	Line_Style_Syms,  GCLineStyle },
 | 
			
		||||
    { (char *)&GCV.cap_style,          "cap-style",      T_SYM,
 | 
			
		||||
	Cap_Style_Syms,   GCCapStyle },
 | 
			
		||||
    { (char *)&GCV.join_style,         "join-style",     T_SYM,
 | 
			
		||||
	Join_Style_Syms,  GCJoinStyle },
 | 
			
		||||
    { (char *)&GCV.fill_style,         "fill-style",     T_SYM,
 | 
			
		||||
	Fill_Style_Syms,  GCFillStyle },
 | 
			
		||||
    { (char *)&GCV.fill_rule,          "fill-rule",      T_SYM,
 | 
			
		||||
	Fill_Rule_Syms,   GCFillRule },
 | 
			
		||||
    { (char *)&GCV.arc_mode,           "arc-mode",       T_SYM,
 | 
			
		||||
	Arc_Mode_Syms,    GCArcMode },
 | 
			
		||||
    { (char *)&GCV.tile,               "tile",           T_PIXMAP,
 | 
			
		||||
	0,                GCTile },
 | 
			
		||||
    { (char *)&GCV.stipple,            "stipple",        T_PIXMAP,
 | 
			
		||||
	0,                GCStipple },
 | 
			
		||||
    { (char *)&GCV.ts_x_origin,        "ts-x",           T_INT,
 | 
			
		||||
	0,                GCTileStipXOrigin },
 | 
			
		||||
    { (char *)&GCV.ts_y_origin,        "ts-y",           T_INT,
 | 
			
		||||
	0,                GCTileStipYOrigin },
 | 
			
		||||
    { (char *)&GCV.font,               "font",           T_FONT,
 | 
			
		||||
	0,                GCFont },
 | 
			
		||||
    { (char *)&GCV.subwindow_mode,     "subwindow-mode", T_SYM,
 | 
			
		||||
	Subwin_Mode_Syms, GCSubwindowMode },
 | 
			
		||||
    { (char *)&GCV.graphics_exposures, "exposures",      T_BOOL,
 | 
			
		||||
	0,                GCGraphicsExposures },
 | 
			
		||||
    { (char *)&GCV.clip_x_origin,      "clip-x",         T_INT,
 | 
			
		||||
	0,                GCClipXOrigin },
 | 
			
		||||
    { (char *)&GCV.clip_y_origin,      "clip-y",         T_INT,
 | 
			
		||||
	0,                GCClipYOrigin },
 | 
			
		||||
    { (char *)&GCV.clip_mask,          "clip-mask",      T_PIXMAP,
 | 
			
		||||
	0,                GCClipMask },
 | 
			
		||||
    { (char *)&GCV.dash_offset,        "dash-offset",    T_INT,
 | 
			
		||||
	0,                GCDashOffset },
 | 
			
		||||
    { (char *)&GCV.dashes,             "dashes",         T_CHAR,
 | 
			
		||||
	0,                GCDashList },
 | 
			
		||||
    {0, 0, T_NONE, 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
int GC_Size = sizeof GC_Rec / sizeof (RECORD);
 | 
			
		||||
 | 
			
		||||
GEOMETRY GEO;
 | 
			
		||||
RECORD Geometry_Rec[] = {
 | 
			
		||||
    { (char *)&GEO.root,              "root",         T_WINDOW, 0, 0 },
 | 
			
		||||
    { (char *)&GEO.x,                 "x",            T_INT,    0, 0 },
 | 
			
		||||
    { (char *)&GEO.y,                 "y",            T_INT,    0, 0 },
 | 
			
		||||
    { (char *)&GEO.width,             "width",        T_INT,    0, 0 },
 | 
			
		||||
    { (char *)&GEO.height,            "height",       T_INT,    0, 0 },
 | 
			
		||||
    { (char *)&GEO.border_width,      "border-width", T_INT,    0, 0 },
 | 
			
		||||
    { (char *)&GEO.depth,             "depth",        T_INT,    0, 0 },
 | 
			
		||||
    {0, 0, T_NONE, 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
int Geometry_Size = sizeof Geometry_Rec / sizeof (RECORD);
 | 
			
		||||
 | 
			
		||||
XWindowAttributes WA;
 | 
			
		||||
RECORD Win_Attr_Rec[] = {
 | 
			
		||||
    { (char *)&WA.x,                    "x",                      T_INT,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&WA.y,                    "y",                      T_INT,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&WA.width,                "width",                  T_INT,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&WA.height,               "height",                 T_INT,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&WA.border_width,         "border-width",           T_INT,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&WA.depth,                "depth",                  T_INT,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&WA.visual,               "visual",                 T_NONE,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&WA.root,                 "root",                   T_WINDOW,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
#if defined(__cplusplus) || defined(c_plusplus)
 | 
			
		||||
    { (char *)&WA.c_class,              "class",                  T_SYM,
 | 
			
		||||
#else
 | 
			
		||||
    { (char *)&WA.class,                "class",                  T_SYM,
 | 
			
		||||
#endif
 | 
			
		||||
	Class_Syms,         0 },
 | 
			
		||||
    { (char *)&WA.bit_gravity,          "bit-gravity",            T_SYM,
 | 
			
		||||
	Bit_Grav_Syms,      0 },
 | 
			
		||||
    { (char *)&WA.win_gravity,          "gravity",                T_SYM,
 | 
			
		||||
	Grav_Syms,          0 },
 | 
			
		||||
    { (char *)&WA.backing_store,        "backing-store",          T_SYM,
 | 
			
		||||
	Backing_Store_Syms, 0 },
 | 
			
		||||
    { (char *)&WA.backing_planes,       "backing-planes",         T_PIXEL,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&WA.backing_pixel,        "backing-pixel",          T_PIXEL,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&WA.save_under,           "save-under",             T_BOOL,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&WA.colormap ,            "colormap",               T_COLORMAP,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&WA.map_installed,        "map-installed",          T_BOOL,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&WA.map_state,            "map-state",              T_SYM,
 | 
			
		||||
	Map_State_Syms,     0 },
 | 
			
		||||
    { (char *)&WA.all_event_masks,      "all-event-masks",        T_MASK,
 | 
			
		||||
	Event_Syms,         0 },
 | 
			
		||||
    { (char *)&WA.your_event_mask,      "your-event-mask",        T_MASK,
 | 
			
		||||
	Event_Syms,         0 },
 | 
			
		||||
    { (char *)&WA.do_not_propagate_mask, "do-not-propagate-mask", T_MASK,
 | 
			
		||||
	Event_Syms,         0 },
 | 
			
		||||
    { (char *)&WA.override_redirect,    "override-redirect",      T_BOOL,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&WA.screen,               "screen",                 T_NONE,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    {0, 0, T_NONE, 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
int Win_Attr_Size = sizeof Win_Attr_Rec / sizeof (RECORD);
 | 
			
		||||
 | 
			
		||||
XFontStruct FI;
 | 
			
		||||
RECORD Font_Info_Rec[] = {
 | 
			
		||||
    { (char *)&FI.direction,            "direction",             T_SYM,
 | 
			
		||||
	Direction_Syms,     0 },
 | 
			
		||||
    { (char *)&FI.min_char_or_byte2,    "min-byte2",             T_INT,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&FI.max_char_or_byte2,    "max-byte2",             T_INT,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&FI.min_byte1,            "min-byte1",             T_INT,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&FI.max_byte1,            "max-byte1",             T_INT,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&FI.all_chars_exist,      "all-chars-exist?",      T_BOOL,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&FI.default_char,         "default-char",          T_INT,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&FI.ascent,               "ascent",                T_INT,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    { (char *)&FI.descent,              "descent",               T_INT,
 | 
			
		||||
	0,                  0 },
 | 
			
		||||
    {0, 0, T_NONE, 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
int Font_Info_Size = sizeof Font_Info_Rec / sizeof (RECORD);
 | 
			
		||||
 | 
			
		||||
XCharStruct CI;
 | 
			
		||||
RECORD Char_Info_Rec[] = {
 | 
			
		||||
    { (char *)&CI.lbearing,      "lbearing",       T_SHORT, 0, 0 },
 | 
			
		||||
    { (char *)&CI.rbearing,      "rbearing",       T_SHORT, 0, 0 },
 | 
			
		||||
    { (char *)&CI.width,         "width",          T_SHORT, 0, 0 },
 | 
			
		||||
    { (char *)&CI.ascent,        "ascent",         T_SHORT, 0, 0 },
 | 
			
		||||
    { (char *)&CI.descent,       "descent",        T_SHORT, 0, 0 },
 | 
			
		||||
    { (char *)&CI.attributes,    "attributes",     T_SHORT, 0, 0 },
 | 
			
		||||
    {0, 0, T_NONE, 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
int Char_Info_Size = sizeof Char_Info_Rec / sizeof (RECORD);
 | 
			
		||||
 | 
			
		||||
XWMHints WMH;
 | 
			
		||||
RECORD Wm_Hints_Rec[] = {
 | 
			
		||||
    { (char *)&WMH.input,         "input?",        T_BOOL,
 | 
			
		||||
	0,                  InputHint },
 | 
			
		||||
    { (char *)&WMH.initial_state, "initial-state", T_SYM,
 | 
			
		||||
	Initial_State_Syms, StateHint },
 | 
			
		||||
    { (char *)&WMH.icon_pixmap,   "icon-pixmap",   T_PIXMAP,
 | 
			
		||||
	0,                  IconPixmapHint },
 | 
			
		||||
    { (char *)&WMH.icon_window,   "icon-window",   T_WINDOW,
 | 
			
		||||
	0,                  IconWindowHint },
 | 
			
		||||
    { (char *)&WMH.icon_x,        "icon-x",        T_INT,
 | 
			
		||||
	0,                  IconPositionHint },
 | 
			
		||||
    { (char *)&WMH.icon_y,        "icon-y",        T_INT,
 | 
			
		||||
	0,                  IconPositionHint },
 | 
			
		||||
    { (char *)&WMH.icon_mask,     "icon-mask",     T_PIXMAP,
 | 
			
		||||
	0,                  IconMaskHint },
 | 
			
		||||
    { (char *)&WMH.window_group,  "window-group",  T_WINDOW,
 | 
			
		||||
	0,                  WindowGroupHint },
 | 
			
		||||
    {0, 0, T_NONE, 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
int Wm_Hints_Size = sizeof Wm_Hints_Rec / sizeof (RECORD);
 | 
			
		||||
 | 
			
		||||
XSizeHints SZH;
 | 
			
		||||
RECORD Size_Hints_Rec[] = {
 | 
			
		||||
    { (char *)&SZH.x,              "x",               T_INT,  0, PPosition },
 | 
			
		||||
    { (char *)&SZH.y,              "y",               T_INT,  0, PPosition },
 | 
			
		||||
    { (char *)&SZH.width,          "width",           T_INT,  0, PSize },
 | 
			
		||||
    { (char *)&SZH.height,         "height",          T_INT,  0, PSize },
 | 
			
		||||
    { (char *)&SZH.x,              "x",               T_INT,  0, USPosition },
 | 
			
		||||
    { (char *)&SZH.y,              "y",               T_INT,  0, USPosition },
 | 
			
		||||
    { (char *)&SZH.width,          "width",           T_INT,  0, USSize },
 | 
			
		||||
    { (char *)&SZH.height,         "height",          T_INT,  0, USSize },
 | 
			
		||||
    { (char *)&SZH.min_width,      "min-width",       T_INT,  0, PMinSize },
 | 
			
		||||
    { (char *)&SZH.min_height,     "min-height",      T_INT,  0, PMinSize },
 | 
			
		||||
    { (char *)&SZH.max_width,      "max-width",       T_INT,  0, PMaxSize },
 | 
			
		||||
    { (char *)&SZH.max_height,     "max-height",      T_INT,  0, PMaxSize },
 | 
			
		||||
    { (char *)&SZH.width_inc,      "width-inc",       T_INT,  0, PResizeInc },
 | 
			
		||||
    { (char *)&SZH.height_inc,     "height-inc",      T_INT,  0, PResizeInc },
 | 
			
		||||
    { (char *)&SZH.min_aspect.x,   "min-aspect-x",    T_INT,  0, PAspect },
 | 
			
		||||
    { (char *)&SZH.min_aspect.y,   "min-aspect-y",    T_INT,  0, PAspect },
 | 
			
		||||
    { (char *)&SZH.max_aspect.x,   "max-aspect-x",    T_INT,  0, PAspect },
 | 
			
		||||
    { (char *)&SZH.max_aspect.y,   "max-aspect-y",    T_INT,  0, PAspect },
 | 
			
		||||
    { (char *)&SZH.base_width,     "base-width",      T_INT,  0, PBaseSize },
 | 
			
		||||
    { (char *)&SZH.base_height,    "base-height",     T_INT,  0, PBaseSize },
 | 
			
		||||
    { (char *)&SZH.win_gravity,    "gravity",         T_SYM,  Grav_Syms, 
 | 
			
		||||
								 PWinGravity },
 | 
			
		||||
    {0, 0, T_NONE, 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
int Size_Hints_Size = sizeof Size_Hints_Rec / sizeof (RECORD);
 | 
			
		||||
 | 
			
		||||
unsigned long Vector_To_Record (v, len, sym, rp) Object v, sym;
 | 
			
		||||
	register RECORD *rp; {
 | 
			
		||||
    register Object *p;
 | 
			
		||||
    unsigned long mask = 0;
 | 
			
		||||
 | 
			
		||||
    Check_Type (v, T_Vector);
 | 
			
		||||
    p = VECTOR(v)->data;
 | 
			
		||||
    if (VECTOR(v)->size != len && !EQ(p[0], sym))
 | 
			
		||||
	Primitive_Error ("invalid argument");
 | 
			
		||||
    for ( ; rp->slot; rp++) {
 | 
			
		||||
	++p;
 | 
			
		||||
	if (rp->type == T_NONE || Nullp (*p))
 | 
			
		||||
	    continue;
 | 
			
		||||
	switch (rp->type) {
 | 
			
		||||
	case T_INT:
 | 
			
		||||
	    *(int *)rp->slot = Get_Integer (*p); break;
 | 
			
		||||
	case T_SHORT:
 | 
			
		||||
	    *(short *)rp->slot = Get_Integer (*p); break;
 | 
			
		||||
	case T_CHAR:
 | 
			
		||||
	    *(char *)rp->slot = Get_Integer (*p); break;
 | 
			
		||||
	case T_PIXEL:
 | 
			
		||||
	    *(unsigned long *)rp->slot = Get_Pixel (*p); break;
 | 
			
		||||
	case T_BACKGROUND:
 | 
			
		||||
	    if (EQ(*p, Sym_None))
 | 
			
		||||
		*(Pixmap *)rp->slot = None;
 | 
			
		||||
	    else if (EQ(*p, Sym_Parent_Relative))
 | 
			
		||||
		*(Pixmap *)rp->slot = ParentRelative;
 | 
			
		||||
	    else
 | 
			
		||||
		*(Pixmap *)rp->slot = Get_Pixmap (*p);
 | 
			
		||||
	    break;
 | 
			
		||||
	case T_BORDER:
 | 
			
		||||
	    if (EQ(*p, Sym_Copy_From_Parent)) {
 | 
			
		||||
		*(Pixmap *)rp->slot = CopyFromParent;
 | 
			
		||||
		break;
 | 
			
		||||
	    }
 | 
			
		||||
	    /* fall through */
 | 
			
		||||
	case T_PIXMAP:
 | 
			
		||||
	    *(Pixmap *)rp->slot = Get_Pixmap (*p); break;
 | 
			
		||||
	case T_BOOL:
 | 
			
		||||
	    Check_Type (*p, T_Boolean);
 | 
			
		||||
	    *(Bool *)rp->slot = (Bool)(FIXNUM(*p));
 | 
			
		||||
	    break;
 | 
			
		||||
	case T_FONT:
 | 
			
		||||
	    *(Font *)rp->slot = Get_Font (*p);
 | 
			
		||||
	    break;
 | 
			
		||||
	case T_COLORMAP:
 | 
			
		||||
	    *(Colormap *)rp->slot = Get_Colormap (*p); break;
 | 
			
		||||
	case T_CURSOR:
 | 
			
		||||
	    *(Cursor *)rp->slot = Get_Cursor (*p);
 | 
			
		||||
	    break;
 | 
			
		||||
	case T_WINDOW:
 | 
			
		||||
	    break;
 | 
			
		||||
	case T_MASK:
 | 
			
		||||
	    *(long *)rp->slot = Symbols_To_Bits (*p, 1, rp->syms);
 | 
			
		||||
	    break;
 | 
			
		||||
	case T_SYM:
 | 
			
		||||
	    *(int *)rp->slot = (int)Symbols_To_Bits (*p, 0, rp->syms);
 | 
			
		||||
	    break;
 | 
			
		||||
	default:
 | 
			
		||||
	    Panic ("vector->record");
 | 
			
		||||
	}
 | 
			
		||||
	mask |= rp->mask;
 | 
			
		||||
    }
 | 
			
		||||
    return mask;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Object Record_To_Vector (rp, len, sym, dpy, flags) Object sym;
 | 
			
		||||
	register RECORD *rp; Display *dpy; unsigned long flags; {
 | 
			
		||||
    register i;
 | 
			
		||||
    Object v, x;
 | 
			
		||||
    GC_Node2;
 | 
			
		||||
 | 
			
		||||
    v = Null;
 | 
			
		||||
    GC_Link2 (sym, v);
 | 
			
		||||
    v = Make_Vector (len, Null);
 | 
			
		||||
    VECTOR(v)->data[0] = sym;
 | 
			
		||||
    for (i = 1; rp->slot; i++, rp++) {
 | 
			
		||||
	if (rp->type == T_NONE)
 | 
			
		||||
	    continue;
 | 
			
		||||
	if (rp->mask && !(flags & rp->mask))
 | 
			
		||||
	    continue;
 | 
			
		||||
	x = Null;
 | 
			
		||||
	switch (rp->type) {
 | 
			
		||||
	case T_INT:
 | 
			
		||||
	    x = Make_Integer (*(int *)rp->slot); break;
 | 
			
		||||
	case T_SHORT:
 | 
			
		||||
	    x = Make_Integer (*(short *)rp->slot); break;
 | 
			
		||||
	case T_CHAR:
 | 
			
		||||
	    x = Make_Integer (*(char *)rp->slot); break;
 | 
			
		||||
	case T_PIXEL:
 | 
			
		||||
	    x = Make_Pixel (*(unsigned long *)rp->slot); break;
 | 
			
		||||
	case T_PIXMAP:
 | 
			
		||||
	    if (*(unsigned long *)rp->slot == ~0L)
 | 
			
		||||
		x = Sym_None;
 | 
			
		||||
	    else
 | 
			
		||||
		x = Make_Pixmap_Foreign (dpy, *(Pixmap *)rp->slot);
 | 
			
		||||
	    break;
 | 
			
		||||
	case T_FONT:
 | 
			
		||||
	    if (*(unsigned long *)rp->slot == ~0L)
 | 
			
		||||
		x = Sym_None;
 | 
			
		||||
	    else {
 | 
			
		||||
		register XFontStruct *info;
 | 
			
		||||
		Disable_Interrupts;
 | 
			
		||||
		info = XQueryFont (dpy, *(Font *)rp->slot);
 | 
			
		||||
		Enable_Interrupts;
 | 
			
		||||
		x = Make_Font_Foreign (dpy, False, *(Font *)rp->slot, info);
 | 
			
		||||
	    }
 | 
			
		||||
	    break;
 | 
			
		||||
	case T_BOOL:
 | 
			
		||||
	    x = *(Bool *)rp->slot ? True : False; break;
 | 
			
		||||
	case T_COLORMAP:
 | 
			
		||||
	    x = Make_Colormap (0, dpy, *(Colormap *)rp->slot); break;
 | 
			
		||||
	case T_WINDOW:
 | 
			
		||||
	    x = Make_Window (0, dpy, *(Window *)rp->slot); break;
 | 
			
		||||
	case T_MASK:
 | 
			
		||||
	    x = Bits_To_Symbols (*(long *)rp->slot, 1, rp->syms);
 | 
			
		||||
	    break;
 | 
			
		||||
	case T_SYM:
 | 
			
		||||
	    x = Bits_To_Symbols ((unsigned long)*(int *)rp->slot, 0, rp->syms);
 | 
			
		||||
	    break;
 | 
			
		||||
	default:
 | 
			
		||||
	    Panic ("record->vector");
 | 
			
		||||
	}
 | 
			
		||||
	VECTOR(v)->data[i] = x;
 | 
			
		||||
    }
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SYMDESCR Func_Syms[] = {
 | 
			
		||||
    { "clear",         GXclear },
 | 
			
		||||
    { "and",           GXand },
 | 
			
		||||
    { "and-reverse",   GXandReverse },
 | 
			
		||||
    { "copy",          GXcopy },
 | 
			
		||||
    { "and-inverted",  GXandInverted },
 | 
			
		||||
    { "no-op",         GXnoop },
 | 
			
		||||
    { "xor",           GXxor },
 | 
			
		||||
    { "or",            GXor },
 | 
			
		||||
    { "nor",           GXnor },
 | 
			
		||||
    { "equiv",         GXequiv },
 | 
			
		||||
    { "invert",        GXinvert },
 | 
			
		||||
    { "or-reverse",    GXorReverse },
 | 
			
		||||
    { "copy-inverted", GXcopyInverted },
 | 
			
		||||
    { "or-inverted",   GXorInverted },
 | 
			
		||||
    { "nand",          GXnand },
 | 
			
		||||
    { "set",           GXset },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Bit_Grav_Syms[] = {
 | 
			
		||||
    { "forget",        ForgetGravity },
 | 
			
		||||
    { "north-west",    NorthWestGravity },
 | 
			
		||||
    { "north",         NorthGravity },
 | 
			
		||||
    { "north-east",    NorthEastGravity },
 | 
			
		||||
    { "west",          WestGravity },
 | 
			
		||||
    { "center",        CenterGravity },
 | 
			
		||||
    { "east",          EastGravity },
 | 
			
		||||
    { "south-west",    SouthWestGravity },
 | 
			
		||||
    { "south",         SouthGravity },
 | 
			
		||||
    { "south-east",    SouthEastGravity },
 | 
			
		||||
    { "static",        StaticGravity },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Grav_Syms[] = {
 | 
			
		||||
    { "unmap",         UnmapGravity },
 | 
			
		||||
    { "north-west",    NorthWestGravity },
 | 
			
		||||
    { "north",         NorthGravity },
 | 
			
		||||
    { "north-east",    NorthEastGravity },
 | 
			
		||||
    { "west",          WestGravity },
 | 
			
		||||
    { "center",        CenterGravity },
 | 
			
		||||
    { "east",          EastGravity },
 | 
			
		||||
    { "south-west",    SouthWestGravity },
 | 
			
		||||
    { "south",         SouthGravity },
 | 
			
		||||
    { "south-east",    SouthEastGravity },
 | 
			
		||||
    { "static",        StaticGravity },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Backing_Store_Syms[] = {
 | 
			
		||||
    { "not-useful",    NotUseful },
 | 
			
		||||
    { "when-mapped",   WhenMapped },
 | 
			
		||||
    { "always",        Always },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Stack_Mode_Syms[] = {
 | 
			
		||||
    { "above",        Above },
 | 
			
		||||
    { "below",        Below },
 | 
			
		||||
    { "top-if",       TopIf },
 | 
			
		||||
    { "bottom-if",    BottomIf },
 | 
			
		||||
    { "opposite",     Opposite },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Line_Style_Syms[] = {
 | 
			
		||||
    { "solid",        LineSolid },
 | 
			
		||||
    { "dash",         LineOnOffDash },
 | 
			
		||||
    { "double-dash",  LineDoubleDash },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Cap_Style_Syms[] = {
 | 
			
		||||
    { "not-last",     CapNotLast },
 | 
			
		||||
    { "butt",         CapButt },
 | 
			
		||||
    { "round",        CapRound },
 | 
			
		||||
    { "projecting",   CapProjecting },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Join_Style_Syms[] = {
 | 
			
		||||
    { "miter",        JoinMiter },
 | 
			
		||||
    { "round",        JoinRound },
 | 
			
		||||
    { "bevel",        JoinBevel },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Fill_Style_Syms[] = {
 | 
			
		||||
    { "solid",        FillSolid },
 | 
			
		||||
    { "tiled",        FillTiled },
 | 
			
		||||
    { "stippled",     FillStippled },
 | 
			
		||||
    { "opaque-stippled", FillOpaqueStippled },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Fill_Rule_Syms[] = {
 | 
			
		||||
    { "even-odd",     EvenOddRule },
 | 
			
		||||
    { "winding",      WindingRule },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Arc_Mode_Syms[] = {
 | 
			
		||||
    { "chord",        ArcChord },
 | 
			
		||||
    { "pie-slice",    ArcPieSlice },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Subwin_Mode_Syms[] = {
 | 
			
		||||
    { "clip-by-children",    ClipByChildren },
 | 
			
		||||
    { "include-inferiors",   IncludeInferiors },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Class_Syms[] = {
 | 
			
		||||
    { "input-output",    InputOutput },
 | 
			
		||||
    { "input-only",      InputOnly },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Map_State_Syms[] = {
 | 
			
		||||
    { "unmapped",      IsUnmapped },
 | 
			
		||||
    { "unviewable",    IsUnviewable },
 | 
			
		||||
    { "viewable",      IsViewable },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR State_Syms[] = {
 | 
			
		||||
    { "shift",        ShiftMask },
 | 
			
		||||
    { "lock",         LockMask },
 | 
			
		||||
    { "control",      ControlMask },
 | 
			
		||||
    { "mod1",         Mod1Mask },
 | 
			
		||||
    { "mod2",         Mod2Mask },
 | 
			
		||||
    { "mod3",         Mod3Mask },
 | 
			
		||||
    { "mod4",         Mod4Mask },
 | 
			
		||||
    { "mod5",         Mod5Mask },
 | 
			
		||||
    { "button1",      Button1Mask },
 | 
			
		||||
    { "button2",      Button2Mask },
 | 
			
		||||
    { "button3",      Button3Mask },
 | 
			
		||||
    { "button4",      Button4Mask },
 | 
			
		||||
    { "button5",      Button5Mask },
 | 
			
		||||
    { "any-modifier", AnyModifier },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Button_Syms[] = {
 | 
			
		||||
    { "any-button",   AnyButton },
 | 
			
		||||
    { "button1",      Button1 },
 | 
			
		||||
    { "button2",      Button2 },
 | 
			
		||||
    { "button3",      Button3 },
 | 
			
		||||
    { "button4",      Button4 },
 | 
			
		||||
    { "button5",      Button5 },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Cross_Mode_Syms[] = {
 | 
			
		||||
    { "normal",       NotifyNormal },
 | 
			
		||||
    { "grab",         NotifyGrab },
 | 
			
		||||
    { "ungrab",       NotifyUngrab },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Cross_Detail_Syms[] = {
 | 
			
		||||
    { "ancestor",          NotifyAncestor },
 | 
			
		||||
    { "virtual",           NotifyVirtual },
 | 
			
		||||
    { "inferior",          NotifyInferior },
 | 
			
		||||
    { "nonlinear",         NotifyNonlinear },
 | 
			
		||||
    { "nonlinear-virtual", NotifyNonlinearVirtual },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Focus_Detail_Syms[] = {
 | 
			
		||||
    { "ancestor",          NotifyAncestor },
 | 
			
		||||
    { "virtual",           NotifyVirtual },
 | 
			
		||||
    { "inferior",          NotifyInferior },
 | 
			
		||||
    { "nonlinear",         NotifyNonlinear },
 | 
			
		||||
    { "nonlinear-virtual", NotifyNonlinearVirtual },
 | 
			
		||||
    { "pointer",           NotifyPointer },
 | 
			
		||||
    { "pointer-root",      NotifyPointerRoot },
 | 
			
		||||
    { "none",              NotifyDetailNone },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Visibility_Syms[] = {
 | 
			
		||||
    { "unobscured",         VisibilityUnobscured },
 | 
			
		||||
    { "partially-obscured", VisibilityPartiallyObscured },
 | 
			
		||||
    { "fully-obscured",     VisibilityFullyObscured },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Place_Syms[] = {
 | 
			
		||||
    { "top",      PlaceOnTop },
 | 
			
		||||
    { "bottom",   PlaceOnBottom },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Prop_Syms[] = {
 | 
			
		||||
    { "new-value", PropertyNewValue },
 | 
			
		||||
    { "deleted",   PropertyDelete },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Mapping_Syms[] = {
 | 
			
		||||
    { "modifier", MappingModifier },
 | 
			
		||||
    { "keyboard", MappingKeyboard },
 | 
			
		||||
    { "pointer",  MappingPointer },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Direction_Syms[] = {
 | 
			
		||||
    { "left-to-right", FontLeftToRight },
 | 
			
		||||
    { "right-to-left", FontRightToLeft },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Polyshape_Syms[] = {
 | 
			
		||||
    { "complex",       Complex },
 | 
			
		||||
    { "non-convex",    Nonconvex },
 | 
			
		||||
    { "convex",        Convex },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Propmode_Syms[] = {
 | 
			
		||||
    { "replace",    PropModeReplace },
 | 
			
		||||
    { "prepend",    PropModePrepend },
 | 
			
		||||
    { "append",     PropModeAppend },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Grabstatus_Syms[] = {
 | 
			
		||||
    { "success",         Success },
 | 
			
		||||
    { "not-viewable",    GrabNotViewable },
 | 
			
		||||
    { "already-grabbed", AlreadyGrabbed },
 | 
			
		||||
    { "frozen",          GrabFrozen },
 | 
			
		||||
    { "invalid-time",    GrabInvalidTime },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Bitmapstatus_Syms[] = {
 | 
			
		||||
    { "success",         BitmapSuccess },
 | 
			
		||||
    { "open-failed",     BitmapOpenFailed },
 | 
			
		||||
    { "file-invalid",    BitmapFileInvalid },
 | 
			
		||||
    { "no-memory",       BitmapNoMemory },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Circulate_Syms[] = {
 | 
			
		||||
    { "raise-lowest",      RaiseLowest },
 | 
			
		||||
    { "lower-highest",     LowerHighest },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Allow_Events_Syms[] = {
 | 
			
		||||
    { "async-pointer",    AsyncPointer },
 | 
			
		||||
    { "sync-pointer",     SyncPointer },
 | 
			
		||||
    { "replay-pointer",   ReplayPointer },
 | 
			
		||||
    { "async-keyboard",   AsyncKeyboard },
 | 
			
		||||
    { "sync-keyboard",    SyncKeyboard },
 | 
			
		||||
    { "replay-keyboard",  ReplayKeyboard },
 | 
			
		||||
    { "async-both",       AsyncBoth },
 | 
			
		||||
    { "sync-both",        SyncBoth },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Revert_Syms[] = {
 | 
			
		||||
    { "none",         RevertToNone },
 | 
			
		||||
    { "pointer-root", RevertToPointerRoot },
 | 
			
		||||
    { "parent",       RevertToParent },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Shape_Syms[] = {
 | 
			
		||||
    { "cursor",  CursorShape },
 | 
			
		||||
    { "tile",    TileShape },
 | 
			
		||||
    { "stipple", StippleShape },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Initial_State_Syms[] = {
 | 
			
		||||
    { "dont-care", DontCareState },
 | 
			
		||||
    { "normal",    NormalState },
 | 
			
		||||
    { "zoom",      ZoomState },
 | 
			
		||||
    { "iconic",    IconicState },
 | 
			
		||||
    { "inactive",  InactiveState },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Ordering_Syms[] = {
 | 
			
		||||
    { "unsorted",  Unsorted },
 | 
			
		||||
    { "y-sorted",  YSorted },
 | 
			
		||||
    { "yx-sorted", YXSorted },
 | 
			
		||||
    { "yx-banded", YXBanded },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Byte_Order_Syms[] = {
 | 
			
		||||
    { "lsb-first", LSBFirst },
 | 
			
		||||
    { "msb-first", MSBFirst },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Saveset_Syms[] = {
 | 
			
		||||
    { "insert",    SetModeInsert },
 | 
			
		||||
    { "delete",    SetModeDelete },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Closemode_Syms[] = {
 | 
			
		||||
    { "destroy-all",         DestroyAll },
 | 
			
		||||
    { "retain-permanent",    RetainPermanent },
 | 
			
		||||
    { "retain-temporary",    RetainTemporary },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Event_Syms[] = {
 | 
			
		||||
    { "key-press",               KeyPressMask },
 | 
			
		||||
    { "key-release",             KeyReleaseMask },
 | 
			
		||||
    { "button-press",            ButtonPressMask },
 | 
			
		||||
    { "button-release",          ButtonReleaseMask },
 | 
			
		||||
    { "enter-window",            EnterWindowMask },
 | 
			
		||||
    { "leave-window",            LeaveWindowMask },
 | 
			
		||||
    { "pointer-motion",          PointerMotionMask },
 | 
			
		||||
    { "pointer-motion-hint",     PointerMotionHintMask },
 | 
			
		||||
    { "button-1-motion",         Button1MotionMask },
 | 
			
		||||
    { "button-2-motion",         Button2MotionMask },
 | 
			
		||||
    { "button-3-motion",         Button3MotionMask },
 | 
			
		||||
    { "button-4-motion",         Button4MotionMask },
 | 
			
		||||
    { "button-5-motion",         Button5MotionMask },
 | 
			
		||||
    { "button-motion",           ButtonMotionMask },
 | 
			
		||||
    { "keymap-state",            KeymapStateMask },
 | 
			
		||||
    { "exposure",                ExposureMask },
 | 
			
		||||
    { "visibility-change",       VisibilityChangeMask },
 | 
			
		||||
    { "structure-notify",        StructureNotifyMask },
 | 
			
		||||
    { "resize-redirect",         ResizeRedirectMask },
 | 
			
		||||
    { "substructure-notify",     SubstructureNotifyMask },
 | 
			
		||||
    { "substructure-redirect",   SubstructureRedirectMask },
 | 
			
		||||
    { "focus-change",            FocusChangeMask },
 | 
			
		||||
    { "property-change",         PropertyChangeMask },
 | 
			
		||||
    { "colormap-change",         ColormapChangeMask },
 | 
			
		||||
    { "owner-grab-button",       OwnerGrabButtonMask },
 | 
			
		||||
    { "all-events",              ~(unsigned long)0 },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SYMDESCR Error_Syms[] = {
 | 
			
		||||
    { "bad-request",        BadRequest },
 | 
			
		||||
    { "bad-value",          BadValue },
 | 
			
		||||
    { "bad-window",         BadWindow },
 | 
			
		||||
    { "bad-pixmap",         BadPixmap },
 | 
			
		||||
    { "bad-atom",           BadAtom },
 | 
			
		||||
    { "bad-cursor",         BadCursor },
 | 
			
		||||
    { "bad-font",           BadFont },
 | 
			
		||||
    { "bad-match",          BadMatch },
 | 
			
		||||
    { "bad-drawable",       BadDrawable },
 | 
			
		||||
    { "bad-access",         BadAccess },
 | 
			
		||||
    { "bad-alloc",          BadAlloc },
 | 
			
		||||
    { "bad-color",          BadColor },
 | 
			
		||||
    { "bad-gcontext",       BadGC },
 | 
			
		||||
    { "bad-id-choice",      BadIDChoice },
 | 
			
		||||
    { "bad-name",           BadName },
 | 
			
		||||
    { "bad-length",         BadLength },
 | 
			
		||||
    { "bad-implementation", BadImplementation },
 | 
			
		||||
    { 0, 0 }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static Init_Record (rec, size, name, var) RECORD *rec; char *name;
 | 
			
		||||
	Object *var; {
 | 
			
		||||
    Object list, tail, cell;
 | 
			
		||||
    register i;
 | 
			
		||||
    char buf[128];
 | 
			
		||||
    GC_Node2;
 | 
			
		||||
 | 
			
		||||
    GC_Link2 (list, tail);
 | 
			
		||||
    for (list = tail = Null, i = 1; i < size; tail = cell, i++, rec++) {
 | 
			
		||||
	cell = Intern (rec->name);
 | 
			
		||||
	cell = Cons (cell, Make_Integer (i));
 | 
			
		||||
	cell = Cons (cell, Null);
 | 
			
		||||
	if (Nullp (list))
 | 
			
		||||
	    list = cell;
 | 
			
		||||
	else
 | 
			
		||||
	    P_Set_Cdr (tail, cell);
 | 
			
		||||
    }
 | 
			
		||||
    sprintf (buf, "%s-slots", name);
 | 
			
		||||
    Define_Variable (var, buf, list);
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_type () {
 | 
			
		||||
    Init_Record (Set_Attr_Rec, Set_Attr_Size, "set-window-attributes",
 | 
			
		||||
	&Set_Attr_Slots);
 | 
			
		||||
    Init_Record (Conf_Rec, Conf_Size, "window-configuration", &Conf_Slots);
 | 
			
		||||
    Init_Record (GC_Rec, GC_Size, "gcontext", &GC_Slots);
 | 
			
		||||
    Init_Record (Geometry_Rec, Geometry_Size, "geometry", &Geometry_Slots);
 | 
			
		||||
    Init_Record (Win_Attr_Rec, Win_Attr_Size, "get-window-attributes",
 | 
			
		||||
	&Win_Attr_Slots);
 | 
			
		||||
    Init_Record (Font_Info_Rec, Font_Info_Size, "font-info", &Font_Info_Slots);
 | 
			
		||||
    Init_Record (Char_Info_Rec, Char_Info_Size, "char-info", &Char_Info_Slots);
 | 
			
		||||
    Init_Record (Wm_Hints_Rec, Wm_Hints_Size, "wm-hints", &Wm_Hints_Slots);
 | 
			
		||||
    Init_Record (Size_Hints_Rec, Size_Hints_Size, "size-hints",
 | 
			
		||||
	&Size_Hints_Slots);
 | 
			
		||||
    Define_Symbol (&Sym_Parent_Relative, "parent-relative");
 | 
			
		||||
    Define_Symbol (&Sym_Copy_From_Parent, "copy-from-parent");
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,54 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
static Object P_Get_Default (d, program, option) Object d, program, option; {
 | 
			
		||||
    register char *ret;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    if (ret = XGetDefault (DISPLAY(d)->dpy, Get_Strsym (program),
 | 
			
		||||
	    Get_Strsym (option)))
 | 
			
		||||
	return Make_String (ret, strlen (ret));
 | 
			
		||||
    return False;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Resource_Manager_String (d) Object d; {
 | 
			
		||||
    register char *ret;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    ret = XResourceManagerString (DISPLAY(d)->dpy);
 | 
			
		||||
    return ret ? Make_String (ret, strlen (ret)) : False;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Parse_Geometry (string) Object string; {
 | 
			
		||||
    Object ret, t;
 | 
			
		||||
    register mask;
 | 
			
		||||
    int x, y;
 | 
			
		||||
    unsigned w, h;
 | 
			
		||||
 | 
			
		||||
    mask = XParseGeometry (Get_Strsym (string), &x, &y, &w, &h);
 | 
			
		||||
    t = ret = P_Make_List (Make_Integer (6), False);
 | 
			
		||||
    if (mask & XNegative) Car (t) = True; t = Cdr (t);
 | 
			
		||||
    if (mask & YNegative) Car (t) = True; t = Cdr (t);
 | 
			
		||||
    if (mask & XValue) Car (t) = Make_Integer (x); t = Cdr (t);
 | 
			
		||||
    if (mask & YValue) Car (t) = Make_Integer (y); t = Cdr (t);
 | 
			
		||||
    if (mask & WidthValue) Car (t) = Make_Unsigned (w); t = Cdr (t);
 | 
			
		||||
    if (mask & HeightValue) Car (t) = Make_Unsigned (h);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Parse_Color (d, cmap, spec) Object d, cmap, spec; {
 | 
			
		||||
    XColor ret;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    if (XParseColor (DISPLAY(d)->dpy, Get_Colormap (cmap), Get_Strsym (spec),
 | 
			
		||||
	    &ret))
 | 
			
		||||
	return Make_Color (ret.red, ret.green, ret.blue);
 | 
			
		||||
    return False;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_util () {
 | 
			
		||||
    Define_Primitive (P_Get_Default,       "get-default",         3, 3, EVAL);
 | 
			
		||||
    Define_Primitive (P_Resource_Manager_String,
 | 
			
		||||
			"resource-manager-string",                1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Parse_Geometry,    "parse-geometry",      1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Parse_Color,       "parse-color",         3, 3, EVAL);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,262 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
static Object Sym_Set_Attr, Sym_Get_Attr, Sym_Geo;
 | 
			
		||||
Object Sym_Conf;
 | 
			
		||||
 | 
			
		||||
Generic_Predicate (Window)
 | 
			
		||||
 | 
			
		||||
Generic_Equal_Dpy (Window, WINDOW, win)
 | 
			
		||||
 | 
			
		||||
Generic_Print (Window, "#[window %lu]", WINDOW(x)->win)
 | 
			
		||||
 | 
			
		||||
Generic_Get_Display (Window, WINDOW)
 | 
			
		||||
 | 
			
		||||
Object Make_Window (finalize, dpy, win) Display *dpy; Window win; {
 | 
			
		||||
    Object w;
 | 
			
		||||
 | 
			
		||||
    if (win == None)
 | 
			
		||||
	return Sym_None;
 | 
			
		||||
    if (win == PointerRoot)
 | 
			
		||||
	return Intern ("pointer-root");
 | 
			
		||||
    w = Find_Object (T_Window, (GENERIC)dpy, Match_X_Obj, win);
 | 
			
		||||
    if (Nullp (w)) {
 | 
			
		||||
	w = Alloc_Object (sizeof (struct S_Window), T_Window, 0);
 | 
			
		||||
	WINDOW(w)->tag = Null;
 | 
			
		||||
	WINDOW(w)->win = win;
 | 
			
		||||
	WINDOW(w)->dpy = dpy;
 | 
			
		||||
	WINDOW(w)->free = 0;
 | 
			
		||||
	WINDOW(w)->finalize = finalize;
 | 
			
		||||
	Register_Object (w, (GENERIC)dpy, finalize ? P_Destroy_Window :
 | 
			
		||||
	    (PFO)0, 0);
 | 
			
		||||
    }
 | 
			
		||||
    return w;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Window Get_Window (w) Object w; {
 | 
			
		||||
    if (EQ(w, Sym_None))
 | 
			
		||||
	return None;
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    return WINDOW(w)->win;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Drawable Get_Drawable (d, dpyp) Object d; Display **dpyp; {
 | 
			
		||||
    if (TYPE(d) == T_Window) {
 | 
			
		||||
	*dpyp = WINDOW(d)->dpy;
 | 
			
		||||
	return (Drawable)WINDOW(d)->win;
 | 
			
		||||
    } else if (TYPE(d) == T_Pixmap) {
 | 
			
		||||
	*dpyp = PIXMAP(d)->dpy;
 | 
			
		||||
	return (Drawable)PIXMAP(d)->pm;
 | 
			
		||||
    }
 | 
			
		||||
    Wrong_Type_Combination (d, "drawable");
 | 
			
		||||
    /*NOTREACHED*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Create_Window (parent, x, y, width, height, border_width, attr)
 | 
			
		||||
	Object parent, x, y, width, height, border_width, attr; {
 | 
			
		||||
    unsigned long mask;
 | 
			
		||||
    Window win;
 | 
			
		||||
    
 | 
			
		||||
    Check_Type (parent, T_Window);
 | 
			
		||||
    mask = Vector_To_Record (attr, Set_Attr_Size, Sym_Set_Attr, Set_Attr_Rec);
 | 
			
		||||
    if ((win = XCreateWindow (WINDOW(parent)->dpy, WINDOW(parent)->win,
 | 
			
		||||
	    Get_Integer (x), Get_Integer (y), Get_Integer (width),
 | 
			
		||||
	    Get_Integer (height), Get_Integer (border_width),
 | 
			
		||||
	    CopyFromParent, CopyFromParent, CopyFromParent, mask, &SWA)) == 0)
 | 
			
		||||
	Primitive_Error ("cannot create window");
 | 
			
		||||
    return Make_Window (1, WINDOW(parent)->dpy, win);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Configure_Window (w, conf) Object w, conf; {
 | 
			
		||||
    unsigned long mask;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    mask = Vector_To_Record (conf, Conf_Size, Sym_Conf, Conf_Rec);
 | 
			
		||||
    XConfigureWindow (WINDOW(w)->dpy, WINDOW(w)->win, mask, &WC);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Change_Window_Attributes (w, attr) Object w, attr; {
 | 
			
		||||
    unsigned long mask;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    mask = Vector_To_Record (attr, Set_Attr_Size, Sym_Set_Attr, Set_Attr_Rec);
 | 
			
		||||
    XChangeWindowAttributes (WINDOW(w)->dpy, WINDOW(w)->win, mask, &SWA);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Get_Window_Attributes (w) Object w; {
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    XGetWindowAttributes (WINDOW(w)->dpy, WINDOW(w)->win, &WA);
 | 
			
		||||
    return Record_To_Vector (Win_Attr_Rec, Win_Attr_Size, Sym_Get_Attr,
 | 
			
		||||
	WINDOW(w)->dpy, ~0L);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Get_Geometry (d) Object d; {
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    Drawable dr = Get_Drawable (d, &dpy);
 | 
			
		||||
 | 
			
		||||
    /* GEO.width, GEO.height, etc. should really be unsigned, not int.
 | 
			
		||||
     */
 | 
			
		||||
    XGetGeometry (dpy, dr, &GEO.root, &GEO.x, &GEO.y, (unsigned *)&GEO.width,
 | 
			
		||||
	(unsigned *)&GEO.height, (unsigned *)&GEO.border_width,
 | 
			
		||||
	(unsigned *)&GEO.depth);
 | 
			
		||||
    return Record_To_Vector (Geometry_Rec, Geometry_Size, Sym_Geo, dpy, ~0L);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Map_Window (w) Object w; {
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    XMapWindow (WINDOW(w)->dpy, WINDOW(w)->win);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Unmap_Window (w) Object w; {
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    XUnmapWindow (WINDOW(w)->dpy, WINDOW(w)->win);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Object P_Destroy_Window (w) Object w; {
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    if (!WINDOW(w)->free)
 | 
			
		||||
	XDestroyWindow (WINDOW(w)->dpy, WINDOW(w)->win);
 | 
			
		||||
    Deregister_Object (w);
 | 
			
		||||
    WINDOW(w)->free = 1;
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Destroy_Subwindows (w) Object w; {
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    XDestroySubwindows (WINDOW(w)->dpy, WINDOW(w)->win);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Map_Subwindows (w) Object w; {
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    XMapSubwindows (WINDOW(w)->dpy, WINDOW(w)->win);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Unmap_Subwindows (w) Object w; {
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    XUnmapSubwindows (WINDOW(w)->dpy, WINDOW(w)->win);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Circulate_Subwindows (w, dir) Object w, dir; {
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    XCirculateSubwindows (WINDOW(w)->dpy, WINDOW(w)->win,
 | 
			
		||||
	Symbols_To_Bits (dir, 0, Circulate_Syms));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Query_Tree (w) Object w; {
 | 
			
		||||
    Window root, parent, *children;
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    int i;
 | 
			
		||||
    unsigned n;
 | 
			
		||||
    Object v, ret;
 | 
			
		||||
    GC_Node2;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    dpy = WINDOW(w)->dpy;
 | 
			
		||||
    Disable_Interrupts;
 | 
			
		||||
    XQueryTree (dpy, WINDOW(w)->win, &root, &parent, &children, &n);
 | 
			
		||||
    Enable_Interrupts;
 | 
			
		||||
    v = ret = Null;
 | 
			
		||||
    GC_Link2 (v, ret);
 | 
			
		||||
    v = Make_Window (0, dpy, root);
 | 
			
		||||
    ret = Cons (v, Null);
 | 
			
		||||
    v = Make_Window (0, dpy, parent);
 | 
			
		||||
    ret = Cons (v, ret);
 | 
			
		||||
    v = Make_Vector (n, Null);
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	Object x;
 | 
			
		||||
	
 | 
			
		||||
	x = Make_Window (0, dpy, children[i]);
 | 
			
		||||
	VECTOR(v)->data[i] = x;
 | 
			
		||||
    }
 | 
			
		||||
    ret = Cons (v, ret);
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Translate_Coordinates (src, x, y, dst) Object src, x, y, dst; {
 | 
			
		||||
    int rx, ry;
 | 
			
		||||
    Window child;
 | 
			
		||||
    Object l, t, z;
 | 
			
		||||
    GC_Node3;
 | 
			
		||||
 | 
			
		||||
    Check_Type (src, T_Window);
 | 
			
		||||
    Check_Type (dst, T_Window);
 | 
			
		||||
    if (!XTranslateCoordinates (WINDOW(src)->dpy, WINDOW(src)->win,
 | 
			
		||||
	    WINDOW(dst)->win, Get_Integer (x), Get_Integer (y), &rx, &ry,
 | 
			
		||||
	    &child))
 | 
			
		||||
	return False;
 | 
			
		||||
    l = t = P_Make_List (Make_Integer (3), Null);
 | 
			
		||||
    GC_Link3 (l, t, dst);
 | 
			
		||||
    Car (t) = Make_Integer (rx); t = Cdr (t);
 | 
			
		||||
    Car (t) = Make_Integer (ry), t = Cdr (t);
 | 
			
		||||
    z = Make_Window (0, WINDOW(dst)->dpy, child);
 | 
			
		||||
    Car (t) = z;
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    return l;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Query_Pointer (win) Object win; {
 | 
			
		||||
    Object l, t, z;
 | 
			
		||||
    Bool ret;
 | 
			
		||||
    Window root, child;
 | 
			
		||||
    int r_x, r_y, x, y;
 | 
			
		||||
    unsigned int mask;
 | 
			
		||||
    GC_Node3;
 | 
			
		||||
 | 
			
		||||
    Check_Type (win, T_Window);
 | 
			
		||||
    ret = XQueryPointer (WINDOW(win)->dpy, WINDOW(win)->win, &root, &child,
 | 
			
		||||
	&r_x, &r_y, &x, &y, &mask);
 | 
			
		||||
    t = l = P_Make_List (Make_Integer (8), Null);
 | 
			
		||||
    GC_Link3 (l, t, win);
 | 
			
		||||
    Car (t) = Make_Integer (x); t = Cdr (t);
 | 
			
		||||
    Car (t) = Make_Integer (y); t = Cdr (t);
 | 
			
		||||
    Car (t) = ret ? True : False; t = Cdr (t);
 | 
			
		||||
    z = Make_Window (0, WINDOW(win)->dpy, root);
 | 
			
		||||
    Car (t) = z; t = Cdr (t);
 | 
			
		||||
    Car (t) = Make_Integer (r_x); t = Cdr (t);
 | 
			
		||||
    Car (t) = Make_Integer (r_y); t = Cdr (t);
 | 
			
		||||
    z = Make_Window (0, WINDOW(win)->dpy, child);
 | 
			
		||||
    Car (t) = z; t = Cdr (t);
 | 
			
		||||
    z = Bits_To_Symbols ((unsigned long)mask, 1, State_Syms);
 | 
			
		||||
    Car (t) = z;
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    return l;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_window () {
 | 
			
		||||
    Define_Symbol (&Sym_Set_Attr, "set-window-attributes");
 | 
			
		||||
    Define_Symbol (&Sym_Get_Attr, "get-window-attributes");
 | 
			
		||||
    Define_Symbol (&Sym_Conf, "window-configuration");
 | 
			
		||||
    Define_Symbol (&Sym_Geo, "geometry");
 | 
			
		||||
    Generic_Define (Window, "window", "window?");
 | 
			
		||||
    Define_Primitive (P_Window_Display,   "window-display",   1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Create_Window,
 | 
			
		||||
			"xlib-create-window",                 7, 7, EVAL);
 | 
			
		||||
    Define_Primitive (P_Configure_Window,
 | 
			
		||||
			"xlib-configure-window",              2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Change_Window_Attributes,
 | 
			
		||||
			"xlib-change-window-attributes",      2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Get_Window_Attributes,
 | 
			
		||||
			"xlib-get-window-attributes",         1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Get_Geometry,     "xlib-get-geometry",1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Map_Window,       "map-window",       1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Unmap_Window,     "unmap-window",     1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Circulate_Subwindows,
 | 
			
		||||
			"circulate-subwindows",               2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Destroy_Window,   "destroy-window",   1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Destroy_Subwindows,
 | 
			
		||||
			"destroy-subwindows",                 1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Map_Subwindows,   "map-subwindows",   1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Unmap_Subwindows, "unmap-subwindows", 1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Query_Tree,       "query-tree",       1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Translate_Coordinates,
 | 
			
		||||
			"translate-coordinates",              4, 4, EVAL);
 | 
			
		||||
    Define_Primitive (P_Query_Pointer,    "query-pointer",    1, 1, EVAL);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,172 @@
 | 
			
		|||
#include "xlib.h"
 | 
			
		||||
 | 
			
		||||
static Object Sym_Pointer_Root;
 | 
			
		||||
 | 
			
		||||
static Object P_Reparent_Window (w, parent, x, y) Object w, parent, x, y; {
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    Check_Type (parent, T_Window);
 | 
			
		||||
    XReparentWindow (WINDOW(w)->dpy, WINDOW(w)->win, WINDOW(parent)->win,
 | 
			
		||||
	Get_Integer (x), Get_Integer (y));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Install_Colormap (c) Object c; {
 | 
			
		||||
    Check_Type (c, T_Colormap);
 | 
			
		||||
    XInstallColormap (COLORMAP(c)->dpy, COLORMAP(c)->cm);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Uninstall_Colormap (c) Object c; {
 | 
			
		||||
    Check_Type (c, T_Colormap);
 | 
			
		||||
    XUninstallColormap (COLORMAP(c)->dpy, COLORMAP(c)->cm);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_List_Installed_Colormaps (w) Object w; {
 | 
			
		||||
    int i, n;
 | 
			
		||||
    Colormap *ret;
 | 
			
		||||
    Object v;
 | 
			
		||||
    GC_Node;
 | 
			
		||||
 | 
			
		||||
    Check_Type (w, T_Window);
 | 
			
		||||
    ret = XListInstalledColormaps (WINDOW(w)->dpy, WINDOW(w)->win, &n);
 | 
			
		||||
    v = Make_Vector (n, Null);
 | 
			
		||||
    GC_Link (v);
 | 
			
		||||
    for (i = 0; i < n; i++) {
 | 
			
		||||
	Object c;
 | 
			
		||||
	
 | 
			
		||||
	c = Make_Colormap (0, WINDOW(w)->dpy, ret[i]);
 | 
			
		||||
	VECTOR(v)->data[i] = c;
 | 
			
		||||
    }
 | 
			
		||||
    XFree ((char *)ret);
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Set_Input_Focus (d, win, revert_to, time) Object d, win,
 | 
			
		||||
    revert_to, time; {
 | 
			
		||||
    Window focus = PointerRoot;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    if (!EQ(win, Sym_Pointer_Root))
 | 
			
		||||
	focus = Get_Window (win);
 | 
			
		||||
    XSetInputFocus (DISPLAY(d)->dpy, focus, Symbols_To_Bits (revert_to, 0,
 | 
			
		||||
	Revert_Syms), Get_Time (time));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Input_Focus (d) Object d; {
 | 
			
		||||
    Window win;
 | 
			
		||||
    int revert_to;
 | 
			
		||||
    Object ret, x;
 | 
			
		||||
    GC_Node;
 | 
			
		||||
 | 
			
		||||
    Check_Type (d, T_Display);
 | 
			
		||||
    XGetInputFocus (DISPLAY(d)->dpy, &win, &revert_to);
 | 
			
		||||
    ret = Cons (Null, Null);
 | 
			
		||||
    GC_Link (ret);
 | 
			
		||||
    x = Make_Window (0, DISPLAY(d)->dpy, win);
 | 
			
		||||
    Car (ret) = x;
 | 
			
		||||
    x = Bits_To_Symbols ((unsigned long)revert_to, 0, Revert_Syms);
 | 
			
		||||
    Cdr (ret) = x;
 | 
			
		||||
    GC_Unlink;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_General_Warp_Pointer (dpy, dst, dstx, dsty, src, srcx, srcy,
 | 
			
		||||
	srcw, srch) Object dpy, dst, dstx, dsty, src, srcx, srcy, srcw, srch; {
 | 
			
		||||
    Check_Type (dpy, T_Display);
 | 
			
		||||
    XWarpPointer (DISPLAY(dpy)->dpy, Get_Window (src), Get_Window (dst),
 | 
			
		||||
	Get_Integer (srcx), Get_Integer (srcy), Get_Integer (srcw),
 | 
			
		||||
	Get_Integer (srch), Get_Integer (dstx), Get_Integer (dsty));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Bell (argc, argv) Object *argv; {
 | 
			
		||||
    register percent = 0;
 | 
			
		||||
 | 
			
		||||
    Check_Type (argv[0], T_Display);
 | 
			
		||||
    if (argc == 2) {
 | 
			
		||||
	percent = Get_Integer (argv[1]);
 | 
			
		||||
	if (percent < -100 || percent > 100)
 | 
			
		||||
	    Range_Error (argv[1]);
 | 
			
		||||
    }
 | 
			
		||||
    XBell (DISPLAY(argv[0])->dpy, percent);
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Set_Access_Control (dpy, on) Object dpy, on; {
 | 
			
		||||
    Check_Type (dpy, T_Display);
 | 
			
		||||
    Check_Type (on, T_Boolean);
 | 
			
		||||
    XSetAccessControl (DISPLAY(dpy)->dpy, EQ(on, True));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Change_Save_Set (win, mode) Object win, mode; {
 | 
			
		||||
    Check_Type (win, T_Window);
 | 
			
		||||
    XChangeSaveSet (WINDOW(win)->dpy, WINDOW(win)->win,
 | 
			
		||||
	Symbols_To_Bits (mode, 0, Saveset_Syms));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Set_Close_Down_Mode (dpy, mode) Object dpy, mode; {
 | 
			
		||||
    Check_Type (dpy, T_Display);
 | 
			
		||||
    XSetCloseDownMode (DISPLAY(dpy)->dpy,
 | 
			
		||||
	Symbols_To_Bits (mode, 0, Closemode_Syms));
 | 
			
		||||
    return Void;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Get_Pointer_Mapping (dpy) Object dpy; {
 | 
			
		||||
    unsigned char map[256];
 | 
			
		||||
    register i, n;
 | 
			
		||||
    Object ret;
 | 
			
		||||
 | 
			
		||||
    Check_Type (dpy, T_Display);
 | 
			
		||||
    n = XGetPointerMapping (DISPLAY(dpy)->dpy, map, 256);
 | 
			
		||||
    ret = Make_Vector (n, Null);
 | 
			
		||||
    for (i = 0; i < n; i++)
 | 
			
		||||
	VECTOR(ret)->data[i] = Make_Integer (map[i]);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Object P_Set_Pointer_Mapping (dpy, map) Object dpy, map; {
 | 
			
		||||
    register i, n;
 | 
			
		||||
    register unsigned char *p;
 | 
			
		||||
    Object ret;
 | 
			
		||||
    Alloca_Begin;
 | 
			
		||||
 | 
			
		||||
    Check_Type (dpy, T_Display);
 | 
			
		||||
    Check_Type (map, T_Vector);
 | 
			
		||||
    n = VECTOR(map)->size;
 | 
			
		||||
    Alloca (p, unsigned char*, n);
 | 
			
		||||
    for (i = 0; i < n; i++)
 | 
			
		||||
	p[i] = Get_Integer (VECTOR(map)->data[i]);
 | 
			
		||||
    ret = XSetPointerMapping (DISPLAY(dpy)->dpy, p, n) == MappingSuccess ?
 | 
			
		||||
	True : False;
 | 
			
		||||
    Alloca_End;
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
elk_init_xlib_wm () {
 | 
			
		||||
    Define_Primitive (P_Reparent_Window,  "reparent-window",  4, 4, EVAL);
 | 
			
		||||
    Define_Primitive (P_Install_Colormap, "install-colormap", 1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Uninstall_Colormap,
 | 
			
		||||
			"uninstall-colormap",                 1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_List_Installed_Colormaps,
 | 
			
		||||
			"list-installed-colormaps",           1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Set_Input_Focus,  "set-input-focus",  4, 4, EVAL);
 | 
			
		||||
    Define_Primitive (P_Input_Focus,      "input-focus",      1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_General_Warp_Pointer,
 | 
			
		||||
			"general-warp-pointer",               9, 9, EVAL);
 | 
			
		||||
    Define_Primitive (P_Bell,             "bell",             1, 2, VARARGS);
 | 
			
		||||
    Define_Primitive (P_Set_Access_Control,
 | 
			
		||||
			"set-access-control",                 2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Change_Save_Set,  "change-save-set",  2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Set_Close_Down_Mode,
 | 
			
		||||
			"set-close-down-mode",                2, 2, EVAL);
 | 
			
		||||
    Define_Primitive (P_Get_Pointer_Mapping,
 | 
			
		||||
			"get-pointer-mapping",                1, 1, EVAL);
 | 
			
		||||
    Define_Primitive (P_Set_Pointer_Mapping,
 | 
			
		||||
			"set-pointer-mapping",                2, 2, EVAL);
 | 
			
		||||
    Define_Symbol(&Sym_Pointer_Root, "pointer-root");
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,287 @@
 | 
			
		|||
#include <X11/X.h>
 | 
			
		||||
#include <X11/Xlib.h>
 | 
			
		||||
#include <X11/Xutil.h>
 | 
			
		||||
 | 
			
		||||
#undef True
 | 
			
		||||
#undef False
 | 
			
		||||
 | 
			
		||||
#ifndef NeedFunctionPrototypes          /* Kludge */
 | 
			
		||||
 #error "X11 Release 3 (or earlier) no longer supported"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if XlibSpecificationRelease >= 5
 | 
			
		||||
#  define XLIB_RELEASE_5_OR_LATER
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if XlibSpecificationRelease >= 6
 | 
			
		||||
#  define XLIB_RELEASE_6_OR_LATER
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "scheme.h"
 | 
			
		||||
 | 
			
		||||
extern int T_Display;
 | 
			
		||||
extern int T_Gc;
 | 
			
		||||
extern int T_Pixel;
 | 
			
		||||
extern int T_Pixmap;
 | 
			
		||||
extern int T_Window;
 | 
			
		||||
extern int T_Font;
 | 
			
		||||
extern int T_Colormap;
 | 
			
		||||
extern int T_Color;
 | 
			
		||||
extern int T_Cursor;
 | 
			
		||||
extern int T_Atom;
 | 
			
		||||
 | 
			
		||||
#define DISPLAY(x)   ((struct S_Display *)POINTER(x))
 | 
			
		||||
#define GCONTEXT(x)  ((struct S_Gc *)POINTER(x))
 | 
			
		||||
#define PIXEL(x)     ((struct S_Pixel *)POINTER(x))
 | 
			
		||||
#define PIXMAP(x)    ((struct S_Pixmap *)POINTER(x))
 | 
			
		||||
#define WINDOW(x)    ((struct S_Window *)POINTER(x))
 | 
			
		||||
#define FONT(x)      ((struct S_Font *)POINTER(x))
 | 
			
		||||
#define COLORMAP(x)  ((struct S_Colormap *)POINTER(x))
 | 
			
		||||
#define COLOR(x)     ((struct S_Color *)POINTER(x))
 | 
			
		||||
#define CURSOR(x)    ((struct S_Cursor *)POINTER(x))
 | 
			
		||||
#define ATOM(x)      ((struct S_Atom *)POINTER(x))
 | 
			
		||||
 | 
			
		||||
struct S_Display {
 | 
			
		||||
    Object after;
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    char free;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct S_Gc {
 | 
			
		||||
    Object tag;
 | 
			
		||||
    GC gc;
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    char free;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct S_Pixel {
 | 
			
		||||
    Object tag;
 | 
			
		||||
    unsigned long pix;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct S_Pixmap {
 | 
			
		||||
    Object tag;
 | 
			
		||||
    Pixmap pm;
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    char free;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct S_Window {
 | 
			
		||||
    Object tag;
 | 
			
		||||
    Window win;
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    char free;
 | 
			
		||||
    char finalize;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct S_Font {
 | 
			
		||||
    Object name;
 | 
			
		||||
    Font id;
 | 
			
		||||
    XFontStruct *info;
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct S_Colormap {
 | 
			
		||||
    Object tag;
 | 
			
		||||
    Colormap cm;
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    char free;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct S_Color {
 | 
			
		||||
    Object tag;
 | 
			
		||||
    XColor c;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct S_Cursor {
 | 
			
		||||
    Object tag;
 | 
			
		||||
    Cursor cursor;
 | 
			
		||||
    Display *dpy;
 | 
			
		||||
    char free;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct S_Atom {
 | 
			
		||||
    Object tag;
 | 
			
		||||
    Atom atom;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum Type {
 | 
			
		||||
    T_NONE,
 | 
			
		||||
    T_INT, T_CHAR, T_PIXEL, T_PIXMAP, T_BOOL, T_FONT, T_COLORMAP, T_CURSOR,
 | 
			
		||||
    T_WINDOW, T_MASK, T_SYM, T_SHORT, T_BACKGROUND, T_BORDER
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    char *slot;
 | 
			
		||||
    char *name;
 | 
			
		||||
    enum Type type;
 | 
			
		||||
    SYMDESCR *syms;
 | 
			
		||||
    int mask;
 | 
			
		||||
} RECORD;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    Window root;
 | 
			
		||||
    int x, y, width, height, border_width, depth;
 | 
			
		||||
} GEOMETRY;
 | 
			
		||||
 | 
			
		||||
C_LINKAGE_BEGIN
 | 
			
		||||
 | 
			
		||||
extern Colormap Get_Colormap P_((Object));
 | 
			
		||||
extern Cursor Get_Cursor P_((Object));
 | 
			
		||||
extern Drawable Get_Drawable P_((Object, Display**));
 | 
			
		||||
extern Font Get_Font P_((Object));
 | 
			
		||||
extern int Get_Screen_Number P_((Display*, Object));
 | 
			
		||||
extern Object Get_Event_Args P_((XEvent*));
 | 
			
		||||
extern Pixmap Get_Pixmap P_((Object));
 | 
			
		||||
extern Time Get_Time P_((Object));
 | 
			
		||||
extern Window Get_Window P_((Object));
 | 
			
		||||
extern XColor *Get_Color P_((Object));
 | 
			
		||||
extern unsigned long Get_Pixel P_((Object));
 | 
			
		||||
extern void Destroy_Event_Args P_((Object));
 | 
			
		||||
extern int Encode_Event P_((Object));
 | 
			
		||||
extern int Match_X_Obj P_((ELLIPSIS));
 | 
			
		||||
extern void Open_Font_Maybe P_((Object));
 | 
			
		||||
extern Object Make_Atom P_((Atom));
 | 
			
		||||
extern Object Make_Color P_((unsigned int, unsigned int, unsigned int));
 | 
			
		||||
extern Object Make_Colormap P_((int, Display*, Colormap));
 | 
			
		||||
extern Object Make_Cursor P_((Display*, Cursor));
 | 
			
		||||
extern Object Make_Cursor_Foreign P_((Display*, Cursor));
 | 
			
		||||
extern Object Make_Display P_((int, Display*));
 | 
			
		||||
extern Object Make_Font P_((Display*, Object, Font, XFontStruct*));
 | 
			
		||||
extern Object Make_Font_Foreign P_((Display*, Object, Font, XFontStruct*));
 | 
			
		||||
extern Object Make_Gc P_((int, Display*, GC));
 | 
			
		||||
extern Object Make_Pixel P_((unsigned long));
 | 
			
		||||
extern Object Make_Pixmap P_((Display*, Pixmap));
 | 
			
		||||
extern Object Make_Pixmap_Foreign P_((Display*, Pixmap));
 | 
			
		||||
extern Object Make_Window P_((int, Display*, Window));
 | 
			
		||||
extern Object P_Close_Display P_((Object));
 | 
			
		||||
extern Object P_Close_Font P_((Object));
 | 
			
		||||
extern Object P_Destroy_Window P_((Object));
 | 
			
		||||
extern Object P_Free_Colormap P_((Object));
 | 
			
		||||
extern Object P_Free_Cursor P_((Object));
 | 
			
		||||
extern Object P_Free_Gc P_((Object));
 | 
			
		||||
extern Object P_Free_Pixmap P_((Object));
 | 
			
		||||
extern Object P_Window_Unique_Id P_((Object));
 | 
			
		||||
extern Object Record_To_Vector
 | 
			
		||||
    P_((RECORD*, int, Object, Display*, unsigned long));
 | 
			
		||||
extern unsigned long Vector_To_Record P_((Object, int, Object, RECORD*));
 | 
			
		||||
 | 
			
		||||
C_LINKAGE_END
 | 
			
		||||
 | 
			
		||||
extern XSetWindowAttributes SWA;
 | 
			
		||||
extern XWindowChanges WC;
 | 
			
		||||
extern XGCValues GCV;
 | 
			
		||||
extern GEOMETRY GEO;
 | 
			
		||||
extern XWindowAttributes WA;
 | 
			
		||||
extern XFontStruct FI;
 | 
			
		||||
extern XCharStruct CI;
 | 
			
		||||
extern XWMHints WMH;
 | 
			
		||||
extern XSizeHints SZH;
 | 
			
		||||
 | 
			
		||||
extern Set_Attr_Size, Conf_Size, GC_Size, Geometry_Size, Win_Attr_Size,
 | 
			
		||||
    Font_Info_Size, Char_Info_Size, Wm_Hints_Size, Size_Hints_Size;
 | 
			
		||||
extern RECORD Set_Attr_Rec[], Conf_Rec[], GC_Rec[], Geometry_Rec[],
 | 
			
		||||
    Win_Attr_Rec[], Font_Info_Rec[], Char_Info_Rec[], Wm_Hints_Rec[],
 | 
			
		||||
    Size_Hints_Rec[];
 | 
			
		||||
 | 
			
		||||
extern SYMDESCR Func_Syms[], Bit_Grav_Syms[], Event_Syms[], Error_Syms[],
 | 
			
		||||
    Grav_Syms[], Backing_Store_Syms[], Class_Syms[], Stack_Mode_Syms[],
 | 
			
		||||
    Line_Style_Syms[], State_Syms[], Cap_Style_Syms[], Join_Style_Syms[],
 | 
			
		||||
    Map_State_Syms[], Fill_Style_Syms[], Fill_Rule_Syms[], Arc_Mode_Syms[],
 | 
			
		||||
    Subwin_Mode_Syms[], Button_Syms[], Cross_Mode_Syms[], Cross_Detail_Syms[],
 | 
			
		||||
    Focus_Detail_Syms[], Place_Syms[], Visibility_Syms[], Prop_Syms[],
 | 
			
		||||
    Mapping_Syms[], Direction_Syms[], Shape_Syms[], Propmode_Syms[],
 | 
			
		||||
    Grabstatus_Syms[], Allow_Events_Syms[], Revert_Syms[], Polyshape_Syms[],
 | 
			
		||||
    Initial_State_Syms[], Bitmapstatus_Syms[], Circulate_Syms[],
 | 
			
		||||
    Ordering_Syms[], Byte_Order_Syms[], Saveset_Syms[], Closemode_Syms[];
 | 
			
		||||
 | 
			
		||||
extern Object Sym_None, Sym_Now, Sym_Char_Info, Sym_Conf;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if __STDC__ || defined(ANSI_CPP)
 | 
			
		||||
#  define conc(a,b) a##b
 | 
			
		||||
#  define conc3(a,b,c) a##b##c
 | 
			
		||||
#else
 | 
			
		||||
#  define _identity(x) x
 | 
			
		||||
#  define conc(a,b) _identity(a)b
 | 
			
		||||
#  define conc3(a,b,c) conc(conc(a,b),c)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Generic_Predicate (Pixmap) generates:
 | 
			
		||||
 *
 | 
			
		||||
 *   int T_Pixmap;
 | 
			
		||||
 *
 | 
			
		||||
 *   static Object P_Pixmapp (x) Object x; {
 | 
			
		||||
 *        return TYPE(x) == T_Pixmap ? True : False;
 | 
			
		||||
 *   }
 | 
			
		||||
 */
 | 
			
		||||
#define Generic_Predicate(type) int conc(T_,type);\
 | 
			
		||||
\
 | 
			
		||||
static Object conc3(P_,type,p) (x) Object x; {\
 | 
			
		||||
    return TYPE(x) == conc(T_,type) ? True : False;\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Generic_Equal (Pixmap, PIXMAP, pm) generates:
 | 
			
		||||
 *
 | 
			
		||||
 *    static Pixmap_Equal (x, y) Object x, y; {
 | 
			
		||||
 *        return PIXMAP(x)->pm == PIXMAP(y)->field
 | 
			
		||||
 *            && !PIXMAP(x)->free && !PIXMAP(y)->free;
 | 
			
		||||
 *    }
 | 
			
		||||
 */
 | 
			
		||||
#define Generic_Equal(type,cast,field) static conc(type,_Equal) (x, y)\
 | 
			
		||||
	Object x, y; {\
 | 
			
		||||
    return cast(x)->field == cast(y)->field\
 | 
			
		||||
	&& !cast(x)->free && !cast(y)->free;\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Same as above, but doesn't check for ->free:
 | 
			
		||||
 */
 | 
			
		||||
#define Generic_Simple_Equal(type,cast,field) static conc(type,_Equal) (x, y)\
 | 
			
		||||
	Object x, y; {\
 | 
			
		||||
    return cast(x)->field == cast(y)->field;\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Same as above, but also checks ->dpy
 | 
			
		||||
 */
 | 
			
		||||
#define Generic_Equal_Dpy(type,cast,field) static conc(type,_Equal)\
 | 
			
		||||
	    (x, y)\
 | 
			
		||||
	Object x, y; {\
 | 
			
		||||
    return cast(x)->field == cast(y)->field && cast(x)->dpy == cast(y)->dpy\
 | 
			
		||||
	&& !cast(x)->free && !cast(y)->free;\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Generic_Print (Pixmap, "#[pixmap %u]", PIXMAP(x)->pm) generates:
 | 
			
		||||
 *
 | 
			
		||||
 *    static Pixmap_Print (x, port, raw, depth, len) Object x, port; {
 | 
			
		||||
 *        Printf (port, "#[pixmap %u]", PIXMAP(x)->pm);
 | 
			
		||||
 *    }
 | 
			
		||||
 */
 | 
			
		||||
#define Generic_Print(type,fmt,how) static conc(type,_Print)\
 | 
			
		||||
	(x, port, raw, depth, len) Object x, port; {\
 | 
			
		||||
    Printf (port, fmt, (unsigned)how);\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Generic_Define (Pixmap, "pixmap", "pixmap?") generates:
 | 
			
		||||
 *
 | 
			
		||||
 *    T_Pixmap = Define_Type (0, "pixmap", NOFUNC, sizeof (struct S_Pixmap),
 | 
			
		||||
 *        Pixmap_Equal, Pixmap_Equal, Pixmap_Print, NOFUNC);
 | 
			
		||||
 *    Define_Primitive (P_Pixmapp, "pixmap?", 1, 1, EVAL);
 | 
			
		||||
 */
 | 
			
		||||
#define Generic_Define(type,name,pred) conc(T_,type) =\
 | 
			
		||||
    Define_Type (0, name, NOFUNC, sizeof (struct conc(S_,type)),\
 | 
			
		||||
	conc(type,_Equal), conc(type,_Equal), conc(type,_Print), NOFUNC);\
 | 
			
		||||
    Define_Primitive (conc3(P_,type,p), pred, 1, 1, EVAL);
 | 
			
		||||
 | 
			
		||||
/* Generic_Get_Display (Pixmap, PIXMAP) generates:
 | 
			
		||||
 *
 | 
			
		||||
 *    static Object P_Pixmap_Display (x) Object x; {
 | 
			
		||||
 *        Check_Type (x, T_Pixmap);
 | 
			
		||||
 *        return Make_Display (PIXMAP(x)->dpy);
 | 
			
		||||
 *    }
 | 
			
		||||
 */
 | 
			
		||||
#define Generic_Get_Display(type,cast) static Object conc3(P_,type,_Display)\
 | 
			
		||||
	(x) Object x; {\
 | 
			
		||||
    Check_Type (x, conc(T_,type));\
 | 
			
		||||
    return Make_Display (0, cast(x)->dpy);\
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue