At last, merge the putty-gtk2 branch back into the trunk!
[u/mdw/putty] / mac / macpgen.c
index 8c6aa2a..f8765c4 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: macpgen.c,v 1.1 2003/02/12 23:53:15 ben Exp $ */
+/* $Id$ */
 /*
  * Copyright (c) 1999, 2003 Ben Harris
  * All rights reserved.
@@ -71,14 +71,11 @@ static void mac_event(EventRecord *);
 static void mac_contentclick(WindowPtr, EventRecord *);
 static void mac_growwindow(WindowPtr, EventRecord *);
 static void mac_activatewindow(WindowPtr, EventRecord *);
-static void mac_activateabout(WindowPtr, EventRecord *);
+static void mac_suspendresume(EventRecord *);
 static void mac_updatewindow(WindowPtr);
-static void mac_updatelicence(WindowPtr);
 static void mac_keypress(EventRecord *);
 static int mac_windowtype(WindowPtr);
 static void mac_menucommand(long);
-static void mac_openabout(void);
-static void mac_openlicence(void);
 static void mac_adjustcursor(RgnHandle);
 static void mac_adjustmenus(void);
 static void mac_closewindow(WindowPtr);
@@ -126,7 +123,7 @@ static void mac_startup(void) {
     /* Get base system version (only used if there's no better selector) */
     if (Gestalt(gestaltSystemVersion, &mac_gestalts.sysvers) != noErr ||
        (mac_gestalts.sysvers &= 0xffff) < 0x700)
-       fatalbox("PuTTY requires System 7 or newer");
+       fatalbox("PuTTYgen requires System 7 or newer");
     /* Find out if we've got Color Quickdraw */
     if (Gestalt(gestaltQuickdrawVersion, &mac_gestalts.qdvers) != noErr)
        mac_gestalts.qdvers = gestaltOriginalQD;
@@ -208,12 +205,33 @@ static void mac_eventloop(void) {
     Boolean gotevent;
     EventRecord event;
     RgnHandle cursrgn;
+    Point mousenow, mousethen;
+    KeyState *ks;
+    WindowPtr front;
 
     cursrgn = NewRgn();
+    GetMouse(&mousethen);
     for (;;) {
        mac_adjustcursor(cursrgn);
        gotevent = WaitNextEvent(everyEvent, &event, LONG_MAX, cursrgn);
        mac_adjustcursor(cursrgn);
+       front = mac_frontwindow();
+       if (front != NULL) {
+           ks = mac_windowkey(front);
+           if (ks->collecting_entropy) {
+               GetMouse(&mousenow);
+               if (mousenow.h != mousethen.h || mousenow.v != mousethen.v) {
+                   ks->entropy[ks->entropy_got++] = *(unsigned *)&mousenow;
+                   ks->entropy[ks->entropy_got++] = TickCount();
+                   if (ks->entropy_got >= ks->entropy_required)
+                       ks->collecting_entropy = 0;
+                   SetControlValue(ks->progress, ks->entropy_got);
+                   mousethen = mousenow;
+               }
+               SetEmptyRgn(cursrgn);
+           }
+       }
+           
        if (gotevent)
            mac_event(&event);
        if (borednow)
@@ -293,112 +311,46 @@ static void mac_event(EventRecord *event) {
         }
         break;
 #endif
+      case osEvt:
+       switch ((event->message & osEvtMessageMask) >> 24) {
+         case suspendResumeMessage:
+           mac_suspendresume(event);
+           break;
+       }
+       break;
       case kHighLevelEvent:
        AEProcessAppleEvent(event); /* errors? */
        break;
     }
 }
 
