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();
#define 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 },
}
-#define RETURN_FALSE_IF_FAIL( expression ) if ( !expression ) {return false; }else
+//#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";
#include "model.h"
-#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 ) 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();
gboolean selection_button_press( GtkWidget* 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;
}
gboolean wheelmove_scroll( GtkWidget* 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 ){
globalErrorStream() << message;
}
-#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 ) 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();
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;
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
typedef struct _GtkWidget GtkWidget;
const char* misc_model_dialog( GtkWidget* parent );
+void Entity_setColour();
typedef struct _GtkMenu GtkMenu;
void Entity_constructMenu( GtkMenu* menu );
};
+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 );
+}
+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, &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, &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 MemberCaller1<ColorAttribute, const BrowsedPathEntry::SetPathCallback&, &ColorAttribute::browse> BrowseCaller;
+};
+
+
class ModelAttribute : public EntityAttribute
{
CopiedString m_key;
g_current_comment = eclass;
GtkTextBuffer* buffer = gtk_text_view_get_buffer( g_entityClassComment );
- gtk_text_buffer_set_text( buffer, eclass->comments(), -1 );
+ //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 ){
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 ) );
gtk_widget_show( GTK_WIDGET( text ) );
gtk_container_add( GTK_CONTAINER( scr ), GTK_WIDGET( text ) );
g_entityClassComment = text;
+ {
+ GtkTextBuffer *buffer = gtk_text_view_get_buffer( text );
+ gtk_text_buffer_create_tag( buffer, "bold", "weight", PANGO_WEIGHT_BOLD, NULL );
+ }
}
}
}
// =============================================================================
// Add new shader tag dialog
-EMessageBoxReturn DoShaderTagDlg( CopiedString* tag, char* title ){
+EMessageBoxReturn DoShaderTagDlg( CopiedString* tag, const char* title ){
ModalDialog dialog;
GtkEntry* textentry;
ModalDialogButton ok_button( dialog, eIDOK );
return ret;
}
-EMessageBoxReturn DoShaderInfoDlg( const char* name, const char* filename, char* title ){
+EMessageBoxReturn DoShaderInfoDlg( const char* name, const char* filename, const char* title ){
ModalDialog dialog;
ModalDialogButton ok_button( dialog, eIDOK );
#include "string/string.h"
EMessageBoxReturn DoLightIntensityDlg( int *intensity );
-EMessageBoxReturn DoShaderTagDlg( CopiedString *tag, char* title );
-EMessageBoxReturn DoShaderInfoDlg( const char* name, const char* filename, char* title );
+EMessageBoxReturn DoShaderTagDlg( CopiedString *tag, const char* title );
+EMessageBoxReturn DoShaderInfoDlg( const char* name, const char* filename, const char* title );
EMessageBoxReturn DoTextureLayout( float *fx, float *fy );
void DoTextEditor( const char* filename, int cursorpos, int length, bool external_editor );
-/*
+/*
Copyright (C) 1999-2006 Id Software, Inc. and contributors.
For a list of contributors, see the accompanying CONTRIBUTORS file.
GtkVBox* vbox2 = create_dialog_vbox( 0, 4 );
gtk_container_add( GTK_CONTAINER( frame ), GTK_WIDGET( 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 ) );
Paths_constructPreferences( preferencesPage );
}
- return create_simple_modal_dialog_window( "Engine Path Not Found", m_modal, GTK_WIDGET( frame ) );
+ return create_simple_modal_dialog_window( "Engine Path Configuration", m_modal, GTK_WIDGET( frame ) );
}
};
}
}
}
- if ( m_bGamePrompt || !currentGameDescription ) {
+ if ( !currentGameDescription ) {
Create();
DoGameDialog();
// use m_nComboSelect to identify the game to run as and set the globals
CGameDialog() :
m_sGameFile( "" ),
- m_bGamePrompt( true ),
+ m_bGamePrompt( false ),
m_bForceLogConsole( false ){
}
virtual ~CGameDialog();
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 ){
}
};
};
void TextureBrowser_ShowDirectory( TextureBrowser& textureBrowser, const char* directory ){
+ textureBrowser.m_searchedTags = false;
if ( TextureBrowser_showWads() ) {
Archive* archive = GlobalFileSystem().getArchive( directory );
ASSERT_NOTNULL( archive );
gboolean TextureBrowser_button_press( GtkWidget* 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;
}
gboolean TextureBrowser_scroll( GtkWidget* 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 );
}
name << GlobalRadiant().getAppPath() << "bitmaps/notex.png";
g_notex = name.c_str();
- name = NULL;
+ name.clear();
name << GlobalRadiant().getAppPath() << "bitmaps/shadernotex.png";
g_shadernotex = name.c_str();
}
gboolean xywnd_button_press( GtkWidget* widget, GdkEventButton* event, XYWnd* xywnd ){
if ( event->type == GDK_BUTTON_PRESS ) {
+ gtk_widget_grab_focus( xywnd->GetWidget() );
+
if( !xywnd->Active() ){
g_pParentWnd->SetActiveXY( xywnd );
}
}
gboolean xywnd_wheel_scroll( GtkWidget* widget, GdkEventScroll* event, XYWnd* xywnd ){
+ gtk_widget_grab_focus( xywnd->GetWidget() );
+ GtkWindow* window = xywnd->m_parent != 0 ? xywnd->m_parent : MainFrame_getWindow();
+ if( !gtk_window_is_active( window ) )
+ gtk_window_present( window );
+
if( !xywnd->Active() ){
g_pParentWnd->SetActiveXY( xywnd );
}
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++;
node_t *headnode;
entity_t *e, *tripped;
const char *value;
- int tripcount;
+ int tripcount = INT_MIN;
headnode = tree->headnode;