From 2647b10332087c0705b9d8a38c8af473a8a4acba Mon Sep 17 00:00:00 2001 From: ben Date: Fri, 29 Nov 2002 00:32:03 +0000 Subject: [PATCH] Improve support for non-colour displays by adding a mask of attributes to ignore when breaking text into runs for display, and implement setting this on Mac (other ports just use 0xffffffff). We don't use DeviceLoop for this any more because Apple Technical Q&A QA1024 says we shouldn't. Unlike their example, we don't depend on the Display Manager's being present either. git-svn-id: svn://svn.tartarus.org/sgt/putty@2264 cda61777-01e9-0310-a592-d414129be87e --- mac/mac.h | 2 -- mac/macterm.c | 59 ++++++++++++++++++++++++++++------------------------------- terminal.c | 4 +++- terminal.h | 3 +++ 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/mac/mac.h b/mac/mac.h index 1bd54824..85540210 100644 --- a/mac/mac.h +++ b/mac/mac.h @@ -52,8 +52,6 @@ typedef struct { char *realhost; /* Logging */ void *logctx; - /* Conveniences */ - unsigned long attr_mask; /* Mask of attributes to display */ /* Mac-specific elements */ short fontnum; diff --git a/mac/macterm.c b/mac/macterm.c index 9e51fd1c..daed7f6f 100644 --- a/mac/macterm.c +++ b/mac/macterm.c @@ -1,4 +1,4 @@ -/* $Id: macterm.c,v 1.15 2002/11/28 21:10:55 ben Exp $ */ +/* $Id: macterm.c,v 1.16 2002/11/29 00:32:03 ben Exp $ */ /* * Copyright (c) 1999 Simon Tatham * Copyright (c) 1999, 2002 Ben Harris @@ -94,13 +94,9 @@ static RoutineDescriptor mac_scrolltracker_upp = static RoutineDescriptor do_text_for_device_upp = BUILD_ROUTINE_DESCRIPTOR(uppDeviceLoopDrawingProcInfo, (ProcPtr)do_text_for_device); -static RoutineDescriptor mac_set_attr_mask_upp = - BUILD_ROUTINE_DESCRIPTOR(uppDeviceLoopDrawingProcInfo, - (ProcPtr)mac_set_attr_mask); #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 TARGET_RT_MAC_CFM */ static void inbuf_putc(Session *s, int c) { @@ -170,7 +166,6 @@ void mac_newsession(void) { mac_initfont(s); mac_initpalette(s); - s->attr_mask = ATTR_MASK; if (HAVE_COLOR_QD()) { /* Set to FALSE to not get palette updates in the background. */ SetPalette(s->window, s->palette, TRUE); @@ -946,12 +941,34 @@ void do_cursor(Context ctx, int x, int y, char *text, int len, * Should probably be called start_redraw or something. */ void pre_paint(Session *s) { + GDHandle gdh; + Rect myrect, tmprect; - s->attr_mask = ATTR_INVALID; - if (HAVE_COLOR_QD()) - DeviceLoop(s->window->visRgn, &mac_set_attr_mask_upp, (long)s, 0); - else - mac_set_attr_mask(1, 0, NULL, (long)s); + s->term->attr_mask = 0xffffffff; + if (HAVE_COLOR_QD()) { + SetPort(s->window); + myrect = (*s->window->visRgn)->rgnBBox; + LocalToGlobal((Point *)&myrect.top); + LocalToGlobal((Point *)&myrect.bottom); + for (gdh = GetDeviceList(); + gdh != NULL; + gdh = GetNextDevice(gdh)) { + if (TestDeviceAttribute(gdh, screenDevice) && + TestDeviceAttribute(gdh, screenActive) && + SectRect(&(*gdh)->gdRect, &myrect, &tmprect)) { + switch ((*(*gdh)->gdPMap)->pixelSize) { + case 1: + if (s->cfg.bold_colour) + s->term->attr_mask &= ~ATTR_BOLD; + /* FALLTHROUGH */ + case 2: + s->term->attr_mask &= ~ATTR_COLOURS; + } + } + } + } else + s->term->attr_mask &= ~(ATTR_COLOURS | + (s->cfg.bold_colour ? ATTR_BOLD : 0)); } Context get_ctx(void *frontend) { @@ -965,26 +982,6 @@ void free_ctx(Context ctx) { } -static pascal void mac_set_attr_mask(short depth, short devflags, - GDHandle device, long cookie) { - - Session *s = (Session *)cookie; - - switch (depth) { - default: - s->attr_mask |= ATTR_FGMASK | ATTR_BGMASK; - /* FALLTHROUGH */ - case 2: - s->attr_mask |= ATTR_BOLD; - /* FALLTHROUGH */ - case 1: - s->attr_mask |= ATTR_UNDER | ATTR_REVERSE | TATTR_ACTCURS | - TATTR_PASCURS | ATTR_ASCII | ATTR_GBCHR | ATTR_LINEDRW | - (s->cfg.bold_colour ? 0 : ATTR_BOLD); - break; - } -} - /* * Presumably this does something in Windows */ diff --git a/terminal.c b/terminal.c index 06d6ee6b..59500725 100644 --- a/terminal.c +++ b/terminal.c @@ -336,6 +336,7 @@ Terminal *term_init(Config *mycfg, void *frontend) term->nbeeps = 0; term->lastbeep = FALSE; term->beep_overloaded = FALSE; + term->attr_mask = 0xffffffff; term->resize_fn = NULL; term->resize_ctx = NULL; @@ -3039,7 +3040,8 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise) if ((term->disptext[idx] ^ tattr) & ATTR_WIDE) dirty_line = TRUE; - break_run = (tattr != attr || j - start >= sizeof(ch)); + break_run = (((tattr ^ attr) & term->attr_mask) || + j - start >= sizeof(ch)); /* Special hack for VT100 Linedraw glyphs */ if ((attr & CSET_MASK) == 0x2300 && tchar >= 0xBA diff --git a/terminal.h b/terminal.h index 727f8429..b6b5a06f 100644 --- a/terminal.h +++ b/terminal.h @@ -155,6 +155,9 @@ struct terminal_tag { short wordness[256]; + /* Mask of attributes to pay attention to when painting. */ + unsigned long attr_mask; + wchar_t *paste_buffer; int paste_len, paste_pos, paste_hold; long last_paste; -- 2.11.0