Author: ray
Date: Mon Sep 22 10:21:08 2014
New Revision: 271952
URL: http://svnweb.freebsd.org/changeset/base/271952

Log:
  MFC 271381-271382,271385,271463-271466,271485,271506
  
  o Add sysctls to enable/disable potentially dengerous key combinations, like
          reboot/halt/debug.
  o Add support for most key combinations supported by syscons(4).
  o Some spelling fixes
  o Remove stray whitespaces.
  o Switch vt(4) to traditional behaviour with copy-paste same as syscons(4) do.
  o Fix stray char on paste.
  o Fix 'function declaration isn't a prototype' warning.
  o vt(4): Enclose vt_mouse_paste() prototype inside #ifndef 
SC_NO_CUTPASTE/#endif
  
  Approved by:  re (gjb)
  Sponsored by: The FreeBSD Foundation

Modified:
  stable/10/sys/dev/vt/hw/ofwfb/ofwfb.c
  stable/10/sys/dev/vt/logo/logo_freebsd.c
  stable/10/sys/dev/vt/vt.h
  stable/10/sys/dev/vt/vt_buf.c
  stable/10/sys/dev/vt/vt_consolectl.c
  stable/10/sys/dev/vt/vt_core.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/vt/hw/ofwfb/ofwfb.c
==============================================================================
--- stable/10/sys/dev/vt/hw/ofwfb/ofwfb.c       Mon Sep 22 10:05:36 2014        
(r271951)
+++ stable/10/sys/dev/vt/hw/ofwfb/ofwfb.c       Mon Sep 22 10:21:08 2014        
(r271952)
@@ -53,7 +53,7 @@ struct ofwfb_softc {
 
        phandle_t       sc_node;
        ihandle_t       sc_handle;
-       bus_space_tag_t sc_memt; 
+       bus_space_tag_t sc_memt;
 };
 
 static vd_probe_t      ofwfb_probe;

Modified: stable/10/sys/dev/vt/logo/logo_freebsd.c
==============================================================================
--- stable/10/sys/dev/vt/logo/logo_freebsd.c    Mon Sep 22 10:05:36 2014        
(r271951)
+++ stable/10/sys/dev/vt/logo/logo_freebsd.c    Mon Sep 22 10:21:08 2014        
(r271952)
@@ -637,5 +637,5 @@ unsigned char vt_logo_image[] = {
        0x1f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0e, 0x00, 0x00,
        0x00, 0x00, 0x03, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00,
        0x3f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 
+       0x00, 0x00, 0x00,
 };

Modified: stable/10/sys/dev/vt/vt.h
==============================================================================
--- stable/10/sys/dev/vt/vt.h   Mon Sep 22 10:05:36 2014        (r271951)
+++ stable/10/sys/dev/vt/vt.h   Mon Sep 22 10:21:08 2014        (r271952)
@@ -114,11 +114,17 @@ typedef unsigned int      vt_axis_t;
 struct vt_mouse_cursor;
 #endif
 
+struct vt_pastebuf {
+       term_char_t             *vpb_buf;       /* Copy-paste buffer. */
+       unsigned int             vpb_bufsz;     /* Buffer size. */
+       unsigned int             vpb_len;       /* Length of a last selection. 
*/
+};
+
 struct vt_device {
        struct vt_window        *vd_windows[VT_MAXWINDOWS]; /* (c) Windows. */
        struct vt_window        *vd_curwindow;  /* (d) Current window. */
        struct vt_window        *vd_savedwindow;/* (?) Saved for suspend. */
-       struct vt_window        *vd_markedwin;  /* (?) Copy/paste buf owner. */
+       struct vt_pastebuf       vd_pastebuf;   /* (?) Copy/paste buf. */
        const struct vt_driver  *vd_driver;     /* (c) Graphics driver. */
        void                    *vd_softc;      /* (u) Driver data. */
 #ifndef SC_NO_CUTPASTE
@@ -152,6 +158,10 @@ struct vt_device {
        unsigned int             vd_unit;       /* (c) Device unit. */
 };
 
+#define        VD_PASTEBUF(vd) ((vd)->vd_pastebuf.vpb_buf)
+#define        VD_PASTEBUFSZ(vd)       ((vd)->vd_pastebuf.vpb_bufsz)
+#define        VD_PASTEBUFLEN(vd)      ((vd)->vd_pastebuf.vpb_len)
+
 /*
  * Per-window terminal screen buffer.
  *

Modified: stable/10/sys/dev/vt/vt_buf.c
==============================================================================
--- stable/10/sys/dev/vt/vt_buf.c       Mon Sep 22 10:05:36 2014        
(r271951)
+++ stable/10/sys/dev/vt/vt_buf.c       Mon Sep 22 10:21:08 2014        
(r271952)
@@ -321,7 +321,7 @@ vtbuf_copy(struct vt_buf *vb, const term
        if (r->tr_begin.tp_row > p2->tp_row && r->tr_begin.tp_col == 0 &&
            r->tr_end.tp_col == vb->vb_scr_size.tp_col && /* Full row. */
            (rows + rdiff) == vb->vb_scr_size.tp_row && /* Whole screen. */
-           rdiff > 0) { /* Only forward dirrection. Do not eat history. */
+           rdiff > 0) { /* Only forward direction. Do not eat history. */
                vthistory_addlines(vb, rdiff);
        } else if (p2->tp_row < p1->tp_row) {
                /* Handle overlapping copies of line segments. */
@@ -603,7 +603,7 @@ vtbuf_get_marked_len(struct vt_buf *vb)
        ei = e.tp_row * vb->vb_scr_size.tp_col + e.tp_col;
 
        /* Number symbols and number of rows to inject \n */
-       sz = ei - si + ((e.tp_row - s.tp_row) * 2) + 1;
+       sz = ei - si + ((e.tp_row - s.tp_row) * 2);
 
        return (sz * sizeof(term_char_t));
 }

