svn commit: r271952 - in stable/10/sys/dev/vt: . hw/ofwfb logo

Aleksandr Rybalko ray at FreeBSD.org
Mon Sep 22 10:21:10 UTC 2014


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. */
 	}
 }
 


More information about the svn-src-all mailing list