Add bare-minimum extension-reaper-macos REAPER extension skeleton

C/C++ extension built directly against the vendored Cockos reaper-sdk
headers (no Rust/reaper-rs wrapper layer). Loads, registers a test
action, and confirms via REAPER's console — confirmed working in
REAPER 2026-07-15.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Paul Lipscomb
2026-07-15 19:12:33 -04:00
parent 7ecc718f5d
commit cd5ebd84d6
512 changed files with 330043 additions and 1 deletions
@@ -0,0 +1,88 @@
#ifndef _WDL_SETTHREADNAME_H_
#define _WDL_SETTHREADNAME_H_
#include "wdltypes.h"
#if defined(_WIN32) && (defined(_DEBUG) || defined(WDL_SETTHREADNAME_WIN32_RELEASE))
// thread names only work on win32 when running in a debugger, so they are not enabled
// by default for release builds (defined WDL_SETTHREADNAME_WIN32_RELEASE if you wish to use
// them)
#pragma pack(push,8)
typedef struct tagTHREADNAME_INFO
{
DWORD dwType; // Must be 0x1000.
LPCSTR szName; // Pointer to name (in user addr space).
DWORD dwThreadID; // Thread ID (-1=caller thread).
DWORD dwFlags; // Reserved for future use, must be zero.
} THREADNAME_INFO;
#pragma pack(pop)
static void WDL_SetThreadName(const char* threadName) {
const DWORD MS_VC_EXCEPTION = 0x406D1388;
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = threadName;
info.dwThreadID = (DWORD)-1;
info.dwFlags = 0;
#pragma warning(push)
#if _MSC_VER < 1300 && !defined(_WIN64)
#define ULONG_PTR ULONG
#else
#pragma warning(disable: 6320 6322)
#endif
__try {
RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR*)&info);
}
__except (EXCEPTION_EXECUTE_HANDLER) {
}
#pragma warning(pop)
}
#elif defined(__APPLE__)
#include <pthread.h>
#include <CoreServices/CoreServices.h>
#include <AvailabilityMacros.h>
extern "C"
{
void *objc_getClass(const char *p);
#ifndef _OBJC_OBJC_H_
void *sel_getUid(const char *p);
#endif
void objc_msgSend(void);
};
static void WDL_STATICFUNC_UNUSED WDL_SetThreadName(const char* threadName) {
void *(*send_msg)(void *, void *) = (void *(*)(void *, void *))objc_msgSend;
void (*send_msg_cfstring)(void *, void *, CFStringRef) = (void (*)(void *, void *, CFStringRef))objc_msgSend;
void *ct=send_msg( objc_getClass("NSThread"), sel_getUid("currentThread"));
CFStringRef tn=CFStringCreateWithCString(NULL,threadName,kCFStringEncodingUTF8);
send_msg_cfstring(ct,sel_getUid("setName:"), tn);
CFRelease(tn);
#ifdef MAC_OS_X_VERSION_10_6
pthread_setname_np(threadName);
#endif
}
#elif defined(__linux__)
#include <pthread.h>
static void WDL_STATICFUNC_UNUSED WDL_SetThreadName(const char* threadName) {
char tmp[16];
int x;
for (x=0;*threadName && x<15; threadName++) if (*threadName != ' ') tmp[x++]=*threadName;
tmp[x]=0;
pthread_setname_np(pthread_self(),tmp);
}
#else
#define WDL_SetThreadName(x) do { } while (0)
#endif
#endif