static pascal void mac_growtermdraghook(void);
static pascal void mac_scrolltracker(ControlHandle, short);
static pascal void do_text_for_device(short, short, GDHandle, long);
+static void do_text_internal(Context, int, int, wchar_t *, int,
+ unsigned long, int);
static void text_click(Session *, EventRecord *);
static void mac_activateterm(WindowPtr, EventRecord *);
static void mac_adjusttermcursor(WindowPtr, Point, RgnHandle);
*
* x and y are text row and column (zero-based)
*/
-void do_text(Context ctx, int x, int y, wchar_t *text, int len,
- unsigned long attr, int lattr)
+static void do_text_internal(Context ctx, int x, int y, wchar_t *text, int len,
+ unsigned long attr, int lattr)
{
Session *s = ctx;
int style;
assert(len <= 1024);
- /* SGT, 2004-10-14: I don't know how to support combining characters
- * on the Mac. Hopefully the first person to fail this assertion will
- * know how to do it better than me... */
- assert(!(attr & TATTR_COMBINING));
-
SetPort((GrafPtr)GetWindowPort(s->window));
fontwidth = s->font_width;
#endif
}
+/*
+ * Wrapper that handles combining characters.
+ */
+void do_text(Context ctx, int x, int y, wchar_t *text, int len,
+ unsigned long attr, int lattr)
+{
+ if (attr & TATTR_COMBINING) {
+ unsigned long a = 0;
+ attr &= ~TATTR_COMBINING;
+ while (len--) {
+ do_text_internal(ctx, x, y, text, 1, attr | a, lattr);
+ text++;
+ a = TATTR_COMBINING;
+ }
+ } else
+ do_text_internal(ctx, x, y, text, len, attr, lattr);
+}
+
static pascal void do_text_for_device(short depth, short devflags,
GDHandle device, long cookie)
{
}
}
- EraseRect(&a->textrect);
+ if (!(a->attr & TATTR_COMBINING))
+ EraseRect(&a->textrect);
switch (a->lattr & LATTR_MODE) {
case LATTR_NORM:
case LATTR_WIDE:
-/* $Id: macucs.c,v 1.7 2003/04/05 22:12:44 ben Exp $ */
+/* $Id$ */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "putty.h"
+#include "charset.h"
#include "terminal.h"
#include "misc.h"
#include "mac.h"
/*
* Mac Unicode-handling routines.
*
- * FIXME: currently trivial stub versions assuming all codepages
- * are ISO8859-1.
- *
+ * BJH:
* What we _should_ do is to use the Text Encoding Conversion Manager
* when it's available, and have our own routines for converting to
* standard Mac OS scripts when it's not. Support for ATSUI might be
* nice, too.
- */
+ *
+ * I (OSD) am unsure any of the above is necessary if we just use
+ * libcharset */
/*
* Determine whether a byte is the first byte of a double-byte
{
int i;
+ s->ucsdata.line_codepage = decode_codepage(s->cfg.line_codepage);
+
/* Find the line control characters. FIXME: this is not right. */
for (i = 0; i < 256; i++)
if (i < ' ' || (i >= 0x7F && i < 0xA0))
int decode_codepage(char *cp_name)
{
-
- return 0;
+ if (!*cp_name)
+ return CS_NONE; /* use font encoding */
+ return charset_from_localenc(cp_name);
}
char const *cp_enumerate (int index)
{
-
- if (index == 0) return "ISO/IEC 8859-1";
- return NULL;
+ int charset;
+ if (index == 0)
+ return "Use font encoding";
+ charset = charset_localenc_nth(index-1);
+ if (charset == CS_NONE)
+ return NULL;
+ return charset_to_localenc(charset);
}
char const *cp_name(int codepage)
{
-
- return "ISO/IEC 8859-1";
+ if (codepage == CS_NONE)
+ return "Use font encoding";
+ return charset_to_localenc(codepage);
}