]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - contrib/hydratoolz/plugin.cpp
-DGSEAL_ENABLE
[xonotic/netradiant.git] / contrib / hydratoolz / plugin.cpp
index bda4df223e2be41f87efff1c3fab51d8aa74ed98..a290649f2d21f3524f04316a20705352d074e290 100644 (file)
@@ -1,5 +1,5 @@
 /*
-   Copyright (C) 1999-2007 id Software, Inc. and contributors.
+   Copyright (C) 1999-2006 Id Software, Inc. and contributors.
    For a list of contributors, see the accompanying CONTRIBUTORS file.
 
    This file is part of GtkRadiant.
@@ -30,8 +30,6 @@
     Overview
     ========
 
-    This plugin allows the user to rebuild the "wad" key pair in the worldspawn
-    so that it has a list of all the .wad files in use.
 
     Version History
     ===============
     v0.1 - 28/May/2002
       - Initial version.
 
-    v1.0 - 10/March/2003
-      - Added more console output
-      - Removed some old test code
-      - Tweaked dialog box.
-      - Fixed up for Radiant 1.3.5
-
 
     ToDo
     ====
 
-    Nothing...
+ * Code it ? :)
 
  */
 
@@ -60,6 +52,145 @@ _QERFuncTable_1 g_FuncTable;
 _QERFileSystemTable g_FileSystemTable;
 _QEREntityTable g_EntityTable;
 
+// 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_can_default( w, true );
+               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_can_default( w, true );
+               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_can_default( w, true );
+               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_can_default( w, true );
+               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
 
 // =============================================================================
 // Ripped from cmdlib.cpp
@@ -69,7 +200,7 @@ _QEREntityTable g_EntityTable;
    Extract file parts
    ====================
  */
