--- c_config.cpp	1998/11/15 11:57:22	1.1
+++ c_config.cpp	1998/11/15 12:28:05
@@ -74,6 +74,7 @@
 int LoadDesktopMode = 0;
 char HelpCommand[128] = "man -a";
 char *ConfigSourcePath = 0;
+char ProjectDirectory[MAXPATH];
 
 #ifdef CONFIG_SYNTAX_HILIT
 int AddKeyword(ColorKeywords *tab, char color, char *keyword) {
--- c_desktop.cpp	1998/11/15 11:57:22	1.1
+++ c_desktop.cpp	1998/11/15 15:40:41
@@ -66,6 +66,8 @@
 
 #ifdef CONFIG_TAGS
     TagClear();
+    if (FileExists(PROJECT_DIR "/tags"))
+        TagsAdd(PROJECT_DIR "/tags");
 #endif
     
     fp = fopen(FileName, "r");
--- con_linux.cpp	1998/11/14 21:16:42	1.1
+++ con_linux.cpp	1998/11/14 22:39:24
@@ -76,6 +76,8 @@
 
 #define die(s) { printf("%s\n", s); exit(1); } while(0);
 
+struct vt_mode new_vt_mode, old_vt_mode;
+extern int shift_state;
 unsigned int VideoCols = 80;
 unsigned int VideoRows = 25;
 unsigned int CursorX = 0;
@@ -121,6 +123,15 @@
 #endif
 }
 
+static void VTAcquired (int)
+{
+    ioctl(VtFd, VT_RELDISP, VT_ACKACQ); // ok to switch to here
+    if (VtNum <= 12)
+        shift_state |= (1 << KG_ALT); // assume alt- is pressed down
+    else
+        shift_state |= (1 << KG_ALTGR); // or alt-gr if our console is 13+
+}
+
 void mouseHide() {
 #ifdef USE_GPM
     if (GpmFd != -1 && VcsFd != -1 && drawPointer && mouseDrawn == 1) {
@@ -244,6 +255,20 @@
     signal(SIGALRM, SIG_IGN);
     signal(SIGHUP, Die);
     atexit(Cleanup);
+
+    struct sigaction sa;
+    memset(&sa, 0, sizeof(sa));
+    sigemptyset(&sa.sa_mask);
+    sa.sa_flags = SA_RESTART; /* jic? Though I guess EINTR is handled */
+    sa.sa_handler = VTAcquired;
+    if (sigaction(SIGUSR1, &sa, NULL) < 0)
+    {
+        ConDone();
+        perror ("sigaction: VTAcquired");
+        die("Could not set VTAcquired handler\n");
+    }
+
+
     
 #ifdef USE_GPM
     conn.eventMask = ~0;
@@ -254,6 +279,28 @@
     GpmFd = Gpm_Open(&conn, 0);
     mouseShow();
 #endif
+
+    
+    /* Enable VT_PROCESS */
+    if (ioctl(VtFd, VT_GETMODE, &old_vt_mode) != 0)
+    {
+        perror ("ioctl VT_GETMODE");
+        ConDone();
+        die("Could not retrieve VT settings\n");
+    }
+    
+    new_vt_mode = old_vt_mode;
+    new_vt_mode.acqsig = SIGUSR1;
+    new_vt_mode.mode = VT_PROCESS;
+
+    if (ioctl(VtFd, VT_SETMODE, &new_vt_mode) != 0)
+    {
+        perror ("ioctl VT_SETMODE");
+        ConDone();
+        die("Could not set VT settings\n");
+    }
+
+
     return 0;
 }
 
@@ -834,25 +881,33 @@
         {
             int vc = -1;
 
-            switch (kbCode(Event->Key.Code) | kfCtrl) {
-            case kfAlt | kfCtrl | kbF1: vc = 1; break;
-            case kfAlt | kfCtrl | kbF2: vc = 2; break;
-            case kfAlt | kfCtrl | kbF3: vc = 3; break;
-            case kfAlt | kfCtrl | kbF4: vc = 4; break;
-            case kfAlt | kfCtrl | kbF5: vc = 5; break;
-            case kfAlt | kfCtrl | kbF6: vc = 6; break;
-            case kfAlt | kfCtrl | kbF7: vc = 7; break;
-            case kfAlt | kfCtrl | kbF8: vc = 8; break;
-            case kfAlt | kfCtrl | kbF9: vc = 9; break;
-            case kfAlt | kfCtrl | kbF10: vc = 10; break;
-            case kfAlt | kfCtrl | kbF11: vc = 11; break;
-            case kfAlt | kfCtrl | kbF12: vc = 12; break;
+            switch (kbCode(Event->Key.Code)) {
+            case kfAlt | kbF1: vc = 1; break;
+            case kfAlt | kbF2: vc = 2; break;
+            case kfAlt | kbF3: vc = 3; break;
+            case kfAlt | kbF4: vc = 4; break;
+            case kfAlt | kbF5: vc = 5; break;
+            case kfAlt | kbF6: vc = 6; break;
+            case kfAlt | kbF7: vc = 7; break;
+            case kfAlt | kbF8: vc = 8; break;
+            case kfAlt | kbF9: vc = 9; break;
+            case kfAlt | kbF10: vc = 10; break;
+            case kfAlt | kbF11: vc = 11; break;
+            case kfAlt | kbF12: vc = 12; break;
             }
             if (vc != -1) {
-                /* perform the console switch */
-                ioctl(VtFd, VT_ACTIVATE, vc);
+
+                if (shift_final & (1 << KG_ALTGR)) // alt-gr-f1 = #13
+                    vc += 12;
+
+                if (VtNum != vc) // Switch only if the console is ANOTHER console
+                {
+                    shift_state = lock_state = slock_state = 0; // bad
+                    ioctl(VtFd, VT_ACTIVATE, vc);
+                    ioctl(VtFd, VT_RELDISP, 1);         // ok to switch
+                }
+                
                 Event->What = evNone;
-                shift_state = lock_state = slock_state = 0; // bad
                 return -1;
             }
         }
--- e_tags.cpp	1998/11/15 11:57:22	1.1
+++ e_tags.cpp	1998/11/15 12:32:55
@@ -212,6 +212,11 @@
     int *NewT;
     int NewF;
 
+    // Check that this tag is not already loaded
+    for (int i = 0; i < TagFileCount; i++)
+        if (!strcmp(TagMem + TagFiles[i], FileName))
+            return 1;
+
     NewF = AllocMem(FileName, strlen(FileName) + 1);
     if (NewF == -1)
         return 0;
--- fte.cpp	1998/11/15 11:57:22	1.1
+++ fte.cpp	1998/11/15 15:50:21
@@ -188,6 +188,18 @@
                      "Failed to load configuration file '%s'.\n"
                      "Use '-C' option.", ConfigFileName);
     }
