Commit 9bfdc261 authored by Adam Borowski's avatar Adam Borowski Committed by Greg Kroah-Hartman

vt: selection: take screen contents from uniscr if available

This preserves whatever was written even if we can't currently display the
given glyph.  Mouse paste won't corrupt any character of wcwidth() == 1
anymore.

Note that for now uniscr doesn't get allocated until something reads
/dev/vcsuN for that console, making this code dormant for most users.
Signed-off-by: default avatarAdam Borowski <kilobyte@angband.pl>
Acked-by: default avatarNicolas Pitre <nico@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent df155d2d
...@@ -57,11 +57,13 @@ static inline void highlight_pointer(const int where) ...@@ -57,11 +57,13 @@ static inline void highlight_pointer(const int where)
complement_pos(sel_cons, where); complement_pos(sel_cons, where);
} }
static u16 static u32
sel_pos(int n) sel_pos(int n)
{ {
if (use_unicode)
return screen_glyph_unicode(sel_cons, n / 2);
return inverse_translate(sel_cons, screen_glyph(sel_cons, n), return inverse_translate(sel_cons, screen_glyph(sel_cons, n),
use_unicode); 0);
} }
/** /**
...@@ -90,7 +92,8 @@ static u32 inwordLut[]={ ...@@ -90,7 +92,8 @@ static u32 inwordLut[]={
0x07FFFFFE, /* lowercase */ 0x07FFFFFE, /* lowercase */
}; };
static inline int inword(const u16 c) { static inline int inword(const u32 c)
{
return c > 0x7f || (( inwordLut[c>>5] >> (c & 0x1F) ) & 1); return c > 0x7f || (( inwordLut[c>>5] >> (c & 0x1F) ) & 1);
} }
...@@ -167,7 +170,7 @@ int set_selection(const struct tiocl_selection __user *sel, struct tty_struct *t ...@@ -167,7 +170,7 @@ int set_selection(const struct tiocl_selection __user *sel, struct tty_struct *t
struct tiocl_selection v; struct tiocl_selection v;
char *bp, *obp; char *bp, *obp;
int i, ps, pe, multiplier; int i, ps, pe, multiplier;
u16 c; u32 c;
int mode; int mode;
poke_blanked_console(); poke_blanked_console();
......
...@@ -4543,6 +4543,16 @@ u16 screen_glyph(struct vc_data *vc, int offset) ...@@ -4543,6 +4543,16 @@ u16 screen_glyph(struct vc_data *vc, int offset)
} }
EXPORT_SYMBOL_GPL(screen_glyph); EXPORT_SYMBOL_GPL(screen_glyph);
u32 screen_glyph_unicode(struct vc_data *vc, int n)
{
struct uni_screen *uniscr = get_vc_uniscr(vc);
if (uniscr)
return uniscr->lines[n / vc->vc_cols][n % vc->vc_cols];
return inverse_translate(vc, screen_glyph(vc, n * 2), 1);
}
EXPORT_SYMBOL_GPL(screen_glyph_unicode);
/* used by vcs - note the word offset */ /* used by vcs - note the word offset */
unsigned short *screen_pos(struct vc_data *vc, int w_offset, int viewed) unsigned short *screen_pos(struct vc_data *vc, int w_offset, int viewed)
{ {
......
...@@ -32,6 +32,7 @@ extern unsigned char default_blu[]; ...@@ -32,6 +32,7 @@ extern unsigned char default_blu[];
extern unsigned short *screen_pos(struct vc_data *vc, int w_offset, int viewed); extern unsigned short *screen_pos(struct vc_data *vc, int w_offset, int viewed);
extern u16 screen_glyph(struct vc_data *vc, int offset); extern u16 screen_glyph(struct vc_data *vc, int offset);
extern u32 screen_glyph_unicode(struct vc_data *vc, int offset);
extern void complement_pos(struct vc_data *vc, int offset); extern void complement_pos(struct vc_data *vc, int offset);
extern void invert_screen(struct vc_data *vc, int offset, int count, int shift); extern void invert_screen(struct vc_data *vc, int offset, int count, int shift);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment