+// cast to GtkWidget*
+void *g_pMainWnd;
+
+// =============================================================================
+// Ripped from TexTool.cpp
+
+static void dialog_button_callback( GtkWidget *widget, gpointer data ){
+ GtkWidget *parent;
+ int *loop, *ret;
+
+ parent = gtk_widget_get_toplevel( widget );
+ loop = (int*)gtk_object_get_data( GTK_OBJECT( parent ), "loop" );
+ ret = (int*)gtk_object_get_data( GTK_OBJECT( parent ), "ret" );
+
+ *loop = 0;
+ *ret = gpointer_to_int( data );
+}
+
+static gint dialog_delete_callback( GtkWidget *widget, GdkEvent* event, gpointer data ){
+ int *loop;
+
+ gtk_widget_hide( widget );
+ loop = (int*)gtk_object_get_data( GTK_OBJECT( widget ), "loop" );
+ *loop = 0;
+
+ return TRUE;
+}
+
+int DoMessageBox( const char* lpText, const char* lpCaption, guint32 uType ){
+ GtkWidget *window, *w, *vbox, *hbox;
+ int mode = ( uType & MB_TYPEMASK ), ret, loop = 1;
+
+ window = ui::Window( ui::window_type::TOP );
+ gtk_signal_connect( GTK_OBJECT( window ), "delete_event",
+ GTK_SIGNAL_FUNC( dialog_delete_callback ), NULL );
+ gtk_signal_connect( GTK_OBJECT( window ), "destroy",
+ GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
+ gtk_window_set_title( GTK_WINDOW( window ), lpCaption );
+ gtk_container_border_width( GTK_CONTAINER( window ), 10 );
+ gtk_object_set_data( GTK_OBJECT( window ), "loop", &loop );
+ gtk_object_set_data( GTK_OBJECT( window ), "ret", &ret );
+ gtk_widget_realize( window );
+
+ vbox = ui::VBox( FALSE, 10 );
+ gtk_container_add( GTK_CONTAINER( window ), vbox );
+ gtk_widget_show( vbox );
+
+ w = ui::Label( lpText );
+ gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 2 );
+ gtk_label_set_justify( GTK_LABEL( w ), GTK_JUSTIFY_LEFT );
+ gtk_widget_show( w );
+
+ w = gtk_hseparator_new();
+ gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 2 );
+ gtk_widget_show( w );
+
+ hbox = ui::HBox( FALSE, 10 );
+ gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 2 );
+ gtk_widget_show( hbox );
+
+ if ( mode == MB_OK ) {
+ w = ui::Button( "Ok" );
+ gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
+ gtk_signal_connect( GTK_OBJECT( w ), "clicked",
+ GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDOK ) );
+ GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
+ gtk_widget_grab_default( w );
+ gtk_widget_show( w );
+ ret = IDOK;
+ }
+ else if ( mode == MB_OKCANCEL ) {
+ w = ui::Button( "Ok" );
+ gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
+ gtk_signal_connect( GTK_OBJECT( w ), "clicked",
+ GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDOK ) );
+ GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
+ gtk_widget_grab_default( w );
+ gtk_widget_show( w );
+
+ w = ui::Button( "Cancel" );
+ gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
+ gtk_signal_connect( GTK_OBJECT( w ), "clicked",
+ GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDCANCEL ) );
+ gtk_widget_show( w );
+ ret = IDCANCEL;
+ }
+ else if ( mode == MB_YESNOCANCEL ) {
+ w = ui::Button( "Yes" );
+ gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
+ gtk_signal_connect( GTK_OBJECT( w ), "clicked",
+ GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDYES ) );
+ GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
+ gtk_widget_grab_default( w );
+ gtk_widget_show( w );
+
+ w = ui::Button( "No" );
+ gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
+ gtk_signal_connect( GTK_OBJECT( w ), "clicked",
+ GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDNO ) );
+ gtk_widget_show( w );
+
+ w = ui::Button( "Cancel" );
+ gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
+ gtk_signal_connect( GTK_OBJECT( w ), "clicked",
+ GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDCANCEL ) );
+ gtk_widget_show( w );
+ ret = IDCANCEL;
+ }
+ else /* if (mode == MB_YESNO) */
+ {
+ w = ui::Button( "Yes" );
+ gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
+ gtk_signal_connect( GTK_OBJECT( w ), "clicked",
+ GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDYES ) );
+ GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
+ gtk_widget_grab_default( w );
+ gtk_widget_show( w );
+
+ w = ui::Button( "No" );
+ gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
+ gtk_signal_connect( GTK_OBJECT( w ), "clicked",
+ GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDNO ) );
+ gtk_widget_show( w );
+ ret = IDNO;
+ }
+
+ gtk_widget_show( window );
+ gtk_grab_add( window );
+
+ while ( loop )
+ gtk_main_iteration();
+
+ gtk_grab_remove( window );
+ gtk_widget_destroy( window );
+
+ return ret;
+}
+
+// End of rip from TexTool.cpp