Modified: stable/10/sys/dev/vt/vt_consolectl.c
==============================================================================
--- stable/10/sys/dev/vt/vt_consolectl.c        Mon Sep 22 10:05:36 2014        
(r271951)
+++ stable/10/sys/dev/vt/vt_consolectl.c        Mon Sep 22 10:21:08 2014        
(r271952)
@@ -51,7 +51,7 @@ consolectl_ioctl(struct cdev *dev, u_lon
 {
 
        switch (cmd) {
-       case CONS_GETVERS: 
+       case CONS_GETVERS:
                *(int*)data = 0x200;
                return 0;
        case CONS_MOUSECTL: {

Modified: stable/10/sys/dev/vt/vt_core.c
==============================================================================
--- stable/10/sys/dev/vt/vt_core.c      Mon Sep 22 10:05:36 2014        
(r271951)
+++ stable/10/sys/dev/vt/vt_core.c      Mon Sep 22 10:21:08 2014        
(r271952)
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/lock.h>
 #include <sys/malloc.h>
 #include <sys/mutex.h>
+#include <sys/power.h>
 #include <sys/priv.h>
 #include <sys/proc.h>
 #include <sys/reboot.h>
@@ -123,6 +124,18 @@ VT_SYSCTL_INT(debug, 0, "vt(9) debug lev
 VT_SYSCTL_INT(deadtimer, 15, "Time to wait busy process in VT_PROCESS mode");
 VT_SYSCTL_INT(suspendswitch, 1, "Switch to VT0 before suspend");
 
+/* Allow to disable some keyboard combinations. */
+VT_SYSCTL_INT(kbd_halt, 1, "Enable halt keyboard combination.  "
+    "See kbdmap(5) to configure.");
+VT_SYSCTL_INT(kbd_poweroff, 1, "Enable Power Off keyboard combination.  "
+    "See kbdmap(5) to configure.");
+VT_SYSCTL_INT(kbd_reboot, 1, "Enable reboot keyboard combination.  "
+    "See kbdmap(5) to configure (typically Ctrl-Alt-Delete).");
+VT_SYSCTL_INT(kbd_debug, 1, "Enable key combination to enter debugger.  "
+    "See kbdmap(5) to configure (typically Ctrl-Alt-Esc).");
+VT_SYSCTL_INT(kbd_panic, 0, "Enable request to panic.  "
+    "See kbdmap(5) to configure.");
+
 static struct vt_device        vt_consdev;
 static unsigned int vt_unit = 0;
 static MALLOC_DEFINE(M_VT, "vt", "vt device");
@@ -149,6 +162,9 @@ static int vt_late_window_switch(struct 
 static int vt_proc_alive(struct vt_window *);
 static void vt_resize(struct vt_device *);
 static void vt_update_static(void *);
+#ifndef SC_NO_CUTPASTE
+static void vt_mouse_paste(void);
+#endif
 
 SET_DECLARE(vt_drv_set, struct vt_driver);
 
@@ -163,10 +179,14 @@ static struct vt_device   vt_consdev = {
        .vd_flags = VDF_INVALID,
        .vd_windows = { [VT_CONSWINDOW] =  &vt_conswindow, },
        .vd_curwindow = &vt_conswindow,
-       .vd_markedwin = NULL,
        .vd_kbstate = 0,
 
 #ifndef SC_NO_CUTPASTE
+       .vd_pastebuf = {
+               .vpb_buf = NULL,
+               .vpb_bufsz = 0,
+               .vpb_len = 0
+       },
        .vd_mcursor = &vt_default_mouse_pointer,
        .vd_mcursor_fg = TC_WHITE,
        .vd_mcursor_bg = TC_BLACK,
@@ -334,7 +354,7 @@ vt_proc_window_switch(struct vt_window *
        if (curvw->vw_flags & VWF_VTYLOCK)
                return (EBUSY);
 
-       /* Ask current process permitions to switch away. */
+       /* Ask current process permission to switch away. */
        if (curvw->vw_smode.mode == VT_PROCESS) {
                DPRINTF(30, "%s: VT_PROCESS ", __func__);
                if (vt_proc_alive(curvw) == FALSE) {
@@ -484,18 +504,47 @@ vt_machine_kbdevent(int c)
 {
 
        switch (c) {
-       case SPCLKEY | DBG:
-               kdb_enter(KDB_WHY_BREAK, "manual escape to debugger");
+       case SPCLKEY | DBG: /* kbdmap(5) keyword `debug`. */
+               if (vt_kbd_debug)
+                       kdb_enter(KDB_WHY_BREAK, "manual escape to debugger");
                return (1);
-       case SPCLKEY | RBT:
-               /* XXX: Make this configurable! */
-               shutdown_nice(0);
+       case SPCLKEY | HALT: /* kbdmap(5) keyword `halt`. */
+               if (vt_kbd_halt)
+                       shutdown_nice(RB_HALT);
                return (1);
-       case SPCLKEY | HALT:
-               shutdown_nice(RB_HALT);
+       case SPCLKEY | PASTE: /* kbdmap(5) keyword `paste`. */
+#ifndef SC_NO_CUTPASTE
+               /* Insert text from cut-paste buffer. */
+               vt_mouse_paste();
+#endif
+               break;
+       case SPCLKEY | PDWN: /* kbdmap(5) keyword `pdwn`. */
+               if (vt_kbd_poweroff)
+                       shutdown_nice(RB_HALT|RB_POWEROFF);
                return (1);
-       case SPCLKEY | PDWN:
-               shutdown_nice(RB_HALT|RB_POWEROFF);
+       case SPCLKEY | PNC: /* kbdmap(5) keyword `panic`. */
+               /*
+                * Request to immediate panic if sysctl
+                * kern.vt.enable_panic_key allow it.
+                */
+               if (vt_kbd_panic)
+                       panic("Forced by the panic key");
+               return (1);
+       case SPCLKEY | RBT: /* kbdmap(5) keyword `boot`. */
+               if (vt_kbd_reboot)
+                       shutdown_nice(RB_AUTOBOOT);
+               return (1);
+       case SPCLKEY | SPSC: /* kbdmap(5) keyword `spsc`. */
+               /* Force activatation/deactivation of the screen saver. */
+               /* TODO */
+               return (1);
+       case SPCLKEY | STBY: /* XXX Not present in kbdcontrol parser. */
+               /* Put machine into Stand-By mode. */
+               power_pm_suspend(POWER_SLEEP_STATE_STANDBY);
+               return (1);
+       case SPCLKEY | SUSP: /* kbdmap(5) keyword `susp`. */
+               /* Suspend machine. */
+               power_pm_suspend(POWER_SLEEP_STATE_SUSPEND);
                return (1);
        };
 
@@ -611,6 +660,20 @@ vt_processkey(keyboard_t *kbd, struct vt
                }
 
                switch (c) {
+               case NEXT:
+                       /* Switch to next VT. */
+                       c = (vw->vw_number + 1) % VT_MAXWINDOWS;
+                       vw = vd->vd_windows[c];
+                       if (vw != NULL)
+                               vt_proc_window_switch(vw);
+                       return (0);
+               case PREV:
+                       /* Switch to previous VT. */
+                       c = (vw->vw_number - 1) % VT_MAXWINDOWS;
+                       vw = vd->vd_windows[c];
+                       if (vw != NULL)
+                               vt_proc_window_switch(vw);
+                       return (0);
                case SLK: {
 
                        kbdd_ioctl(kbd, KDGKBSTATE, (caddr_t)&state);
@@ -1520,7 +1583,7 @@ vt_mouse_terminput_button(struct vt_devi
        mouseb[4] = '!' + x;
        mouseb[5] = '!' + y;
 
-       for (i = 0; i < sizeof(mouseb); i++ )
+       for (i = 0; i < sizeof(mouseb); i++)
                terminal_input_char(vw->vw_terminal, mouseb[i]);
 }
 
@@ -1558,6 +1621,23 @@ vt_mouse_terminput(struct vt_device *vd,
        }
 }
 
+static void
+vt_mouse_paste()
+{
+       term_char_t *buf;
+       int i, len;
+
+       len = VD_PASTEBUFLEN(main_vd);
+       buf = VD_PASTEBUF(main_vd);
+       len /= sizeof(term_char_t);
+       for (i = 0; i < len; i++) {
+               if (buf[i] == '\0')
+                       continue;
+               terminal_input_char(main_vd->vd_curwindow->vw_terminal,
+                   buf[i]);
+       }
+}
+
 void
 vt_mouse_event(int type, int x, int y, int event, int cnt, int mlevel)
 {
@@ -1565,8 +1645,7 @@ vt_mouse_event(int type, int x, int y, i
        struct vt_window *vw;
        struct vt_font *vf;
        term_pos_t size;
-       term_char_t *buf;
-       int i, len, mark;
+       int len, mark;
 
        vd = main_vd;
        vw = vd->vd_curwindow;
@@ -1609,17 +1688,10 @@ vt_mouse_event(int type, int x, int y, i
 
                vd->vd_mx = x;
                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_my / vf->vf_height) == 1)) {
-
-                       /*
-                        * We have something marked to copy, so update pointer
-                        * to window with selection.
-                        */
-                       vd->vd_markedwin = vw;
-               }
+               if (vd->vd_mstate & MOUSE_BUTTON1DOWN)
+                       vtbuf_set_mark(&vw->vw_buf, VTB_MARK_MOVE,
+                           vd->vd_mx / vf->vf_width,
+                           vd->vd_my / vf->vf_height);
 
                vt_resume_flush_timer(vw->vw_device, 0);
                return; /* Done */
@@ -1652,27 +1724,7 @@ vt_mouse_event(int type, int x, int y, i
                case 0: /* up */
                        break;
                default:
-                       if (vd->vd_markedwin == NULL)
-                               return;
-                       /* Get current selecton size in bytes. */
-                       len = vtbuf_get_marked_len(&vd->vd_markedwin->vw_buf);
-                       if (len <= 0)
-                               return;
-
-                       buf = malloc(len, M_VT, M_WAITOK | M_ZERO);
-                       /* Request cupy/paste buffer data, no more than `len' */
-                       vtbuf_extract_marked(&vd->vd_markedwin->vw_buf, buf,
-                           len);
-
-                       len /= sizeof(term_char_t);
-                       for (i = 0; i < len; i++ ) {
-                               if (buf[i] == '\0')
-                                       continue;
-                               terminal_input_char(vw->vw_terminal, buf[i]);
-                       }
-
-                       /* Done, so cleanup. */
-                       free(buf, M_VT);
+                       vt_mouse_paste();
                        break;
                }
                return; /* Done */
@@ -1705,8 +1757,38 @@ vt_mouse_event(int type, int x, int y, i
                 * We have something marked to copy, so update pointer to
                 * window with selection.
                 */
-               vd->vd_markedwin = vw;
                vt_resume_flush_timer(vw->vw_device, 0);
+
+               switch (mark) {
+               case VTB_MARK_END:
+               case VTB_MARK_WORD:
+               case VTB_MARK_ROW:
+               case VTB_MARK_EXTEND:
+                       break;
+               default:
+                       /* Other types of mark do not require to copy data. */
+                       return;
+               }
+
+               /* Get current selection size in bytes. */
+               len = vtbuf_get_marked_len(&vw->vw_buf);
+               if (len <= 0)
+                       return;
+
+               /* Reallocate buffer only if old one is too small. */
+               if (len > VD_PASTEBUFSZ(vd)) {
+                       VD_PASTEBUF(vd) = realloc(VD_PASTEBUF(vd), len, M_VT,
+                           M_WAITOK | M_ZERO);
+                       /* Update buffer size. */
+                       VD_PASTEBUFSZ(vd) = len;
+               }
+               /* Request copy/paste buffer data, no more than `len' */
+               vtbuf_extract_marked(&vw->vw_buf, VD_PASTEBUF(vd),
+                   VD_PASTEBUFSZ(vd));
+
+               VD_PASTEBUFLEN(vd) = len;
+
+               /* XXX VD_PASTEBUF(vd) have to be freed on shutdown/unload. */
        }
 }
 
_______________________________________________
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