-void HYDRA_ExtractFilePath( const char *path, char *dest ){
+void ExtractFilePath( const char *path, char *dest ){
        const char *src;
 
        src = path + strlen( path ) - 1;
@@ -84,7 +215,7 @@ void HYDRA_ExtractFilePath( const char *path, char *dest ){
        dest[src - path] = 0;
 }
 
-void HYDRA_ExtractFileName( const char *path, char *dest ){
+void ExtractFileName( const char *path, char *dest ){
        const char *src;
 
        src = path + strlen( path ) - 1;
@@ -103,7 +234,7 @@ void HYDRA_ExtractFileName( const char *path, char *dest ){
        *dest = 0;
 }
 
-void HYDRA_ConvertDOSToUnixName( char *dst, const char *src ){
+void ConvertDOSToUnixName( char *dst, const char *src ){
        while ( *src )
        {
                if ( *src == '\\' ) {
@@ -136,7 +267,7 @@ GSList *AddToWadList( GSList *wadlist, const char *shadername, const char *wad )
                if ( strcmp( shadername,"color" ) == 0 ) {
                        return wadlist;
                }
-               HYDRA_ExtractFilePath( shadername,tmpstr );
+               ExtractFilePath( shadername,tmpstr );
                // Sys_Printf("checking: %s\n",shadername);
 
                int l = strlen( tmpstr ) - 1;
@@ -146,11 +277,11 @@ GSList *AddToWadList( GSList *wadlist, const char *shadername, const char *wad )
                }
                else
                {
-                       Sys_Printf( "HydraToolz: WARNING: Unknown wad file for shader %s\n",shadername );
+                       Sys_Printf( "WARNING: Unknown wad file for shader %s\n",shadername );
                        return wadlist;
                }
 
-               HYDRA_ExtractFileName( tmpstr,tmpstr );
+               ExtractFileName( tmpstr,tmpstr );
 
                wadname = (char *)malloc( strlen( tmpstr ) + 5 );
                sprintf( wadname,"%s.wad",tmpstr );
@@ -162,13 +293,13 @@ GSList *AddToWadList( GSList *wadlist, const char *shadername, const char *wad )
 
        for ( GSList *l = wadlist; l != NULL ; l = l->next )
        {
-               if ( !stricmp( (char *)l->data,wadname ) ) {
+               if ( string_equal_nocase( (char *)l->data,wadname ) ) {
                        free( wadname );
                        return wadlist;
                }
        }
 
-       Sys_Printf( "HydraToolz: Adding Wad File to WAD list: %s (reason: ",wadname );
+       Sys_Printf( "Adding Wad File to WAD list: %s (reason: ",wadname );
        if ( shadername ) {
                Sys_Printf( "see shader \"%s\")\n", shadername );
        }
@@ -182,7 +313,7 @@ void UpdateWadKeyPair( void ){
        int i,nb;
 
        char wads[2048]; // change to CString usage ?
-       *wads = 0;
+       wads[0] = 0;
        char *p1,*p2;
        entity_t *pEntity;
        epair_t *pEpair;
@@ -190,19 +321,17 @@ void UpdateWadKeyPair( void ){
        face_t  *f;
        brush_t *b;
        char cleanwadname[QER_MAX_NAMELEN];
-       char *actualwad;
+       const char *actualwad;
 
 
        pEntity = (entity_t *)g_FuncTable.m_pfnGetEntityHandle( 0 ); // get the worldspawn ent
 
-       Sys_Printf( "HydraToolz: Searching for in-use wad files...\n" );
+       Sys_Printf( "Searching for in-use wad files...\n" );
        for ( pEpair = pEntity->epairs; pEpair != NULL; pEpair = pEpair->next )
        {
-               if ( stricmp( pEpair->key,"wad" ) == 0 ) {
+               if ( string_equal_nocase( pEpair->key,"wad" ) ) {
                        strcpy( wads,pEpair->value );
-                       HYDRA_ConvertDOSToUnixName( wads,wads );
-
-                       Sys_Printf( "HydraToolz: Current wad key is \"%s\"!\n",wads );
+                       ConvertDOSToUnixName( wads,wads );
 
                        // ok, we got the list of ; delimited wads, now split it into a GSList that contains
                        // just the wad names themselves.
@@ -217,7 +346,7 @@ void UpdateWadKeyPair( void ){
 
                                }
                                if ( strchr( p1,'/' ) || strchr( p1,'\\' ) ) {
-                                       HYDRA_ExtractFileName( p1,cleanwadname );
+                                       ExtractFileName( p1,cleanwadname );
                                        wadlist = AddToWadList( wadlist, NULL, cleanwadname );
                                }
                                else
@@ -242,11 +371,6 @@ void UpdateWadKeyPair( void ){
                }
        }
 
-       if ( !*wads ) {
-               Sys_Printf( "HydraToolz: No \"wad\" keypair wound in worldspawn\n" );
-       }
-
-
        nb = g_FuncTable.m_pfnAllocateActiveBrushHandles();
        for ( i = 0; i < nb; i++ )
        {
@@ -281,16 +405,14 @@ void UpdateWadKeyPair( void ){
        }
        g_FuncTable.m_pfnReleaseSelectedBrushHandles();
 
-       Sys_Printf( "HydraToolz: Rebuilding worldspawn's \"wad\" key-pair...\n" );
        // Now we have a complete list of wadnames (without paths) so we just have to turn this
        // back to a ; delimited list.
 
-       *wads = 0;
+       wads[0] = 0;
        while ( wadlist )
        {
-               // skip wad files if they start with "common-"
-               if ( strnicmp( (char *)wadlist->data,"common-",7 ) == 0 ) {
-                       Sys_Printf( "HydraToolz: Skipping radiant/user-supplied wad file %s\n",(char *)wadlist->data );
+               if ( string_equal_nocase( (char *)wadlist->data,"common-hydra.wad" ) ) {
+                       Sys_Printf( "Skipping radiant-supplied wad file %s\n",(char *)wadlist->data );
                }
                else
                {
@@ -298,14 +420,14 @@ void UpdateWadKeyPair( void ){
                                strcat( wads,";" );
                        }
 
-                       actualwad = vfsGetFullPath( (char *)wadlist->data, 0, 0 );
+                       actualwad = vfsGetFullPath( (char *)wadlist->data );
 
                        if ( actualwad ) {
                                strcat( wads, actualwad );
                        }
                        else
                        {
-                               Sys_Printf( "HydraToolz: WARNING: could not locate wad file %s\n",(char *)wadlist->data );
+                               Sys_Printf( "WARNING: could not locate wad file %s\n",(char *)wadlist->data );
                                strcat( wads, (char *)wadlist->data );
                        }
                }
@@ -315,28 +437,24 @@ void UpdateWadKeyPair( void ){
        }
 
        // store the wad list back in the worldspawn.
-       if ( *wads ) {
+       if ( wads[0] ) {
                //free(pEpair->value);
                //pEpair->value = strdup(wads);
                SetKeyValue( pEntity, "wad", wads );
-               Sys_Printf( "HydraToolz: Setting worldspawn \"wad\" key value to \"%s\"\n",wads );
-
        }
 
-       Sys_Printf( "HydraToolz: Finished rebuilding wad keypair!\n" );
-
 }
 
 // =============================================================================
 // PLUGIN INTERFACE STUFF
 
 // plugin name
-const char *PLUGIN_NAME = "HydraToolz";
+const char *PLUGIN_NAME = "Q3 Texture Tools";
 
 // commands in the menu
 const char *PLUGIN_COMMANDS = "About...;Create/Update WAD keypair";
 
-const char *PLUGIN_ABOUT = "HydraToolz v1.0 for GTKRadiant\n\n"
+const char *PLUGIN_ABOUT = "HydraToolz for GTKRadiant\n\n"
                                                   "By Hydra!";
 
 extern "C" void* WINAPI QERPlug_GetFuncTable(){
@@ -344,6 +462,11 @@ extern "C" void* WINAPI QERPlug_GetFuncTable(){
 }
 
 const char* QERPlug_Init( void* hApp, void *pWidget ){
+       GtkWidget* pMainWidget = static_cast<GtkWidget*>( pWidget );
+
+       g_pMainWnd = pMainWidget;
+       memset( &g_FuncTable, 0, sizeof( _QERFuncTable_1 ) );
+       g_FuncTable.m_nSize = sizeof( _QERFuncTable_1 );
        return "HydraToolz for GTKRadiant"; // do we need this ? hmmm
 }
 
@@ -360,7 +483,7 @@ extern "C" void QERPlug_Dispatch( const char* p, vec3_t vMin, vec3_t vMax, bool
                UpdateWadKeyPair();
        }
        else if ( !strcmp( p, "About..." ) ) {
-               g_FuncTable.m_pfnMessageBox( NULL, PLUGIN_ABOUT, "About", MB_OK, NULL );
+               g_FuncTable.m_pfnMessageBox( (GtkWidget*)NULL, PLUGIN_ABOUT, "About", eMB_OK );
        }
 }
 
@@ -370,13 +493,7 @@ extern "C" void QERPlug_Dispatch( const char* p, vec3_t vMin, vec3_t vMax, bool
 CSynapseServer* g_pSynapseServer = NULL;
 CSynapseClientHydraToolz g_SynapseClient;
 
-#if __GNUC__ >= 4
-#pragma GCC visibility push(default)
-#endif
-extern "C" CSynapseClient * SYNAPSE_DLL_EXPORT Synapse_EnumerateInterfaces( const char *version, CSynapseServer *pServer ) {
-#if __GNUC__ >= 4
-#pragma GCC visibility pop
-#endif
+extern "C" CSynapseClient * SYNAPSE_DLL_EXPORT Synapse_EnumerateInterfaces( const char *version, CSynapseServer *pServer ){
        if ( strcmp( version, SYNAPSE_VERSION ) ) {
                Syn_Printf( "ERROR: synapse API version mismatch: should be '" SYNAPSE_VERSION "', got '%s'\n", version );
                return NULL;