static int _xgeDpyClose(Display* dpy, XExtCodes* codes) { XExtDisplayInfo *info = _xgeFindDisplay(dpy); if (info->data != NULL) { XGEData* xge_data = (XGEData*)info->data; if (xge_data->extensions) { XGEExtList current, next; current = xge_data->extensions; while(current) { next = current->next; Xfree(current); current = next; } } XFree(xge_data->vers); XFree(xge_data); } return XextRemoveDisplay(xge_info, dpy); }
/* * Extensions need to register callbacks for their events. */ Bool _X_HIDDEN xgeExtRegister(Display* dpy, int offset, XExtensionHooks* callbacks) { XGEExtNode* newExt; XGEData* xge_data; XExtDisplayInfo* info = _xgeFindDisplay(dpy); if (!info) return False; /* error! */ if (!_xgeCheckExtInit(dpy, info)) return False; xge_data = (XGEData*)info->data; newExt = (XGEExtNode*)Xmalloc(sizeof(XGEExtNode)); if (!newExt) { fprintf(stderr, "xgeExtRegister: Failed to alloc memory.\n"); return False; } newExt->extension = offset; newExt->hooks = callbacks; newExt->next = xge_data->extensions; xge_data->extensions = newExt; return True; }
/* * protocol to Xlib event conversion routine. */ static Bool _xgeWireToEvent(Display* dpy, XEvent* re, xEvent *event) { int extension; XGEExtList it; XExtDisplayInfo* info = _xgeFindDisplay(dpy); if (!info || !info->data) return False; /* _xgeCheckExtInit() calls LockDisplay, leading to a SIGABRT. Well, I guess we don't need the data we get in CheckExtInit anyway if (!_xgeCheckExtInit(dpy, info)) return False; */ extension = ((xGenericEvent*)event)->extension; it = ((XGEData*)info->data)->extensions; while(it) { if (it->extension == extension) { return (it->hooks->wire_to_event(dpy, re, event)); } it = it->next; } return False; }
/* Set event_base and error_base to the matching values for XGE. * Note that since XGE doesn't use any errors and events, the actual return * value is of limited use. */ Bool XGEQueryExtension(Display* dpy, int* event_base, int* error_base) { XExtDisplayInfo* info = _xgeFindDisplay(dpy); if (!_xgeCheckExtInit(dpy, info)) return False; *event_base = info->codes->first_event; *error_base = info->codes->first_error; return True; }
/* Get XGE version number. * Doesn't actually get it from server, that should have been done beforehand * already */ Bool XGEQueryVersion(Display* dpy, int *major_version, int *minor_version) { XExtDisplayInfo* info = _xgeFindDisplay(dpy); if (!info) return False; if (!_xgeCheckExtInit(dpy, info)) return False; *major_version = ((XGEData*)info->data)->vers->major_version; *minor_version = ((XGEData*)info->data)->vers->minor_version; return True; }
/* * xlib event to protocol conversion routine. */ static Status _xgeEventToWire(Display* dpy, XEvent* re, xEvent* event) { int extension; XGEExtList it; XExtDisplayInfo* info = _xgeFindDisplay(dpy); if (!info || !info->data) return 1; /* error! */ extension = ((XGenericEvent*)re)->extension; it = ((XGEData*)info->data)->extensions; while(it) { if (it->extension == extension) { return (it->hooks->event_to_wire(dpy, re, event)); } it = it->next; } return Success; }