-static void mac_contentclick(WindowPtr window, EventRecord *event) {
-    short item;
-    DialogRef dialog;
+static void mac_contentclick(WindowPtr window, EventRecord *event)
+{
 
-    switch (mac_windowtype(window)) {
-      case wAbout:
-       dialog = GetDialogFromWindow(window);
-       if (DialogSelect(event, &dialog, &item))
-           switch (item) {
-             case wiAboutLicence:
-               mac_openlicence();
-               break;
-           }
-       break;
-    }
+    if (mac_wininfo(window)->click != NULL)
+       (*mac_wininfo(window)->click)(window, event);
 }
 
-static void mac_growwindow(WindowPtr window, EventRecord *event) {
+static void mac_growwindow(WindowPtr window, EventRecord *event)
+{
 
-    switch (mac_windowtype(window)) {
-    }
+    if (mac_wininfo(window)->grow != NULL)
+       (*mac_wininfo(window)->grow)(window, event);
 }
 
-static void mac_activatewindow(WindowPtr window, EventRecord *event) {
-    int active;
+static void mac_activatewindow(WindowPtr window, EventRecord *event)
+{
 
-    active = (event->modifiers & activeFlag) != 0;
     mac_adjustmenus();
-    switch (mac_windowtype(window)) {
-      case wAbout:
-       mac_activateabout(window, event);
-       break;
-    }
-}
-
-static void mac_activateabout(WindowPtr window, EventRecord *event) {
-    DialogRef dialog;
-    DialogItemType itemtype;
-    Handle itemhandle;
-    short item;
-    Rect itemrect;
-    int active;
-
-    dialog = GetDialogFromWindow(window);
-    active = (event->modifiers & activeFlag) != 0;
-    GetDialogItem(dialog, wiAboutLicence, &itemtype, &itemhandle, &itemrect);
-    HiliteControl((ControlHandle)itemhandle, active ? 0 : 255);
-    DialogSelect(event, &dialog, &item);
+    if (mac_wininfo(window)->activate != NULL)
+       (*mac_wininfo(window)->activate)(window, event);
 }
 
 static void mac_updatewindow(WindowPtr window)
 {
-#if TARGET_API_MAC_CARBON
-    RgnHandle rgn;
-#endif
 
-    switch (mac_windowtype(window)) {
-      case wAbout:
-       BeginUpdate(window);
-#if TARGET_API_MAC_CARBON
-       rgn = NewRgn();
-       GetPortVisibleRegion(GetWindowPort(window), rgn);
-       UpdateDialog(GetDialogFromWindow(window), rgn);
-       DisposeRgn(rgn);
-#else
-       UpdateDialog(window, window->visRgn);
-#endif
-       EndUpdate(window);
-       break;
-      case wLicence:
-       mac_updatelicence(window);
-       break;
-    }
-}
-
-static void mac_updatelicence(WindowPtr window)
-{
-    Handle h;
-    int len;
-    long fondsize;
-    Rect textrect;
-
-    SetPort((GrafPtr)GetWindowPort(window));
-    BeginUpdate(window);
-    fondsize = GetScriptVariable(smRoman, smScriptSmallFondSize);
-    TextFont(HiWord(fondsize));
-    TextSize(LoWord(fondsize));
-    h = Get1Resource('TEXT', wLicence);
-    len = GetResourceSizeOnDisk(h);
-#if TARGET_API_MAC_CARBON
-    GetPortBounds(GetWindowPort(window), &textrect);
-#else
-    textrect = window->portRect;
-#endif
-    if (h != NULL) {
-       HLock(h);
-       TETextBox(*h, len, &textrect, teFlushDefault);
-       HUnlock(h);
-    }
-    EndUpdate(window);
+    if (mac_wininfo(window)->update != NULL)
+       (*mac_wininfo(window)->update)(window);
 }
 
 /*
@@ -417,7 +369,8 @@ static int mac_windowtype(WindowPtr window)
 /*
  * Handle a key press
  */
-static void mac_keypress(EventRecord *event) {
+static void mac_keypress(EventRecord *event)
+{
     WindowPtr window;
 
     window = FrontWindow();
@@ -425,12 +378,13 @@ static void mac_keypress(EventRecord *event) {
        mac_adjustmenus();
        mac_menucommand(MenuKey(event->message & charCodeMask));
     } else {
-       switch (mac_windowtype(window)) {
-       }
+       if (mac_wininfo(window)->key != NULL)
+           (*mac_wininfo(window)->key)(window, event);
     }       
 }
 
-static void mac_menucommand(long result) {
+static void mac_menucommand(long result)
+{
     short menu, item;
     WindowPtr window;
 #if !TARGET_API_MAC_CARBON
@@ -457,6 +411,9 @@ static void mac_menucommand(long result) {
         break;
       case mFile:
         switch (item) {
+         case iNew:
+           mac_newkey();
+           goto done;
           case iClose:
             mac_closewindow(window);
             goto done;
@@ -467,57 +424,15 @@ static void mac_menucommand(long result) {
         break;
     }
     /* If we get here, handling is up to window-specific code. */
-    switch (mac_windowtype(window)) {
-    }
+    if (mac_wininfo(window)->menu != NULL)
+       (*mac_wininfo(window)->menu)(window, menu, item);
+
   done:
     HiliteMenu(0);
 }
 
-static void mac_openabout(void) {
-    DialogItemType itemtype;
-    Handle item;
-    VersRecHndl vers;
-    Rect box;
-    StringPtr longvers;
-    WinInfo *wi;
-
-    if (windows.about)
-       SelectWindow(windows.about);
-    else {
-       windows.about =
-           GetDialogWindow(GetNewDialog(wAbout, NULL, (WindowPtr)-1));
-       wi = smalloc(sizeof(*wi));
-       wi->s = NULL;
-       wi->wtype = wAbout;
-       SetWRefCon(windows.about, (long)wi);
-       vers = (VersRecHndl)Get1Resource('vers', 1);
-       if (vers != NULL && *vers != NULL) {
-           longvers = (*vers)->shortVersion + (*vers)->shortVersion[0] + 1;
-           GetDialogItem(GetDialogFromWindow(windows.about), wiAboutVersion,
-                         &itemtype, &item, &box);
-           assert(itemtype & kStaticTextDialogItem);
-           SetDialogItemText(item, longvers);
-       }
-       ShowWindow(windows.about);
-    }
-}
-
-static void mac_openlicence(void) {
-    WinInfo *wi;
-
-    if (windows.licence)
-       SelectWindow(windows.licence);
-    else {
-       windows.licence = GetNewWindow(wLicence, NULL, (WindowPtr)-1);
-       wi = smalloc(sizeof(*wi));
-       wi->s = NULL;
-       wi->wtype = wLicence;
-       SetWRefCon(windows.licence, (long)wi);
-       ShowWindow(windows.licence);
-    }
-}
-
-static void mac_closewindow(WindowPtr window) {
+static void mac_closewindow(WindowPtr window)
+{
 
     switch (mac_windowtype(window)) {
 #if !TARGET_API_MAC_CARBON
@@ -525,14 +440,30 @@ static void mac_closewindow(WindowPtr window) {
        CloseDeskAcc(GetWindowKind(window));
        break;
 #endif
-      case wAbout:
-       windows.about = NULL;
-       DisposeDialog(GetDialogFromWindow(window));
-       break;
-      case wLicence:
-       windows.licence = NULL;
-       DisposeWindow(window);
-       break;
+      default:
+       if (mac_wininfo(window)->close != NULL)
+           (*mac_wininfo(window)->close)(window);
+    }
+}
+
+static void mac_suspendresume(EventRecord *event)
+{
+    WindowPtr front;
+    EventRecord fakeevent;
+
+    /*
+     * We're called either before we're suspended or after we're
+     * resumed, so we're the front application at this point.
+     */
+    front = FrontWindow();
+    if (front != NULL) {
+       fakeevent.what = activateEvt;
+       fakeevent.message = (UInt32)front;
+       fakeevent.when = event->when;
+       fakeevent.where = event->where;
+       fakeevent.modifiers =
+           (event->message & resumeFlag) ? activeFlag : 0;
+       mac_activatewindow(front, &fakeevent);
     }
 }
 
@@ -566,15 +497,15 @@ static void mac_adjustmenus(void) {
        DisableItem(menu, iClose);
     EnableItem(menu, iQuit);
 
-    switch (mac_windowtype(window)) {
-      default:
+    if (mac_wininfo(window)->adjustmenus != NULL)
+       (*mac_wininfo(window)->adjustmenus)(window);
+    else {
        DisableItem(menu, iSave);
        DisableItem(menu, iSaveAs);
        menu = GetMenuHandle(mEdit);
        DisableItem(menu, 0);
        menu = GetMenuHandle(mWindow);
        DisableItem(menu, 0); /* Until we get more than 1 item on it. */
-       break;
     }
     DrawMenuBar();
 }
@@ -582,7 +513,8 @@ static void mac_adjustmenus(void) {
 /*
  * Make sure the right cursor's being displayed.
  */
-static void mac_adjustcursor(RgnHandle cursrgn) {
+static void mac_adjustcursor(RgnHandle cursrgn)
+{
     Point mouse;
     WindowPtr window, front;
     short part;
@@ -615,8 +547,9 @@ static void mac_adjustcursor(RgnHandle cursrgn) {
 #endif
        }
     } else {
-       switch (mac_windowtype(window)) {
-         default:
+       if (mac_wininfo(window)->adjustcursor != NULL)
+           (*mac_wininfo(window)->adjustcursor)(window, mouse, cursrgn);
+       else {
 #if TARGET_API_MAC_CARBON
            GetQDGlobalsArrow(&arrow);
            SetCursor(&arrow);
@@ -625,7 +558,6 @@ static void mac_adjustcursor(RgnHandle cursrgn) {
            SetCursor(&qd.arrow);
            CopyRgn(window->visRgn, cursrgn);
 #endif
-           break;
        }
     }
 }