-/* $Id: macterm.c,v 1.69 2003/02/07 01:38:12 ben Exp $ */
+/* $Id: macterm.c,v 1.72 2003/03/29 23:07:55 ben Exp $ */
/*
* Copyright (c) 1999 Simon Tatham
* Copyright (c) 1999, 2002 Ben Harris
static pascal void mac_scrolltracker(ControlHandle, short);
static pascal void do_text_for_device(short, short, GDHandle, long);
static void text_click(Session *, EventRecord *);
+static void mac_activateterm(WindowPtr, EventRecord *);
+static void mac_adjusttermcursor(WindowPtr, Point, RgnHandle);
+static void mac_adjusttermmenus(WindowPtr);
+static void mac_updateterm(WindowPtr);
+static void mac_clickterm(WindowPtr, EventRecord *);
+static void mac_growterm(WindowPtr, EventRecord *);
+static void mac_keyterm(WindowPtr, EventRecord *);
+static void mac_menuterm(WindowPtr, short, short);
+static void mac_closeterm(WindowPtr);
void pre_paint(Session *s);
void post_paint(Session *s);
s->window = GetNewCWindow(wTerminal, NULL, (WindowPtr)-1);
else
s->window = GetNewWindow(wTerminal, NULL, (WindowPtr)-1);
- wi = smalloc(sizeof(*wi));
+ wi = snew(WinInfo);
+ memset(wi, 0, sizeof(*wi));
wi->s = s;
wi->wtype = wTerminal;
+ wi->activate = &mac_activateterm;
+ wi->adjustcursor = &mac_adjusttermcursor;
+ wi->adjustmenus = &mac_adjusttermmenus;
+ wi->update = &mac_updateterm;
+ wi->click = &mac_clickterm;
+ wi->grow = &mac_growterm;
+ wi->key = &mac_keyterm;
+ wi->menu = &mac_menuterm;
+ wi->close = &mac_closeterm;
SetWRefCon(s->window, (long)wi);
s->scrollbar = GetNewControl(cVScroll, s->window);
s->term = term_init(&s->cfg, &s->ucsdata, s);
static UnicodeToTextFallbackUPP uni_to_font_fallback_upp;
-static void mac_initfont(Session *s) {
+static void mac_initfont(Session *s)
+{
FontInfo fi;
TextEncoding enc;
OptionBits fbflags;
mac_drawgrowicon(s);
}
-static void mac_initpalette(Session *s) {
+static void mac_initpalette(Session *s)
+{
if (!HAVE_COLOR_QD())
return;
* Set the background colour of the window correctly. Should be
* called whenever the default background changes.
*/
-static void mac_adjustwinbg(Session *s) {
+static void mac_adjustwinbg(Session *s)
+{
if (!HAVE_COLOR_QD())
return;
/*
* Set the cursor shape correctly
*/
-void mac_adjusttermcursor(WindowPtr window, Point mouse, RgnHandle cursrgn) {
+static void mac_adjusttermcursor(WindowPtr window, Point mouse,
+ RgnHandle cursrgn)
+{
Session *s;
ControlHandle control;
short part;
#define DisableItem DisableMenuItem
#define EnableItem EnableMenuItem
#endif
-void mac_adjusttermmenus(WindowPtr window) {
+static void mac_adjusttermmenus(WindowPtr window)
+{
Session *s;
MenuHandle menu;
#if !TARGET_API_MAC_CARBON
EnableItem(menu, iShowEventLog);
}
-void mac_menuterm(WindowPtr window, short menu, short item) {
+static void mac_menuterm(WindowPtr window, short menu, short item)
+{
Session *s;
s = mac_windowsession(window);
}
}
-void mac_clickterm(WindowPtr window, EventRecord *event) {
+static void mac_clickterm(WindowPtr window, EventRecord *event)
+{
Session *s;
Point mouse;
ControlHandle control;
}
}
-static void text_click(Session *s, EventRecord *event) {
+static void text_click(Session *s, EventRecord *event)
+{
Point localwhere;
int row, col;
static UInt32 lastwhen = 0;
if (data[i] == 0x2028)
data[i] = 0x000d;
- mactextbuf = smalloc(len); /* XXX DBCS */
+ mactextbuf = snewn(len, char); /* XXX DBCS */
if (s->uni_to_font != NULL) {
err = ConvertFromUnicodeToText(s->uni_to_font, len * sizeof(UniChar),
(UniChar *)data,
#endif
}
-void get_clip(void *frontend, wchar_t **p, int *lenp) {
+void get_clip(void *frontend, wchar_t **p, int *lenp)
+{
#if TARGET_API_MAC_CARBON
*lenp = 0;
#else
texth = NewHandle(0);
textlen = GetScrap(texth, kScrapFlavorTypeText, &offset);
HLock(texth);
- data = smalloc(textlen * 2);
+ data = snewn(textlen, wchar_t);
/* XXX should use 'styl' scrap if it's there. */
if (mac_gestalts.encvvers != 0 &&
UpgradeScriptInfoToTextEncoding(smSystemScript,
#endif
}
-static pascal void mac_scrolltracker(ControlHandle control, short part) {
+static pascal void mac_scrolltracker(ControlHandle control, short part)
+{
Session *s;
#if TARGET_API_MAC_CARBON
}
}
-void mac_keyterm(WindowPtr window, EventRecord *event) {
+static void mac_keyterm(WindowPtr window, EventRecord *event)
+{
Session *s = mac_windowsession(window);
Key_Sym keysym = PK_NULL;
unsigned int mods = 0, flags = PKF_NUMLOCK;
char oldmsg[20];
} growterm_state;
-void mac_growterm(WindowPtr window, EventRecord *event) {
+static void mac_growterm(WindowPtr window, EventRecord *event)
+{
Rect limits;
long grow_result;
int newrows, newcols;
sfree(s);
}
-void mac_activateterm(WindowPtr window, Boolean active) {
+static void mac_activateterm(WindowPtr window, EventRecord *event)
+{
Session *s;
+ Boolean active = (event->modifiers & activeFlag) != 0;
s = mac_windowsession(window);
s->term->has_focus = active;
mac_drawgrowicon(s);
}
-void mac_updateterm(WindowPtr window) {
+static void mac_updateterm(WindowPtr window)
+{
Session *s;
Rect bbox;
#if TARGET_API_MAC_CARBON
EndUpdate(window);
}
-static void mac_drawgrowicon(Session *s) {
+static void mac_drawgrowicon(Session *s)
+{
Rect clip;
RgnHandle savergn;
* x and y are text row and column (zero-based)
*/
void do_text(Context ctx, int x, int y, char *text, int len,
- unsigned long attr, int lattr) {
+ unsigned long attr, int lattr)
+{
Session *s = ctx;
int style;
struct do_text_args a;
}
static pascal void do_text_for_device(short depth, short devflags,
- GDHandle device, long cookie) {
+ GDHandle device, long cookie)
+{
struct do_text_args *a = (struct do_text_args *)cookie;
int bgcolour, fgcolour, bright, reverse, tmp;
#if TARGET_API_MAC_CARBON
* Call from the terminal emulator to get its graphics context.
* Should probably be called start_redraw or something.
*/
-void pre_paint(Session *s) {
+void pre_paint(Session *s)
+{
GDHandle gdh;
Rect myrect, tmprect;
#if TARGET_API_MAC_CARBON
(s->cfg.bold_colour ? ATTR_BOLD : 0));
}
-Context get_ctx(void *frontend) {
+Context get_ctx(void *frontend)
+{
Session *s = frontend;
pre_paint(s);
return s;
}
-void free_ctx(Context ctx) {
+void free_ctx(Context ctx)
+{
}
/*
* Presumably this does something in Windows
*/
-void post_paint(Session *s) {
+void post_paint(Session *s)
+{
}
* start is the line number of the top of the display
* page is the length of the displayed page
*/
-void set_sbar(void *frontend, int total, int start, int page) {
+void set_sbar(void *frontend, int total, int start, int page)
+{
Session *s = frontend;
/* We don't redraw until we've set everything up, to avoid glitches */
/*
* Set the window title
*/
-void set_title(void *frontend, char *title) {
+void set_title(void *frontend, char *title)
+{
Session *s = frontend;
Str255 mactitle;
/*
* Resize the window at the emulator's request
*/
-void request_resize(void *frontend, int w, int h) {
+void request_resize(void *frontend, int w, int h)
+{
Session *s = frontend;
+ RgnHandle grayrgn;
+ Rect graybox;
+ int wlim, hlim;
+ /* Arbitrarily clip to the size of the desktop. */
+ grayrgn = GetGrayRgn();
+#if TARGET_API_MAC_CARBON
+ GetRegionBounds(grayrgn, &graybox);
+#else
+ graybox = (*grayrgn)->rgnBBox;
+#endif
+ wlim = (graybox.right - graybox.left) / s->font_width;
+ hlim = (graybox.bottom - graybox.top) / s->font_height;
+ if (w > wlim) w = wlim;
+ if (h > hlim) h = hlim;
term_size(s->term, h, w, s->cfg.savelines);
mac_initfont(s);
}
/*
* Set the logical palette. Called by the terminal emulator.
*/
-void palette_set(void *frontend, int n, int r, int g, int b) {
+void palette_set(void *frontend, int n, int r, int g, int b)
+{
Session *s = frontend;
static const int first[21] = {
0, 2, 4, 6, 8, 10, 12, 14,
/*
* Reset to the default palette
*/
-void palette_reset(void *frontend) {
+void palette_reset(void *frontend)
+{
Session *s = frontend;
/* This maps colour indices in cfg to those used in our palette. */
static const int ww[] = {
* Scroll the screen. (`lines' is +ve for scrolling forward, -ve
* for backward.)
*/
-void do_scroll(Context ctx, int topline, int botline, int lines) {
+void do_scroll(Context ctx, int topline, int botline, int lines)
+{
Session *s = ctx;
Rect r;
RgnHandle scrollrgn = NewRgn();