Respect SC_NO_CUTPASTE option. It disable mouse cursor and cut/paste support

for vt(9). Note: /dev/sysmouse not affected.

Sponsored by:	The FreeBSD Foundation
This commit is contained in:
Aleksandr Rybalko 2013-12-09 15:01:34 +00:00
parent 7f6897133f
commit 0f49db6e47
5 changed files with 32 additions and 4 deletions

View File

@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
#include <dev/vt/vt.h>
#ifndef SC_NO_CUTPASTE
struct mouse_cursor vt_default_mouse_pointer = {
.map = {
0x00, /* "__ " */
@ -66,3 +67,4 @@ struct mouse_cursor vt_default_mouse_pointer = {
.w = 8,
.h = 13,
};
#endif

View File

@ -181,15 +181,17 @@ void vtbuf_init(struct vt_buf *, const term_pos_t *);
void vtbuf_grow(struct vt_buf *, const term_pos_t *, int);
void vtbuf_putchar(struct vt_buf *, const term_pos_t *, term_char_t);
void vtbuf_cursor_position(struct vt_buf *, const term_pos_t *);
void vtbuf_mouse_cursor_position(struct vt_buf *vb, int col, int row);
void vtbuf_cursor_visibility(struct vt_buf *, int);
void vtbuf_scroll_mode(struct vt_buf *vb, int yes);
void vtbuf_undirty(struct vt_buf *, term_rect_t *, struct vt_bufmask *);
void vtbuf_sethistory_size(struct vt_buf *, int);
int vtbuf_set_mark(struct vt_buf *vb, int type, int col, int row);
int vtbuf_iscursor(struct vt_buf *vb, int row, int col);
void vtbuf_cursor_visibility(struct vt_buf *, int);
#ifndef SC_NO_CUTPASTE
void vtbuf_mouse_cursor_position(struct vt_buf *vb, int col, int row);
int vtbuf_set_mark(struct vt_buf *vb, int type, int col, int row);
int vtbuf_get_marked_len(struct vt_buf *vb);
void vtbuf_extract_marked(struct vt_buf *vb, term_char_t *buf, int sz);
#endif
#define VTB_MARK_NONE 0
#define VTB_MARK_END 1
@ -389,12 +391,14 @@ struct vt_font {
unsigned int vf_refcount;
};
#ifndef SC_NO_CUTPASTE
struct mouse_cursor {
uint8_t map[64 * 64 / 8];
uint8_t mask[64 * 64 / 8];
uint8_t w;
uint8_t h;
};
#endif
const uint8_t *vtfont_lookup(const struct vt_font *vf, term_char_t c);
struct vt_font *vtfont_ref(struct vt_font *vf);
@ -403,8 +407,10 @@ int vtfont_load(vfnt_t *f, struct vt_font **ret);
/* Sysmouse. */
void sysmouse_process_event(mouse_info_t *mi);
#ifndef SC_NO_CUTPASTE
void vt_mouse_event(int type, int x, int y, int event, int cnt);
void vt_mouse_state(int show);
#endif
#define VT_MOUSE_SHOW 1
#define VT_MOUSE_HIDE 0

View File

@ -135,6 +135,7 @@ vthistory_getpos(const struct vt_buf *vb, unsigned int *offset)
*offset = vb->vb_roffset;
}
#ifndef SC_NO_CUTPASTE /* Only mouse support use it now. */
/* Translate current view row number to history row. */
static int
vtbuf_wth(struct vt_buf *vb, int row)
@ -142,6 +143,7 @@ vtbuf_wth(struct vt_buf *vb, int row)
return ((vb->vb_roffset + row) % vb->vb_history_size);
}
#endif
/* Translate history row to current view row number. */
static int
@ -531,6 +533,7 @@ vtbuf_cursor_position(struct vt_buf *vb, const term_pos_t *p)
}
}
#ifndef SC_NO_CUTPASTE
void
vtbuf_mouse_cursor_position(struct vt_buf *vb, int col, int row)
{
@ -691,6 +694,7 @@ vtbuf_set_mark(struct vt_buf *vb, int type, int col, int row)
vtbuf_flush_mark(vb);
return (1);
}
#endif
void
vtbuf_cursor_visibility(struct vt_buf *vb, int yes)

