-/* $Id: mac.c,v 1.54 2003/03/06 23:44:47 ben Exp $ */
+/* $Id$ */
/*
* Copyright (c) 1999, 2003 Ben Harris
* All rights reserved.
#include <MacTypes.h>
#include <AEDataModel.h>
#include <AppleEvents.h>
+#include <Controls.h>
#include <Quickdraw.h>
#include <Fonts.h>
#include <MacWindows.h>
static int borednow = FALSE;
struct mac_gestalts mac_gestalts;
UInt32 sleeptime;
+static long timing_next_time;
static void mac_startup(void);
static void mac_eventloop(void);
fatalbox("Unable to create menu bar.");
SetMenuBar(menuBar);
AppendResMenu(GetMenuHandle(mApple), 'DRVR');
- if (mac_gestalts.menuattr & gestaltMenuMgrAquaLayoutMask)
+ if (mac_gestalts.menuattr & gestaltMenuMgrAquaLayoutMask) {
DeleteMenuItem(GetMenuHandle(mFile), iQuit);
+ /* Also delete the separator above the Quit item. */
+ DeleteMenuItem(GetMenuHandle(mFile), iQuit - 1);
+ }
mac_adjustmenus();
DrawMenuBar();
InitCursor();
NewAEEventHandlerUPP(&mac_aevt_quit), 0, FALSE);
}
+void timer_change_notify(long next)
+{
+ timing_next_time = next;
+}
+
static void mac_eventloop(void) {
Boolean gotevent;
EventRecord event;
RgnHandle cursrgn;
+ long next;
+ long ticksleft;
cursrgn = NewRgn();
sleeptime = 0;
for (;;) {
- mac_adjustcursor(cursrgn);
+ ticksleft=timing_next_time-GETTICKCOUNT();
+ if (sleeptime > ticksleft && ticksleft >=0)
+ sleeptime=ticksleft;
gotevent = WaitNextEvent(everyEvent, &event, sleeptime, cursrgn);
+ if (timing_next_time <= GETTICKCOUNT()) {
+ if (run_timers(timing_next_time, &next)) {
+ timer_change_notify(next);
+ }
+ }
+
/*
* XXX For now, limit sleep time to 1/10 s to work around
* wake-before-sleep race in MacTCP code.
if (borednow)
cleanup_exit(0);
}
- sk_poll();
if (!gotevent)
- mac_pollterm();
+ sk_poll();
+ if (mac_gestalts.apprvers >= 0x100 && mac_frontwindow() != NULL)
+ IdleControls(mac_frontwindow());
}
DisposeRgn(cursrgn);
}
case iOpen:
mac_opensession();
goto done;
+ case iChange:
+ mac_reconfig();
+ goto done;
case iClose:
mac_closewindow(window);
goto done;
if (window != NULL && mac_wininfo(window)->adjustmenus != NULL)
(*mac_wininfo(window)->adjustmenus)(window);
else {
+ DisableItem(menu, iChange);
DisableItem(menu, iSave);
DisableItem(menu, iSaveAs);
DisableItem(menu, iDuplicate);
return FALSE;
}
-void agent_query(void *in, int inlen, void **out, int *outlen)
+int agent_query(void *in, int inlen, void **out, int *outlen,
+ void (*callback)(void *, void *, int), void *callback_ctx)
{
*out = NULL;
*outlen = 0;
+ return 1;
}
/* Temporary null routines for testing. */
-/*
- * FIXME: verify_ssh_host_key() should be passed a frontend handle,
- * but backends have to have a terminal handle instead, because they
- * pass it to from_backend(), so we accept a terminal handle here as
- * well, and hope no-one tries to call us with sensible arguments.
- */
void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
char *keystr, char *fingerprint)
{
- Str255 stuff;
- Terminal *term = frontend;
- Session *s = term->frontend;
+ Str255 pappname;
+ Str255 pfingerprint;
+ Str255 pkeytype;
+ Session *s = frontend;
+ int ret, alertret;
+
+ c2pstrcpy(pappname, appname);
+ c2pstrcpy(pkeytype, keytype);
+ c2pstrcpy(pfingerprint, fingerprint);
/*
* This function is horribly wrong. For one thing, the alert
* Aqua. Also, PuTTY might be in the background, in which case we
* should use the Notification Manager to wake up the user. In
* any case, we shouldn't hold up processing of other connections'
- * data just because this one's waiting for the user. It should
- * also handle a host key cache, of course, and see the note above
- * about the "frontend" argument and the one below about closing
- * the connection. All in all, a bit of a mess really.
+ * data just because this one's waiting for the user. Also see the
+ * note below about closing the connection. All in all, a bit of
+ * a mess really.
*/
- stuff[0] = sprintf((char *)(&stuff[1]),
- "The server's key fingerprint is: %s\n"
- "Continue connecting?", fingerprint);
- ParamText(stuff, NULL, NULL, NULL);
- if (CautionAlert(wQuestion, NULL) == 2) {
- /*
- * User chose "Cancel". Unfortunately, if I tear the
- * connection down here, Bad Things happen when I return. I
- * think this function should actually return something
- * telling the SSH code to abandon the connection.
- */
+ /* Verify the key against the cache */
+
+ ret = verify_host_key(host, port, keytype, keystr);
+
+ if (ret == 0) /* success - key matched OK */
+ return;
+ if (ret == 2) { /* key was different */
+ ParamText(pappname, pkeytype, pfingerprint, NULL);
+ alertret=CautionAlert(wWrong, NULL);
+ if (alertret == 8) {
+ /* Cancel */
+ goto cancel;
+ } else if (alertret == 9) {
+ /* Connect Just Once */
+ } else {
+ /* Update Key */
+ store_host_key(host, port, keytype, keystr);
+ }
+ }
+ if (ret == 1) { /* key was absent */
+ ParamText(pkeytype, pfingerprint, pappname, NULL);
+ alertret=CautionAlert(wAbsent, NULL);
+ if (alertret == 7) {
+ /* Cancel */
+ goto cancel;
+ } else if (alertret == 8) {
+ /* Connect Just Once */
+ } else {
+ /* Update Key */
+ store_host_key(host, port, keytype, keystr);
+ }
}
+
+ return;
+
+ cancel:
+ /*
+ * User chose "Cancel". Unfortunately, if I tear the
+ * connection down here, Bad Things happen when I return. I
+ * think this function should actually return something
+ * telling the SSH code to abandon the connection.
+ */
+ return;
}
-void askcipher(void *frontend, char *ciphername, int cs)
+void askalg(void *frontend, const char *algtype, const char *algname)
{
}
/* SGT: I have no idea whether Mac X servers need anything here. */
}
+void update_specials_menu(void *frontend)
+{
+ Session *s = frontend;
+ WindowPtr front;
+
+ front = mac_frontwindow();
+ if (front != NULL && mac_windowsession(front) == s)
+ mac_adjustmenus();
+}
+
+void notify_remote_exit(void *fe) { /* XXX anything needed here? */ }
+
/*
* Local Variables:
* c-file-style: "simon"