#include "xlib.h" #include "scheme48.h" s48_value Sym_Now; Generic_Predicate (Atom) Generic_Simple_Equal (Atom, ATOM, atom) Generic_Print (Atom, "#[atom %lu]", ATOM(x)->atom) /* s48_value Make_Atom (a) Atom a; { s48_value atom; if (a == None) return Sym_None; atom = Find_Object (T_Atom, (GENERIC)0, Match_X_Obj, a); if (S48_NULL_P (atom)) { atom = Alloc_Object (sizeof (struct S_Atom), T_Atom, 0); ATOM(atom)->tag = S48_NULL; ATOM(atom)->atom = a; Register_Object (atom, (GENERIC)0, (PFO)0, 0); } return atom; } */ /* Should be used with care */ s48_value Intern_Atom (s48_value Xdisplay, s48_value name){ Atom a = XInternAtom(EXTRACT_DISPLAY(Xdisplay), s48_extract_string(name), 0); return s48_enter_integer((long)a); } s48_value Find_Atom (s48_value Xdisplay, s48_value name){ Atom a = XInternAtom (EXTRACT_DISPLAY(Xdisplay), s48_extract_string(name), 1); if (a == None){ return s48_value s48_enter_symbol(none); }else{ return a; } } s48_value Atom_Name (s48_value Xdisplay, s48_value a) { register char *s; // not used: Disalbe_Interrupts s = XGetAtomName (EXTRACT_DISPLAY Xdisplay, a); // not used: Enable_Interrupts return s48_enter_string (s); } s48_value List_Properties (s48_value Xwindow, x48_value Xdisplay){ int n, i; Atom *ap; s48_value v; S48_DECLARE_GC_PROTECT(1); //not used: Disable_Interrupts ap = XListProperties (EXTRACT_DISPLAY(Xdisplay), EXTRACT_WINDOW(Xwindow), &n); //not used: Enable_Interrupts v = s48_make_vector (n, S48_NULL); S48_GC_PROTECT_1 (v); for (i = 0; i < n; i++) { S48_VECTOR_SET(v, i, s48_enter_integer((long) ap[i])) } S48_GC_UNPROTECT; XFree ((char *)ap); return v; } s48_value Get_Property(s48_value Xwindow, s48_value Xdisplay, s48_value Xatom_prop, s48_value Xatom_type, s48_value start, s48_value len, s48_value deletep) { Atom req_type = AnyPropertyType, actual_type_ret; int format_ret, i; unsigned long nitems_ret, bytes_left_ret; unsigned char* prop_ret; s48_value ret, x; S48_DECLARE_GC_PROTECT(2); if (!S48_EQ_P(Xatom_type, S48_FALSE)){ req_type = s48_extract_integer(Xatom_type); } //not used: Disable_Interrupts XGetWindowProperty (EXTRACT_DISPLAY(Xdisplay), EXTRACT_WINDOW(Xwindow), s48_extract_integer(Xatom_prop), s48_extract_integer (start), s48_extract_integer (len), S48_EXTRACT_BOOLEAN(deletep), req_type, &actual_type_ret, &format_ret, &nitems_ret, &bytes_left_ret, &prop_ret); S48_GC_PROTECT_2 (ret, v); ret = s48_cons(s48_enter_integer(bytes_left_ret), S48_NULL); if (nitems_ret){ if (format_ret == 8){ char d[nitems_ret+1]; bcopy((char *)data, d, (int)nitems_ret); d[nitems_ret+1] = (char)0; ret = s48_cons (s48_enter_string(d), ret); }else{ s48_value v; // Assumes short is 16 bits and int is 32 bits. v = s48_make_vector (nitems_ret, S48_NULL); for (i = 0; i < nitems_ret; i++){ x = s48_enter_integer (format_ret == 16 ? *((short *)prop_ret + i) : *((int *)prop_ret + i)); S48_VECTOR_SET(v, i, x;) } ret = s48_cons(v, ret); } }else{ ret = (S48_NULL, ret); } ret = s48_cons(s48_enter_integer((long)format_ret), ret); ret = s48_cons(s48_enter_integer((long)actual_type_ret), ret); S48_GC_UNPROTECT; return ret; } s48_value Change_Property(s48_value Xdisplay, s48_value Xwindow, s48_value Xatom_prop, s48_value Xatom_type, s48_value format, s48_value mode, s48_value data){ int i, x, f, m, nitems; char* buf; m = Symbol_To_Bit (mode, Propmode_Syms); f = (int)s48_extract_integer(format); switch (f) { case 8: buf = s48_extract_string(data); nitems = strlen(buf); break; case 16: case 32: nitems = S48_VECTOR_LENGTH(data); // Alloca (buf, char*, nitems * (f / sizeof (char))); for (i = 0; i < nitems; i++) { x = (int)s48_extract_integer(s48_VECTOR_REF(data, nitems)); if (f == 16) { *((short *)buf + i) = x; /* Assumes short is 16 bits */ }else *((int *)buf + i) = x; } /* and int is 32 bits. */ break; } XChangeProperty (EXTRACT_DISPLAY(Xdisplay), EXTRACT_WINDOW(Xwindow), s48_extract_integer(Xatom_prop), s48_extract_integer(Xatom_type), f, m, (unsigned char *)buf, nitems); return S48_UNSPECIFIC; } s48_value P_Delete_Property (s48_value Xdisplay, s48_value Xwindow, s48_value Xatom_prop){ XDeleteProperty (EXTRACT_DISPLAY(Xdisplay), EXTRACT_WINDOW(Xwindow), s48_extract_integer(Xatom_prop)); return S48_UNSPECIFIC; } s48_value Rotate_Properties (s48_value Xdisplay, s48_value Xwindow, s48_value Xatom_vec, s48_value delta){ int n = S48_VECTOR_LENGTH(Xatom_vec), i; Atom p[n]; for (i = 0; i < n; i++) { p[i] = s48_extract_integer(S48_VECTOR_REF(Xatom_vec, i)); } XRotateWindowProperties(EXTRACT_DISPLAY(Xdisplay), EXTRACT_WINDOW(Xwindwo), p, n, (int)s48_extract_integer(delta)); return S48_UNSPECIFIC; } s48_value Set_Selection_Owner (s48_value Xdisplay, s48_value Xatom_s, s48_value Xwindow_owner, s58_value time){ XSetSelectionOwner (EXTRACT_DISPLAY(Xdisplay), s48_extract_integer(Xatom_s), EXTRACT_WINDOW(Xwindow_owner), EXTRACT_TIME(time)); return S48_UNSPECIFIC; } /* static s48_value P_Selection_Owner (d, s) s48_value 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)); } */ s48_value Selection_Owner (s48_value Xdisplay, s48_value Xatom_s){ return ENTER_WINDOW (XGetSelectionOwner (EXTRACT_DISPLAY(Xdisplay), s48_extract_integer(Xatom_s))); } /* static s48_value P_Convert_Selection (s, target, prop, w, time) s48_value s, target, prop, w, time; { Atom p = None; Check_Type (s, T_Atom); Check_Type (target, T_Atom); if (!S48_EQ_P(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; } */ s48_value Convert_Selection (s48_value Xdisplay, s48_value Xatom_s, s48_value Xatom_t, s48_value Xatom_p, s48_value Xwindow, s48_value time){ Atom p = None; if (!S48_EQ_P(prop, Sym_None)) { Check_Type (prop, T_Atom); p = ATOM(prop)->atom; } XConvertSelection(EXTRACT_DISPLAY(Xdisplay), EXTRACT_ATOM(Xatom_s), EXTRACT_ATOM(Xatom_t), EXTRACT_ATOM(Xatom_p), EXTRACT_WINDOW(Xwindow), EXTRACT_TIME(time)); return S48_UNSPECIFIC; } 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); }