summaryrefslogtreecommitdiffstats
path: root/sys/dev/vt
diff options
context:
space:
mode:
authorray <ray@FreeBSD.org>2014-09-22 10:21:08 +0000
committerray <ray@FreeBSD.org>2014-09-22 10:21:08 +0000
commitd214dc3b2061ca3ef809ec2b3cdd0d4cd7b0d821 (patch)
tree9685cebe41ebaa8286c3c8ddebb1242a7d178c1b /sys/dev/vt
parentdcca53b69ed32a88ebc7b06acd8efd3990d17535 (diff)
downloadFreeBSD-src-d214dc3b2061ca3ef809ec2b3cdd0d4cd7b0d821.zip
FreeBSD-src-d214dc3b2061ca3ef809ec2b3cdd0d4cd7b0d821.tar.gz
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
Diffstat (limited to 'sys/dev/vt')
-rw-r--r--sys/dev/vt/hw/ofwfb/ofwfb.c2
-rw-r--r--sys/dev/vt/logo/logo_freebsd.c2
-rw-r--r--sys/dev/vt/vt.h12
-rw-r--r--sys/dev/vt/vt_buf.c4
-rw-r--r--sys/dev/vt/vt_consolectl.c2
-rw-r--r--sys/dev/vt/vt_core.c176
6 files changed, 145 insertions, 53 deletions
diff --git a/sys/dev/vt/hw/ofwfb/ofwfb.c b/sys/dev/vt/hw/ofwfb/ofwfb.c
index 75d42b5..ad5b664 100644
--- a/sys/dev/vt/hw/ofwfb/ofwfb.c
+++ b/sys/dev/vt/hw/ofwfb/ofwfb.c
@@ -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;
diff --git a/sys/dev/vt/logo/logo_freebsd.c b/sys/dev/vt/logo/logo_freebsd.c
index fc70570..beb3f0c 100644
--- a/sys/dev/vt/logo/logo_freebsd.c
+++ b/sys/dev/vt/logo/logo_freebsd.c
@@ -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,
};
diff --git a/sys/dev/vt/vt.h b/sys/dev/vt/vt.h
index b660545..c804e56 100644
--- a/sys/dev/vt/vt.h
+++ b/sys/dev/vt/vt.h
@@ -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.
*
diff --git a/sys/dev/vt/vt_buf.c b/sys/dev/vt/vt_buf.c
index d468173..28a7082 100644
--- a/sys/dev/vt/vt_buf.c
+++ b/sys/dev/vt/vt_buf.c
@@ -321,7 +321,7 @@ vtbuf_copy(struct vt_buf *vb, const term_rect_t *r, const term_pos_t *p2)
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));
}
diff --git a/sys/dev/vt/vt_consolectl.c b/sys/dev/vt/vt_consolectl.c
index 32e3ba6..a7042fd 100644
--- a/sys/dev/vt/vt_consolectl.c
+++ b/sys/dev/vt/vt_consolectl.c
@@ -51,7 +51,7 @@ consolectl_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag,
{
switch (cmd) {
- case CONS_GETVERS:
+ case CONS_GETVERS:
*(int*)data = 0x200;
return 0;
case CONS_MOUSECTL: {
diff --git a/sys/dev/vt/vt_core.c b/sys/dev/vt/vt_core.c
index 3372804..15151aa 100644
--- a/sys/dev/vt/vt_core.c
+++ b/sys/dev/vt/vt_core.c
@@ -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 level");
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 vt_window *);
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 *vw)
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 | HALT: /* kbdmap(5) keyword `halt`. */
+ if (vt_kbd_halt)
+ shutdown_nice(RB_HALT);
+ return (1);
+ 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 | 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 | RBT:
- /* XXX: Make this configurable! */
- shutdown_nice(0);
+ case SPCLKEY | SPSC: /* kbdmap(5) keyword `spsc`. */
+ /* Force activatation/deactivation of the screen saver. */
+ /* TODO */
return (1);
- case SPCLKEY | HALT:
- shutdown_nice(RB_HALT);
+ 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 | PDWN:
- shutdown_nice(RB_HALT|RB_POWEROFF);
+ 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_device *vd, int c)
}
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_device *vd, int button)
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, int type, int x, int y, int event,
}
}
+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, int event, int cnt, int mlevel)
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, int event, int cnt, int mlevel)
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, int event, int cnt, int mlevel)
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, int event, int cnt, int mlevel)
* 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. */
}
}
OpenPOWER on IntegriCloud