Module loading.

This commit is contained in:
Glenn Maynard
2003-09-05 06:54:32 +00:00
parent dde370f2db
commit 510f97bc45
2 changed files with 38 additions and 31 deletions
@@ -1,46 +1,54 @@
#include "global.h" #include "global.h"
#include "LoadingWindow_Gtk.h" #include "RageLog.h"
#include "StepMania.h" #include "StepMania.h"
#include <gtk/gtk.h> #include "LoadingWindow_Gtk.h"
#include "loading.xpm" #include "LoadingWindow_GtkModule.h"
static GtkWidget *label; #include <dlfcn.h>
static GtkWidget *window;
static void *Handle = NULL;
static INIT Module_Init;
static SHUTDOWN Module_Shutdown;
static SETTEXT Module_SetText;
LoadingWindow_Gtk::LoadingWindow_Gtk() LoadingWindow_Gtk::LoadingWindow_Gtk()
{ {
GdkPixmap *loadmap; try {
GtkWidget *vbox; ASSERT( Handle == NULL );
GtkWidget *loadimage;
gtk_init(&g_argc,&g_argv); Handle = dlopen( DirOfExecutable + "/" + "GtkModule.so", RTLD_NOW );
window = gtk_window_new(GTK_WINDOW_TOPLEVEL); if( Handle == NULL )
gtk_widget_realize(window); RageException::Throw("dlopen(): %s", dlerror());
loadmap = gdk_pixmap_create_from_xpm_d(window->window,NULL,NULL,loading);
loadimage = gtk_image_new_from_pixmap(loadmap,NULL);
label = gtk_label_new(NULL);
gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_CENTER);
vbox = gtk_vbox_new(FALSE,5);
gtk_container_add(GTK_CONTAINER(window),vbox);
gtk_box_pack_start(GTK_BOX(vbox),loadimage,FALSE,FALSE,0);
gtk_box_pack_end(GTK_BOX(vbox),label,TRUE,TRUE,0);
gtk_widget_show_all(window); Module_Init = (INIT) dlsym(Handle, "Init");
gtk_main_iteration_do(FALSE); if( !Module_Init )
RageException::ThrowNonfatal( "Couldn't load symbol Module_Init" );
Module_Shutdown = (SHUTDOWN) dlsym(Handle, "Shutdown");
if( !Module_Shutdown )
RageException::ThrowNonfatal( "Couldn't load symbol Module_Shutdown" );
Module_SetText = (SETTEXT) dlsym(Handle, "SetText");
if( !Module_SetText )
RageException::ThrowNonfatal( "Couldn't load symbol Module_SetText" );
const char *ret = Module_Init( &g_argc, &g_argv );
if( ret != NULL )
RageException::ThrowNonfatal( ret );
} catch(...) {
dlclose( Handle );
Handle = NULL;
throw;
}
} }
LoadingWindow_Gtk::~LoadingWindow_Gtk() LoadingWindow_Gtk::~LoadingWindow_Gtk()
{ {
gtk_widget_hide_all(window); Module_Shutdown();
g_signal_emit_by_name (G_OBJECT (window), "destroy");
while( gtk_events_pending() ) dlclose( Handle );
gtk_main_iteration_do(FALSE); Handle = NULL;
} }
void LoadingWindow_Gtk::SetText( CString s ) void LoadingWindow_Gtk::SetText( CString s )
{ {
gtk_label_set_text(GTK_LABEL(label), s); Module_SetText( s );
gtk_widget_show(label);
gtk_main_iteration_do(FALSE);
} }
@@ -12,7 +12,6 @@ public:
void Paint() { } void Paint() { }
}; };
#undef ARCH_LOADING_WINDOW #define HAVE_LOADING_WINDOW_GTK
#define ARCH_LOADING_WINDOW LoadingWindow_Gtk
#endif #endif