]> asedeno.scripts.mit.edu Git - PuTTY.git/blobdiff - mac.c
sunc with reality
[PuTTY.git] / mac.c
diff --git a/mac.c b/mac.c
index db6ff19ab6d0fe87007dc0c22959cfb27a6fdcd1..6ccb38391e091d2e28363444868f641735b6aa35 100644 (file)
--- a/mac.c
+++ b/mac.c
@@ -1,4 +1,4 @@
-/* $Id: mac.c,v 1.1.2.14 1999/03/11 21:40:31 ben Exp $ */
+/* $Id: mac.c,v 1.1.2.26 1999/08/02 22:32:38 ben Exp $ */
 /*
  * Copyright (c) 1999 Ben Harris
  * All rights reserved.
 #include <Menus.h>
 #include <TextEdit.h>
 #include <Appearance.h>
+#include <CodeFragments.h>
 #include <Dialogs.h>
 #include <Devices.h>
 #include <DiskInit.h>
 #include <Gestalt.h>
+#include <Resources.h>
 #include <ToolUtils.h>
 
+#include <assert.h>
 #include <limits.h>
 #include <stdarg.h>
 #include <stdlib.h>            /* putty.h needs size_t */
@@ -59,24 +62,25 @@ struct mac_gestalts mac_gestalts;
 
 static void mac_startup(void);
 static void mac_eventloop(void);
+#pragma noreturn (mac_eventloop)
 static void mac_event(EventRecord *);
 static void mac_contentclick(WindowPtr, EventRecord *);
 static void mac_growwindow(WindowPtr, EventRecord *);
-static void mac_activatewindow(WindowPtr, Boolean);
+static void mac_activatewindow(WindowPtr, EventRecord *);
+static void mac_activateabout(WindowPtr, EventRecord *);
 static void mac_updatewindow(WindowPtr);
 static void mac_keypress(EventRecord *);
 static int mac_windowtype(WindowPtr);
 static void mac_menucommand(long);
-static void mac_adjustcursor(void);
+static void mac_openabout(void);
+static void mac_adjustcursor(RgnHandle);
 static void mac_adjustmenus(void);
 static void mac_closewindow(WindowPtr);
 static void mac_zoomwindow(WindowPtr, short);
 static void mac_shutdown(void);
-
-static void mac_newsession(void);
+#pragma noreturn (mac_shutdown)
 
 struct mac_windows {
-    WindowPtr terminal; /* XXX: Temporary */
     WindowPtr about;
     WindowPtr licence;
 };
@@ -89,6 +93,8 @@ int main (int argc, char **argv) {
     mac_eventloop();
 }
 
