diff options
author | dumbbell <dumbbell@FreeBSD.org> | 2014-08-27 09:34:41 +0000 |
---|---|---|
committer | dumbbell <dumbbell@FreeBSD.org> | 2014-08-27 09:34:41 +0000 |
commit | ab9f3a65b1ea5f7cec0e61cda01b626a1ead6314 (patch) | |
tree | 1283f731489763e1a5b7d7f15f6b96e0952b366f /sys/dev | |
parent | 22464809265beea7b7903c7dbc8989f5a6b585dd (diff) | |
download | FreeBSD-src-ab9f3a65b1ea5f7cec0e61cda01b626a1ead6314.zip FreeBSD-src-ab9f3a65b1ea5f7cec0e61cda01b626a1ead6314.tar.gz |
vt(4): Implement basic support for KDSETMODE ioctl
With the current implementation, this allows an X11 server to tell
the console it switches a particular window in "graphics mode". This
information is used by the mouse handling code to ignore sysmouse events
in the window taken by the X server: only him should receive those
events.
Reported by: flo@, glebius@, kan@
Tested by: flo@
Reviewed by: kan@
MFC after: 1 week
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/vt/vt.h | 1 | ||||
-rw-r--r-- | sys/dev/vt/vt_core.c | 26 |
2 files changed, 23 insertions, 4 deletions
diff --git a/sys/dev/vt/vt.h b/sys/dev/vt/vt.h index 89d3de4..2108bdf 100644 --- a/sys/dev/vt/vt.h +++ b/sys/dev/vt/vt.h @@ -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 */ diff --git a/sys/dev/vt/vt_core.c b/sys/dev/vt/vt_core.c index 5cc3803..d4f71d0 100644 --- a/sys/dev/vt/vt_core.c +++ b/sys/dev/vt/vt_core.c @@ -1476,8 +1476,13 @@ vt_mouse_event(int type, int x, int y, int event, int cnt, int mlevel) 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, int cnt, int mlevel) 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); |