Work around a weird bug in gdk_draw_text_wc().
[u/mdw/putty] / mac / mac.c
index 5083cdd..c6a93dc 100644 (file)
--- a/mac/mac.c
+++ b/mac/mac.c
@@ -1,4 +1,4 @@
-/* $Id: mac.c,v 1.6 2002/12/10 01:11:40 ben Exp $ */
+/* $Id: mac.c,v 1.14 2003/01/02 00:33:40 ben Exp $ */
 /*
  * Copyright (c) 1999 Ben Harris
  * All rights reserved.
 #include <Devices.h>
 #include <DiskInit.h>
 #include <Gestalt.h>
+#include <LowMem.h>
 #include <Resources.h>
 #include <Script.h>
+#include <TextCommon.h>
 #include <ToolUtils.h>
+#include <UnicodeConverter.h>
 
 #include <assert.h>
 #include <limits.h>
@@ -100,6 +103,7 @@ int main (int argc, char **argv) {
 
 static void mac_startup(void) {
     Handle menuBar;
+    TECInfoHandle ti;
 
     /* Init Memory Manager */
     MaxApplZone();
@@ -142,6 +146,20 @@ static void mac_startup(void) {
     /* Mac OS 8.5 Window Manager? */
     if (Gestalt(gestaltWindowMgrAttr, &mac_gestalts.windattr) != noErr)
        mac_gestalts.windattr = 0;
+    /* Text Encoding Conversion Manager? */
+    if (
+#if TARGET_RT_MAC_CFM
+       &TECGetInfo == kUnresolvedCFragSymbolAddress ||
+#else
+       InitializeUnicodeConverter(NULL) != noErr ||
+#endif
+       TECGetInfo(&ti) != noErr)
+       mac_gestalts.encvvers = 0;
+    else {
+       mac_gestalts.encvvers = (*ti)->tecVersion;
+       mac_gestalts.uncvattr = (*ti)->tecUnicodeConverterFeatures;
+       DisposeHandle((Handle)ti);
+    }
 
     /* We've been tested with the Appearance Manager */
     if (mac_gestalts.apprvers != 0)
@@ -158,6 +176,17 @@ static void mac_startup(void) {
     windows.about = NULL;
     windows.licence = NULL;
 
+    {
+       short vol;
+       long dirid;
+
+       /* Set the default directory for loading and saving settings. */
+       /* XXX Should we create it? */
+       if (get_session_dir(FALSE, &vol, &dirid) == noErr) {
+           LMSetSFSaveDisk(-vol);
+           LMSetCurDirStore(dirid);
+       }
+    }
     init_ucs();
 }
 
@@ -245,13 +274,16 @@ static void mac_contentclick(WindowPtr window, EventRecord *event) {
        mac_clickterm(window, event);
        break;
       case wAbout:
-       if (DialogSelect(event, &(DialogPtr)window, &item))
+       if (DialogSelect(event, &window, &item))
            switch (item) {
              case wiAboutLicence:
                mac_openlicence();
                break;
            }
        break;
+      case wSettings:
+       mac_clickdlg(window, event);
+       break;
     }
 }
 
@@ -272,6 +304,9 @@ static void mac_activatewindow(WindowPtr window, EventRecord *event) {
       case wTerminal:
        mac_activateterm(window, active);
        break;
+      case wSettings:
+       mac_activatedlg(window, event);
+       break;
       case wAbout:
        mac_activateabout(window, event);
        break;
@@ -298,6 +333,7 @@ static void mac_updatewindow(WindowPtr window) {
        mac_updateterm(window);
        break;
       case wAbout:
+      case wSettings:
        BeginUpdate(window);
        UpdateDialog(window, window->visRgn);
        EndUpdate(window);
@@ -335,6 +371,7 @@ static void mac_updatelicence(WindowPtr window)
  */
 static int mac_windowtype(WindowPtr window) {
     int kind;
+    long refcon;
 
     if (window == NULL)
        return wNone;
@@ -343,7 +380,11 @@ static int mac_windowtype(WindowPtr window) {
        return wDA;
     if (GetWVariant(window) == zoomDocProc)
        return wTerminal;
-    return GetWRefCon(window);
+    refcon = GetWRefCon(window);
+    if (refcon < 1024)
+       return refcon;
+    else
+       return wSettings;
 }
 
 /*
@@ -397,6 +438,9 @@ static void mac_menucommand(long result) {
           case iNew:
             mac_newsession();
             goto done;
+         case iOpen:
+           mac_opensession();
+           goto done;
           case iClose:
             mac_closewindow(window);
             goto done;
@@ -440,11 +484,6 @@ static void mac_openabout(void) {
 }
 
 static void mac_openlicence(void) {
-    DialogItemType itemtype;
-    Handle item;
-    VersRecHndl vers;
-    Rect box;
-    StringPtr longvers;
 
     if (windows.licence)
        SelectWindow(windows.licence);
@@ -548,6 +587,10 @@ static void mac_adjustcursor(RgnHandle cursrgn) {
 
 static void mac_shutdown(void) {
 
+#if !TARGET_RT_MAC_CFM
+    if (mac_gestalts.encvvers != 0)
+       TerminateUnicodeConverter();
+#endif
     exit(0);
 }