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