+#pragma noreturn (main)
+
 static void mac_startup(void) {
     Handle menuBar;
 
@@ -115,9 +121,15 @@ static void mac_startup(void) {
            mac_gestalts.apprvers = 0x0100;
        else
            mac_gestalts.apprvers = 0;
+    /* Paranoia: Did we manage to pull in AppearanceLib? */
+    if (&RegisterAppearanceClient == kUnresolvedCFragSymbolAddress)
+       mac_gestalts.apprvers = 0;
     /* Mac OS 8.5 Control Manager (proportional scrollbars)? */
     if (Gestalt(gestaltControlMgrAttr, &mac_gestalts.cntlattr) != noErr)
        mac_gestalts.cntlattr = 0;
+    /* Mac OS 8.5 Window Manager? */
+    if (Gestalt(gestaltWindowMgrAttr, &mac_gestalts.windattr) != noErr)
+       mac_gestalts.windattr = 0;
 
     /* We've been tested with the Appearance Manager */
     if (mac_gestalts.apprvers != 0)
@@ -131,23 +143,41 @@ static void mac_startup(void) {
     mac_adjustmenus();
     DrawMenuBar();
     InitCursor();
-    windows.terminal = NULL;
     windows.about = NULL;
     windows.licence = NULL;
+
+    /* Initialise networking */
+#ifdef WITH_OPENTRANSPORT
+    if ((*otpt_stack.init)() == 0)
+       net_stack = &otpt_stack;
+    else 
+#endif
+#ifdef WITH_MACTCP
+    if ((*mtcp_stack.init)() == 0)
+       net_stack = &mtcp_stack;
+    else
+#endif
+       fatalbox("No useful TCP/IP stack found");
+
+       
+
 }
 
 static void mac_eventloop(void) {
     Boolean gotevent;
     EventRecord event;
-    int i;
+    RgnHandle cursrgn;
 
+    cursrgn = NewRgn();
     for (;;) {
-       mac_adjustcursor();
-       gotevent = WaitNextEvent(everyEvent, &event, LONG_MAX, NULL);
-       mac_adjustcursor();
+       mac_adjustcursor(cursrgn);
+       gotevent = WaitNextEvent(everyEvent, &event, LONG_MAX, cursrgn);
+       mac_adjustcursor(cursrgn);
        if (gotevent)
            mac_event(&event);
+       net_poll();
     }
+    DisposeRgn(cursrgn);
 }
 
 static void mac_event(EventRecord *event) {
@@ -196,8 +226,7 @@ static void mac_event(EventRecord *event) {
         mac_keypress(event);
         break;
       case activateEvt:
-       mac_activatewindow((WindowPtr)event->message,
-                          (event->modifiers & activeFlag) != 0);
+       mac_activatewindow((WindowPtr)event->message, event);
         break;
       case updateEvt:
         mac_updatewindow((WindowPtr)event->message);
@@ -237,16 +266,34 @@ static void mac_growwindow(WindowPtr window, EventRecord *event) {
     }
 }
 
-static void mac_activatewindow(WindowPtr window, Boolean active) {
+static void mac_activatewindow(WindowPtr window, EventRecord *event) {
+    int active;
 
+    active = (event->modifiers & activeFlag) != 0;
     mac_adjustmenus();
     switch (mac_windowtype(window)) {
       case wTerminal:
        mac_activateterm(window, active);
        break;
+      case wAbout:
+       mac_activateabout(window, event);
+       break;
     }
 }
 
+static void mac_activateabout(WindowPtr window, EventRecord *event) {
+    DialogItemType itemtype;
+    Handle itemhandle;
+    short item;
+    Rect itemrect;
+    int active;
+
+    active = (event->modifiers & activeFlag) != 0;
+    GetDialogItem(window, wiAboutLicence, &itemtype, &itemhandle, &itemrect);
+    HiliteControl((ControlHandle)itemhandle, active ? 0 : 255);
+    DialogSelect(event, &window, &item);
+}
+
 static void mac_updatewindow(WindowPtr window) {
 
     switch (mac_windowtype(window)) {
@@ -285,14 +332,19 @@ static int mac_windowtype(WindowPtr window) {
  * Handle a key press
  */
 static void mac_keypress(EventRecord *event) {
-    char key;
     WindowPtr window;
 
-    if (event->what == keyDown && (event->modifiers & cmdKey)) {
+    window = FrontWindow();
+    /*
+     * Check for a command-key combination, but ignore it if it counts
+     * as a meta-key combination and we're in a terminal window.
+     */
+    if (event->what == keyDown && (event->modifiers & cmdKey) /*&&
+       !((event->modifiers & cfg.meta_modifiers) == cfg.meta_modifiers &&
+           mac_windowtype(window) == wTerminal)*/) {
        mac_adjustmenus();
        mac_menucommand(MenuKey(event->message & charCodeMask));
     } else {
-       window = FrontWindow();
        switch (mac_windowtype(window)) {
          case wTerminal:
            mac_keyterm(window, event);
@@ -304,38 +356,70 @@ static void mac_keypress(EventRecord *event) {
 static void mac_menucommand(long result) {
     short menu, item;
     Str255 da;
+    WindowPtr window;
 
     menu = HiWord(result);
     item = LoWord(result);
+    window = FrontWindow();
+    /* Things which do the same whatever window we're in. */
     switch (menu) {
       case mApple:
         switch (item) {
           case iAbout:
-            GetNewDialog(wAbout, NULL, (GrafPort *)-1);
-            break;
+           mac_openabout();
+            goto done;
           default:
             GetMenuItemText(GetMenuHandle(mApple), item, da);
             OpenDeskAcc(da);
-            break;
+            goto done;
         }
         break;
       case mFile:
         switch (item) {
           case iNew:
             mac_newsession();
-            break;
+            goto done;
           case iClose:
-            mac_closewindow(FrontWindow());
-            break;
+            mac_closewindow(window);
+            goto done;
           case iQuit:
             mac_shutdown();
-            break;
+            goto done;
         }
         break;
     }
+    /* If we get here, handling is up to window-specific code. */
+    switch (mac_windowtype(window)) {
+      case wTerminal:
+       mac_menuterm(window, menu, item);
+       break;
+    }
+  done:
     HiliteMenu(0);
 }
 
+static void mac_openabout(void) {
+    DialogItemType itemtype;
+    Handle item;
+    VersRecHndl vers;
+    Rect box;
+    StringPtr longvers;
+
+    if (windows.about)
+       SelectWindow(windows.about);
+    else {
+       windows.about = GetNewDialog(wAbout, NULL, (WindowPtr)-1);
+       /* XXX check we're using the right resource file? */
+       vers = (VersRecHndl)GetResource('vers', 1);
+       assert(vers != NULL && *vers != NULL);
+       longvers = (*vers)->shortVersion + (*vers)->shortVersion[0] + 1;
+       GetDialogItem(windows.about, wiAboutVersion, &itemtype, &item, &box);
+       assert(itemtype & kStaticTextDialogItem);
+       SetDialogItemText(item, longvers);
+       ShowWindow(windows.about);
+    }
+}
+
 static void mac_closewindow(WindowPtr window) {
 
     switch (mac_windowtype(window)) {
@@ -345,6 +429,10 @@ static void mac_closewindow(WindowPtr window) {
       case wTerminal:
        /* FIXME: end session and stuff */
        break;
+      case wAbout:
+       windows.about = NULL;
+       CloseWindow(window);
+       break;
       default:
        CloseWindow(window);
        break;
@@ -371,6 +459,10 @@ static void mac_adjustmenus(void) {
     menu = GetMenuHandle(mFile);
     EnableItem(menu, 0);
     EnableItem(menu, iNew);
+    if (window != NULL)
+       EnableItem(menu, iClose);
+    else
+       DisableItem(menu, iClose);
     EnableItem(menu, iQuit);
 
     switch (mac_windowtype(window)) {
@@ -388,23 +480,37 @@ static void mac_adjustmenus(void) {
 /*
  * Make sure the right cursor's being displayed.
  */
-static void mac_adjustcursor(void) {
-
-    SetCursor(&qd.arrow);
-}
-
-void write_clip(void *data, int len) {
-
-    /* XXX: do something */
-}
-
-void get_clip(void **p, int *lenp) {
+static void mac_adjustcursor(RgnHandle cursrgn) {
+    Point mouse;
+    WindowPtr window, front;
+    short part;
 
-    /* XXX: do something */
+    GetMouse(&mouse);
+    LocalToGlobal(&mouse);
+    part = FindWindow(mouse, &window);
+    front = FrontWindow();
+    if (part != inContent || window == NULL || window != front) {
+       /* Cursor isn't in the front window, so switch to arrow */
+       SetCursor(&qd.arrow);
+       SetRectRgn(cursrgn, SHRT_MIN, SHRT_MIN, SHRT_MAX, SHRT_MAX);
+       if (front != NULL)
+           DiffRgn(cursrgn, front->visRgn, cursrgn);
+    } else {
+       switch (mac_windowtype(window)) {
+         case wTerminal:
+           mac_adjusttermcursor(window, mouse, cursrgn);
+           break;
+         default:
+           SetCursor(&qd.arrow);
+           CopyRgn(window->visRgn, cursrgn);
+           break;
+       }
+    }
 }
 
 static void mac_shutdown(void) {
 
+    net_shutdown();
     exit(0);
 }