Module loading.
This commit is contained in:
@@ -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 );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user