From 2b5d095464a28ae680cf4454af99b4debd3bcabf Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 22 Jun 2006 21:04:47 +0000 Subject: correctly forward configure events to plugin windows, and cleanup FST code git-svn-id: svn://localhost/ardour2/trunk@635 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/fst/vstwin.c | 400 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 210 insertions(+), 190 deletions(-) (limited to 'libs/fst/vstwin.c') diff --git a/libs/fst/vstwin.c b/libs/fst/vstwin.c index 18d35546a2..8911ff4a01 100644 --- a/libs/fst/vstwin.c +++ b/libs/fst/vstwin.c @@ -21,81 +21,162 @@ struct ERect{ short right; }; -static pthread_mutex_t plugin_mutex; +static pthread_mutex_t plugin_mutex = PTHREAD_MUTEX_INITIALIZER; static FST* fst_first = NULL; DWORD gui_thread_id = 0; +static char* message_name (int message) +{ + switch (message) { + case 0x0000: + return "WM_NULL"; + + case 0x0001: + return "WM_CREATE"; + + case 0x0002: + return "WM_DESTROY"; + + case 0x0003: + return "WM_MOVE"; + + case 0x0004: + return "WM_SIZEWAIT"; + + case 0x0005: + return "WM_SIZE"; + + case 0x0006: + return "WM_ACTIVATE"; + + case 0x0007: + return "WM_SETFOCUS"; + + case 0x0008: + return "WM_KILLFOCUS"; + + case 0x0009: + return "WM_SETVISIBLE"; + + case 0x000a: + return "WM_ENABLE"; + + case 0x000b: + return "WM_SETREDRAW"; + + case 0x000c: + return "WM_SETTEXT"; + + case 0x000d: + return "WM_GETTEXT"; + + case 0x000e: + return "WM_GETTEXTLENGTH"; + + case 0x000f: + return "WM_PAINT"; + case 0x0010: + return "WM_CLOSE"; + case 0x0011: + return "WM_QUERYENDSESSION"; + case 0x0012: + return "WM_QUIT"; + case 0x0013: + return "WM_QUERYOPEN"; + case 0x0014: + return "WM_ERASEBKGND"; -/* Define to a macro to generate an assembly function directive */ -#define __ASM_FUNC(name) ".type " __ASM_NAME(name) ",@function" + case 0x0015: + return "WM_SYSCOLORCHANGE"; -/* Define to a macro to generate an assembly name from a C symbol */ -#define __ASM_NAME(name) name + case 0x0016: + return "WM_ENDSESSION"; -# define __ASM_GLOBAL_FUNC(name,code) \ - __asm__( ".align 4\n\t" \ - ".globl " __ASM_NAME(#name) "\n\t" \ - __ASM_FUNC(#name) "\n" \ - __ASM_NAME(#name) ":\n\t" \ - code ); + case 0x0017: + return "WM_SYSTEMERROR"; -__ASM_GLOBAL_FUNC( fst_get_teb, ".byte 0x64\n\tmovl 0x18,%eax\n\tret" ); + case 0x0018: + return "WM_SHOWWINDOW"; + case 0x0019: + return "WM_CTLCOLOR"; + case 0x001a: + return "WM_WININICHANGE"; -#define DELAYED_WINDOW + case 0x001b: + return "WM_DEVMODECHANGE"; + case 0x001c: + return "WM_ACTIVATEAPP"; + + case 0x001d: + return "WM_FONTCHANGE"; + + case 0x001e: + return "WM_TIMECHANGE"; + + case 0x001f: + return "WM_CANCELMODE"; + + case 0x0020: + return "WM_SETCURSOR"; + + case 0x0021: + return "WM_MOUSEACTIVATE"; + + case 0x0022: + return "WM_CHILDACTIVATE"; + + case 0x0023: + return "WM_QUEUESYNC"; + + case 0x0024: + return "WM_GETMINMAXINFO"; + + default: + break; + } + return "--- OTHER ---"; +} + static LRESULT WINAPI my_window_proc (HWND w, UINT msg, WPARAM wp, LPARAM lp) { FST* fst; - LRESULT result; // if (msg != WM_TIMER) { -// fst_error ("window callback handler, msg = 0x%x win=%p\n", msg, w); +// fst_error ("window callback handler, msg = 0x%x (%s) win=%p\n", msg, message_name (msg), w); // } switch (msg) { case WM_KEYUP: case WM_KEYDOWN: - printf( "got a key\n" ); break; case WM_CLOSE: - printf("wtf.\n" ); PostQuitMessage (0); + case WM_DESTROY: case WM_NCDESTROY: /* we should never get these */ //return 0; break; - case WM_PAINT: -// case WM_ACTIVATE: -#ifdef DELAYED_WINDOW - //if (wp & WA_ACTIVE) { - if ((fst = GetPropA (w, "fst_ptr")) != NULL) { - if (fst->window && !fst->been_activated) { - fst->been_activated = TRUE; -// { -// XSetWindowAttributes attr; -// -// attr.override_redirect = TRUE; -//// XChangeWindowAttributes( thread_display(), fst->xid, CWOverrideRedirect, &attr ); -// } - pthread_cond_signal (&fst->window_status_change); - pthread_mutex_unlock (&fst->lock); - } + if ((fst = GetPropA (w, "fst_ptr")) != NULL) { + if (fst->window && !fst->been_activated) { + fst->been_activated = TRUE; + pthread_cond_signal (&fst->window_status_change); + pthread_mutex_unlock (&fst->lock); } -// } -#endif + } break; default: @@ -123,31 +204,102 @@ fst_handle_new () return fst; } -#ifdef HAVE_TLS -static __thread int ejmpbuf_valid = FALSE; -static __thread jmp_buf ejmpbuf; -#else -static pthread_key_t ejmpbuf_valid_key; -static pthread_key_t ejmpbuf_key; -#endif +int +fst_create_editor (FST* fst) +{ + HMODULE hInst; + HWND window; -void debreak( void ) { printf( "debreak\n" ); } + /* "guard point" to trap errors that occur during plugin loading */ + /* Note: fst->lock is held while this function is called */ -int -fst_init (void (*sighandler)(int,siginfo_t*,void*)) -{ - //SharedWineInit (sighandler); - wine_shared_premain(); + if (!(fst->plugin->flags & effFlagsHasEditor)) { + fst_error ("Plugin \"%s\" has no editor", fst->handle->name); + return -1; + } + + if ((hInst = GetModuleHandleA (NULL)) == NULL) { + fst_error ("can't get module handle"); + return 1; + } + +// if ((window = CreateWindowExA (WS_EX_TOOLWINDOW | WS_EX_TRAYWINDOW, "FST", fst->handle->name, + if ((window = CreateWindowExA (0, "FST", fst->handle->name, + (WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX), + 0, 0, 1, 1, + NULL, NULL, + hInst, + NULL)) == NULL) { + fst_error ("cannot create editor window"); + return 1; + } + + if (!SetPropA (window, "fst_ptr", fst)) { + fst_error ("cannot set fst_ptr on window"); + } + + fst->window = window; + fst->xid = (int) GetPropA (window, "__wine_x11_whole_window"); + + { + struct ERect* er; + + ShowWindow (fst->window, SW_SHOW); + + fst->plugin->dispatcher (fst->plugin, effEditOpen, 0, 0, fst->window, 0 ); + fst->plugin->dispatcher (fst->plugin, effEditGetRect, 0, 0, &er, 0 ); + + fst->width = er->right-er->left; + fst->height = er->bottom-er->top; + + SetWindowPos (fst->window, 0, 0, 0, er->right-er->left+8, er->bottom-er->top+26, SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOZORDER); + } return 0; } +void +fst_destroy_editor (FST* fst) +{ + pthread_mutex_lock (&fst->lock); + if (fst->window) { + fst->destroy = TRUE; + if (!PostThreadMessageA (gui_thread_id, WM_USER, 0, 0)) { + fst_error ("could not post message to gui thread"); + } + pthread_cond_wait (&fst->window_status_change, &fst->lock); + + } + pthread_mutex_unlock (&fst->lock); +} + +void +fst_event_loop_remove_plugin (FST* fst) +{ + FST* p; + FST* prev; + + for (p = fst_first, prev = NULL; p->next; prev = p, p = p->next) { + if (p == fst) { + if (prev) { + prev->next = p->next; + } + } + } + + if (fst_first == fst) { + fst_first = fst_first->next; + } + +} + +void debreak( void ) { printf( "debreak\n" ); } + DWORD WINAPI gui_event_loop (LPVOID param) { MSG msg; FST* fst; - char c; HMODULE hInst; HWND window; @@ -175,6 +327,7 @@ DWORD WINAPI gui_event_loop (LPVOID param) } while (GetMessageA (&msg, NULL, 0,0)) { + if( msg.message == WM_KEYDOWN ) debreak(); TranslateMessage( &msg ); DispatchMessageA (&msg); @@ -184,8 +337,8 @@ DWORD WINAPI gui_event_loop (LPVOID param) */ - if( msg.message == WM_TIMER ) { - pthread_mutex_lock (&plugin_mutex); + if( msg.message == WM_TIMER ) { + pthread_mutex_lock (&plugin_mutex); again: for (fst = fst_first; fst; fst = fst->next) { @@ -221,21 +374,12 @@ again: pthread_mutex_unlock (&plugin_mutex); } } - printf( "quit........\n" ); - exit(0); - gtk_main_quit(); -} - -void -fst_set_focus (FST* fst) -{ - if (fst->window) { - SetFocus (fst->window); - } + fst_error ("FST GUI event loop has quit!"); + return 0; } int -wine_shared_premain () +fst_init () { WNDCLASSA wc; HMODULE hInst; @@ -270,6 +414,8 @@ wine_shared_premain () int fst_run_editor (FST* fst) { + /* Add the FST to the list of all that should be handled by the GUI thread */ + pthread_mutex_lock (&plugin_mutex); if (fst_first == NULL) { @@ -282,7 +428,6 @@ fst_run_editor (FST* fst) p->next = fst; } - printf( "gui_thread_id = %d\n", gui_thread_id ); if (!PostThreadMessageA (gui_thread_id, WM_USER, 0, 0)) { fst_error ("could not post message to gui thread"); return -1; @@ -306,129 +451,10 @@ fst_run_editor (FST* fst) return 0; } -int -fst_create_editor (FST* fst) -{ - HMODULE hInst; - char class[20]; - HWND window; - - /* "guard point" to trap errors that occur during plugin loading */ - - /* Note: fst->lock is held while this function is called */ - - if (!(fst->plugin->flags & effFlagsHasEditor)) { - fst_error ("Plugin \"%s\" has no editor", fst->handle->name); - return -1; - } - - if ((hInst = GetModuleHandleA (NULL)) == NULL) { - fst_error ("can't get module handle"); - return 1; - } - -// if ((window = CreateWindowExA (WS_EX_TOOLWINDOW | WS_EX_TRAYWINDOW, "FST", fst->handle->name, - if ((window = CreateWindowExA (0, "FST", fst->handle->name, - (WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX), - 0, 0, 1, 1, - NULL, NULL, - hInst, - NULL)) == NULL) { - fst_error ("cannot create editor window"); - return 1; - } - - if (!SetPropA (window, "fst_ptr", fst)) { - fst_error ("cannot set fst_ptr on window"); - } - - fst->window = window; - fst->xid = (int) GetPropA (window, "__wine_x11_whole_window"); - -// XChangeWindowAttributes( XOpenDisplay(NULL), fst->xid, CWOverrideRedirect, ~0 ); - - -#ifdef DELAYED_WINDOW - { - struct ERect* er; - - ShowWindow (fst->window, SW_SHOW); - - fst->plugin->dispatcher (fst->plugin, effEditOpen, 0, 0, fst->window, 0 ); - fst->plugin->dispatcher (fst->plugin, effEditGetRect, 0, 0, &er, 0 ); - - fst->width = er->right-er->left; - fst->height = er->bottom-er->top; - - SetWindowPos (fst->window, 0, 0, 0, er->right-er->left+8, er->bottom-er->top+26, SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOZORDER); - } -#else - - pthread_cond_signal (&fst->window_status_change); - pthread_mutex_unlock (&fst->lock); - -#endif - return 0; -} - -void -fst_show_editor (FST* fst) -{ -#ifndef DELAYED_WINDOW - struct ERect* er; - - fst->plugin->dispatcher (fst->plugin, effEditOpen, 0, 0, fst->window, 0 ); - fst->plugin->dispatcher (fst->plugin, effEditGetRect, 0, 0, &er, 0 ); - fst->width = er->right-er->left; - fst->height = er->bottom-er->top; - - SetWindowPos (window, 0, 0, 0, er->right-er->left+8, er->bottom-er->top+26, SWP_NOMOVE | SWP_NOZORDER); - *ejmpbuf_valid = FALSE; -#endif -} - -void -fst_destroy_editor (FST* fst) -{ - FST* p; - FST* prev; - - pthread_mutex_lock (&fst->lock); - if (fst->window) { - fst->destroy = TRUE; - if (!PostThreadMessageA (gui_thread_id, WM_USER, 0, 0)) { - fst_error ("could not post message to gui thread"); - } - pthread_cond_wait (&fst->window_status_change, &fst->lock); - - } - pthread_mutex_unlock (&fst->lock); -} - -void -fst_event_loop_remove_plugin (FST* fst) -{ - FST* p; - FST* prev; - - for (p = fst_first, prev = NULL; p->next; prev = p, p = p->next) { - if (p == fst) { - if (prev) { - prev->next = p->next; - } - } - } - - if (fst_first == fst) { - fst_first = fst_first->next; - } - -} - FSTHandle* fst_load (const char *path) { - char* buf, *buf2; + char* buf; FSTHandle* fhandle; char* period; @@ -555,9 +581,3 @@ fst_get_XID (FST* fst) { return fst->xid; } - -int -fst_adopt_thread () -{ - return 0; -} -- cgit v1.2.3