vt.h revision 268366
11558Srgrimes/*- 21558Srgrimes * Copyright (c) 2009, 2013 The FreeBSD Foundation 31558Srgrimes * All rights reserved. 41558Srgrimes * 51558Srgrimes * This software was developed by Ed Schouten under sponsorship from the 61558Srgrimes * FreeBSD Foundation. 71558Srgrimes * 81558Srgrimes * Portions of this software were developed by Oleksandr Rybalko 91558Srgrimes * under sponsorship from the FreeBSD Foundation. 101558Srgrimes * 111558Srgrimes * Redistribution and use in source and binary forms, with or without 121558Srgrimes * modification, are permitted provided that the following conditions 131558Srgrimes * are met: 141558Srgrimes * 1. Redistributions of source code must retain the above copyright 151558Srgrimes * notice, this list of conditions and the following disclaimer. 161558Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 171558Srgrimes * notice, this list of conditions and the following disclaimer in the 181558Srgrimes * documentation and/or other materials provided with the distribution. 191558Srgrimes * 201558Srgrimes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 211558Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 221558Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 231558Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 241558Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 251558Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 261558Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 271558Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 281558Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 291558Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30114589Sobrien * SUCH DAMAGE. 311558Srgrimes * 327585Sbde * $FreeBSD: stable/10/sys/dev/vt/vt.h 268366 2014-07-07 14:16:05Z ray $ 331558Srgrimes */ 341558Srgrimes 351558Srgrimes#ifndef _DEV_VT_VT_H_ 361558Srgrimes#define _DEV_VT_VT_H_ 371558Srgrimes 3841477Sjulian#include <sys/param.h> 39114589Sobrien#include <sys/_lock.h> 4041477Sjulian#include <sys/_mutex.h> 4193103Smarkm#include <sys/callout.h> 4293103Smarkm#include <sys/condvar.h> 4393103Smarkm#include <sys/conf.h> 441558Srgrimes#include <sys/consio.h> 4555275Speter#include <sys/kbio.h> 4675557Smckusick#include <sys/mouse.h> 471558Srgrimes#include <sys/terminal.h> 481558Srgrimes#include <sys/sysctl.h> 4940918Smjacob 5086514Siedowse#include "opt_syscons.h" 51172236Srodrigc#include "opt_splash.h" 5298542Smckusick 5323675Speter#ifndef VT_MAXWINDOWS 541558Srgrimes#ifdef MAXCONS 551558Srgrimes#define VT_MAXWINDOWS MAXCONS 5623675Speter#else 5723675Speter#define VT_MAXWINDOWS 12 5855725Speter#endif 591558Srgrimes#endif 60120901Smckusick 61172236Srodrigc#ifndef VT_ALT_TO_ESC_HACK 6255725Speter#define VT_ALT_TO_ESC_HACK 1 63101037Smux#endif 6486514Siedowse 6523675Speter#define VT_CONSWINDOW 0 661558Srgrimes 671558Srgrimes#if defined(SC_TWOBUTTON_MOUSE) || defined(VT_TWOBUTTON_MOUSE) 6892839Simp#define VT_MOUSE_PASTEBUTTON MOUSE_BUTTON3DOWN /* right button */ 69100935Sphk#define VT_MOUSE_EXTENDBUTTON MOUSE_BUTTON2DOWN /* not really used */ 7092839Simp#else 71171800Spjd#define VT_MOUSE_PASTEBUTTON MOUSE_BUTTON2DOWN /* middle button */ 7292839Simp#define VT_MOUSE_EXTENDBUTTON MOUSE_BUTTON3DOWN /* right button */ 7323675Speter#endif /* defined(SC_TWOBUTTON_MOUSE) || defined(VT_TWOBUTTON_MOUSE) */ 747585Sbde 7592839Simp#define SC_DRIVER_NAME "vt" 761558Srgrimes#ifdef VT_DEBUG 771558Srgrimes#define DPRINTF(_l, ...) if (vt_debug > (_l)) printf( __VA_ARGS__ ) 7841474Sjulian#define VT_CONSOLECTL_DEBUG 79126345Sscottl#define VT_SYSMOUSE_DEBUG 8066861Sadrian#else 811558Srgrimes#define DPRINTF(_l, ...) do {} while (0) 821558Srgrimes#endif 8366861Sadrian#define ISSIGVALID(sig) ((sig) > 0 && (sig) < NSIG) 84188110Smckusick 85188110Smckusick#define VT_SYSCTL_INT(_name, _default, _descr) \ 861558Srgrimesstatic int vt_##_name = _default; \ 871558SrgrimesSYSCTL_INT(_kern_vt, OID_AUTO, _name, CTLFLAG_RW, &vt_##_name, _default,\ 8866861Sadrian _descr); \ 891558SrgrimesTUNABLE_INT("kern.vt." #_name, &vt_##_name); 901558Srgrimes 911558Srgrimesstruct vt_driver; 921558Srgrimes 9374556Smckusickvoid vt_allocate(struct vt_driver *, void *); 9474556Smckusickvoid vt_resume(void); 9574556Smckusickvoid vt_suspend(void); 9674556Smckusick 971558Srgrimestypedef unsigned int vt_axis_t; 9866861Sadrian 991558Srgrimes/* 10098542Smckusick * List of locks 10198542Smckusick * (d) locked by vd_lock 10298542Smckusick * (b) locked by vb_lock 1031558Srgrimes * (G) locked by Giant 1048871Srgrimes * (u) unlocked, locked by higher levels 1051558Srgrimes * (c) const until freeing 1061558Srgrimes * (?) yet to be determined 1071558Srgrimes */ 1081558Srgrimes 1092153Sdg/* 11066861Sadrian * Per-device datastructure. 1112153Sdg */ 1122153Sdg 11375927Smckusickstruct vt_device { 11475927Smckusick struct vt_window *vd_windows[VT_MAXWINDOWS]; /* (c) Windows. */ 11575927Smckusick struct vt_window *vd_curwindow; /* (d) Current window. */ 11675927Smckusick struct vt_window *vd_savedwindow;/* (?) Saved for suspend. */ 1171558Srgrimes struct vt_window *vd_markedwin; /* (?) Copy/paste buf owner. */ 1181558Srgrimes const struct vt_driver *vd_driver; /* (c) Graphics driver. */ 1191558Srgrimes void *vd_softc; /* (u) Driver data. */ 12023675Speter uint16_t vd_mx; /* (?) Mouse X. */ 1211558Srgrimes uint16_t vd_my; /* (?) Mouse Y. */ 1221558Srgrimes vt_axis_t vd_mdirtyx; /* (?) Screen width. */ 1231558Srgrimes vt_axis_t vd_mdirtyy; /* (?) Screen height. */ 1241558Srgrimes uint32_t vd_mstate; /* (?) Mouse state. */ 1251558Srgrimes term_pos_t vd_offset; /* (?) Pixel offset. */ 1261558Srgrimes vt_axis_t vd_width; /* (?) Screen width. */ 1271558Srgrimes vt_axis_t vd_height; /* (?) Screen height. */ 1281558Srgrimes struct mtx vd_lock; /* Per-device lock. */ 12966861Sadrian struct cv vd_winswitch; /* (d) Window switch notify. */ 13066861Sadrian struct callout vd_timer; /* (d) Display timer. */ 131187931Sobrien int vd_flags; /* (d) Device flags. */ 132187931Sobrien#define VDF_TEXTMODE 0x01 /* Do text mode rendering. */ 133187931Sobrien#define VDF_SPLASH 0x02 /* Splash screen active. */ 134187931Sobrien#define VDF_ASYNC 0x04 /* vt_timer() running. */ 13566861Sadrian#define VDF_INVALID 0x08 /* Entire screen should be re-rendered. */ 13666861Sadrian#define VDF_DEAD 0x10 /* Early probing found nothing. */ 137188110Smckusick#define VDF_INITIALIZED 0x20 /* vtterm_cnprobe already done. */ 138188110Smckusick#define VDF_MOUSECURSOR 0x40 /* Mouse cursor visible. */ 139188110Smckusick#define VDF_QUIET_BELL 0x80 /* Disable bell. */ 140188110Smckusick int vd_keyboard; /* (G) Keyboard index. */ 1411558Srgrimes unsigned int vd_kbstate; /* (?) Device unit. */ 1421558Srgrimes unsigned int vd_unit; /* (c) Device unit. */ 1431558Srgrimes}; 1441558Srgrimes 1451558Srgrimes/* 1461558Srgrimes * Per-window terminal screen buffer. 14766861Sadrian * 1481558Srgrimes * Because redrawing is performed asynchronously, the buffer keeps track 1491558Srgrimes * of a rectangle that needs to be redrawn (vb_dirtyrect). Because this 1501558Srgrimes * approach seemed to cause suboptimal performance (when the top left 1511558Srgrimes * and the bottom right of the screen are modified), it also uses a set 15266861Sadrian * of bitmasks to keep track of the rows and columns (mod 64) that have 15366861Sadrian * been modified. 15466861Sadrian */ 15566861Sadrian 1561558Srgrimesstruct vt_bufmask { 1571558Srgrimes uint64_t vbm_row, vbm_col; 158187931Sobrien#define VBM_DIRTY UINT64_MAX 1591558Srgrimes}; 16070050Siedowse 161126345Sscottlstruct vt_buf { 162126345Sscottl struct mtx vb_lock; /* Buffer lock. */ 163126345Sscottl term_pos_t vb_scr_size; /* (b) Screen dimensions. */ 164126345Sscottl int vb_flags; /* (b) Flags. */ 165126345Sscottl#define VBF_CURSOR 0x1 /* Cursor visible. */ 166126345Sscottl#define VBF_STATIC 0x2 /* Buffer is statically allocated. */ 167126345Sscottl#define VBF_MTX_INIT 0x4 /* Mutex initialized. */ 168126345Sscottl#define VBF_SCROLL 0x8 /* scroll locked mode. */ 16941474Sjulian#define VBF_HISTORY_FULL 0x10 /* All rows filled. */ 17041474Sjulian int vb_history_size; 171102231Strhodes#define VBF_DEFAULT_HISTORY_SIZE 500 17241474Sjulian int vb_roffset; /* (b) History rows offset. */ 17341474Sjulian int vb_curroffset; /* (b) Saved rows offset. */ 17441474Sjulian term_pos_t vb_cursor; /* (u) Cursor position. */ 17541474Sjulian term_pos_t vb_mark_start; /* (b) Copy region start. */ 17641474Sjulian term_pos_t vb_mark_end; /* (b) Copy region end. */ 17766861Sadrian int vb_mark_last; /* Last mouse event. */ 17886514Siedowse term_rect_t vb_dirtyrect; /* (b) Dirty rectangle. */ 17941474Sjulian struct vt_bufmask vb_dirtymask; /* (b) Dirty bitmasks. */ 1801558Srgrimes term_char_t *vb_buffer; /* (u) Data buffer. */ 18166861Sadrian term_char_t **vb_rows; /* (u) Array of rows */ 1821558Srgrimes}; 1831558Srgrimes 1841558Srgrimesvoid vtbuf_copy(struct vt_buf *, const term_rect_t *, const term_pos_t *); 18523675Spetervoid vtbuf_fill_locked(struct vt_buf *, const term_rect_t *, term_char_t); 186100935Sphkvoid vtbuf_init_early(struct vt_buf *); 1871558Srgrimesvoid vtbuf_init(struct vt_buf *, const term_pos_t *); 1881558Srgrimesvoid vtbuf_grow(struct vt_buf *, const term_pos_t *, int); 1891558Srgrimesvoid vtbuf_putchar(struct vt_buf *, const term_pos_t *, term_char_t); 1901558Srgrimesvoid vtbuf_cursor_position(struct vt_buf *, const term_pos_t *); 1911558Srgrimesvoid vtbuf_scroll_mode(struct vt_buf *vb, int yes); 1921558Srgrimesvoid vtbuf_undirty(struct vt_buf *, term_rect_t *, struct vt_bufmask *); 19323675Spetervoid vtbuf_sethistory_size(struct vt_buf *, int); 1941558Srgrimesint vtbuf_iscursor(struct vt_buf *vb, int row, int col); 1951558Srgrimesvoid vtbuf_cursor_visibility(struct vt_buf *, int); 1961558Srgrimes#ifndef SC_NO_CUTPASTE 1971558Srgrimesvoid vtbuf_mouse_cursor_position(struct vt_buf *vb, int col, int row); 198102231Strhodesint vtbuf_set_mark(struct vt_buf *vb, int type, int col, int row); 1991558Srgrimesint vtbuf_get_marked_len(struct vt_buf *vb); 2001558Srgrimesvoid vtbuf_extract_marked(struct vt_buf *vb, term_char_t *buf, int sz); 20123675Speter#endif 20292839Simp 2031558Srgrimes#define VTB_MARK_NONE 0 20498542Smckusick#define VTB_MARK_END 1 2051558Srgrimes#define VTB_MARK_START 2 20674556Smckusick#define VTB_MARK_WORD 3 207120901Smckusick#define VTB_MARK_ROW 4 208120901Smckusick#define VTB_MARK_EXTEND 5 20998542Smckusick#define VTB_MARK_MOVE 6 210172236Srodrigc 211172236Srodrigc#define VTBUF_SLCK_ENABLE(vb) vtbuf_scroll_mode((vb), 1) 212172236Srodrigc#define VTBUF_SLCK_DISABLE(vb) vtbuf_scroll_mode((vb), 0) 213171800Spjd 21498542Smckusick#define VTBUF_MAX_HEIGHT(vb) \ 215101037Smux ((vb)->vb_history_size) 2161558Srgrimes#define VTBUF_GET_ROW(vb, r) \ 217172236Srodrigc ((vb)->vb_rows[((vb)->vb_roffset + (r)) % VTBUF_MAX_HEIGHT(vb)]) 218172236Srodrigc#define VTBUF_GET_FIELD(vb, r, c) \ 219172236Srodrigc ((vb)->vb_rows[((vb)->vb_roffset + (r)) % VTBUF_MAX_HEIGHT(vb)][(c)]) 220172236Srodrigc#define VTBUF_FIELD(vb, r, c) \ 2211558Srgrimes ((vb)->vb_rows[((vb)->vb_curroffset + (r)) % VTBUF_MAX_HEIGHT(vb)][(c)]) 222187931Sobrien#define VTBUF_ISCURSOR(vb, r, c) \ 2231558Srgrimes vtbuf_iscursor((vb), (r), (c)) 22475927Smckusick#define VTBUF_DIRTYROW(mask, row) \ 22575927Smckusick ((mask)->vbm_row & ((uint64_t)1 << ((row) % 64))) 226102231Strhodes#define VTBUF_DIRTYCOL(mask, col) \ 22775927Smckusick ((mask)->vbm_col & ((uint64_t)1 << ((col) % 64))) 22875927Smckusick#define VTBUF_SPACE_CHAR(attr) (' ' | (attr)) 22975927Smckusick 23075927Smckusick#define VHS_SET 0 23175927Smckusick#define VHS_CUR 1 23275927Smckusick#define VHS_END 2 23375927Smckusickint vthistory_seek(struct vt_buf *, int offset, int whence); 23475927Smckusickvoid vthistory_addlines(struct vt_buf *vb, int offset); 23575927Smckusickvoid vthistory_getpos(const struct vt_buf *, unsigned int *offset); 23675927Smckusick 23775927Smckusick/* 23875927Smckusick * Per-window datastructure. 23975927Smckusick */ 24075557Smckusick 24175927Smckusickstruct vt_window { 24275927Smckusick struct vt_device *vw_device; /* (c) Device. */ 24375927Smckusick struct terminal *vw_terminal; /* (c) Terminal. */ 24475927Smckusick struct vt_buf vw_buf; /* (u) Screen buffer. */ 245207141Sjeff struct vt_font *vw_font; /* (d) Graphical font. */ 246207141Sjeff unsigned int vw_number; /* (c) Window number. */ 247207141Sjeff int vw_kbdmode; /* (?) Keyboard mode. */ 24875927Smckusick char *vw_kbdsq; /* Escape sequence queue*/ 24975927Smckusick unsigned int vw_flags; /* (d) Per-window flags. */ 25075927Smckusick int vw_mouse_level;/* Mouse op mode. */ 25175927Smckusick#define VWF_BUSY 0x1 /* Busy reconfiguring device. */ 25275927Smckusick#define VWF_OPENED 0x2 /* TTY in use. */ 25375927Smckusick#define VWF_SCROLL 0x4 /* Keys influence scrollback. */ 25475927Smckusick#define VWF_CONSOLE 0x8 /* Kernel message console window. */ 25575927Smckusick#define VWF_VTYLOCK 0x10 /* Prevent window switch. */ 25675927Smckusick#define VWF_MOUSE_HIDE 0x20 /* Disable mouse events processing. */ 25775927Smckusick#define VWF_READY 0x40 /* Window fully initialized. */ 258187931Sobrien#define VWF_SWWAIT_REL 0x10000 /* Program wait for VT acquire is done. */ 259163845Spjd#define VWF_SWWAIT_ACQ 0x20000 /* Program wait for VT release is done. */ 260163845Spjd pid_t vw_pid; /* Terminal holding process */ 261163845Spjd struct proc *vw_proc; 262163845Spjd struct vt_mode vw_smode; /* switch mode */ 263163845Spjd struct callout vw_proc_dead_timer; 264163845Spjd struct vt_window *vw_switch_to; 265163845Spjd}; 266163845Spjd 267163845Spjd#define VT_AUTO 0 /* switching is automatic */ 268163845Spjd#define VT_PROCESS 1 /* switching controlled by prog */ 269163845Spjd#define VT_KERNEL 255 /* switching controlled in kernel */ 270163845Spjd 271163845Spjd#define IS_VT_PROC_MODE(vw) ((vw)->vw_smode.mode == VT_PROCESS) 272163845Spjd 273163845Spjd/* 274171800Spjd * Per-device driver routines. 275171800Spjd * 276171800Spjd * vd_bitbltchr is used when the driver operates in graphics mode, while 277163845Spjd * vd_putchar is used when the driver operates in text mode 278163845Spjd * (VDF_TEXTMODE). 279163845Spjd */ 280163845Spjd 281163845Spjdtypedef int vd_init_t(struct vt_device *vd); 282163845Spjdtypedef int vd_probe_t(struct vt_device *vd); 28374556Smckusicktypedef void vd_postswitch_t(struct vt_device *vd); 28474556Smckusicktypedef void vd_blank_t(struct vt_device *vd, term_color_t color); 285102231Strhodestypedef void vd_bitbltchr_t(struct vt_device *vd, const uint8_t *src, 28674556Smckusick const uint8_t *mask, int bpl, vt_axis_t top, vt_axis_t left, 28774556Smckusick unsigned int width, unsigned int height, term_color_t fg, term_color_t bg); 28874556Smckusicktypedef void vd_maskbitbltchr_t(struct vt_device *vd, const uint8_t *src, 28974556Smckusick const uint8_t *mask, int bpl, vt_axis_t top, vt_axis_t left, 29074556Smckusick unsigned int width, unsigned int height, term_color_t fg, term_color_t bg); 29174556Smckusicktypedef void vd_putchar_t(struct vt_device *vd, term_char_t, 29274556Smckusick vt_axis_t top, vt_axis_t left, term_color_t fg, term_color_t bg); 29375557Smckusicktypedef int vd_fb_ioctl_t(struct vt_device *, u_long, caddr_t, struct thread *); 29474556Smckusicktypedef int vd_fb_mmap_t(struct vt_device *, vm_ooffset_t, vm_paddr_t *, int, 29574556Smckusick vm_memattr_t *); 29675557Smckusicktypedef void vd_drawrect_t(struct vt_device *, int, int, int, int, int, 29775557Smckusick term_color_t); 29874556Smckusicktypedef void vd_setpixel_t(struct vt_device *, int, int, term_color_t); 29974556Smckusick 30075557Smckusickstruct vt_driver { 30175557Smckusick char vd_name[16]; 30275557Smckusick /* Console attachment. */ 303207141Sjeff vd_probe_t *vd_probe; 30475557Smckusick vd_init_t *vd_init; 30575557Smckusick 30675557Smckusick /* Drawing. */ 30775557Smckusick vd_blank_t *vd_blank; 30875557Smckusick vd_bitbltchr_t *vd_bitbltchr; 309187931Sobrien vd_maskbitbltchr_t *vd_maskbitbltchr; 31075557Smckusick vd_drawrect_t *vd_drawrect; 311102231Strhodes vd_setpixel_t *vd_setpixel; 31275557Smckusick 31375557Smckusick /* Framebuffer ioctls, if present. */ 314118302Sru vd_fb_ioctl_t *vd_fb_ioctl; 31575557Smckusick 31675557Smckusick /* Framebuffer mmap, if present. */ 31775557Smckusick vd_fb_mmap_t *vd_fb_mmap; 31875557Smckusick 31975557Smckusick /* Text mode operation. */ 32075557Smckusick vd_putchar_t *vd_putchar; 32175557Smckusick 322120901Smckusick /* Update display setting on vt switch. */ 32374556Smckusick vd_postswitch_t *vd_postswitch; 324120901Smckusick 325120901Smckusick /* Priority to know which one can override */ 326120901Smckusick int vd_priority; 327120901Smckusick#define VD_PRIORITY_DUMB 10 328120901Smckusick#define VD_PRIORITY_GENERIC 100 329120901Smckusick#define VD_PRIORITY_SPECIFIC 1000 330120901Smckusick}; 331120901Smckusick 332120901Smckusick/* 333120901Smckusick * Console device madness. 334120901Smckusick * 335120901Smckusick * Utility macro to make early vt(4) instances work. 336120901Smckusick */ 337120901Smckusick 338120901Smckusickextern const struct terminal_class vt_termclass; 339120901Smckusickvoid vt_upgrade(struct vt_device *vd); 340120901Smckusick 341120901Smckusick#define PIXEL_WIDTH(w) ((w) / 8) 342120901Smckusick#define PIXEL_HEIGHT(h) ((h) / 16) 343120901Smckusick 344120901Smckusick#ifndef VT_FB_DEFAULT_WIDTH 345120901Smckusick#define VT_FB_DEFAULT_WIDTH 2048 346120901Smckusick#endif 347120901Smckusick#ifndef VT_FB_DEFAULT_HEIGHT 348120901Smckusick#define VT_FB_DEFAULT_HEIGHT 1200 349120901Smckusick#endif 350172236Srodrigc 351172236Srodrigc#define VT_CONSDEV_DECLARE(driver, width, height, softc) \ 352172236Srodrigcstatic struct terminal driver ## _consterm; \ 353172236Srodrigcstatic struct vt_window driver ## _conswindow; \ 354172236Srodrigcstatic struct vt_device driver ## _consdev = { \ 355172236Srodrigc .vd_driver = &driver, \ 356172236Srodrigc .vd_softc = (softc), \ 357182027Srodrigc .vd_flags = VDF_INVALID, \ 358182027Srodrigc .vd_windows = { [VT_CONSWINDOW] = &driver ## _conswindow, }, \ 359172236Srodrigc .vd_curwindow = &driver ## _conswindow, \ 360186471Sobrien .vd_markedwin = NULL, \ 36174556Smckusick .vd_kbstate = 0, \ 36274556Smckusick}; \ 36374556Smckusickstatic term_char_t driver ## _constextbuf[(width) * \ 364172236Srodrigc (VBF_DEFAULT_HISTORY_SIZE)]; \ 365172236Srodrigcstatic term_char_t *driver ## _constextbufrows[ \ 36674556Smckusick VBF_DEFAULT_HISTORY_SIZE]; \ 36774556Smckusickstatic struct vt_window driver ## _conswindow = { \ 36874556Smckusick .vw_number = VT_CONSWINDOW, \ 36974556Smckusick .vw_flags = VWF_CONSOLE, \ 37074556Smckusick .vw_buf = { \ 37174556Smckusick .vb_buffer = driver ## _constextbuf, \ 37274556Smckusick .vb_rows = driver ## _constextbufrows, \ 37323675Speter .vb_history_size = VBF_DEFAULT_HISTORY_SIZE, \ 37423675Speter .vb_curroffset = 0, \ 3751558Srgrimes .vb_roffset = 0, \ 3761558Srgrimes .vb_flags = VBF_STATIC, \ 37741477Sjulian .vb_mark_start = { \ 37823675Speter .tp_row = 0, \ 37975557Smckusick .tp_col = 0, \ 38086514Siedowse }, \ 38186514Siedowse .vb_mark_end = { \ 382100935Sphk .tp_row = 0, \ 383100935Sphk .tp_col = 0, \ 384100935Sphk }, \ 38541477Sjulian .vb_scr_size = { \ 38631904Sbde .tp_row = height, \ 3872153Sdg .tp_col = width, \ 388207141Sjeff }, \ 389207141Sjeff }, \ 390207141Sjeff .vw_device = &driver ## _consdev, \ 391209408Sdelphij .vw_terminal = &driver ## _consterm, \ 392209408Sdelphij .vw_kbdmode = K_XLATE, \ 393209408Sdelphij}; \ 394209408SdelphijTERMINAL_DECLARE_EARLY(driver ## _consterm, vt_termclass, \ 395209408Sdelphij &driver ## _conswindow); \ 396209408SdelphijSYSINIT(vt_early_cons, SI_SUB_INT_CONFIG_HOOKS, SI_ORDER_ANY, \ 397209408Sdelphij vt_upgrade, &driver ## _consdev) 398209408Sdelphij 399209408Sdelphij/* name argument is not used yet. */ 400207141Sjeff#define VT_DRIVER_DECLARE(name, drv) DATA_SET(vt_drv_set, drv) 401209408Sdelphij 402207141Sjeff/* 403207141Sjeff * Fonts. 404207141Sjeff * 405207141Sjeff * Remapping tables are used to map Unicode points to glyphs. They need 406207141Sjeff * to be sorted, because vtfont_lookup() performs a binary search. Each 407207141Sjeff * font has two remapping tables, for normal and bold. When a character 408207141Sjeff * is not present in bold, it uses a normal glyph. When no glyph is 409207141Sjeff * available, it uses glyph 0, which is normally equal to U+FFFD. 41055275Speter */ 41155275Speter 41234266Sjulianstruct vt_font_map { 41334266Sjulian uint32_t vfm_src; 41434266Sjulian uint16_t vfm_dst; 41534266Sjulian uint16_t vfm_len; 41634266Sjulian}; 4171558Srgrimes 4181558Srgrimesstruct vt_font { 4191558Srgrimes struct vt_font_map *vf_map[VFNT_MAPS]; 4201558Srgrimes uint8_t *vf_bytes; 42174556Smckusick unsigned int vf_height, vf_width; 422102231Strhodes unsigned int vf_map_count[VFNT_MAPS]; 4231558Srgrimes unsigned int vf_refcount; 4241558Srgrimes}; 4251558Srgrimes 4261558Srgrimes#ifndef SC_NO_CUTPASTE 4271558Srgrimesstruct mouse_cursor { 4281558Srgrimes uint8_t map[64 * 64 / 8]; 4291558Srgrimes uint8_t mask[64 * 64 / 8]; 4301558Srgrimes uint8_t w; 43134266Sjulian uint8_t h; 432201708Smckusick}; 433201708Smckusick#endif 434201708Smckusick 435201708Smckusickconst uint8_t *vtfont_lookup(const struct vt_font *vf, term_char_t c); 4361558Srgrimesstruct vt_font *vtfont_ref(struct vt_font *vf); 4371558Srgrimesvoid vtfont_unref(struct vt_font *vf); 4381558Srgrimesint vtfont_load(vfnt_t *f, struct vt_font **ret); 4391558Srgrimes 4401558Srgrimes/* Sysmouse. */ 4411558Srgrimesvoid sysmouse_process_event(mouse_info_t *mi); 4421558Srgrimes#ifndef SC_NO_CUTPASTE 4431558Srgrimesvoid vt_mouse_event(int type, int x, int y, int event, int cnt, int mlevel); 4441558Srgrimesvoid vt_mouse_state(int show); 4451558Srgrimes#endif 4461558Srgrimes#define VT_MOUSE_SHOW 1 4471558Srgrimes#define VT_MOUSE_HIDE 0 4481558Srgrimes 4491558Srgrimes#endif /* !_DEV_VT_VT_H_ */ 4501558Srgrimes 4511558Srgrimes