- g_pGroupDlg->Show();
- }
- else // 4 way
- {
- {
- GtkWidget* hsplit = gtk_hpaned_new();
- m_pSplits[0] = hsplit;
- gtk_box_pack_start( GTK_BOX( vbox ), hsplit, TRUE, TRUE, 0 );
- gtk_widget_show( hsplit );
-
- {
- GtkWidget* vsplit1 = gtk_vpaned_new();
- m_pSplits[1] = vsplit1;
- gtk_paned_add1( GTK_PANED( hsplit ), vsplit1 );
- gtk_widget_show( vsplit1 );
-
- {
- GtkWidget* vsplit2 = gtk_vpaned_new();
- m_pSplits[2] = vsplit2;
- gtk_paned_add2( GTK_PANED( hsplit ), vsplit2 );
- gtk_widget_show( vsplit2 );
-
- m_pCamWnd = new CamWnd();
- {
- GtkWidget* frame = create_framed_widget( m_pCamWnd->GetWidget() );
- gtk_paned_add1( GTK_PANED( vsplit1 ), frame );
- }
-
- m_pXYWnd = new XYWnd();
- m_pXYWnd->SetViewType( XY );
- {
- GtkWidget* frame = create_framed_widget( m_pXYWnd->GetWidget() );
- gtk_paned_add1( GTK_PANED( vsplit2 ), frame );
- }
-
- m_pYZWnd = new XYWnd();
- m_pYZWnd->SetViewType( YZ );
- {
- GtkWidget* frame = create_framed_widget( m_pYZWnd->GetWidget() );
- gtk_paned_add2( GTK_PANED( vsplit1 ), frame );
- }
-
- m_pXZWnd = new XYWnd();
- m_pXZWnd->SetViewType( XZ );
- {
- GtkWidget* frame = create_framed_widget( m_pXZWnd->GetWidget() );
- gtk_paned_add2( GTK_PANED( vsplit2 ), frame );
- }
- }
- }
- }
-
- // g_qeglobals_gui.d_edit = NULL;
-
- {
- m_pTexWnd = new TexWnd();
- GtkWidget* frame = create_framed_texwnd( m_pTexWnd );
-
- {
- GtkWidget* w = gtk_label_new( _( "Textures" ) );
- gtk_widget_show( w );
- gtk_notebook_insert_page( GTK_NOTEBOOK( g_pGroupDlg->m_pNotebook ), frame, w, 1 );
- }
- }
-
- m_pTexWnd->m_pParent = g_pGroupDlg->m_pWidget;
-// gtk_widget_realize (m_pTexWnd->GetWidget ());
- m_pZWnd = create_floating_zwnd( this );
-
- while ( gtk_events_pending() )
- gtk_main_iteration();
-
- {
- int x = GTK_PANED( m_pSplits[0] )->max_position / 2 - gutter;
- gtk_paned_set_position( GTK_PANED( m_pSplits[0] ), x );
- }
-
- {
- int y = GTK_PANED( m_pSplits[1] )->max_position / 2 - gutter;
- gtk_paned_set_position( GTK_PANED( m_pSplits[1] ), y );
- gtk_paned_set_position( GTK_PANED( m_pSplits[2] ), y );
- }
- }
-
- if ( g_PrefsDlg.mWindowInfo.nState & GDK_WINDOW_STATE_MAXIMIZED ) {
- gtk_window_maximize( GTK_WINDOW( window ) );
- }
-
- gtk_widget_show( window );
-
- Texture_Init();
-
- if ( m_pXYWnd ) { // this is always true?
- m_pXYWnd->SetActive( true );
- }
- m_bSplittersOK = true;
- Texture_SetMode( g_qeglobals.d_savedinfo.iTexMenu );
-
- g_pParentWnd->OnEntitiesSetViewAs( 0 );
-
-// m_wndTextureBar.Create (vbox);
- create_main_statusbar( window, vbox );
-
- LoadCommandMap();
- ShowMenuItemKeyBindings( window );
-
- if ( g_qeglobals_gui.d_edit != NULL ) {
- console_construct( g_qeglobals_gui.d_edit );
- }
-
- // bool load_last = FALSE;
-
- SetGridStatus();
- SetButtonMenuStates();
-
- // m_bShowShader and m_bTextureShaderlistOnly have a menu checkbox, update it now
- GtkWidget *item;
- g_bIgnoreCommands++;
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_shaders_show" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bShowShaders ? TRUE : FALSE );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_textures_shaderlistonly" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_PrefsDlg.m_bTexturesShaderlistOnly ? TRUE : FALSE );
- g_bIgnoreCommands--;
-
-// if (g_PrefsDlg.m_bTextureBar)
-// gtk_widget_show (m_wndTextureBar.m_pWidget);
-
- SetActiveXY( m_pXYWnd );
-
- s_idle_id = gtk_timeout_add( 25, mainframe_idle, this );
-
- QGL_InitExtensions();
-
- if ( g_PrefsDlg.mLocalPrefs.mbEmpty ) {
- g_PrefsDlg.mLocalPrefs.mbEmpty = false;
- g_PrefsDlg.SavePrefs();
- }
-
- // remove the pid file
- remove( g_pidGameFile.GetBuffer() );
-
- Sys_Printf( "Entering message loop\n" );
-
- m_bDoLoop = true;
-
- m_nTimer = gtk_timeout_add( 1000, timer, this );
-}
-
-// =============================================================================
-// MainFrame class
-
-MainFrame::MainFrame(){
- m_bDoLoop = false;
- m_bSplittersOK = false;
- g_pParentWnd = this;
- m_pXYWnd = (XYWnd*)NULL;
- m_pCamWnd = NULL;
- m_pTexWnd = (TexWnd*)NULL;
- m_pZWnd = (ZWnd*)NULL;
- m_pYZWnd = (XYWnd*)NULL;
- m_pXZWnd = (XYWnd*)NULL;
- m_pActiveXY = (XYWnd*)NULL;
- m_bCamPreview = true;
- m_pWatchBSP = NULL;
- for ( int n = 0; n < 6; n++ )
- m_pStatusLabel[n] = NULL;
- m_bNeedStatusUpdate = false;
- m_nTimer = 0;
- m_bSleeping = false;
- Create();
-}
-
-MainFrame::~MainFrame(){
- while ( g_BSPFrontendCommands )
- {
- free( g_BSPFrontendCommands->data );
- g_BSPFrontendCommands = g_slist_remove( g_BSPFrontendCommands, g_BSPFrontendCommands->data );
- }
-}
-
-void MainFrame::ReleaseContexts(){
- if ( m_pXYWnd ) {
- m_pXYWnd->DestroyContext();
- }
- if ( m_pYZWnd ) {
- m_pYZWnd->DestroyContext();
- }
- if ( m_pXZWnd ) {
- m_pXZWnd->DestroyContext();
- }
- if ( m_pCamWnd ) {
- m_pCamWnd->DestroyContext();
- }
- if ( m_pTexWnd ) {
- m_pTexWnd->DestroyContext();
- }
- if ( m_pZWnd ) {
- m_pZWnd->DestroyContext();
- }
-}
-
-void MainFrame::CreateContexts(){
- if ( m_pCamWnd ) {
- m_pCamWnd->CreateContext();
- }
- if ( m_pXYWnd ) {
- m_pXYWnd->CreateContext();
- }
- if ( m_pYZWnd ) {
- m_pYZWnd->CreateContext();
- }
- if ( m_pXZWnd ) {
- m_pXZWnd->CreateContext();
- }
- if ( m_pTexWnd ) {
- m_pTexWnd->CreateContext();
- }
- if ( m_pZWnd ) {
- m_pZWnd->CreateContext();
- }
-}
-
-static void Sys_Iconify( GtkWidget *w ){
- // we might not have been realized yet
- if ( w->window == NULL ) {
- return;
- }
-
- if ( !GTK_WIDGET_MAPPED( w ) ) {
- return;
- }
-
-#if defined ( __linux__ ) || defined ( __APPLE__ )
- Sys_FPrintf( SYS_WRN, "FIXME: Sys_Iconify\n" );
-#if 0
- XWindowAttributes xattr;
- GdkWindowPrivate *Private;
-
- Private = (GdkWindowPrivate*)w->window;
- g_object_set_data( G_OBJECT( w ), "was_mapped", GINT_TO_POINTER( 0 ) );
-
- if ( !Private->destroyed ) {
- xattr.map_state = IsUnmapped;
- XGetWindowAttributes( Private->xdisplay, Private->xwindow, &xattr );
-
- if ( xattr.map_state != IsUnmapped ) {
- g_object_set_data( G_OBJECT( w ), "was_mapped", GINT_TO_POINTER( 1 ) );
- }
-
- XIconifyWindow( Private->xdisplay, Private->xwindow, 0 );
- }
-#endif
-#endif
-
-#ifdef _WIN32
- ShowWindow( (HWND)GDK_WINDOW_HWND( w->window ), SW_MINIMIZE );
-#endif
-}
-
-static void Sys_Restore( GtkWidget *w ){
- // we might not have been realized yet
- if ( w->window == NULL ) {
- return;
- }
-
- if ( !GTK_WIDGET_VISIBLE( w ) ) {
- return;
- }
-
-#if defined ( __linux__ ) || defined ( __APPLE__ )
- Sys_FPrintf( SYS_WRN, "FIXME: Sys_Restore\n" );
- #if 0
- XWindowAttributes xattr;
- GdkWindowPrivate *Private;
-
- Private = (GdkWindowPrivate*)w->window;
-
- xattr.map_state = IsUnmapped;
- XGetWindowAttributes( Private->xdisplay, Private->xwindow, &xattr );
-
- if ( xattr.map_state == IsUnmapped ) {
- XMapRaised( Private->xdisplay, Private->xwindow );
- }
- #endif
-#endif
-
-#ifdef _WIN32
- ShowWindow( (HWND)GDK_WINDOW_HWND( w->window ), SW_RESTORE );
-#endif
-}
-
-#ifdef _DEBUG
-//#define DBG_SLEEP
-#endif
-
-void RefreshModelSkin( GSList **pModels, entitymodel_t *model ){
- //++timo FIXME: the are some bogus entitymodel_t that appear in the list cause of buggy HasModel
- // so we avoid the fucked up ones, assuming they are at the end
- if ( !model->strSkin ) {
-#ifdef DBG_SLEEP
- Sys_Printf( "Dropping model %p with empty skin in RefreshModelSkin\n", model );
-#endif
-
- // and also keeping it so we have an actual count of empty models
- g_slist_append( *pModels, model );
- return;
- }
- // do we have this model already?
- if ( g_slist_find( *pModels, model ) ) {
-#ifdef DBG_SLEEP
-
- // looks like we don't have the filename for the model, only the skin name and tris.. so we put the adress
- Sys_Printf( "Already processed model: %p %s\n", model, ( (GString *)model->strSkin )->str );
-#endif
- return;
- }
- model->nTextureBind = Texture_LoadSkin( ( (GString *)model->strSkin )->str, &model->nSkinWidth, &model->nSkinHeight );
- if ( model->nTextureBind != -1 ) {
- Sys_Printf( "LOADED SKIN: %s\n", ( (GString *)model->strSkin )->str );
- }
- else{
- Sys_Printf( "Load skin failed: %s\n", ( (GString *)model->strSkin )->str );
- }
- *pModels = g_slist_append( *pModels, model );
-#ifdef DBG_SLEEP
- Sys_Printf( "Processed model %p %s\n", model, ( (GString *)model->strSkin )->str );
-#endif
-}
-
-void MainFrame::OnSleep(){
- m_bSleeping ^= 1;
- if ( m_bSleeping ) {
- // useful when trying to debug crashes in the sleep code
- Sys_Printf( "Going into sleep mode..\n" );
-
- Sys_Printf( "Dispatching sleep msg..." );
- DispatchRadiantMsg( RADIANT_SLEEP );
- Sys_Printf( "Done.\n" );
-
- if ( CurrentStyle() == eSplit ) {
- Sys_Iconify( m_pZWnd->m_pParent );
- }
-
- Sys_Iconify( m_pWidget );
- Select_Deselect();
- QERApp_FreeShaders();
- g_bScreenUpdates = false;
-
- // release contexts
- Sys_Printf( "Releasing contexts..." );
- ReleaseContexts();
- Sys_Printf( "Done.\n" );
-
- // free all the skins in the caches
- // their GL resources have been freed but the structs are not, so Radiant would think they are still valid
- g_lstSkinCache.RemoveAll();
- }
- else
- {
- Sys_Printf( "Waking up\n" );
- if ( CurrentStyle() == eSplit ) {
- Sys_Restore( m_pZWnd->m_pParent );
- }
-
- Sys_Restore( m_pWidget );
-
- // create contexts
- Sys_Printf( "Creating contexts..." );
- CreateContexts();
- Sys_Printf( "Done.\n" );
-
- Sys_Printf( "Making current on camera..." );
- m_pCamWnd->MakeCurrent();
- Sys_Printf( "Done.\n" );
-
- Sys_Printf( "Reloading shaders..." );
- // reload the shader scripts and textures
- QERApp_ReloadShaders();
- // current shader
- // NOTE: we are kinda making it loop on itself, it will update the pShader and scroll the texture window
- Texture_SetTexture( &g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, NULL, false );
- Sys_Printf( "Done.\n" );
-
- // rebuild the patches by setting the bDirty flag on them
- for ( brush_t* b = active_brushes.next ; b != &active_brushes ; b = b->next )
- {
- if ( b->patchBrush ) {
- b->pPatch->bDirty = true;
- }
- }
-
- Sys_Printf( "Reloading skins..." );
- // we have purged all the skins before going to sleep
- // to rebuild, go through everything that needs a skin and call Texture_LoadSkin
- // namely, all entitymodel_t
- // since there's no direct list we go through entities to get the eclass_t and from there the entitymodel_t
- // (a single eclass_t can reference several entitymodel_t)
- // FIXME: and what's up with md3Class then? what is it used for?
-/*
- eclass_t *e;
- entity_t *ent;
- GSList *Models = NULL;
- for (ent = entities.next; ent != &entities; ent = ent->next)
- {
- // if it's a model with skin then the fixedsize flag must be on
- // only if there IS a model .. we are not trying to load
- if (ent->eclass->fixedsize)
- {
- if (ent->eclass->model)
- {
- #ifdef DBG_SLEEP
- if (ent->md3Class)
- Sys_Printf("WARNING: unexpected ent->md3Class!=NULL with ent->eclass->model!=NULL\n");
- #endif
- entitymodel_t *model;
- for (model = ent->eclass->model; model; model=model->pNext)
- RefreshModelSkin (&Models, model);
- } else if (ent->md3Class)
- {
- entitymodel_t *model;
- for (model = ent->md3Class->model; model; model=model->pNext)
- RefreshModelSkin (&Models, model);
- }
- #ifdef DBG_SLEEP
- else
- Sys_Printf("WARNING: entity %p %s with fixedsize and no model no md3Class\n", ent, ent->eclass->name);
- #endif
- }
- }
- #ifdef DBG_SLEEP
- for (e = g_md3Cache; e ; e = e->next)
- {
- entitymodel_t *model;
- for (model = e->model; model; model=model->pNext)
- if (!g_slist_find (Models, model))
- {
- Sys_Printf("model %p ", model);
- if (model->strSkin)
- Sys_Printf("%s not found in main loop\n", ((GString *)model->strSkin)->str);
- else
- Sys_Printf("not found in main loop (no skin)\n");
- }
- }
- #endif
- // clean the model list
- g_slist_free (Models);
- */
- Sys_Printf( "Done.\n" );
-
- g_bScreenUpdates = true;
-
- Sys_Printf( "Dispatching wake msg..." );
- DispatchRadiantMsg( RADIANT_WAKEUP );
- Sys_Printf( "Done\n" );
- }
-}
-
-void WINAPI QERApp_Sleep(){
- g_pParentWnd->OnSleep();
-}
-
-/*!
- NOTE TTimo
- the exit path is a bit complicated, I guess we have to run the window pos saving in OnDelete
- and not in OnDestroy because the info may be lost already?
- \todo try sinking OnDelete into OnDestroy and see if it breaks anything
- */
-void MainFrame::OnDelete(){
- save_window_pos( m_pWidget, g_PrefsDlg.mWindowInfo.position );
-
- // surface inspector and patch inspector
- save_window_pos( g_dlgSurface.GetWidget(), g_PrefsDlg.mWindowInfo.posSurfaceWnd );
- save_window_pos( g_PatchDialog.GetWidget(), g_PrefsDlg.mWindowInfo.posPatchWnd );
-
- // entity inspector / group dialog
- // NOTE TTimo do we have to save a different window depending on the view mode?
- save_window_pos( g_pGroupDlg->m_pWidget, g_PrefsDlg.mWindowInfo.posEntityWnd );
-
- if ( g_PrefsDlg.m_bFloatingZ ) {
- save_window_pos( m_pZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posZWnd );
- }
- else{
- g_PrefsDlg.mWindowInfo.nZFloatWidth = GTK_PANED( m_pSplits[0] )->child1_size;
- }
-
- if ( CurrentStyle() == eFloating ) {
- save_window_pos( m_pCamWnd->m_pParent, g_PrefsDlg.mWindowInfo.posCamWnd );
- save_window_pos( m_pXYWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXYWnd );
- save_window_pos( m_pXZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posXZWnd );
- save_window_pos( m_pYZWnd->m_pParent, g_PrefsDlg.mWindowInfo.posYZWnd );
- }
-
- g_PrefsDlg.mWindowInfo.nState = gdk_window_get_state( g_pParentWnd->m_pWidget->window );
-}
-
-void MainFrame::OnDestroy(){
- // shut down console output first
- // (we'll still get the info if we are running a log file anyway)
- g_qeglobals_gui.d_edit = NULL;
-
-#ifdef _DEBUG
- Sys_Printf( "MainFrame::OnDestroy\n" );
-#endif
- if ( s_idle_id ) {
- gtk_timeout_remove( s_idle_id );
- }
- if ( m_nTimer ) {
- gtk_timeout_remove( m_nTimer );
- }
-
- if ( !g_qeglobals.disable_ini ) {
- Sys_Printf( "Start writing prefs\n" );
- Sys_Printf( "MRU_Save... " );
- MRU_Save();
- Sys_Printf( "OK\n" );
-
- gpointer w;
-
- w = g_object_get_data( G_OBJECT( g_pGroupDlg->m_pWidget ), "split1" );
- g_PrefsDlg.mWindowInfo.nEntitySplit1 = GTK_PANED( w )->child1_size;
- w = g_object_get_data( G_OBJECT( g_pGroupDlg->m_pWidget ), "split2" );
- g_PrefsDlg.mWindowInfo.nEntitySplit2 = GTK_PANED( w )->child1_size;
-
- if ( !FloatingGroupDialog() ) {
- GtkWidget *vsplit, *hsplit, *vsplit2, *hsplit2;
-
- vsplit = m_pSplits[0];
- vsplit2 = m_pSplits[1];
- hsplit = m_pSplits[2];
- hsplit2 = m_pSplits[3];
-
- g_PrefsDlg.mWindowInfo.nXYHeight = GTK_PANED( vsplit )->child1_size;
- g_PrefsDlg.mWindowInfo.nXYWidth = GTK_PANED( hsplit2 )->child1_size;
-
- if ( CurrentStyle() == eRegular ) {
- g_PrefsDlg.mWindowInfo.nZWidth = GTK_PANED( hsplit )->child1_size;
- }
- else{
- g_PrefsDlg.mWindowInfo.nCamWidth = GTK_PANED( hsplit )->child1_size;
- }
-
- g_PrefsDlg.mWindowInfo.nCamHeight = GTK_PANED( vsplit2 )->child1_size;
- }
- else
- {
- if ( g_PrefsDlg.m_bFloatingZ || CurrentStyle() == eSplit ) {
- if ( GTK_WIDGET_VISIBLE( m_pZWnd->m_pParent ) ) {
- g_PrefsDlg.m_bZVis = TRUE;
- }
- else{
- g_PrefsDlg.m_bZVis = FALSE;
- }
- }
- }
- g_PrefsDlg.SavePrefs();
- Sys_Printf( "Done prefs\n" );
- }
-
- // spog - this may be better in another place..
- // deletes filters list and assigns g_qeglobals.d_savedinfo.filters = NULL
- g_qeglobals.d_savedinfo.filters = FilterListDelete( g_qeglobals.d_savedinfo.filters );
-
- delete m_pXYWnd; m_pXYWnd = NULL;
- delete m_pYZWnd; m_pYZWnd = NULL;
- delete m_pXZWnd; m_pXZWnd = NULL;
- delete m_pZWnd; m_pZWnd = NULL;
- delete m_pTexWnd; m_pTexWnd = NULL;
- delete m_pCamWnd; m_pCamWnd = NULL;
-
- if ( g_pGroupDlg->m_pWidget ) {
- //!\todo fix "Gtk-CRITICAL **: file gtknotebook.c: line 4643 (gtk_notebook_get_tab_label): assertion `GTK_IS_WIDGET (child)' failed"
- gtk_widget_destroy( g_pGroupDlg->m_pWidget );
- g_pGroupDlg->m_pWidget = NULL;
- }
-
- if ( strcmpi( currentmap, "unnamed.map" ) != 0 ) {
- g_PrefsDlg.m_strLastMap = currentmap;
- g_PrefsDlg.SavePrefs();
- }
- Sys_Printf( "CleanUpEntities..." );
- CleanUpEntities();
- Sys_Printf( "Done.\n" );
-
- Sys_Printf( "Releasing brushes..." );
- while ( active_brushes.next != &active_brushes )
- Brush_Free( active_brushes.next, false );
- while ( selected_brushes.next != &selected_brushes )
- Brush_Free( selected_brushes.next, false );
- while ( filtered_brushes.next != &filtered_brushes )
- Brush_Free( filtered_brushes.next, false );
- Sys_Printf( "Done.\n" );
-
- Sys_Printf( "Releasing entities..." );
- while ( entities.next != &entities )
- Entity_Free( entities.next );
- Sys_Printf( "Done.\n" );
-
- epair_t* pEPair = g_qeglobals.d_project_entity->epairs;
- while ( pEPair )
- {
- epair_t* pNextEPair = pEPair->next;
- free( pEPair->key );
- free( pEPair->value );
- free( pEPair );
- pEPair = pNextEPair;
- }
-
- entity_t* pEntity = g_qeglobals.d_project_entity->next;
- while ( pEntity != NULL && pEntity != g_qeglobals.d_project_entity )
- {
- entity_t* pNextEntity = pEntity->next;
- Entity_Free( pEntity );
- pEntity = pNextEntity;
- }
-
- Sys_Printf( "Freeing world entity..." );
- if ( world_entity ) {
- Entity_Free( world_entity );
- }
- Sys_Printf( "Done.\n" );
-
- Sys_Printf( "Shutdown VFS..." );
- vfsShutdown();
- Sys_Printf( "Done.\n" );
-
- Sys_Printf( "FreeShaders..." );
- QERApp_FreeShaders();
- Sys_Printf( "Done.\n" );
-}
-
-// TTimo: now using profile.cpp code
-void MainFrame::LoadCommandMap(){
- FILE *f;
- CString strINI;
- bool bUserCmdList = false;
- int nLen;
- // verbose a little: count of user commands we recognized
- int iCount = 0;
- int iOverrideCount = 0;
- int j;
-
-
-#if defined ( __linux__ ) || defined ( __APPLE__ )
- strINI = g_PrefsDlg.m_rc_path->str;
-#elif defined( WIN32 )
- strINI = g_strGameToolsPath;
-#else
-#error "WTF are you compiling this on"
-#endif
- AddSlash( strINI );
- strINI += "shortcuts.ini";
-
- f = fopen( strINI.GetBuffer(), "r" );
- if ( f != NULL ) {
- fclose( f );
- // loop through all the commands
- for ( int i = 0; i < g_nCommandCount; i++ )
- {
- char value[1024];
- if ( read_var( strINI.GetBuffer(), "Commands", g_Commands[i].m_strCommand, value ) ) {
- if ( !bUserCmdList ) {
- Sys_Printf( "Found user's shortcuts list at %s\n", strINI.GetBuffer() );
- bUserCmdList = true;
- }
- CString strBuff;
- strBuff = value;
- strBuff.TrimLeft();
- strBuff.TrimRight();
- strBuff.MakeLower();
- int nSpecial = strBuff.Find( "+alt" );
- g_Commands[i].m_nModifiers = 0;
- if ( nSpecial >= 0 ) {
- g_Commands[i].m_nModifiers |= RAD_ALT;
- FindReplace( strBuff, "+alt", "" );
- }
- nSpecial = strBuff.Find( "+ctrl" );
- if ( nSpecial >= 0 ) {
- g_Commands[i].m_nModifiers |= RAD_CONTROL;
- FindReplace( strBuff, "+ctrl", "" );
- }
- nSpecial = strBuff.Find( "+shift" );
- if ( nSpecial >= 0 ) {
- g_Commands[i].m_nModifiers |= RAD_SHIFT;
- FindReplace( strBuff, "+shift", "" );
- }
- strBuff.TrimLeft();
- strBuff.TrimRight();
- strBuff.MakeUpper();
- // strBuff has been cleaned of it's modifiers .. switch between a regular key and a virtual one
- // based on length
- nLen = strBuff.GetLength();
- if ( nLen == 1 ) { // most often case.. deal with first
- g_Commands[i].m_nKey = __toascii( strBuff.GetAt( 0 ) );
- iCount++;
- }
- else // special key
- {
- for ( j = 0; j < g_nKeyCount; j++ )
- {
- if ( strBuff.CompareNoCase( g_Keys[j].m_strName ) == 0 ) {
- g_Commands[i].m_nKey = g_Keys[j].m_nVKKey;
- iCount++;
- break;
- }
- }
- if ( j == g_nKeyCount ) {
- Sys_Printf( "WARNING: failed to parse user command %s\n", value );
- continue;
- }
- }
- // maybe this new shortcut is overriding another one
- // then we need to disable the other binded key
- for ( j = 0; j < g_nCommandCount; j++ )
- {
- if ( j == i ) {
- continue;
- }
- if ( g_Commands[i].m_nKey == g_Commands[j].m_nKey && g_Commands[i].m_nModifiers == g_Commands[j].m_nModifiers ) {
- // found!
- g_Commands[j].m_nKey = 0;
- // verbose
- iOverrideCount++;
- // it's the only one
- break;
- }
- }
- }
- }
- if ( iOverrideCount ) {
- Sys_Printf( "User's command list overrides %d default commands\n", iOverrideCount );
- }
- Sys_Printf( "Parsed %d custom shortcuts\n", iCount );
- }
- else{
- Sys_Printf( "Looked for a '%s' keyboard shortcuts file, not found\n", strINI.GetBuffer() );
- }
-}
-
-// TTimo: an m_nKey can be set to zero if there's no shorcut binded
-// we also output the count of commands that are not binded .. dunno if it's much use ..
-// (non-binded keys are usually keys that were defined by shortcuts overriden by user prefs)
-void MainFrame::ShowMenuItemKeyBindings( GtkWidget* window ){
- //!\todo Find a better way to get the global accelerator group..
- GtkAccelGroup *accel = GTK_ACCEL_GROUP( gtk_accel_groups_from_object( G_OBJECT( window ) )->data );
- gpointer item;
- guint mods;
- int i;
- int iCount = 0;
-
- for ( i = 0; i < g_nCommandCount; i++ )
- {
- if ( g_Commands[i].m_nKey == 0 ) {
- iCount++;
- continue;
- }
-
- item = g_object_get_data( G_OBJECT( m_pWidget ), g_Commands[i].m_strMenu );
- if ( item == NULL ) {
- Sys_FPrintf( SYS_WRN, "WARNING: keyboard shortcuts init, no menu item found for command: \"%s\"\n",
- g_Commands[i].m_strCommand );
- continue;
- }
-
- mods = 0;
- if ( g_Commands[i].m_nModifiers ) { // are there modifiers present?
- if ( g_Commands[i].m_nModifiers & RAD_SHIFT ) {
- mods |= GDK_SHIFT_MASK;
- }
- if ( g_Commands[i].m_nModifiers & RAD_ALT ) {
- mods |= GDK_MOD1_MASK;
- }
- if ( g_Commands[i].m_nModifiers & RAD_CONTROL ) {
- mods |= GDK_CONTROL_MASK;
- }
- }
-
- // GTK won't add accelerators for some keys (ex.: delete), so we have to do it manually
- if ( gtk_accelerator_valid( g_Commands[i].m_nKey, (GdkModifierType)mods ) ) {
-#ifdef DBG_KBD
- // NOTE TTimo this is the important place where all the shortcuts are binded
- Sys_Printf( "Calling gtk_widget_add_accelerator on command: %s menu: %s key: %d mods: %d\n", g_Commands[i].m_strCommand, g_Commands[i].m_strMenu, g_Commands[i].m_nKey, mods );
-#endif
- gtk_widget_add_accelerator( GTK_WIDGET( item ), "activate", accel, g_Commands[i].m_nKey,
- (GdkModifierType)mods, GTK_ACCEL_VISIBLE );
- }
- else
- {
- GtkAccelLabel *accel_label = GTK_ACCEL_LABEL( GTK_BIN( item )->child );
- GString *gstring;
- gboolean had_mod;
-
- g_free( accel_label->accel_string );
- accel_label->accel_string = NULL;
-
- gstring = g_string_new( accel_label->accel_string );
- g_string_append( gstring, " " );
-
- had_mod = FALSE;
- if ( mods & GDK_SHIFT_MASK ) {
- g_string_append( gstring, "Shft" );
- had_mod = TRUE;
- }
- if ( mods & GDK_CONTROL_MASK ) {
- if ( had_mod ) {
- g_string_append( gstring, "+" );
- }
- g_string_append( gstring, "Ctl" );
- had_mod = TRUE;
- }
- if ( mods & GDK_MOD1_MASK ) {
- if ( had_mod ) {
- g_string_append( gstring, "+" );
- }
- g_string_append( gstring, "Alt" );
- had_mod = TRUE;
- }
-
- if ( had_mod ) {
- g_string_append( gstring, "+" );
- }
- if ( g_Commands[i].m_nKey < 0x80 || ( g_Commands[i].m_nKey > 0x80 && g_Commands[i].m_nKey <= 0xff ) ) {
- switch ( g_Commands[i].m_nKey )
- {
- case ' ':
- g_string_append( gstring, "Space" );
- break;
- case '\\':
- g_string_append( gstring, "Backslash" );
- break;
- default:
- g_string_append_c( gstring, toupper( g_Commands[i].m_nKey ) );
- break;
- }
- }
- else
- {
- gchar *tmp;
-
- tmp = gtk_accelerator_name( g_Commands[i].m_nKey, (GdkModifierType)0 );
- if ( tmp[0] != 0 && tmp[1] == 0 ) {
- tmp[0] = toupper( tmp[0] );
- }
- g_string_append( gstring, tmp );
- g_free( tmp );
- }
-
- g_free( accel_label->accel_string );
- accel_label->accel_string = gstring->str;
- g_string_free( gstring, FALSE );
-
- if ( !accel_label->accel_string ) {
- accel_label->accel_string = g_strdup( "" );
- }
-
- gtk_widget_queue_resize( GTK_WIDGET( accel_label ) );
- }
- }
-
- if ( iCount ) {
- Sys_Printf( "%d commands not bound to a key\n", iCount );
- }
-}
-
-void MainFrame::CreateQEChildren(){
- // load the project file
- if ( g_argc > 1 ) {
- Sys_Printf( "loading project file from the command line: %s\n", g_argv[1] );
- if ( !QE_LoadProject( g_argv[1] ) ) {
- Error( "Unable to load project file %s\n", g_argv[1] );
- }
- }
- else
- {
- const char* filename = NULL;
- char buf[PATH_MAX];
- const char *r;
- bool bTriedTemplate = false;
-
- if ( g_PrefsDlg.m_nLastProjectVer != 0 && g_PrefsDlg.m_nLastProjectVer != PROJECT_VERSION ) {
- // we need to regenerate from template
- Sys_Printf( "last project has version %d, this binary wants version %d - regenerating from the template\n", g_PrefsDlg.m_nLastProjectVer, PROJECT_VERSION );
- g_PrefsDlg.m_strLastProject = "";
- }
-
- r = g_PrefsDlg.m_strLastProject.GetBuffer();
-
- while ( r == NULL || *r == '\0' || access( r, R_OK ) != 0 || !QE_LoadProject( r ) )
- {
- if ( !bTriedTemplate ) {
- // try default project location
- bTriedTemplate = true;
- // for all OSes, we look for the template in the base installation (no homepath here)
- strcpy( buf, g_pGameDescription->mEnginePath.GetBuffer() );
- strcat( buf, g_pGameDescription->mBaseGame.GetBuffer() );
- strcat( buf, "/scripts/" );
- strcat( buf, PROJECT_TEMPLATE_NAME );
- r = buf;
- }
- else
- {
- gtk_MessageBox( NULL, _( "Failed to load project file.\nPlease enter a valid project file." ), _( "Load Project" ) );
-
- filename = file_dialog( m_pWidget, TRUE, _( "Choose Project File" ), buf, "project" );
- if ( filename != NULL ) {
- r = filename;
- }
- else{
- Error( "Cannot continue without loading a project..." );
- }
- }
- }
- }
-
- QE_Init();
-}
-
-void MainFrame::OnTimer(){
- GdkModifierType mask;
-
- gdk_window_get_pointer( NULL, NULL, NULL, &mask );
-
- if ( ( mask & ( GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK ) ) == 0 ) {
- QE_CountBrushesAndUpdateStatusBar();
- QE_CheckAutoSave();
- }
-
- // see MainFrame::UpdateStatusText below
- if ( m_bNeedStatusUpdate ) {
- for ( int n = 0; n < 6; n++ )
- {
- if ( m_strStatus[n].GetLength() >= 0 && m_pStatusLabel[n] != NULL ) {
- gtk_label_set_text( GTK_LABEL( m_pStatusLabel[n] ), m_strStatus[n] );
- }
- }
- m_bNeedStatusUpdate = false;
- }
-}
-
-void MainFrame::UpdateStatusText(){
- m_bNeedStatusUpdate = true;
-}
-
-void MainFrame::SetStatusText( int nPane, const char* pText ){
- if ( pText && nPane <= 5 && nPane >= 0 ) {
- m_strStatus[nPane] = pText;
- UpdateStatusText();
- }
-}
-void MainFrame::SetButtonMenuStates(){
- GtkWidget *item;
- g_bIgnoreCommands++;
-
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showangles" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_angles );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_shownames" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_names );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showcoordinates" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_coordinates );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showoutline" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_outline );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_selection_nooutline" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_qeglobals.d_savedinfo.iSelectedOutlinesStyle & OUTLINE_ZBUF ) );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_showaxes" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), g_qeglobals.d_savedinfo.show_axis );
- //item = GTK_WIDGET (g_object_get_data (G_OBJECT (m_pWidget), "menu_view_showpath"));
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS ) ? FALSE : TRUE );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_world" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_WORLD ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_entities" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_ENT ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_areaportals" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_AREAPORTALS ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_translucent" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRANSLUCENT ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_liquids" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIQUIDS ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_caulk" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CAULK ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clips" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLIP ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_botclips" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_BOTCLIP ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_structural" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_STRUCTURAL ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_paths" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_clusterportals" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLUSTERPORTALS ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lightgrid" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTGRID ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_lights" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTS ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_patches" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CURVES ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_details" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_DETAILS ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_hintsskips" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_HINTSSKIPS ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_models" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_MODELS ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_filter_triggers" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ),
- ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRIGGERS ) != 0 );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_lock" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bTextureLock ) ? TRUE : FALSE );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_toggle_rotatelock" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bRotateLock ) ? TRUE : FALSE );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_cubicclipping" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bCubicClipping ) ? TRUE : FALSE );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_view_opengllighting" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bGLLighting ) ? TRUE : FALSE );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "menu_snaptogrid" ) );
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), ( g_PrefsDlg.m_bSnap ) ? TRUE : FALSE );
-
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_view_cubicclipping" ) );
- gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bCubicClipping ) ? TRUE : FALSE );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectmodel" ) );
- gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectModels ) ? FALSE : TRUE );
-
- if ( !g_pGameDescription->mNoPatch ) {
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_dontselectcurve" ) );
- gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_PrefsDlg.m_bSelectCurves ) ? FALSE : TRUE );
-
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_showboundingbox" ) );
- gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchShowBounds ) ? TRUE : FALSE );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_weld" ) );
- gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchWeld ) ? TRUE : FALSE );
- item = GTK_WIDGET( g_object_get_data( G_OBJECT( m_pWidget ), "tb_patch_drilldown" ) );
- gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( item ), ( g_bPatchDrillDown ) ? TRUE : FALSE );
- }
-
- int id, n = g_PrefsDlg.m_nTextureScale;
- switch ( n )
- {
- case 10: id = ID_TEXTURES_TEXTUREWINDOWSCALE_10; break;
- case 25: id = ID_TEXTURES_TEXTUREWINDOWSCALE_25; break;
- case 50: id = ID_TEXTURES_TEXTUREWINDOWSCALE_50; break;
- case 200: id = ID_TEXTURES_TEXTUREWINDOWSCALE_200; break;
- default: id = ID_TEXTURES_TEXTUREWINDOWSCALE_100; break;
- }
- SetTextureScale( id );
-
- // FIXME TTimo cleaned up .. the right place to do this in QE_LoadProject?
-/*
- if (g_qeglobals.d_project_entity)
- {
- FillTextureMenu(); // redundant but i'll clean it up later.. yeah right..
- FillBSPMenu();
- }
- */
- g_bIgnoreCommands--;
-}
-
-void MainFrame::UpdateWindows( int nBits ){
- if ( !g_bScreenUpdates ) {
- return;
- }
-#ifdef DBG_WINDOWPOS
- static int bean_count = 0;
- char bean_buf[100];
- sprintf( bean_buf,"UpdateWindows %d",bean_count );
- CheckWatchit( bean_buf );
- bean_count++;
-#endif
-
- if ( nBits & ( W_XY | W_XY_OVERLAY ) ) {
- if ( m_pXYWnd ) {
- m_pXYWnd->RedrawWindow();
- }
- if ( m_pXZWnd ) {
- m_pXZWnd->RedrawWindow();
- }
- if ( m_pYZWnd ) {
- m_pYZWnd->RedrawWindow();
- }
- }