summaryrefslogtreecommitdiff
path: root/libs/fst
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2006-06-22 21:04:47 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2006-06-22 21:04:47 +0000
commit2b5d095464a28ae680cf4454af99b4debd3bcabf (patch)
tree4ef4347a5f29e186c7d3e8284e7a3dac222fd157 /libs/fst
parent58c39d50b11592c0482eb9be460889fc20ba7440 (diff)
correctly forward configure events to plugin windows, and cleanup FST code
git-svn-id: svn://localhost/ardour2/trunk@635 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/fst')
-rw-r--r--libs/fst/fst.c15
-rw-r--r--libs/fst/fst.h17
-rw-r--r--libs/fst/fstinfofile.c2
-rw-r--r--libs/fst/vstwin.c400
4 files changed, 227 insertions, 207 deletions
diff --git a/libs/fst/fst.c b/libs/fst/fst.c
index cbee5de52a..85473578d2 100644
--- a/libs/fst/fst.c
+++ b/libs/fst/fst.c
@@ -3,6 +3,15 @@
#include "fst.h"
+
+void
+default_fst_error_callback (const char *desc)
+{
+ fprintf(stderr, "%s\n", desc);
+}
+
+void (*fst_error_callback)(const char *desc) = &default_fst_error_callback;
+
void
fst_error (const char *fmt, ...)
{
@@ -15,10 +24,4 @@ fst_error (const char *fmt, ...)
va_end (ap);
}
-void
-default_fst_error_callback (const char *desc)
-{
- fprintf(stderr, "%s\n", desc);
-}
-void (*fst_error_callback)(const char *desc) = &default_fst_error_callback;
diff --git a/libs/fst/fst.h b/libs/fst/fst.h
index 61dc09a2a1..9055eac620 100644
--- a/libs/fst/fst.h
+++ b/libs/fst/fst.h
@@ -8,18 +8,18 @@
/**
* Display FST error message.
*
- * Set via fst_set_error_function(), otherwise a FST-provided
- * default will print @a msg (plus a newline) to stderr.
- *
- * @param msg error message text (no newline at end).
+ * @param fmt printf-style formatting specification
*/
-extern void (*fst_error_callback)(const char *msg);
+extern void fst_error (const char *fmt, ...);
/**
* Set the @ref fst_error_callback for error message display.
*
* The FST library provides two built-in callbacks for this purpose:
- * default_fst_error_callback() and silent_fst_error_callback().
+ * default_fst_error_callback().
+ *
+ * The default will print the message (plus a newline) to stderr.
+ *
*/
void fst_set_error_function (void (*func)(const char *));
@@ -81,7 +81,7 @@ struct _FST
extern "C" {
#endif
-extern int fst_init (void (*sighandler)(int,siginfo_t*,void*));
+extern int fst_init ();
extern FSTHandle* fst_load (const char*);
extern int fst_unload (FSTHandle*);
@@ -96,9 +96,6 @@ extern int fst_run_editor (FST*);
extern void fst_destroy_editor (FST*);
extern int fst_get_XID (FST*);
-extern int fst_adopt_thread ();
-extern void* fst_get_teb();
-
extern void fst_signal_handler (int sig, siginfo_t* info, void* context);
extern FSTInfo *fst_get_info( char *dllpathname );
diff --git a/libs/fst/fstinfofile.c b/libs/fst/fstinfofile.c
index 9560053c7b..7cc98d2233 100644
--- a/libs/fst/fstinfofile.c
+++ b/libs/fst/fstinfofile.c
@@ -9,7 +9,7 @@
#include <stddef.h>
#include <stdio.h>
#include <string.h>
-
+#include <stdlib.h>
#define MAX_STRING_LEN 256
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;
-}