-/* $Id: macterm.c,v 1.1.2.28 1999/03/23 00:43:46 ben Exp $ */
+/* $Id: macterm.c,v 1.1.2.31 1999/03/28 15:27:03 ben Exp $ */
/*
+ * Copyright (c) 1999 Simon Tatham
* Copyright (c) 1999 Ben Harris
* All rights reserved.
*
#include <QuickdrawText.h>
#include <Resources.h>
#include <Scrap.h>
+#include <Script.h>
#include <Sound.h>
#include <ToolUtils.h>
static int mac_keytrans(struct mac_session *, EventRecord *, unsigned char *);
static void text_click(struct mac_session *, EventRecord *);
-#ifdef USES_ROUTINE_DESCRIPTORS
+#if TARGET_RT_MAC_CFM
static RoutineDescriptor mac_scrolltracker_upp =
BUILD_ROUTINE_DESCRIPTOR(uppControlActionProcInfo,
(ProcPtr)mac_scrolltracker);
static RoutineDescriptor mac_set_attr_mask_upp =
BUILD_ROUTINE_DESCRIPTOR(uppDeviceLoopDrawingProcInfo,
(ProcPtr)mac_set_attr_mask);
-#else /* not USES_ROUTINE_DESCRIPTORS */
+#else /* not TARGET_RT_MAC_CFM */
#define mac_scrolltracker_upp mac_scrolltracker
#define do_text_for_device_upp do_text_for_device
#define mac_set_attr_mask_upp mac_set_attr_mask
-#endif /* not USES_ROUTINE_DESCRIPTORS */
+#endif /* not TARGET_RT_MAC_CFM */
/*
* Temporary hack till I get the terminal emulator supporting multiple
void mac_newsession(void) {
struct mac_session *s;
- int i;
UInt32 starttime;
char msg[128];
/* This should obviously be initialised by other means */
mac_loadconfig(&cfg);
- back = &loop_backend;
+ back = &hexdump_backend;
s = smalloc(sizeof(*s));
memset(s, 0, sizeof(*s));
onlysession = s;
}
/*
- * I don't think this is (a) safe or (b) a good way to do this.
+ * Set the background colour of the window correctly. Should be
+ * called whenever the default background changes.
*/
static void mac_adjustwinbg(struct mac_session *s) {
- if (s->wctab == NULL)
- s->wctab = (WCTabHandle)NewHandle(sizeof(**s->wctab));
- if (s->wctab == NULL)
- return; /* do without */
- (*s->wctab)->wCSeed = 0;
- (*s->wctab)->wCReserved = 0;
- (*s->wctab)->ctSize = 0;
- (*s->wctab)->ctTable[0].value = wContentColor;
- (*s->wctab)->ctTable[0].rgb = (*s->palette)->pmInfo[DEFAULT_BG].ciRGB;
- SetWinColor(s->window, s->wctab);
+#if 0 /* XXX doesn't link (at least for 68k) */
+ if (mac_gestalts.windattr & gestaltWindowMgrPresent)
+ SetWindowContentColor(s->window,
+ &(*s->palette)->pmInfo[DEFAULT_BG].ciRGB);
+ else
+#endif
+ {
+ if (s->wctab == NULL)
+ s->wctab = (WCTabHandle)NewHandle(sizeof(**s->wctab));
+ if (s->wctab == NULL)
+ return; /* do without */
+ (*s->wctab)->wCSeed = 0;
+ (*s->wctab)->wCReserved = 0;
+ (*s->wctab)->ctSize = 0;
+ (*s->wctab)->ctTable[0].value = wContentColor;
+ (*s->wctab)->ctTable[0].rgb = (*s->palette)->pmInfo[DEFAULT_BG].ciRGB;
+ SetWinColor(s->window, s->wctab);
+ }
}
/*
}
}
-#define K_SPACE 0x3100
#define K_BS 0x3300
#define K_F1 0x7a00
#define K_F2 0x7800
#define K_F10 0x6d00
#define K_F11 0x6700
#define K_F12 0x6f00
+#define K_F13 0x6900
+#define K_F14 0x6b00
+#define K_F15 0x7100
#define K_INSERT 0x7200
#define K_HOME 0x7300
#define K_PRIOR 0x7400
unsigned char buf[20];
int len;
struct mac_session *s;
- int i;
s = (struct mac_session *)GetWRefCon(window);
len = mac_keytrans(s, event, buf);
back->send((char *)buf, len);
}
+static UInt32 mac_rekey(EventModifiers newmodifiers, UInt32 oldmessage) {
+ UInt32 transresult, state;
+ Ptr kchr;
+
+ state = 0;
+ kchr = (Ptr)GetScriptManagerVariable(smKCHRCache);
+ transresult = KeyTranslate(kchr,
+ (oldmessage & keyCodeMask) >> 8 |
+ newmodifiers & 0xff00,
+ &state);
+ /*
+ * KeyTranslate returns two character codes. We only worry about
+ * one. Yes, this is slightly bogus, but it makes life less
+ * painful.
+ */
+ return oldmessage & ~charCodeMask | transresult & 0xff;
+}
+
+
static int mac_keytrans(struct mac_session *s, EventRecord *event,
unsigned char *output) {
unsigned char *p = output;
/* No meta key yet -- that'll be rather fun. */
+ /* Check if the meta "key" was held down */
+
+ if ((event->modifiers & cfg.meta_modifiers) == cfg.meta_modifiers) {
+ *p++ = '\033';
+ event->modifiers &= ~cfg.meta_modifiers;
+ event->message = mac_rekey(event->modifiers, event->message);
+ }
+
/* Keys that we handle locally */
if (event->modifiers & shiftKey) {
switch (event->message & keyCodeMask) {
case K_LEFT:
p += sprintf((char *)p, app_cursor_keys ? "\x1BOD" : "\x1B[D");
return p - output;
+ case KP_ENTER:
+ *p++ = 0x0d;
+ return p - output;
case K_BS:
*p++ = (cfg.bksp_is_delete ? 0x7f : 0x08);
return p - output;
(*window->visRgn)->rgnBBox.right,
(*window->visRgn)->rgnBBox.bottom);
/* Restore default colours in case the Window Manager uses them */
- PmForeColor(16);
- PmBackColor(18);
+ PmForeColor(DEFAULT_FG);
+ PmBackColor(DEFAULT_BG);
if (FrontWindow() != window)
EraseRect(&(*s->scrollbar)->contrlRect);
UpdateControls(window, window->visRgn);
void do_text(struct mac_session *s, int x, int y, char *text, int len,
unsigned long attr) {
int style = 0;
- int bgcolour, fgcolour;
- RGBColor rgbfore, rgbback;
struct do_text_args a;
RgnHandle textrgn;