/* Copyright 2001-2003 by Norbert Freudemann, David Frese */ #include "xlib.h" s48_value scx_Intern_Atom(s48_value display, s48_value name, s48_value only_if_exists) { Atom a = XInternAtom(scx_extract_display(display), s48_extract_string(name), S48_EXTRACT_BOOLEAN(only_if_exists)); return scx_enter_atom(a); } s48_value scx_Intern_Atoms(s48_value display, s48_value names, s48_value only_if_exists) { int i, n = s48_list_length(names); char* cnames[n]; Atom atoms[n]; for (i = 0; i < n; i++) cnames[i] = s48_extract_string(names); if (!XInternAtoms(scx_extract_display(display), cnames, n, S48_EXTRACT_BOOLEAN(only_if_exists), atoms)) return S48_FALSE; else { s48_value l = S48_NULL; S48_DECLARE_GC_PROTECT(1); S48_GC_PROTECT_1(l); for (i = n-1; i >= 0; i--) l = s48_cons(scx_enter_atom(atoms[i]), l); return l; } } s48_value scx_Get_Atom_Name(s48_value display, s48_value a) { char* s; s48_value str; s = XGetAtomName(scx_extract_display(display), scx_extract_atom(a)); str = s48_enter_string(s); XFree(s); return str; } s48_value scx_List_Properties(s48_value display, s48_value window) { int n, i; Atom *atoms; s48_value l = S48_NULL; S48_DECLARE_GC_PROTECT(1); atoms = XListProperties (scx_extract_display(display), scx_extract_window(window), &n); S48_GC_PROTECT_1(l); for (i = n-1; i >= 0; i--) l = s48_cons(scx_enter_atom(atoms[i]), l); S48_GC_UNPROTECT(); XFree ((char*)atoms); return l; } s48_value scx_Rotate_Window_Properties(s48_value display, s48_value window, s48_value properties, s48_value delta) { int i, n = s48_list_length(properties); Atom p[n]; for (i = 0; i < n; i++) { p[i] = scx_extract_atom(S48_CAR(properties)); properties = S48_CDR(properties); } XRotateWindowProperties(scx_extract_display(display), scx_extract_window(window), p, n, s48_extract_integer(delta)); return S48_UNSPECIFIC; } s48_value scx_Delete_Property(s48_value display, s48_value window, s48_value prop) { XDeleteProperty(scx_extract_display(display), scx_extract_window(window), scx_extract_atom(prop)); return S48_UNSPECIFIC; } void scx_extract_property(s48_value p, Atom* type, int* format, char** data, int* nelements) { int i; s48_value d = S48_RECORD_REF(p, 2); s48_check_record_type(p, s48_get_imported_binding("scx-property")); *type = scx_extract_atom(S48_RECORD_REF(p, 0)); *format = S48_EXTRACT_ENUM(S48_RECORD_REF(p, 1), "scx-property-format"); switch (*format) { case 0: *format = 8; *nelements = S48_STRING_LENGTH(d); *data = (char*)malloc(*nelements); strcpy(*data, s48_extract_string(d)); break; case 1: *format = 16; *nelements = s48_list_length(d); *data = (char*)malloc(2 * (*nelements)); for (i = 0; i < *nelements; i++) { (*(short**)data)[i] = s48_extract_integer(S48_CAR(d)); d = S48_CDR(d); } break; case 2: *format = 32; *nelements = s48_list_length(d); *data = (char*)malloc(4 * (*nelements)); for (i = 0; i < *nelements; i++) { (*(long**)data)[i] = s48_extract_integer(S48_CAR(d)); d = S48_CDR(d); } break; } } s48_value scx_enter_property(Atom type, int format, char* data, int nelements) { s48_value p = s48_make_record(s48_get_imported_binding("scx-property")); s48_value l = S48_NULL; int i; S48_DECLARE_GC_PROTECT(2); S48_GC_PROTECT_2(p, l); S48_RECORD_SET(p, 0, scx_enter_atom(type)); switch (format) { case 8: S48_RECORD_SET(p, 1, S48_ENTER_ENUM(0, "scx-property-formats")); S48_RECORD_SET(p, 2, s48_enter_substring(data, nelements)); break; case 16: S48_RECORD_SET(p, 1, S48_ENTER_ENUM(1, "scx-property-formats")); for (i = nelements-1; i >= 0; i--) l = s48_cons(s48_enter_integer(((short*)data)[i]), l); S48_RECORD_SET(p, 2, l); break; case 32: S48_RECORD_SET(p, 1, S48_ENTER_ENUM(2, "scx-property-formats")); for (i = nelements-1; i >= 0; i--) l = s48_cons(s48_enter_integer(((long*)data)[i]), l); S48_RECORD_SET(p, 2, l); break; default: // should not be possible S48_RECORD_SET(p, 1, s48_enter_integer(format)); S48_RECORD_SET(p, 2, S48_FALSE); } S48_GC_UNPROTECT(); return p; } s48_value scx_Get_Window_Property(s48_value display, s48_value window, s48_value atom, s48_value start, s48_value len, s48_value deletep, s48_value req_type) { Atom actual_type; int format, i; unsigned long nitems, bytes_left; unsigned char* data = NULL; if (XGetWindowProperty (scx_extract_display(display), scx_extract_window(window), scx_extract_atom(atom), s48_extract_integer(start), s48_extract_integer(len), S48_EXTRACT_BOOLEAN(deletep), scx_extract_atom(req_type), &actual_type, &format, &nitems, &bytes_left, &data) == Success) { s48_value p = scx_enter_property(actual_type, format, data, nitems); s48_value res = S48_NULL; S48_DECLARE_GC_PROTECT(1); XFree(data); S48_GC_PROTECT_1(p); res = s48_cons(s48_enter_integer(bytes_left), p); S48_GC_UNPROTECT(); return res; } else // Property does not exists return S48_FALSE; } #define scx_extract_change_property_mode(x) \ S48_EXTRACT_ENUM(x, "scx-change-property-mode") s48_value scx_Change_Property(s48_value display, s48_value window, s48_value atom, s48_value mode, s48_value property) { Atom type; int format, nelements; char* data; scx_extract_property(property, &type, &format, &data, &nelements); XChangeProperty(scx_extract_display(display), scx_extract_window(window), scx_extract_atom(atom), type, format, scx_extract_change_property_mode(mode), data, nelements); free(data); return S48_UNSPECIFIC; } s48_value scx_Set_Selection_Owner(s48_value display, s48_value selection, s48_value owner, s48_value time) { XSetSelectionOwner(scx_extract_display(display), scx_extract_atom(selection), scx_extract_window(owner), scx_extract_time(time)); return S48_UNSPECIFIC; } s48_value scx_Get_Selection_Owner(s48_value display, s48_value selection) { return scx_enter_window(XGetSelectionOwner(scx_extract_display(display), scx_extract_atom(selection))); } s48_value scx_Convert_Selection(s48_value display, s48_value selection, s48_value target, s48_value property, s48_value requestor, s48_value time) { XConvertSelection(scx_extract_display(display), scx_extract_atom(selection), scx_extract_atom(target), scx_extract_atom(property), scx_extract_window(requestor), scx_extract_time(time)); return S48_UNSPECIFIC; } void scx_init_property(void) { S48_EXPORT_FUNCTION(scx_Intern_Atom); S48_EXPORT_FUNCTION(scx_Intern_Atoms); S48_EXPORT_FUNCTION(scx_Get_Atom_Name); S48_EXPORT_FUNCTION(scx_List_Properties); S48_EXPORT_FUNCTION(scx_Rotate_Window_Properties); S48_EXPORT_FUNCTION(scx_Delete_Property); S48_EXPORT_FUNCTION(scx_Get_Window_Property); S48_EXPORT_FUNCTION(scx_Change_Property); S48_EXPORT_FUNCTION(scx_Set_Selection_Owner); S48_EXPORT_FUNCTION(scx_Get_Selection_Owner); S48_EXPORT_FUNCTION(scx_Convert_Selection); }