Date: Mon, 11 Nov 2013 12:19:26 +0000 (UTC) From: Aleksandr Rybalko <ray@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r257977 - user/ed/newcons/sys/dev/vt Message-ID: <201311111219.rABCJQpO036750@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ray Date: Mon Nov 11 12:19:26 2013 New Revision: 257977 URL: http://svnweb.freebsd.org/changeset/base/257977 Log: Add vt_mouse_event mouth event handling method. Sponsored by: The FreeBSD Foundation Modified: user/ed/newcons/sys/dev/vt/vt_core.c Modified: user/ed/newcons/sys/dev/vt/vt_core.c ============================================================================== --- user/ed/newcons/sys/dev/vt/vt_core.c Mon Nov 11 12:15:52 2013 (r257976) +++ user/ed/newcons/sys/dev/vt/vt_core.c Mon Nov 11 12:19:26 2013 (r257977) @@ -1040,6 +1040,109 @@ finish_vt_acq(struct vt_window *vw) return EINVAL; } +void +vt_mouse_event(int type, int x, int y, int event, int cnt) +{ + struct vt_device *vd; + struct vt_window *vw; + struct vt_font *vf; + term_pos_t size; + int mark; + + vd = main_vd; + vw = vd->vd_curwindow; + vf = vw->vw_font; + + if (vf == NULL) /* Text mode. */ + return; + + /* + * TODO: add flag about pointer position changed, to not redraw chars + * under mouse pointer when nothing changed. + */ + + switch (type) { + case MOUSE_ACTION: + case MOUSE_MOTION_EVENT: + /* Movement */ + x += vd->vd_mx; + y += vd->vd_my; + + vt_termsize(vd, vf, &size); + + /* Apply limits. */ + x = MAX(x, 0); + y = MAX(y, 0); + x = MIN(x, (size.tp_col * vf->vf_width) - 1); + y = MIN(y, (size.tp_row * vf->vf_height) - 1); + + vd->vd_mx = x; + vd->vd_my = y; + if (vd->vd_mstate & MOUSE_BUTTON1DOWN) + vtbuf_set_mark(&vw->vw_buf, VTB_MARK_END, + vd->vd_mx / vf->vf_width, + vd->vd_my / vf->vf_height); + return; /* Done */ + case MOUSE_BUTTON_EVENT: + /* Buttons */ + break; + default: + return; /* Done */ + } + + switch (event) { + case MOUSE_BUTTON1DOWN: + switch (cnt % 4) { + case 0: /* up */ + mark = VTB_MARK_END; + break; + case 1: /* single click: start cut operation */ + mark = VTB_MARK_START; + break; + case 2: /* double click: cut a word */ + mark = VTB_MARK_WORD; + break; + case 3: /* triple click: cut a line */ + mark = VTB_MARK_ROW; + break; + } + break; + case VT_MOUSE_PASTEBUTTON: + switch (event) { + case 0: /* up */ + break; + default: + //sc_mouse_paste(cur_scp); + break; + } + return; /* Done */ + case VT_MOUSE_EXTENDBUTTON: + switch (event) { + case 0: /* up */ + if (!(vd->vd_mstate & MOUSE_BUTTON1DOWN)) + mark = VTB_MARK_END; + else + mark = 0; + break; + default: + mark = VTB_MARK_EXTEND; + break; + } + break; + default: + return; /* Done */ + } + + /* Save buttons state. */ + if (cnt > 0) + vd->vd_mstate |= event; + else + vd->vd_mstate &= ~event; + + vtbuf_set_mark(&vw->vw_buf, mark, vd->vd_mx / vf->vf_width, + vd->vd_my / vf->vf_height); +} + static int vtterm_ioctl(struct terminal *tm, u_long cmd, caddr_t data, struct thread *td)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201311111219.rABCJQpO036750>