From: Thomas Debesse Date: Mon, 22 Feb 2021 23:49:09 +0000 (+0100) Subject: Merge commit '461d008daa6328113ea4ccda37e5604d3df14ba3' into garux-merge X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=54a2bda443aace9c00a1615af10cc1dc8b1f0cd1;p=xonotic%2Fnetradiant.git Merge commit '461d008daa6328113ea4ccda37e5604d3df14ba3' into garux-merge --- 54a2bda443aace9c00a1615af10cc1dc8b1f0cd1 diff --cc libs/picomodel/pm_mdc.c index 235dcecf,aac525b8..5139da02 --- a/libs/picomodel/pm_mdc.c +++ b/libs/picomodel/pm_mdc.c @@@ -36,16 -43,16 +36,16 @@@ #include "picointernal.h" /* mdc model format */ -#define MDC_MAGIC "IDPC" -#define MDC_VERSION 2 +const char *MDC_MAGIC = "IDPC"; +const int MDC_VERSION = 2; /* mdc vertex scale */ -#define MDC_SCALE ( 1.0f / 64.0f ) -#define MDC_MAX_OFS 127.0f -#define MDC_DIST_SCALE 0.05f +const float MDC_SCALE = ( 1.0f / 64.0f ); +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 }, diff --cc libs/stringio.h index 22792729,83572e2f..544b4336 --- a/libs/stringio.h +++ b/libs/stringio.h @@@ -220,7 -219,8 +220,7 @@@ inline bool string_parse_size( const ch } - #define RETURN_FALSE_IF_FAIL(expression) do { if (!(expression)) return false; } while (0) -//#define RETURN_FALSE_IF_FAIL( expression ) if ( !expression ) {return false; }else + #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"; diff --cc plugins/md3model/md5.cpp index e1c5de56,6da4b720..8fea68d7 --- a/plugins/md3model/md5.cpp +++ b/plugins/md3model/md5.cpp @@@ -29,7 -29,8 +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 ) if ( !( expression ) ) { globalErrorStream() << "md5 parse failed: " # expression "\n"; return false; } else + #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(); diff --cc radiant/camwindow.cpp index 283e36c5,1c782e43..2e412bad --- a/radiant/camwindow.cpp +++ b/radiant/camwindow.cpp @@@ -837,8 -843,9 +837,9 @@@ void camwnd_update_xor_rectangle( CamWn } -gboolean selection_button_press( GtkWidget* widget, GdkEventButton* event, WindowObserver* observer ){ +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; @@@ -880,7 -886,12 +881,12 @@@ gboolean selection_motion_freemove( ui: return FALSE; } -gboolean wheelmove_scroll( GtkWidget* widget, GdkEventScroll* event, CamWnd* camwnd ){ +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 ){ diff --cc radiant/eclass_doom3.cpp index 4c7525ea,a358dcce..b6a53440 --- a/radiant/eclass_doom3.cpp +++ b/radiant/eclass_doom3.cpp @@@ -84,7 -84,8 +84,7 @@@ inline void printParseError( const char 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 ) if ( !( expression ) ) { printParseError( FILE_LINE "\nparse failed: " # expression "\n" ); return false; } else + #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(); diff --cc radiant/entity.h index fca38f92,9096287a..d655774c --- a/radiant/entity.h +++ b/radiant/entity.h @@@ -32,9 -30,12 +32,10 @@@ void Scene_EntitySetKeyValue_Selected( void Scene_EntitySetClassname_Selected( const char* classname ); -typedef struct _GtkWidget GtkWidget; -const char* misc_model_dialog( GtkWidget* parent ); +const char* misc_model_dialog( ui::Widget parent ); + void Entity_setColour(); -typedef struct _GtkMenu GtkMenu; -void Entity_constructMenu( GtkMenu* menu ); +void Entity_constructMenu( ui::Menu menu ); void Entity_Construct(); void Entity_Destroy(); diff --cc radiant/entityinspector.cpp index 349d5d09,4905cf01..564d7173 --- a/radiant/entityinspector.cpp +++ b/radiant/entityinspector.cpp @@@ -209,6 -222,52 +209,52 @@@ ShaderAttribute( const char* key ) : St }; + 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; + } -GtkWidget* getWidget() const { - return GTK_WIDGET( m_entry.m_entry.m_frame ); ++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 ApplyCaller; ++typedef MemberCaller 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 UpdateCaller; ++typedef MemberCaller 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 MemberCaller1 BrowseCaller; ++typedef MemberCaller BrowseCaller; + }; + + class ModelAttribute : public EntityAttribute { CopiedString m_key; @@@ -832,7 -892,35 +878,37 @@@ 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 ){ @@@ -1391,13 -1482,17 +1467,17 @@@ ui::Widget EntityInspector_constructWin gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( scr ), GTK_SHADOW_IN ); { - GtkTextView* text = GTK_TEXT_VIEW( gtk_text_view_new() ); - gtk_widget_set_size_request( GTK_WIDGET( text ), 0, -1 ); // allow shrinking + auto text = ui::TextView(ui::New); + text.dimensions(0, -1); // allow shrinking gtk_text_view_set_wrap_mode( text, GTK_WRAP_WORD ); gtk_text_view_set_editable( text, FALSE ); - gtk_widget_show( GTK_WIDGET( text ) ); - gtk_container_add( GTK_CONTAINER( scr ), GTK_WIDGET( text ) ); + 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 ); + } } } } diff --cc radiant/mainframe.cpp index 133b4a75,1c956db0..4e4efa67 --- a/radiant/mainframe.cpp +++ b/radiant/mainframe.cpp @@@ -594,18 -432,34 +594,34 @@@ void Paths_registerPreferencesPage() class PathsDialog : public Dialog { public: -GtkWindow* BuildDialog(){ - GtkFrame* frame = create_dialog_frame( "Path settings", GTK_SHADOW_ETCHED_IN ); +ui::Window BuildDialog(){ + auto frame = create_dialog_frame( "Path settings", ui::Shadow::ETCHED_IN ); - GtkVBox* vbox2 = create_dialog_vbox( 0, 4 ); - gtk_container_add( GTK_CONTAINER( frame ), GTK_WIDGET( vbox2 ) ); + 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, GTK_WIDGET( vbox2 ) ); + PreferencesPage preferencesPage( *this, vbox2 ); Paths_constructPreferences( preferencesPage ); } - return ui::Window(create_simple_modal_dialog_window( "Engine Path Not Found", m_modal, frame )); - return create_simple_modal_dialog_window( "Engine Path Configuration", m_modal, GTK_WIDGET( frame ) ); ++ return ui::Window(create_simple_modal_dialog_window( "Engine Path Configuration", m_modal, frame )); } }; diff --cc radiant/texwindow.cpp index a76c0d99,efc5f432..00969834 --- a/radiant/texwindow.cpp +++ b/radiant/texwindow.cpp @@@ -1475,8 -1376,9 +1476,9 @@@ void BuildStoreAvailableTags( ui::Lis } } -gboolean TextureBrowser_button_press( GtkWidget* widget, GdkEventButton* event, TextureBrowser* textureBrowser ){ +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; @@@ -1553,7 -1452,11 +1555,11 @@@ gboolean TextureBrowser_motion( ui::Wid return FALSE; } -gboolean TextureBrowser_scroll( GtkWidget* widget, GdkEventScroll* event, TextureBrowser* textureBrowser ){ +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 ); } diff --cc radiant/xywindow.cpp index 6da0a4b2,9a1be033..3e81deef --- a/radiant/xywindow.cpp +++ b/radiant/xywindow.cpp @@@ -749,8 -744,10 +749,10 @@@ void xy_update_xor_rectangle( XYWnd& se } } -gboolean xywnd_button_press( GtkWidget* widget, GdkEventButton* event, XYWnd* xywnd ){ +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 ); } @@@ -789,7 -786,12 +791,12 @@@ void xywnd_motion( gdouble x, gdouble y reinterpret_cast( data )->XY_MouseMoved( static_cast( x ), static_cast( y ), buttons_for_state( state ) ); } -gboolean xywnd_wheel_scroll( GtkWidget* widget, GdkEventScroll* event, XYWnd* xywnd ){ +gboolean xywnd_wheel_scroll( ui::Widget widget, GdkEventScroll* event, XYWnd* xywnd ){ + gtk_widget_grab_focus( xywnd->GetWidget() ); - GtkWindow* window = xywnd->m_parent != 0 ? xywnd->m_parent : MainFrame_getWindow(); ++ 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 ); }