Author: dumbbell
Date: Wed Aug 27 09:34:41 2014
New Revision: 270702
URL: http://svnweb.freebsd.org/changeset/base/270702

Log:
  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

Modified:
  head/sys/dev/vt/vt.h
  head/sys/dev/vt/vt_core.c

Modified: head/sys/dev/vt/vt.h
==============================================================================
--- head/sys/dev/vt/vt.h        Wed Aug 27 09:26:33 2014        (r270701)
+++ head/sys/dev/vt/vt.h        Wed Aug 27 09:34:41 2014        (r270702)
@@ -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 */

Modified: head/sys/dev/vt/vt_core.c
==============================================================================
--- head/sys/dev/vt/vt_core.c   Wed Aug 27 09:26:33 2014        (r270701)
+++ head/sys/dev/vt/vt_core.c   Wed Aug 27 09:34:41 2014        (r270702)
@@ -1476,8 +1476,13 @@ vt_mouse_event(int type, int x, int y, i
        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, i
                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);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to