| @@ -30,9 +30,8 @@ typedef AEffect* (*PluginEntryProc) (audioMasterCallback audioMaster); | |||||
| #ifndef YAC_WIN32 | #ifndef YAC_WIN32 | ||||
| // https://github.com/Ardour/ardour/blob/master/gtk2_ardour/linux_vst_gui_support.cc | // https://github.com/Ardour/ardour/blob/master/gtk2_ardour/linux_vst_gui_support.cc | ||||
| long getXWindowProperty(Display* display, Window window, Atom atom) | |||||
| void *getXWindowProperty(Display* display, Window window, Atom atom) | |||||
| { | { | ||||
| long result = 0; | |||||
| int userSize; | int userSize; | ||||
| unsigned long bytes; | unsigned long bytes; | ||||
| unsigned long userCount; | unsigned long userCount; | ||||
| @@ -47,27 +46,53 @@ long getXWindowProperty(Display* display, Window window, Atom atom) | |||||
| // XErrorHandler olderrorhandler = XSetErrorHandler(TempErrorHandler); | // XErrorHandler olderrorhandler = XSetErrorHandler(TempErrorHandler); | ||||
| printf("xxx getXWindowProperty: window=%lu\n", window); | |||||
| XGetWindowProperty(display, | XGetWindowProperty(display, | ||||
| window, | |||||
| atom, | |||||
| 0, | |||||
| 2, | |||||
| false, | |||||
| AnyPropertyType, | |||||
| &userType, | |||||
| &userSize, | |||||
| &userCount, | |||||
| &bytes, | |||||
| &data); | |||||
| if(userCount == 1) | |||||
| result = *(long*)data; | |||||
| window, | |||||
| atom, | |||||
| 0/*offset*/, | |||||
| 2/*length*/, | |||||
| false/*delete*/, | |||||
| AnyPropertyType, | |||||
| &userType/*actual_type_return*/, | |||||
| &userSize/*actual_format_return*/, | |||||
| &userCount/*nitems_return*/, | |||||
| &bytes/*bytes_after_return / partial reads*/, | |||||
| &data); | |||||
| union { | |||||
| long l[2]; | |||||
| void *any; | |||||
| } uptr; | |||||
| uptr.any = 0; | |||||
| printf("xxx getXWindowProperty: userSize=%d userCount=%lu bytes=%lu data=%p\n", userSize, userCount, bytes, data); | |||||
| if(NULL != data) | |||||
| { | |||||
| if(userCount == 1) | |||||
| { | |||||
| // 32-bit | |||||
| uptr.l[0] = *(long*)data; | |||||
| uptr.l[1] = 0; | |||||
| } | |||||
| else if(2 == userCount) | |||||
| { | |||||
| // 64-bit | |||||
| uptr.l[0] = ((long*)data)[0]; | |||||
| uptr.l[1] = ((long*)data)[1]; | |||||
| } | |||||
| XFree(data); | |||||
| } | |||||
| // XSetErrorHandler(olderrorhandler); | // XSetErrorHandler(olderrorhandler); | ||||
| /*Hopefully this will return zero if the property is not set*/ | /*Hopefully this will return zero if the property is not set*/ | ||||
| printf("xxx getXWindowProperty: return callback addr=%p\n", uptr.any); | |||||
| return result; | |||||
| return uptr.any; | |||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -161,7 +186,7 @@ void open_and_close(void) { | |||||
| sleep(2); | sleep(2); | ||||
| #ifndef YAC_WIN32 | #ifndef YAC_WIN32 | ||||
| long result = getXWindowProperty(d, w, XInternAtom(d, "_XEventProc", false)); | |||||
| void *result = getXWindowProperty(d, w, XInternAtom(d, "_XEventProc", false)); | |||||
| if(result == 0) | if(result == 0) | ||||
| { | { | ||||
| printf("xxx no XEventProc found\n"); | printf("xxx no XEventProc found\n"); | ||||