All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
To: linux-kernel@vger.kernel.org
Cc: Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [PATCH 2 of 2] fbcon: simple text blinking implementation
Date: Tue, 01 Jul 2008 16:38:26 +0100	[thread overview]
Message-ID: <486A4F72.6030005@eu.citrix.com> (raw)

I am using the flashcursor function to scan the buffer for blinking text.
For the sake of efficiency I added a simple flag mechanism to disable the scan
when I am sure that there are not blinking characters on the screen.

Signed-off-by: stefano.stabellini@eu.citrix.com

---
 drivers/video/console/fbcon.c |   62 +++++++++++++++++++++++++++++++++-------
 1 files changed, 51 insertions(+), 11 deletions(-)

diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
index 97aff8d..163b37a 100644
--- a/drivers/video/console/fbcon.c
+++ b/drivers/video/console/fbcon.c
@@ -152,6 +152,8 @@ static int fbcon_has_sysfs;
 
 static const struct consw fb_con;
 
+static int blink_flag = 1;
+
 #define CM_SOFTBACK	(8)
 
 #define advance_row(p, delta) (unsigned short *)((unsigned long)(p) + (delta) * vc->vc_size_row)
@@ -402,24 +404,58 @@ static void fb_flashcursor(struct work_struct *work)
 	struct vc_data *vc = NULL;
 	int c;
 	int mode;
+	unsigned short *s;
+	int x = 0, y = 0;
+	static int show_blink = 1;
 
 	acquire_console_sem();
 	if (ops && ops->currcon != -1)
 		vc = vc_cons[ops->currcon].d;
 
 	if (!vc || !CON_IS_VISIBLE(vc) ||
- 	    registered_fb[con2fb_map[vc->vc_num]] != info ||
-	    vc->vc_deccm != 1) {
+	    registered_fb[con2fb_map[vc->vc_num]] != info) {
 		release_console_sem();
 		return;
 	}
 
 	p = &fb_display[vc->vc_num];
-	c = scr_readw((u16 *) vc->vc_pos);
-	mode = (!ops->cursor_flash || ops->cursor_state.enable) ?
-		CM_ERASE : CM_DRAW;
-	ops->cursor(vc, info, mode, softback_lines, get_color(vc, info, c, 1),
-		    get_color(vc, info, c, 0));
+	if (vc->vc_deccm == 1 && !(vc->vc_cursor_type & 0x10)) {
+		c = scr_readw((u16 *) vc->vc_pos);
+		mode = (!ops->cursor_flash || ops->cursor_state.enable) ?
+			CM_ERASE : CM_DRAW;
+		ops->cursor(vc, info, mode, softback_lines,
+				get_color(vc, info, c, 1),
+				get_color(vc, info, c, 0));
+	}
+
+	if (vc->vc_hi_font_mask || !blink_flag) {
+		release_console_sem();
+		return;
+	}
+	if (!softback_lines)
+		s = (u16 *) vc->vc_origin;
+	else
+		s = (u16 *) softback_curr;
+	while (y < vc->vc_rows) {
+		while (x < vc->vc_cols) {
+			c = scr_readw(s);
+			if (attr_blink(c)) {
+				blink_flag = 1;
+				if (!show_blink)
+					c = (c & 0xf4ff) | (attr_bgcol(12, c) << 8);
+				fbcon_putc(vc, c, y, x);
+			}
+			s++;
+			x++;
+		}
+		x = 0;
+		y++;
+		if (s == (u16 *) softback_end)
+			s = (u16 *) softback_buf;
+		if (s == (u16 *) softback_in)
+			s = (u16 *) vc->vc_origin;
+	}
+	show_blink = show_blink ? 0 : 1;
 	release_console_sem();
 }
 
@@ -1331,6 +1367,8 @@ static void fbcon_putcs(struct vc_data *vc, const unsigned short *s,
 	struct display *p = &fb_display[vc->vc_num];
 	struct fbcon_ops *ops = info->fbcon_par;
 
+	if (!vc->vc_hi_font_mask && (vc->vc_attr & 0x80))
+		blink_flag = 1;
 	if (!fbcon_is_inactive(vc, info))
 		ops->putcs(vc, info, s, count, real_y(p, ypos), xpos,
 			   get_color(vc, info, scr_readw(s), 1),
@@ -1350,6 +1388,7 @@ static void fbcon_clear_margins(struct vc_data *vc, int bottom_only)
 	struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
 	struct fbcon_ops *ops = info->fbcon_par;
 
+	blink_flag = 1;
 	if (!fbcon_is_inactive(vc, info))
 		ops->clear_margins(vc, info, bottom_only);
 }
@@ -1364,10 +1403,7 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
 	if (fbcon_is_inactive(vc, info) || vc->vc_deccm != 1)
 		return;
 
-	if (vc->vc_cursor_type & 0x10)
-		fbcon_del_cursor_timer(info);
-	else
-		fbcon_add_cursor_timer(info);
+	fbcon_add_cursor_timer(info);
 
 	ops->cursor_flash = (mode == CM_ERASE) ? 0 : 1;
 	if (mode & CM_SOFTBACK) {
@@ -1860,6 +1896,7 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
 		return -EINVAL;
 
 	fbcon_cursor(vc, CM_ERASE);
+	blink_flag = 1;
 
 	/*
 	 * ++Geert: Only use ywrap/ypan if the console is in text mode
@@ -2074,6 +2111,8 @@ static void fbcon_bmove(struct vc_data *vc, int sy, int sx, int dy, int dx,
 	if (!width || !height)
 		return;
 
+	blink_flag = 1;
+
 	/*  Split blits that cross physical y_wrap case.
 	 *  Pathological case involves 4 blits, better to use recursive
 	 *  code rather than unrolled case
@@ -2811,6 +2850,7 @@ static int fbcon_scrolldelta(struct vc_data *vc, int lines)
 	struct display *disp = &fb_display[fg_console];
 	int offset, limit, scrollback_old;
 
+	blink_flag = 1;
 	if (softback_top) {
 		if (vc->vc_num != fg_console)
 			return 0;

                 reply	other threads:[~2008-07-01 15:38 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=486A4F72.6030005@eu.citrix.com \
    --to=stefano.stabellini@eu.citrix.com \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.