View File

@ -127,7 +127,9 @@ extern unsigned char vt_logo_image[];
/* Font. */
extern struct vt_font vt_font_default;
#ifndef SC_NO_CUTPASTE
extern struct mouse_cursor vt_default_mouse_pointer;
#endif
static int signal_vt_rel(struct vt_window *);
static int signal_vt_acq(struct vt_window *);
@ -689,12 +691,14 @@ vt_flush(struct vt_device *vd)
struct vt_window *vw = vd->vd_curwindow;
struct vt_font *vf = vw->vw_font;
struct vt_bufmask tmask;
struct mouse_cursor *m;
unsigned int row, col;
term_rect_t tarea;
term_pos_t size;
term_char_t *r;
#ifndef SC_NO_CUTPASTE
struct mouse_cursor *m;
int bpl, h, w;
#endif
if (vd->vd_flags & VDF_SPLASH || vw->vw_flags & VWF_BUSY)
return;
@ -711,11 +715,13 @@ vt_flush(struct vt_device *vd)
vd->vd_flags &= ~VDF_INVALID;
}
#ifndef SC_NO_CUTPASTE
if ((vw->vw_flags & VWF_MOUSE_HIDE) == 0) {
/* Mark last mouse position as dirty to erase. */
vtbuf_mouse_cursor_position(&vw->vw_buf, vd->vd_mdirtyx,
vd->vd_mdirtyy);
}
#endif
for (row = tarea.tr_begin.tp_row; row < tarea.tr_end.tp_row; row++) {
if (!VTBUF_DIRTYROW(&tmask, row))
@ -731,6 +737,7 @@ vt_flush(struct vt_device *vd)
}
}
#ifndef SC_NO_CUTPASTE
/* Mouse disabled. */
if (vw->vw_flags & VWF_MOUSE_HIDE)
return;
@ -759,6 +766,7 @@ vt_flush(struct vt_device *vd)
vd->vd_mdirtyx = vd->vd_mx / vf->vf_width;
vd->vd_mdirtyy = vd->vd_my / vf->vf_height;
}
#endif
}
static void
@ -1106,6 +1114,7 @@ finish_vt_acq(struct vt_window *vw)
return (EINVAL);
}
#ifndef SC_NO_CUTPASTE
void
vt_mouse_event(int type, int x, int y, int event, int cnt)
{
@ -1265,6 +1274,7 @@ vt_mouse_state(int show)
break;
}
}
#endif
static int
vtterm_ioctl(struct terminal *tm, u_long cmd, caddr_t data,

View File

@ -190,9 +190,11 @@ sysmouse_process_event(mouse_info_t *mi)
sysmouse_buf_store(buf);
#ifndef SC_NO_CUTPASTE
mtx_unlock(&sysmouse_lock);
vt_mouse_event(mi->operation, x, y, mi->u.event.id, mi->u.event.value);
return;
#endif
done: mtx_unlock(&sysmouse_lock);
}
@ -345,7 +347,9 @@ sysmouse_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag,
return (EINVAL);
sysmouse_level = level;
#ifndef SC_NO_CUTPASTE
vt_mouse_state((level == 0)?VT_MOUSE_SHOW:VT_MOUSE_HIDE);
#endif
return (0);
}
case MOUSE_SETMODE: {
@ -358,8 +362,10 @@ sysmouse_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag,
case 0:
case 1:
sysmouse_level = mode->level;
#ifndef SC_NO_CUTPASTE
vt_mouse_state((mode->level == 0)?VT_MOUSE_SHOW:
VT_MOUSE_HIDE);
#endif
break;
default:
return (EINVAL);