Browse Source

fix _XEventProc property query (64bit)

pull/1639/head
bsp2 6 years ago
parent
commit
aad6e574ee
1 changed files with 65 additions and 37 deletions
  1. +65
    -37
      other/vst2_debug_host/vst2_debug_host.cpp

+ 65
- 37
other/vst2_debug_host/vst2_debug_host.cpp View File

@@ -36,31 +36,22 @@
typedef AEffect* (*PluginEntryProc) (audioMasterCallback audioMaster); 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
void *getXWindowProperty(Display* display, Window window, Atom atom)
{
static void *loc_getProperty(Display *_display, Window _window, const char *_name) {
int userSize; int userSize;
unsigned long bytes; unsigned long bytes;
unsigned long userCount; unsigned long userCount;
unsigned char *data; unsigned char *data;
Atom userType; Atom userType;
// LXVST_xerror = false;
Atom atom = XInternAtom(_display, _name, False);


/*Use our own Xerror handler while we're in here - in an
attempt to stop the brain dead default Xerror behaviour of
qutting the entire application because of e.g. an invalid
window ID*/

// XErrorHandler olderrorhandler = XSetErrorHandler(TempErrorHandler);

printf("xxx getXWindowProperty: window=%lu\n", window);

XGetWindowProperty(display,
window,
// (note) 64bit properties need to be read with two XGetWindowProperty() calls.
// When using just one call and setting the 'length' to 2, the upper 32bit (second array element) will be 0xFFFFffff.
XGetWindowProperty(_display,
_window,
atom, atom,
0/*offset*/, 0/*offset*/,
2/*length*/,
false/*delete*/,
1/*length*/,
False/*delete*/,
AnyPropertyType, AnyPropertyType,
&userType/*actual_type_return*/, &userType/*actual_type_return*/,
&userSize/*actual_format_return*/, &userSize/*actual_format_return*/,
@@ -69,39 +60,63 @@ void *getXWindowProperty(Display* display, Window window, Atom atom)
&data); &data);


union { union {
long l[2];
uint32_t ui[2];
void *any; void *any;
} uptr; } uptr;
uptr.any = 0; uptr.any = 0;


printf("xxx getXWindowProperty: userSize=%d userCount=%lu bytes=%lu data=%p\n", userSize, userCount, bytes, data);
printf("xxx debug_host: loc_getProperty: LOWER userSize=%d userCount=%lu bytes=%lu data=%p\n", userSize, userCount, bytes, data);


if(NULL != data) if(NULL != data)
{ {
if(userCount == 1)
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];
}
if(userCount >= 2)
{
printf("xxx debug_host: loc_getProperty: lo=0x%08x hi=0x%08x\n", ((uint32_t*)data)[0], ((uint32_t*)data)[1]);
}


XFree(data);
}
// lower 32-bit
uptr.ui[0] = *(long*)data;
uptr.ui[1] = 0;

printf("xxx lower=0x%08x\n", uptr.ui[0]);
// // printf("xxx upper=0x%08x\n", uptr.ui[1]);

XFree(data);


// XSetErrorHandler(olderrorhandler);
// // if(userCount >= 2)
{
XGetWindowProperty(_display,
_window,
atom,
1/*offset*/,
1/*length*/,
False/*delete*/,
AnyPropertyType,
&userType/*actual_type_return*/,
&userSize/*actual_format_return*/,
&userCount/*nitems_return*/,
&bytes/*bytes_after_return / partial reads*/,
&data);

printf("xxx lglw_linux: loc_getProperty: UPPER userSize=%d userCount=%lu bytes=%lu data=%p\n", userSize, userCount, bytes, data);
if(NULL != data)
{
// upper 32-bit
uptr.ui[1] = *(long*)data;
printf("xxx upper=0x%08x\n", uptr.ui[1]);
XFree(data);
}
}
}
}


/*Hopefully this will return zero if the property is not set*/
printf("xxx getXWindowProperty: return callback addr=%p\n", uptr.any);
printf("xxx debug_host: loc_getProperty: return value=%p\n", uptr.any);


return uptr.any; return uptr.any;
} }
#endif
#endif // !YAC_WIN32




static VstIntPtr VSTCALLBACK HostCallback(AEffect* effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt) { static VstIntPtr VSTCALLBACK HostCallback(AEffect* effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt) {
@@ -208,6 +223,19 @@ void open_and_close(void) {
XFlush(d); XFlush(d);
#endif #endif


#if 0
// Event test (=> keyboard events are working)
{
int evIdx = 0;
for(;;)
{
XEvent xev;
XNextEvent(d, &xev);
printf("xxx XNextEvent[%d]\n", evIdx++);
}
}
#endif

printf("xxx calling effect->dispatcher<effOpen>\n"); printf("xxx calling effect->dispatcher<effOpen>\n");
effect->dispatcher(effect, effOpen, 0, 0, NULL, 0.0f); effect->dispatcher(effect, effOpen, 0, 0, NULL, 0.0f);
printf("xxx effect->dispatcher<effOpen> returned\n"); printf("xxx effect->dispatcher<effOpen> returned\n");
@@ -220,7 +248,7 @@ void open_and_close(void) {
sleep(2); sleep(2);


#ifndef YAC_WIN32 #ifndef YAC_WIN32
void *result = getXWindowProperty(d, w, XInternAtom(d, "_XEventProc", false));
void *result = loc_getProperty(d, w, "_XEventProc");
if(result == 0) if(result == 0)
{ {
printf("xxx no XEventProc found\n"); printf("xxx no XEventProc found\n");


Loading…
Cancel
Save