Index: sys/dev/vt/vt.h =================================================================== --- sys/dev/vt/vt.h (revision 270653) +++ sys/dev/vt/vt.h (working copy) @@ -271,6 +271,7 @@ struct vt_window { #define VWF_VTYLOCK 0x10 /* Prevent window switch. */ #define VWF_MOUSE_HIDE 0x20 /* Disable mouse events processing. */ #define VWF_READY 0x40 /* Window fully initialized. */ +#define VWF_GRAPHICS 0x80 /* Window in graphics mode (KDSETMODE). */ #define VWF_SWWAIT_REL 0x10000 /* Program wait for VT acquire is done. */ #define VWF_SWWAIT_ACQ 0x20000 /* Program wait for VT release is done. */ pid_t vw_pid; /* Terminal holding process */ Index: sys/dev/vt/vt_core.c =================================================================== --- sys/dev/vt/vt_core.c (revision 270653) +++ sys/dev/vt/vt_core.c (working copy) @@ -1476,8 +1476,13 @@ vt_mouse_event(int type, int x, int y, int event, vf = vw->vw_font; mark = 0; - if (vw->vw_flags & VWF_MOUSE_HIDE) - return; /* Mouse disabled. */ + if (vw->vw_flags & (VWF_MOUSE_HIDE | VWF_GRAPHICS)) + /* + * Either the mouse is disabled, or the window is in + * "graphics mode". The graphics mode is usually set by + * an X server, using the KDSETMODE ioctl. + */ + return; if (vf == NULL) /* Text mode. */ return; @@ -1509,7 +1514,7 @@ vt_mouse_event(int type, int x, int y, int event, vd->vd_my = y; if ((vd->vd_mstate & MOUSE_BUTTON1DOWN) && (vtbuf_set_mark(&vw->vw_buf, VTB_MARK_MOVE, - vd->vd_mx / vf->vf_width, + vd->vd_mx / vf->vf_width, vd->vd_my / vf->vf_height) == 1)) { /* @@ -1854,7 +1859,20 @@ skip_thunk: return (0); } case KDSETMODE: - /* XXX */ + /* + * FIXME: This implementation is incomplete compared to + * syscons. + */ + switch (*(int *)data) { + case KD_TEXT: + case KD_TEXT1: + case KD_PIXEL: + vw->vw_flags &= ~VWF_GRAPHICS; + break; + case KD_GRAPHICS: + vw->vw_flags |= VWF_GRAPHICS; + break; + } return (0); case KDENABIO: /* allow io operations */ error = priv_check(td, PRIV_IO);