+
+    // If the current directory contains a .fte directory, put all stuff there
+    if (FileExists(PROJECT_DIR)) {
+        strcpy(DesktopFileName, PROJECT_DIR "/" DESKTOP_FILE);
+        strcpy(HistoryFileName, PROJECT_DIR "/" HISTORY_FILE);
+        LoadDesktopOnEntry = 1;
+        KeepHistory = 1;
+
+        ExpandPath(".", ProjectDirectory);
+    }
+
+    
     for (Arg = 1; Arg < argc; Arg++) {
         if (!QuoteAll && !QuoteNext && (argv[Arg][0] == '-')) {
             if (argv[Arg][1] == '-') {
@@ -239,7 +251,7 @@
     if (CmdLoadConfiguration(argc, argv) == 0)
         return 1;
 
-    new EGUI(argc, argv, ScreenSizeX, ScreenSizeY);
+    (void) new EGUI(argc, argv, ScreenSizeX, ScreenSizeY);
     if (gui == 0)
         DieError(1, "Failed to initialize display\n");
     
--- view.cpp	1998/11/15 11:57:22	1.1
+++ view.cpp	1998/12/19 18:23:52
@@ -583,10 +583,15 @@
         CompilerMsgs->RunPipe(Dir, Command);
         msgs = CompilerMsgs;
     } else {
-        if (GetDefaultDirectory(Model, Dir, sizeof(Dir)) == 0)
-            return 0;
-
-        msgs = new EMessages(0, &ActiveModel, Dir, Command);
+        // If in "project" mode, we will always use the start directory
+        if (ProjectDirectory[0] && strncmp(Command, "make", 4))
+            msgs = new EMessages(0, &ActiveModel, ProjectDirectory, Command);
+        else {
+            if (GetDefaultDirectory(Model, Dir, sizeof(Dir)) == 0)
+                return 0;
+            
+            msgs = new EMessages(0, &ActiveModel, Dir, Command);
+        }
     }
     SwitchToModel(msgs);
     return 1;
--- c_config.h	1998/11/15 11:57:22	1.1
+++ c_config.h	1998/11/15 12:27:42
@@ -38,6 +38,7 @@
 extern char HelpCommand[128];
 extern char *ConfigSourcePath;
 extern char ConfigFileName[MAXPATH];
+extern char ProjectDirectory[MAXPATH];
 
 int LoadConfig(int argc, char **argv, char *CfgFileName);
 int GetIndentMode(char *Str);
--- fte.h	1998/11/15 11:57:22	1.1
+++ fte.h	1998/11/15 15:50:28
@@ -10,6 +10,13 @@
 #ifndef __FTE_H
 #define __FTE_H
 
+// Filenames of desktop files
+#if defined(UNIX)
+#define DESKTOP_FILE ".fte-desktop"
+#define HISTORY_FILE ".fte-history"
+#define PROJECT_DIR  ".fte"
+#endif
+
 #include "ftever.h"
 #include "feature.h"
 #include "sysdep.h"
