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 "LoadingWindow_Gtk.h"
#include "RageLog.h"
#include "StepMania.h"
#include <gtk/gtk.h>
#include "loading.xpm"
#include "LoadingWindow_Gtk.h"
#include "LoadingWindow_GtkModule.h"
static GtkWidget *label;
static GtkWidget *window;
#include <dlfcn.h>
static void *Handle = NULL;
static INIT Module_Init;
static SHUTDOWN Module_Shutdown;
static SETTEXT Module_SetText;
LoadingWindow_Gtk::LoadingWindow_Gtk()
{
GdkPixmap *loadmap;
GtkWidget *vbox;
GtkWidget *loadimage;
try {
ASSERT( Handle == NULL );
Handle = dlopen( DirOfExecutable + "/" + "GtkModule.so", RTLD_NOW );
if( Handle == NULL )
RageException::Throw("dlopen(): %s", dlerror());
gtk_init(&g_argc,&g_argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_realize(window);
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);
Module_Init = (INIT) dlsym(Handle, "Init");
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" );
gtk_widget_show_all(window);
gtk_main_iteration_do(FALSE);
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()
{
gtk_widget_hide_all(window);
g_signal_emit_by_name (G_OBJECT (window), "destroy");
while( gtk_events_pending() )
gtk_main_iteration_do(FALSE);
Module_Shutdown();
dlclose( Handle );
Handle = NULL;
}
void LoadingWindow_Gtk::SetText( CString s )
{
gtk_label_set_text(GTK_LABEL(label), s);
gtk_widget_show(label);
gtk_main_iteration_do(FALSE);
Module_SetText( s );
}