mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-01 03:22:48 -05:00
We now have a fairly minimal Mac application.
I'm about to try lashing in the terminal emulator... [originally from svn r52]
This commit is contained in:
226
mac.c
226
mac.c
@ -1,4 +1,4 @@
|
||||
/* $Id: mac.c,v 1.1.2.3 1999/02/19 23:51:21 ben Exp $ */
|
||||
/* $Id: mac.c,v 1.1.2.4 1999/02/20 22:10:33 ben Exp $ */
|
||||
/*
|
||||
* mac.c -- miscellaneous Mac-specific routines
|
||||
*/
|
||||
@ -10,11 +10,15 @@
|
||||
#include <Menus.h>
|
||||
#include <TextEdit.h>
|
||||
#include <Dialogs.h>
|
||||
#include <Devices.h>
|
||||
#include <DiskInit.h>
|
||||
#include <ToolUtils.h>
|
||||
|
||||
#include <limits.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h> /* putty.h needs size_t */
|
||||
|
||||
#include "macresid.h"
|
||||
#include "putty.h"
|
||||
|
||||
QDGlobals qd;
|
||||
@ -23,6 +27,17 @@ int cold = 1;
|
||||
|
||||
static void mac_startup(void);
|
||||
static void mac_eventloop(void);
|
||||
static void mac_event(EventRecord *);
|
||||
static void mac_contentclick(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_adjustmenus(void);
|
||||
static void mac_closewindow(WindowPtr);
|
||||
static void mac_zoomwindow(WindowPtr, short);
|
||||
static void mac_shutdown(void);
|
||||
|
||||
int main (int argc, char **argv) {
|
||||
|
||||
@ -45,16 +60,16 @@ static void mac_startup(void) {
|
||||
TEInit();
|
||||
/* Init Dialog Manager */
|
||||
InitDialogs(nil);
|
||||
InitCursor();
|
||||
cold = 0;
|
||||
|
||||
menuBar = GetNewMBar(128);
|
||||
if (menuBar == NULL)
|
||||
fatalbox("Unable to create menu bar.");
|
||||
SetMenuBar(menuBar);
|
||||
AppendResMenu(GetMenuHandle(128), 'DRVR');
|
||||
/* adjustmenus */
|
||||
AppendResMenu(GetMenuHandle(mApple), 'DRVR');
|
||||
mac_adjustmenus();
|
||||
DrawMenuBar();
|
||||
InitCursor();
|
||||
}
|
||||
|
||||
static void mac_eventloop(void) {
|
||||
@ -62,10 +77,209 @@ static void mac_eventloop(void) {
|
||||
EventRecord event;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 100; i++) {
|
||||
for (;;) {
|
||||
mac_adjustcursor();
|
||||
gotevent = WaitNextEvent(everyEvent, &event, LONG_MAX, NULL);
|
||||
mac_adjustcursor();
|
||||
if (gotevent)
|
||||
mac_event(&event);
|
||||
}
|
||||
fatalbox("I'm bored.");
|
||||
}
|
||||
|
||||
static void mac_event(EventRecord *event) {
|
||||
short part;
|
||||
WindowPtr window;
|
||||
Point pt;
|
||||
|
||||
switch (event->what) {
|
||||
case mouseDown:
|
||||
part = FindWindow(event->where, &window);
|
||||
switch (part) {
|
||||
case inMenuBar:
|
||||
mac_adjustmenus();
|
||||
mac_menucommand(MenuSelect(event->where));
|
||||
break;
|
||||
case inSysWindow:
|
||||
SystemClick(event, window);
|
||||
break;
|
||||
case inContent:
|
||||
if (window != FrontWindow())
|
||||
/* XXX: check for movable modal dboxes? */
|
||||
SelectWindow(window);
|
||||
else
|
||||
mac_contentclick(window, event);
|
||||
break;
|
||||
case inGoAway:
|
||||
if (TrackGoAway(window, event->where))
|
||||
mac_closewindow(window);
|
||||
break;
|
||||
case inDrag:
|
||||
/* XXX: moveable modal check? */
|
||||
DragWindow(window, event->where, &qd.screenBits.bounds);
|
||||
break;
|
||||
case inGrow:
|
||||
break;
|
||||
case inZoomIn:
|
||||
case inZoomOut:
|
||||
if (TrackBox(window, event->where, part))
|
||||
mac_zoomwindow(window, part);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case keyDown:
|
||||
case autoKey:
|
||||
mac_keypress(event);
|
||||
break;
|
||||
case activateEvt:
|
||||
/* FIXME: Do something */
|
||||
break;
|
||||
case updateEvt:
|
||||
mac_updatewindow((WindowPtr)event->message);
|
||||
break;
|
||||
case diskEvt:
|
||||
if (HiWord(event->message) != noErr) {
|
||||
SetPt(&pt, 120, 120);
|
||||
DIBadMount(pt, event->message);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void mac_contentclick(WindowPtr window, EventRecord *event) {
|
||||
short item;
|
||||
|
||||
switch (mac_windowtype(window)) {
|
||||
case wTerminal:
|
||||
/* XXX: Do something. */
|
||||
break;
|
||||
case wAbout:
|
||||
if (DialogSelect(event, &(DialogPtr)window, &item))
|
||||
switch (item) {
|
||||
case wiAboutClose:
|
||||
mac_closewindow(window);
|
||||
break;
|
||||
case wiAboutLicence:
|
||||
/* XXX: Do something */
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void mac_updatewindow(WindowPtr window) {
|
||||
|
||||
switch (mac_windowtype(window)) {
|
||||
case wTerminal:
|
||||
/* XXX: DO something */
|
||||
break;
|
||||
case wAbout:
|
||||
BeginUpdate(window);
|
||||
UpdateDialog(window, window->visRgn);
|
||||
EndUpdate(window);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Work out what kind of window we're dealing with.
|
||||
* Concept shamelessly nicked from SurfWriter.
|
||||
*/
|
||||
static int mac_windowtype(WindowPtr window) {
|
||||
int kind;
|
||||
|
||||
if (window == NULL)
|
||||
return wNone;
|
||||
kind = ((WindowPeek)window)->windowKind;
|
||||
if (kind < 0)
|
||||
return wDA;
|
||||
else if (kind == userKind)
|
||||
return wTerminal;
|
||||
else
|
||||
return GetWRefCon(window);
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle a key press
|
||||
*/
|
||||
static void mac_keypress(EventRecord *event) {
|
||||
char key;
|
||||
|
||||
if (event->what == keyDown && (event->modifiers & cmdKey)) {
|
||||
mac_adjustmenus();
|
||||
mac_menucommand(MenuKey(event->message & charCodeMask));
|
||||
}
|
||||
}
|
||||
|
||||
static void mac_menucommand(long result) {
|
||||
short menu, item;
|
||||
Str255 da;
|
||||
|
||||
menu = HiWord(result);
|
||||
item = LoWord(result);
|
||||
switch (menu) {
|
||||
case mApple:
|
||||
switch (item) {
|
||||
case iAbout:
|
||||
GetNewDialog(wAbout, NULL, (GrafPort *)-1);
|
||||
break;
|
||||
default:
|
||||
GetMenuItemText(GetMenuHandle(mApple), item, da);
|
||||
OpenDeskAcc(da);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case mFile:
|
||||
switch (item) {
|
||||
case iClose:
|
||||
mac_closewindow(FrontWindow());
|
||||
break;
|
||||
case iQuit:
|
||||
mac_shutdown();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
HiliteMenu(0);
|
||||
}
|
||||
|
||||
static void mac_closewindow(WindowPtr window) {
|
||||
|
||||
switch (mac_windowtype(window)) {
|
||||
case wDA:
|
||||
CloseDeskAcc(((WindowPeek)window)->windowKind);
|
||||
break;
|
||||
case wTerminal:
|
||||
/* FIXME: end session and stuff */
|
||||
break;
|
||||
default:
|
||||
CloseWindow(window);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void mac_zoomwindow(WindowPtr window, short part) {
|
||||
|
||||
/* FIXME: do something */
|
||||
}
|
||||
|
||||
/*
|
||||
* Make the menus look right before the user gets to see them.
|
||||
*/
|
||||
static void mac_adjustmenus(void) {
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure the right cursor's being displayed.
|
||||
*/
|
||||
static void mac_adjustcursor(void) {
|
||||
|
||||
SetCursor(&qd.arrow);
|
||||
}
|
||||
|
||||
static void mac_shutdown(void) {
|
||||
|
||||
ExitToShell();
|
||||
}
|
||||
|
||||
void fatalbox(const char *fmt, ...) {
|
||||
|
Reference in New Issue
Block a user