瀏覽代碼

Fixing the cursor movement in selections.

Before the fix the cursor wouldn't obey if it's in a selection. If it is
inside it will now change to the reverse. This patch also adds that the
defaultcs will be reversed for the manually drawn cursors.
Christoph Lohmann 10 年之前
父節點
當前提交
594a259836
共有 1 個文件被更改,包括 31 次插入13 次删除
  1. 31 13
      st.c

+ 31 - 13
st.c

@@ -1811,7 +1811,6 @@ tmoveto(int x, int y)
 {
 	int miny, maxy;
 
-	selclear(NULL);
 	if (term.c.state & CURSOR_ORIGIN) {
 		miny = term.top;
 		maxy = term.bot;
@@ -3819,6 +3818,7 @@ xdrawglyph(Glyph g, int x, int y)
 {
 	int numspecs;
 	XftGlyphFontSpec spec;
+
 	numspecs = xmakeglyphfontspecs(&spec, &g, 1, x, y);
 	xdrawglyphfontspecs(&spec, g, numspecs, x, y);
 }
@@ -3828,8 +3828,10 @@ xdrawcursor(void)
 {
 	static int oldx = 0, oldy = 0;
 	int curx;
-	Glyph g = {' ', ATTR_NULL, defaultbg, defaultcs};
+	Glyph g = {' ', ATTR_NULL, defaultbg, defaultcs}, og;
 	int ena_sel = sel.ob.x != -1 && sel.alt == IS_SET(MODE_ALTSCREEN);
+	Color drawcol;
+	XRenderColor dccol;
 
 	LIMIT(oldx, 0, term.col-1);
 	LIMIT(oldy, 0, term.row-1);
@@ -3842,12 +3844,28 @@ xdrawcursor(void)
 	if (term.line[term.c.y][curx].mode & ATTR_WDUMMY)
 		curx--;
 
+	/* remove the old cursor */
+	og = term.line[oldy][oldx];
+	if (ena_sel && selected(oldx, oldy))
+		og.mode ^= ATTR_REVERSE;
+	xdrawglyph(og, oldx, oldy);
+
 	g.u = term.line[term.c.y][term.c.x].u;
-	if (ena_sel && selected(term.c.x, term.c.y))
-		g.mode ^= ATTR_REVERSE;
+	if (ena_sel && selected(term.c.x, term.c.y)) {
+		/*
+		 * Allocate the drawing color which is the reverse of
+		 * defaultcs, if we are selected.
+		 */
+		dccol.red = ~dc.col[defaultcs].color.red;
+		dccol.green = ~dc.col[defaultcs].color.green;
+		dccol.blue = ~dc.col[defaultcs].color.blue;
+		dccol.alpha = ~dc.col[defaultcs].color.alpha;
+		XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &dccol, &drawcol);
 
-	/* remove the old cursor */
-	xdrawglyph(term.line[oldy][oldx], oldx, oldy);
+		g.mode ^= ATTR_REVERSE;
+	} else {
+		drawcol = dc.col[defaultcs];
+	}
 
 	if (IS_SET(MODE_HIDE))
 		return;
@@ -3869,33 +3887,33 @@ xdrawcursor(void)
 			break;
 		case 3: /* Blinking Underline */
 		case 4: /* Steady Underline */
-			XftDrawRect(xw.draw, &dc.col[defaultcs],
+			XftDrawRect(xw.draw, &drawcol,
 					borderpx + curx * xw.cw,
 					borderpx + (term.c.y + 1) * xw.ch - cursorthickness,
 					xw.cw, cursorthickness);
 			break;
 		case 5: /* Blinking bar */
 		case 6: /* Steady bar */
-			XftDrawRect(xw.draw, &dc.col[defaultcs],
+			XftDrawRect(xw.draw, &drawcol,
 					borderpx + curx * xw.cw,
 					borderpx + term.c.y * xw.ch,
 					cursorthickness, xw.ch);
 			break;
 		}
 	} else {
-		XftDrawRect(xw.draw, &dc.col[defaultcs],
+		XftDrawRect(xw.draw, &drawcol,
 				borderpx + curx * xw.cw,
 				borderpx + term.c.y * xw.ch,
 				xw.cw - 1, 1);
-		XftDrawRect(xw.draw, &dc.col[defaultcs],
+		XftDrawRect(xw.draw, &drawcol,
 				borderpx + curx * xw.cw,
 				borderpx + term.c.y * xw.ch,
 				1, xw.ch - 1);
-		XftDrawRect(xw.draw, &dc.col[defaultcs],
+		XftDrawRect(xw.draw, &drawcol,
 				borderpx + (curx + 1) * xw.cw - 1,
 				borderpx + term.c.y * xw.ch,
 				1, xw.ch - 1);
-		XftDrawRect(xw.draw, &dc.col[defaultcs],
+		XftDrawRect(xw.draw, &drawcol,
 				borderpx + curx * xw.cw,
 				borderpx + (term.c.y + 1) * xw.ch - 1,
 				xw.cw, 1);
@@ -3945,7 +3963,7 @@ drawregion(int x1, int y1, int x2, int y2)
 {
 	int i, x, y, ox, numspecs;
 	Glyph base, new;
-	XftGlyphFontSpec* specs;
+	XftGlyphFontSpec *specs;
 	int ena_sel = sel.ob.x != -1 && sel.alt == IS_SET(MODE_ALTSCREEN);
 
 	if (!(xw.state & WIN_VISIBLE))