diff options
-rw-r--r-- | sys/dev/ic/pcdisplay_subr.c | 18 | ||||
-rw-r--r-- | sys/dev/ic/pcdisplayvar.h | 5 | ||||
-rw-r--r-- | sys/dev/ic/vga.c | 11 | ||||
-rw-r--r-- | sys/dev/pcmcia/cfxga.c | 24 | ||||
-rw-r--r-- | sys/dev/wscons/wsdisplay.c | 60 | ||||
-rw-r--r-- | sys/dev/wscons/wsdisplayvar.h | 12 | ||||
-rw-r--r-- | sys/dev/wscons/wsmoused.h | 35 |
7 files changed, 95 insertions, 70 deletions
diff --git a/sys/dev/ic/pcdisplay_subr.c b/sys/dev/ic/pcdisplay_subr.c index f615dfd73a6..8eefcb84a4f 100644 --- a/sys/dev/ic/pcdisplay_subr.c +++ b/sys/dev/ic/pcdisplay_subr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pcdisplay_subr.c,v 1.6 2006/09/29 19:46:02 miod Exp $ */ +/* $OpenBSD: pcdisplay_subr.c,v 1.7 2006/11/29 19:11:15 miod Exp $ */ /* $NetBSD: pcdisplay_subr.c,v 1.16 2000/06/08 07:01:19 cgd Exp $ */ /* @@ -174,23 +174,31 @@ pcdisplay_putchar(id, row, col, c, attr) scr->mem[off] = c | (attr << 8); } -u_int16_t -pcdisplay_getchar(id, row, col) +int +pcdisplay_getchar(id, row, col, cell) void *id; int row, col; + struct wsdisplay_charcell *cell; { struct pcdisplayscreen *scr = id; bus_space_tag_t memt = scr->hdl->ph_memt; bus_space_handle_t memh = scr->hdl->ph_memh; int off; + u_int16_t data; off = row * scr->type->ncols + col; + /* XXX bounds check? */ if (scr->active) - return (bus_space_read_2(memt, memh, + data = (bus_space_read_2(memt, memh, scr->dispoffset + off * 2)); else - return (scr->mem[off]); + data = (scr->mem[off]); + + cell->uc = data & 0xff; + cell->attr = data >> 8; + + return (0); } void diff --git a/sys/dev/ic/pcdisplayvar.h b/sys/dev/ic/pcdisplayvar.h index 314ed8b8aca..4d5044ca7d9 100644 --- a/sys/dev/ic/pcdisplayvar.h +++ b/sys/dev/ic/pcdisplayvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pcdisplayvar.h,v 1.7 2006/09/29 19:46:02 miod Exp $ */ +/* $OpenBSD: pcdisplayvar.h,v 1.8 2006/11/29 19:11:15 miod Exp $ */ /* $NetBSD: pcdisplayvar.h,v 1.8 2000/01/25 02:44:03 ad Exp $ */ /* @@ -89,7 +89,8 @@ unsigned int pcdisplay_mapchar_simple(void *, int); #endif int pcdisplay_mapchar(void *, int, unsigned int *); void pcdisplay_putchar(void *, int, int, u_int, long); -u_int16_t pcdisplay_getchar(void *, int, int); +struct wsdisplay_charcell; +int pcdisplay_getchar(void *, int, int, struct wsdisplay_charcell *); void pcdisplay_copycols(void *, int, int, int,int); void pcdisplay_erasecols(void *, int, int, int, long); void pcdisplay_copyrows(void *, int, int, int); diff --git a/sys/dev/ic/vga.c b/sys/dev/ic/vga.c index d6a58b4b81d..a1560921ecc 100644 --- a/sys/dev/ic/vga.c +++ b/sys/dev/ic/vga.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vga.c,v 1.41 2006/11/29 19:08:22 miod Exp $ */ +/* $OpenBSD: vga.c,v 1.42 2006/11/29 19:11:15 miod Exp $ */ /* $NetBSD: vga.c,v 1.28.2.1 2000/06/30 16:27:47 simonb Exp $ */ /* @@ -238,7 +238,7 @@ int vga_show_screen(void *, void *, int, int vga_load_font(void *, void *, struct wsdisplay_font *); void vga_scrollback(void *, void *, int); void vga_burner(void *v, u_int on, u_int flags); -u_int16_t vga_getchar(void *, int, int); +int vga_getchar(void *, int, int, struct wsdisplay_charcell *); void vga_doswitch(struct vga_config *); @@ -1319,14 +1319,15 @@ vga_burner(v, on, flags) splx(s); } -u_int16_t -vga_getchar(c, row, col) +int +vga_getchar(c, row, col, cell) void *c; int row, col; + struct wsdisplay_charcell *cell; { struct vga_config *vc = c; - return (pcdisplay_getchar(vc->active, row, col)); + return (pcdisplay_getchar(vc->active, row, col, cell)); } struct cfdriver vga_cd = { diff --git a/sys/dev/pcmcia/cfxga.c b/sys/dev/pcmcia/cfxga.c index 66f20ef08bd..5cce96617fb 100644 --- a/sys/dev/pcmcia/cfxga.c +++ b/sys/dev/pcmcia/cfxga.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cfxga.c,v 1.13 2006/11/29 19:08:22 miod Exp $ */ +/* $OpenBSD: cfxga.c,v 1.14 2006/11/29 19:11:17 miod Exp $ */ /* * Copyright (c) 2005, 2006, Matthieu Herrb and Miodrag Vallat @@ -130,16 +130,6 @@ struct wsdisplay_accessops cfxga_accessops = { }; /* - * Backing memory cells for emulation mode. - * We could theoretically hijack 8 bits from the rasops attribute, but this - * will not accomodate font with more than 256 characters. - */ -struct charcell { - u_int uc; - u_int32_t attr; -}; - -/* * Per-screen structure */ @@ -147,7 +137,7 @@ struct cfxga_screen { LIST_ENTRY(cfxga_screen) scr_link; struct cfxga_softc *scr_sc; /* parent reference */ struct rasops_info scr_ri; /* raster op glue */ - struct charcell *scr_mem; /* backing memory */ + struct wsdisplay_charcell *scr_mem; /* backing memory */ }; void cfxga_copycols(void *, int, int, int, int); @@ -515,7 +505,7 @@ cfxga_alloc_screen(void *v, const struct wsscreen_descr *type, void **cookiep, * Allocate backing store to remember non-visible screen contents in * emulation mode. */ - scrsize = ri->ri_rows * ri->ri_cols * sizeof(struct charcell); + scrsize = ri->ri_rows * ri->ri_cols * sizeof(struct wsdisplay_charcell); scr->scr_mem = malloc(scrsize, M_DEVBUF, cold ? M_NOWAIT : M_WAITOK); if (scr->scr_mem == NULL) { free(scr, M_DEVBUF); @@ -944,7 +934,7 @@ fail: int cfxga_repaint_screen(struct cfxga_screen *scr) { - struct charcell *cell = scr->scr_mem; + struct wsdisplay_charcell *cell = scr->scr_mem; struct rasops_info *ri = &scr->scr_ri; int x, y, cx, cy, lx, ly; int fg, bg; @@ -1068,7 +1058,7 @@ cfxga_copycols(void *cookie, int row, int src, int dst, int num) /* Copy columns in backing store. */ ovbcopy(scr->scr_mem + row * ri->ri_cols + src, scr->scr_mem + row * ri->ri_cols + dst, - num * sizeof(struct charcell)); + num * sizeof(struct wsdisplay_charcell)); if (scr != scr->scr_sc->sc_active) return; @@ -1091,7 +1081,7 @@ cfxga_copyrows(void *cookie, int src, int dst, int num) /* Copy rows in backing store. */ ovbcopy(scr->scr_mem + src * ri->ri_cols, scr->scr_mem + dst * ri->ri_cols, - num * ri->ri_cols * sizeof(struct charcell)); + num * ri->ri_cols * sizeof(struct wsdisplay_charcell)); if (scr != scr->scr_sc->sc_active) return; @@ -1162,7 +1152,7 @@ cfxga_eraserows(void *cookie, int row, int num, long attr) for (y = 1; y < num; y++) ovbcopy(scr->scr_mem + row * ri->ri_cols, scr->scr_mem + (row + y) * ri->ri_cols, - ri->ri_cols * sizeof(struct charcell)); + ri->ri_cols * sizeof(struct wsdisplay_charcell)); if (scr != scr->scr_sc->sc_active) return; diff --git a/sys/dev/wscons/wsdisplay.c b/sys/dev/wscons/wsdisplay.c index 4e71d61d85a..14dca81e87f 100644 --- a/sys/dev/wscons/wsdisplay.c +++ b/sys/dev/wscons/wsdisplay.c @@ -1,4 +1,4 @@ -/* $OpenBSD: wsdisplay.c,v 1.71 2006/11/29 12:13:55 miod Exp $ */ +/* $OpenBSD: wsdisplay.c,v 1.72 2006/11/29 19:11:17 miod Exp $ */ /* $NetBSD: wsdisplay.c,v 1.82 2005/02/27 00:27:52 perry Exp $ */ /* @@ -2403,18 +2403,16 @@ mouse_moverel(char dx, char dy) void inverse_char(unsigned short pos) { - u_int16_t uc; - u_int16_t attr; + struct wsdisplay_charcell cell; + int fg, bg, ul; - uc = GET_FULLCHAR(pos); - attr = uc; + GETCHAR(pos, &cell); + UNPACKATTR(cell.attr, &fg, &bg, &ul); - if ((attr >> 8) == 0) - attr = (FG_LIGHTGREY << 8); + ALLOCATTR(bg, fg, WSATTR_WSCOLORS | (ul ? WSATTR_UNDERLINE : 0), + &cell.attr); - attr = (((attr >> 8) & 0x88) | ((((attr >> 8) >> 4) | - ((attr >> 8) << 4)) & 0x77)) ; - PUTCHAR(pos, (u_int) (uc & 0x00FF), (long) attr); + PUTCHAR(pos, cell.uc, cell.attr); } void @@ -2440,12 +2438,14 @@ inverse_region(unsigned short start, unsigned short end) unsigned char skip_spc_right(char border) { + struct wsdisplay_charcell cell; unsigned short current = CPY_END; unsigned short mouse_col = (CPY_END % N_COLS); unsigned short limit = current + (N_COLS - mouse_col - 1); unsigned char res = 0; - while ((GETCHAR(current) == ' ') && (current <= limit)) { + while (GETCHAR(current, &cell) == 0 && cell.uc == ' ' && + current <= limit) { current++; res++; } @@ -2469,12 +2469,14 @@ skip_spc_right(char border) unsigned char skip_spc_left(void) { + struct wsdisplay_charcell cell; short current = CPY_START; unsigned short mouse_col = (MOUSE % N_COLS); unsigned short limit = current - mouse_col; unsigned char res = 0; - while ((GETCHAR(current) == ' ') && (current >= limit)) { + while (GETCHAR(current, &cell) == 0 && cell.uc == ' ' && + current >= limit) { current--; res++; } @@ -2561,13 +2563,16 @@ static const int charClass[256] = { unsigned char skip_char_right(unsigned short offset) { + struct wsdisplay_charcell cell; unsigned short current = offset; unsigned short limit = current + (N_COLS - (MOUSE % N_COLS) - 1); - unsigned char class = charClass[GETCHAR(current)]; + unsigned char class; unsigned char res = 0; - while ((charClass[GETCHAR(current)] == class) - && (current <= limit)) { + GETCHAR(current, &cell); + class = charClass[cell.uc & 0xff]; + while (GETCHAR(current, &cell) == 0 && + charClass[cell.uc & 0xff] == class && current <= limit) { current++; res++; } @@ -2582,12 +2587,16 @@ skip_char_right(unsigned short offset) unsigned char skip_char_left(unsigned short offset) { + struct wsdisplay_charcell cell; short current = offset; unsigned short limit = current - (MOUSE % N_COLS); - unsigned char class = charClass[GETCHAR(current)]; + unsigned char class; unsigned char res = 0; - while ((charClass[GETCHAR(current)] == class) && (current >= limit)) { + GETCHAR(current, &cell); + class = charClass[cell.uc & 0xff]; + while (GETCHAR(current, &cell) == 0 && + charClass[cell.uc & 0xff] == class && current >= limit) { current--; res++; } @@ -2602,11 +2611,16 @@ skip_char_left(unsigned short offset) unsigned char class_cmp(unsigned short first, unsigned short second) { + struct wsdisplay_charcell cell; unsigned char first_class; unsigned char second_class; - first_class = charClass[GETCHAR(first)]; - second_class = charClass[GETCHAR(second)]; + if (GETCHAR(first, &cell) != 0) + return (1); + first_class = charClass[cell.uc & 0xff]; + if (GETCHAR(second, &cell) != 0) + return (1); + second_class = charClass[cell.uc & 0xff]; if (first_class != second_class) return (1); @@ -2659,6 +2673,7 @@ mouse_copy_start(void) void mouse_copy_word() { + struct wsdisplay_charcell cell; unsigned char right; unsigned char left; @@ -2671,7 +2686,7 @@ mouse_copy_word() CPY_START = MOUSE; CPY_END = MOUSE; - if (IS_ALPHANUM(MOUSE)) { + if (GETCHAR(MOUSE, &cell) == 0 && IS_ALPHANUM(cell.uc)) { right = skip_char_right(CPY_END); left = skip_char_left(CPY_START); } else { @@ -3074,6 +3089,7 @@ remove_selection(struct wsdisplay_softc *sc) void mouse_copy_selection(void) { + struct wsdisplay_charcell cell; unsigned short current = 0; unsigned short blank = current; unsigned short buf_end = ((N_COLS + 1) * N_ROWS); @@ -3084,7 +3100,9 @@ mouse_copy_selection(void) sel_end = CPY_END; while (sel_cur <= sel_end && current < buf_end - 1) { - Copybuffer[current] = (GETCHAR(sel_cur)); + if (GETCHAR(sel_cur, &cell) != 0) + break; + Copybuffer[current] = cell.uc; if (!IS_SPACE(Copybuffer[current])) blank = current + 1; /* first blank after non-blank */ current++; diff --git a/sys/dev/wscons/wsdisplayvar.h b/sys/dev/wscons/wsdisplayvar.h index c514e942638..15138079c99 100644 --- a/sys/dev/wscons/wsdisplayvar.h +++ b/sys/dev/wscons/wsdisplayvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: wsdisplayvar.h,v 1.20 2006/11/29 19:08:23 miod Exp $ */ +/* $OpenBSD: wsdisplayvar.h,v 1.21 2006/11/29 19:11:17 miod Exp $ */ /* $NetBSD: wsdisplayvar.h,v 1.30 2005/02/04 02:10:49 perry Exp $ */ /* @@ -102,6 +102,14 @@ struct wsscreen_descr { #define WSSCREEN_UNDERLINE 16 /* can underline */ }; +/* + * Character cell description (for emulation mode). + */ +struct wsdisplay_charcell { + u_int uc; + long attr; +}; + struct wsdisplay_font; /* * Display access functions, invoked by user-land programs which require @@ -121,7 +129,7 @@ struct wsdisplay_accessops { void (*) (void *, int, int), void *); int (*load_font)(void *, void *, struct wsdisplay_font *); void (*scrollback)(void *, void *, int); - u_int16_t (*getchar)(void *, int, int); + int (*getchar)(void *, int, int, struct wsdisplay_charcell *); void (*burn_screen)(void *, u_int, u_int); void (*pollc)(void *, int); }; diff --git a/sys/dev/wscons/wsmoused.h b/sys/dev/wscons/wsmoused.h index fd2c441d15d..1f04bec24c6 100644 --- a/sys/dev/wscons/wsmoused.h +++ b/sys/dev/wscons/wsmoused.h @@ -1,4 +1,4 @@ -/* $OpenBSD: wsmoused.h,v 1.5 2006/02/12 19:55:39 miod Exp $ */ +/* $OpenBSD: wsmoused.h,v 1.6 2006/11/29 19:11:17 miod Exp $ */ /* * Copyright (c) 2001 Jean-Baptiste Marchand, Julien Montagne and Jerome Verdon @@ -105,25 +105,24 @@ extern char Paste_avail; /* flag, to indicate whether a selection is in the #define POS_TO_X(pos) ((pos) % (N_COLS)) #define POS_TO_Y(pos) ((pos) / (N_COLS)) -#define GET_FULLCHAR(pos)\ -((*sc->sc_accessops->getchar)\ - (sc->sc_accesscookie,\ - ((pos) / N_COLS), ((pos) % N_COLS))) - -#define GETCHAR(pos)\ -(((*sc->sc_accessops->getchar)\ - (sc->sc_accesscookie,\ - ((pos) / N_COLS), ((pos) % N_COLS)))\ - & 0x000000FF) - -#define PUTCHAR(pos, uc, attr)\ -((*sc->sc_focus->scr_dconf->emulops->putchar)\ -(sc->sc_focus->scr_dconf->emulcookie, ((pos) / N_COLS),\ - ((pos) % N_COLS), (uc), (attr))); +/* Shortcuts to the various display operations */ +#define GETCHAR(pos, cellp) \ + ((*sc->sc_accessops->getchar) \ + (sc->sc_accesscookie, (pos) / N_COLS, (pos) % N_COLS, cellp)) +#define PUTCHAR(pos, uc, attr) \ + ((*sc->sc_focus->scr_dconf->emulops->putchar) \ + (sc->sc_focus->scr_dconf->emulcookie, ((pos) / N_COLS), \ + ((pos) % N_COLS), (uc), (attr))) +#define UNPACKATTR(attr, fgp, bgp, ulp) \ + ((*sc->sc_focus->scr_dconf->emulops->unpack_attr) \ + (sc->sc_focus->scr_dconf->emulcookie, attr, fgp, bgp, ulp)) +#define ALLOCATTR(fg, bg, flags, attrp) \ + ((*sc->sc_focus->scr_dconf->emulops->alloc_attr) \ + (sc->sc_focus->scr_dconf->emulcookie, fg, bg, flags, attrp)) #define MOUSE_COPY_BUTTON 0 -#define MOUSE_PASTE_BUTTON 1 +#define MOUSE_PASTE_BUTTON 1 #define MOUSE_EXTEND_BUTTON 2 -#define IS_ALPHANUM(pos) (GETCHAR((pos)) != ' ') +#define IS_ALPHANUM(c) ((c) != ' ') #define IS_SPACE(c) ((c) == ' ') |