]> git.xonotic.org Git - xonotic/netradiant.git/commitdiff
Merge commit '461d008daa6328113ea4ccda37e5604d3df14ba3' into garux-merge
authorThomas Debesse <dev@illwieckz.net>
Mon, 22 Feb 2021 23:49:09 +0000 (00:49 +0100)
committerThomas Debesse <dev@illwieckz.net>
Mon, 22 Feb 2021 23:49:09 +0000 (00:49 +0100)
16 files changed:
libs/gtkutil/accelerator.cpp
libs/picomodel/pm_mdc.c
libs/stringio.h
plugins/md3model/md5.cpp
radiant/camwindow.cpp
radiant/eclass_doom3.cpp
radiant/entity.cpp
radiant/entity.h
radiant/entityinspector.cpp
radiant/mainframe.cpp
radiant/preferences.cpp
radiant/preferences.h
radiant/texwindow.cpp
radiant/xywindow.cpp
tools/quake3/common/scriplib.c
tools/quake3/q3map2/portals.c

index 00380d452f8eb6c66fcac93a0439693c0b2f0cee..a17931decaff3649809e4c73fa656b1f946aa142 100644 (file)
@@ -329,14 +329,14 @@ AcceleratorMap g_keydown_accelerators;
 AcceleratorMap g_keyup_accelerators;
 
 bool Keys_press( PressedKeys::Keys& keys, guint keyval ){
-       if ( keys.insert( keyval ).second ) {
+       if ( keys.insert( gdk_keyval_to_upper( keyval ) ).second ) {
                return AcceleratorMap_activate( g_keydown_accelerators, accelerator_for_event_key( keyval, 0 ) );
        }
        return g_keydown_accelerators.find( accelerator_for_event_key( keyval, 0 ) ) != g_keydown_accelerators.end();
 }
 
 bool Keys_release( PressedKeys::Keys& keys, guint keyval ){
-       if ( keys.erase( keyval ) != 0 ) {
+       if ( keys.erase( gdk_keyval_to_upper( keyval ) ) != 0 ) {
                return AcceleratorMap_activate( g_keyup_accelerators, accelerator_for_event_key( keyval, 0 ) );
        }
        return g_keyup_accelerators.find( accelerator_for_event_key( keyval, 0 ) ) != g_keyup_accelerators.end();
index 235dcecf9467c0ca90d1508e0fef403e1adf285e..5139da0245b7eb9db165f9f723c6f4ec44119f6a 100644 (file)
@@ -45,7 +45,7 @@ const float MDC_MAX_OFS         = 127.0f;
 const float MDC_DIST_SCALE      = 0.05f;
 
 /* mdc decoding normal table */
-double mdcNormals[ 256 ][ 3 ] =
+const double mdcNormals[ 256 ][ 3 ] =
 {
        { 1.000000, 0.000000, 0.000000 },
        { 0.980785, 0.195090, 0.000000 },
index 227927291ebbe8b8ebf37e1f6cc93631da26dbf1..544b433674a73ca292a37168150e08c886fde2af 100644 (file)
@@ -220,7 +220,7 @@ inline bool string_parse_size( const char* string, std::size_t& i ){
 }
 
 
-#define RETURN_FALSE_IF_FAIL(expression) do { if (!(expression)) return false; } while (0)
+#define RETURN_FALSE_IF_FAIL( expression ) do{ if ( !expression ) {return false; } }while( 0 )
 
 inline void Tokeniser_unexpectedError( Tokeniser& tokeniser, const char* token, const char* expected ){
        globalErrorStream() << Unsigned( tokeniser.getLine() ) << ":" << Unsigned( tokeniser.getColumn() ) << ": parse error at '" << ( token != 0 ? token : "#EOF" ) << "': expected '" << expected << "'\n";
index e1c5de56d23f0ea0e4ec149a6c62115d9a0992b8..8fea68d7844ba904a28318b9a4dfa3ac7547f44d 100644 (file)
@@ -29,7 +29,7 @@
 
 #include "model.h"
 
-#define MD5_RETURN_FALSE_IF_FAIL(expression) do { if (!(expression)) { globalErrorStream() << "md5 parse failed: " #expression "\n"; return false; } } while (0)
+#define MD5_RETURN_FALSE_IF_FAIL( expression ) do{ if ( !( expression ) ) { globalErrorStream() << "md5 parse failed: " # expression "\n"; return false; } }while( 0 )
 
 bool MD5_parseToken( Tokeniser& tokeniser, const char* string ){
        const char* token = tokeniser.getToken();
index 283e36c515da9156e36951bb48e26baf0f7f6081..2e412badcfe5b71184d5c68c0abfa1e2042065c8 100644 (file)
@@ -839,6 +839,7 @@ void camwnd_update_xor_rectangle( CamWnd& self, rect_t area ){
 
 gboolean selection_button_press( ui::Widget widget, GdkEventButton* event, WindowObserver* observer ){
        if ( event->type == GDK_BUTTON_PRESS ) {
+               gtk_widget_grab_focus( widget );
                observer->onMouseDown( WindowVector_forDouble( event->x, event->y ), button_for_button( event->button ), modifiers_for_state( event->state ) );
        }
        return FALSE;
@@ -881,6 +882,11 @@ gboolean selection_motion_freemove( ui::Widget widget, GdkEventMotion *event, Wi
 }
 
 gboolean wheelmove_scroll( ui::Widget widget, GdkEventScroll* event, CamWnd* camwnd ){
+       //gtk_window_set_focus( camwnd->m_parent, camwnd->m_gl_widget );
+       gtk_widget_grab_focus( camwnd->m_gl_widget );
+       if( !gtk_window_is_active( camwnd->m_parent ) )
+               gtk_window_present( camwnd->m_parent );
+
        if ( event->direction == GDK_SCROLL_UP ) {
                Camera_Freemove_updateAxes( camwnd->getCamera() );
                if( camwnd->m_bFreeMove || !g_camwindow_globals.m_bZoomInToPointer ){
index 4c7525ea4fdb9219bd60c0b958946954c5b2db5a..b6a5344037ef8b6038e51bc8ce2dcf2f30947f7c 100644 (file)
@@ -84,7 +84,7 @@ inline void printParseError( const char* message ){
        globalErrorStream() << message;
 }
 
-#define PARSE_RETURN_FALSE_IF_FAIL(expression) do { if (!( expression)) { printParseError(FILE_LINE "\nparse failed: " #expression "\n"); return false; } } while (0)
+#define PARSE_RETURN_FALSE_IF_FAIL( expression ) do{ if ( !( expression ) ) { printParseError( FILE_LINE "\nparse failed: " # expression "\n" ); return false; } }while( 0 )
 
 bool EntityClassDoom3_parseToken( Tokeniser& tokeniser ){
        const char* token = tokeniser.getToken();
index 728307a66f4f3f1fdc2ab83c98e57b56fde5599f..3a7eddb258218c287da5bc146daeca682c1f6a0c 100644 (file)
@@ -316,6 +316,19 @@ void Entity_createFromSelection( const char* name, const Vector3& origin ){
 
        bool brushesSelected = Scene_countSelectedBrushes( GlobalSceneGraph() ) != 0;
 
+       //is important to have retexturing here; if doing in the end, undo doesn't succeed;
+       if ( string_compare_nocase_n( name, "trigger_", 8 ) == 0 && brushesSelected ){
+               const char* shader = g_pGameDescription->getKeyValue( "shader_trigger" );
+               if ( shader && *shader ){
+                       Scene_PatchSetShader_Selected( GlobalSceneGraph(), shader );
+                       Scene_BrushSetShader_Selected( GlobalSceneGraph(), shader );
+               }
+               else{
+                       Scene_PatchSetShader_Selected( GlobalSceneGraph(), "textures/common/trigger" );
+                       Scene_BrushSetShader_Selected( GlobalSceneGraph(), "textures/common/trigger" );
+               }
+       }
+
        if ( !( entityClass->fixedsize || isModel ) && !brushesSelected ) {
                globalErrorStream() << "failed to create a group entity - no brushes are selected\n";
                return;
@@ -402,18 +415,6 @@ void Entity_createFromSelection( const char* name, const Vector3& origin ){
                        Node_getEntity( node )->setKeyValue( "model", model );
                }
        }
-
-       if ( string_compare_nocase_n( name, "trigger_", 8 ) == 0 && brushesSelected ){
-               const char* shader = g_pGameDescription->getKeyValue( "shader_trigger" );
-               if ( shader && *shader ){
-                       Scene_PatchSetShader_Selected( GlobalSceneGraph(), shader );
-                       Scene_BrushSetShader_Selected( GlobalSceneGraph(), shader );
-               }
-               else{
-                       Scene_PatchSetShader_Selected( GlobalSceneGraph(), "textures/common/trigger" );
-                       Scene_BrushSetShader_Selected( GlobalSceneGraph(), "textures/common/trigger" );
-               }
-       }
 }
 
 #if 0
index fca38f92cd4c598852325ceccc19a725b4f9912f..d655774cde72d9207c9a34ecfd01fcf0e5cbf8a9 100644 (file)
@@ -33,6 +33,7 @@ void Scene_EntitySetClassname_Selected( const char* classname );
 
 
 const char* misc_model_dialog( ui::Widget parent );
+void Entity_setColour();
 
 void Entity_constructMenu( ui::Menu menu );
 
index 349d5d09b5fd34d47f3bf14f3a807121bbd6cd24..564d7173e3cfb328a9dbf4554fa5849567e9d1e0 100644 (file)
@@ -209,6 +209,52 @@ ShaderAttribute( const char* key ) : StringAttribute( key ){
 };
 
 
+class ColorAttribute : public EntityAttribute
+{
+CopiedString m_key;
+BrowsedPathEntry m_entry;
+NonModalEntry m_nonModal;
+public:
+ColorAttribute( const char* key ) :
+       m_key( key ),
+       m_entry( BrowseCaller( *this ) ),
+       m_nonModal( ApplyCaller( *this ), UpdateCaller( *this ) ){
+       m_nonModal.connect( m_entry.m_entry.m_entry );
+}
+void release(){
+       delete this;
+}
+ui::Widget getWidget() const {
+       return ui::Widget( m_entry.m_entry.m_frame );
+}
+void apply(){
+       StringOutputStream value( 64 );
+       value << gtk_entry_get_text( GTK_ENTRY( m_entry.m_entry.m_entry ) );
+       Scene_EntitySetKeyValue_Selected_Undoable( m_key.c_str(), value.c_str() );
+}
+typedef MemberCaller<ColorAttribute, void(), &ColorAttribute::apply> ApplyCaller;
+void update(){
+       StringOutputStream value( 64 );
+       value << SelectedEntity_getValueForKey( m_key.c_str() );
+       gtk_entry_set_text( GTK_ENTRY( m_entry.m_entry.m_entry ), value.c_str() );
+}
+typedef MemberCaller<ColorAttribute, void(), &ColorAttribute::update> UpdateCaller;
+void browse( const BrowsedPathEntry::SetPathCallback& setPath ){
+       //const char *filename = misc_model_dialog( gtk_widget_get_toplevel( GTK_WIDGET( m_entry.m_entry.m_frame ) ) );
+
+       /* hijack BrowsedPathEntry to call colour chooser */
+       Entity_setColour();
+
+//     if ( filename != 0 ) {
+//             setPath( filename );
+//             apply();
+//     }
+       update();
+}
+typedef MemberCaller<ColorAttribute, void(const BrowsedPathEntry::SetPathCallback&), &ColorAttribute::browse> BrowseCaller;
+};
+
+
 class ModelAttribute : public EntityAttribute
 {
 CopiedString m_key;
@@ -833,6 +879,36 @@ void SetComment( EntityClass* eclass ){
        g_current_comment = eclass;
 
        g_entityClassComment.text(eclass->comments());
+
+       GtkTextBuffer* buffer = gtk_text_view_get_buffer( g_entityClassComment );
+       //gtk_text_buffer_set_text( buffer, eclass->comments(), -1 );
+       const char* comment = eclass->comments(), *c;
+       int offset = 0, pattern_start = -1, spaces = 0;
+
+       gtk_text_buffer_set_text( buffer, comment, -1 );
+
+       // Catch patterns like "\nstuff :" used to describe keys and spawnflags, and make them bold for readability.
+
+       for( c = comment; *c; ++c, ++offset ) {
+               if( *c == '\n' ) {
+                       pattern_start = offset;
+                       spaces = 0;
+               }
+               else if( pattern_start >= 0 && ( *c < 'a' || *c > 'z' ) && ( *c < 'A' || *c > 'Z' ) && ( *c < '0' || *c > '9' ) && ( *c != '_' ) ) {
+                       if( *c == ':' && spaces <= 1 ) {
+                               GtkTextIter iter_start, iter_end;
+
+                               gtk_text_buffer_get_iter_at_offset( buffer, &iter_start, pattern_start );
+                               gtk_text_buffer_get_iter_at_offset( buffer, &iter_end, offset );
+                               gtk_text_buffer_apply_tag_by_name( buffer, "bold", &iter_start, &iter_end );
+                       }
+
+                       if( *c == ' ' )
+                               ++spaces;
+                       else
+                               pattern_start = -1;
+               }
+       }
 }
 
 void SurfaceFlags_setEntityClass( EntityClass* eclass ){
@@ -933,7 +1009,7 @@ Creators m_creators;
 public:
 EntityAttributeFactory(){
        m_creators.insert( Creators::value_type( "string", &StatelessAttributeCreator<StringAttribute>::create ) );
-       m_creators.insert( Creators::value_type( "color", &StatelessAttributeCreator<StringAttribute>::create ) );
+       m_creators.insert( Creators::value_type( "color", &StatelessAttributeCreator<ColorAttribute>::create ) );
        m_creators.insert( Creators::value_type( "integer", &StatelessAttributeCreator<StringAttribute>::create ) );
        m_creators.insert( Creators::value_type( "real", &StatelessAttributeCreator<StringAttribute>::create ) );
        m_creators.insert( Creators::value_type( "shader", &StatelessAttributeCreator<ShaderAttribute>::create ) );
@@ -1398,6 +1474,10 @@ ui::Widget EntityInspector_constructWindow( ui::Window toplevel ){
                                        text.show();
                                        scr.add(text);
                                        g_entityClassComment = text;
+                                       {
+                                               GtkTextBuffer *buffer = gtk_text_view_get_buffer( text );
+                                               gtk_text_buffer_create_tag( buffer, "bold", "weight", PANGO_WEIGHT_BOLD, NULL );
+                                       }
                                }
                        }
                }
index 133b4a75bfd5666ef2ab8203738185acd5a36412..4e4efa67fb9ac9cee605ad1d2ef517eaeaef29b9 100644 (file)
@@ -1,4 +1,4 @@
-/*
+/*
    Copyright (C) 1999-2006 Id Software, Inc. and contributors.
    For a list of contributors, see the accompanying CONTRIBUTORS file.
 
@@ -600,12 +600,28 @@ ui::Window BuildDialog(){
        auto vbox2 = create_dialog_vbox( 0, 4 );
        frame.add(vbox2);
 
+       const char* engine;
+#if defined( WIN32 )
+       engine = g_pGameDescription->getRequiredKeyValue( "engine_win32" );
+#elif defined( __linux__ ) || defined ( __FreeBSD__ )
+       engine = g_pGameDescription->getRequiredKeyValue( "engine_linux" );
+#elif defined( __APPLE__ )
+       engine = g_pGameDescription->getRequiredKeyValue( "engine_macos" );
+#else
+#error "unsupported platform"
+#endif
+       StringOutputStream text( 256 );
+       text << "Select directory, where game executable sits (typically \"" << engine << "\")\n";
+       GtkLabel* label = GTK_LABEL( gtk_label_new( text.c_str() ) );
+       gtk_widget_show( GTK_WIDGET( label ) );
+       gtk_container_add( GTK_CONTAINER( vbox2 ), GTK_WIDGET( label ) );
+
        {
                PreferencesPage preferencesPage( *this, vbox2 );
                Paths_constructPreferences( preferencesPage );
        }
 
-       return ui::Window(create_simple_modal_dialog_window( "Engine Path Not Found", m_modal, frame ));
+       return ui::Window(create_simple_modal_dialog_window( "Engine Path Configuration", m_modal, frame ));
 }
 };
 
index adbfefba46874f292a975ddfdd96a378c165fbd9..4c19f55dcd787db315f45372271408f33cf78900 100644 (file)
@@ -426,7 +426,7 @@ void CGameDialog::Init(){
                        }
                }
        }
-       if ( m_bGamePrompt || !currentGameDescription ) {
+       if ( !currentGameDescription ) {
                Create();
                DoGameDialog();
                // use m_nComboSelect to identify the game to run as and set the globals
index 59dd60daaa0c6e42633932892511d91fa594429c..9051097b9deab44b8b8c9ee504c2827172e42ec9 100644 (file)
@@ -252,7 +252,7 @@ std::list<CGameDescription*> mGames;
 
 CGameDialog() :
        m_sGameFile( "" ),
-       m_bGamePrompt( true ),
+       m_bGamePrompt( false ),
        m_bForceLogConsole( false ){
 }
 virtual ~CGameDialog();
index a76c0d99e912783deb95ad95e949b4a96d09d771..00969834e90e47146e3a65723589043bb39c1885 100644 (file)
@@ -393,10 +393,10 @@ TextureBrowser() :
        m_rmbSelected( false ),
        m_searchedTags( false ),
        m_tags( false ),
+       m_move_started( false ),
        m_uniformTextureSize( 160 ),
        m_uniformTextureMinSize( 48 ),
-       m_hideNonShadersInCommon( true ),
-       m_move_started( false ){
+       m_hideNonShadersInCommon( true ){
 }
 };
 
@@ -868,6 +868,7 @@ void visit( const char* minor, const _QERPlugImageTable& table ) const {
 };
 
 void TextureBrowser_ShowDirectory( TextureBrowser& textureBrowser, const char* directory ){
+       textureBrowser.m_searchedTags = false;
        if ( TextureBrowser_showWads() ) {
                Archive* archive = GlobalFileSystem().getArchive( directory );
                ASSERT_NOTNULL( archive );
@@ -1477,6 +1478,7 @@ void BuildStoreAvailableTags(   ui::ListStore storeAvailable,
 
 gboolean TextureBrowser_button_press( ui::Widget widget, GdkEventButton* event, TextureBrowser* textureBrowser ){
        if ( event->type == GDK_BUTTON_PRESS ) {
+               gtk_widget_grab_focus( widget );
                if ( event->button == 3 ) {
                        if ( GlobalTextureBrowser().m_tags ) {
                                textureBrowser->m_rmbSelected = true;
@@ -1554,6 +1556,10 @@ gboolean TextureBrowser_motion( ui::Widget widget, GdkEventMotion *event, Textur
 }
 
 gboolean TextureBrowser_scroll( ui::Widget widget, GdkEventScroll* event, TextureBrowser* textureBrowser ){
+       gtk_widget_grab_focus( widget );
+       if( !gtk_window_is_active( textureBrowser->m_parent ) )
+               gtk_window_present( textureBrowser->m_parent );
+
        if ( event->direction == GDK_SCROLL_UP ) {
                TextureBrowser_MouseWheel( *textureBrowser, true );
        }
index 6da0a4b25fefd0907a712493a7da1f2906553915..3e81deefa49f0c974b8107a358e1b223de017a57 100644 (file)
@@ -751,6 +751,8 @@ void xy_update_xor_rectangle( XYWnd& self, rect_t area ){
 
 gboolean xywnd_button_press( ui::Widget widget, GdkEventButton* event, XYWnd* xywnd ){
        if ( event->type == GDK_BUTTON_PRESS ) {
+               gtk_widget_grab_focus( xywnd->GetWidget() );
+
                if( !xywnd->Active() ){
                        g_pParentWnd->SetActiveXY( xywnd );
                }
@@ -790,6 +792,11 @@ void xywnd_motion( gdouble x, gdouble y, guint state, void* data ){
 }
 
 gboolean xywnd_wheel_scroll( ui::Widget widget, GdkEventScroll* event, XYWnd* xywnd ){
+       gtk_widget_grab_focus( xywnd->GetWidget() );
+       ui::Window window = xywnd->m_parent ? xywnd->m_parent : MainFrame_getWindow();
+       if( !gtk_window_is_active( window ) )
+               gtk_window_present( window );
+
        if( !xywnd->Active() ){
                g_pParentWnd->SetActiveXY( xywnd );
        }
index 7a5079ead40ee1d19a39da4b9bbd6c10135511f6..eb79bef7303f5e6670f2b760a4988c39fe584902 100644 (file)
@@ -266,7 +266,7 @@ skipspace:
                        Error( "Line %i is incomplete\nFile location be: %s\n", scriptline, g_strLoadedFileLocation );
                }
                script->script_p += 2;
-               while ( script->script_p[0] != '*' && script->script_p[1] != '/' )
+               while ( script->script_p[0] != '*' || script->script_p[1] != '/' )
                {
                        if ( *script->script_p == '\n' ) {
                                script->line++;
index 676fa31599df4754276c9580b5e532edd709912c..5fcfcb20705aa02cf22d7af90629ffd9b7546df6 100644 (file)
@@ -669,7 +669,7 @@ int FloodEntities( tree_t *tree ){
        node_t      *headnode;
        entity_t    *e, *tripped;
        const char  *value;
-       int tripcount;
+       int tripcount = INT_MIN;
 
 
        headnode = tree->headnode;