From owner-svn-src-user@FreeBSD.ORG Mon Nov 11 12:19:27 2013 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 1E5D2F29; Mon, 11 Nov 2013 12:19:27 +0000 (UTC) (envelope-from ray@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id E7FEB22D1; Mon, 11 Nov 2013 12:19:26 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id rABCJQtb036751; Mon, 11 Nov 2013 12:19:26 GMT (envelope-from ray@svn.freebsd.org) Received: (from ray@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id rABCJQpO036750; Mon, 11 Nov 2013 12:19:26 GMT (envelope-from ray@svn.freebsd.org) Message-Id: <201311111219.rABCJQpO036750@svn.freebsd.org> From: Aleksandr Rybalko Date: Mon, 11 Nov 2013 12:19:26 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r257977 - user/ed/newcons/sys/dev/vt X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 11 Nov 2013 12:19:27 -0000 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)