From: "Vladimir 'φ-coder/phcoder' Serbinenko" <phcoder@gmail.com>
To: The development of GNU GRUB <grub-devel@gnu.org>
Subject: Re: [PATCH] fix entry editor screen screen layout corruption in trunk
Date: Wed, 03 Apr 2013 15:22:31 +0200 [thread overview]
Message-ID: <515C2D17.2040800@gmail.com> (raw)
In-Reply-To: <20130217191559.1de3c574@opensuse.site>
[-- Attachment #1: Type: text/plain, Size: 5945 bytes --]
On 17.02.2013 16:15, Andrey Borzenkov wrote:
> See screenshot for what I get using current trunk.
>
> I do not pretend to fully understand all this code so review is
> appreciated. So far it does fix both gfxterm and console cases for me.
I've fixed the same problem by much smaller logic change
>
> Patch follows.
>
> ---
>
> From: Andrey Borzenkov <arvidjaar@gmail.com>
> Subject: [PATCH] fix entry editor screen corruption
>
> Fixes the following issues after rev 7137
>
> 1. right margines were erased on wrapped lines (with contibuation char)
>
> 2. left margines were erased on continuation lines
>
> 3. max_lines was effectively ignored by gfxterm, so last line was printed
> outside of editor window, overwriting bottom border and probably beyond
>
> 4. menu_entry:update_screen() unconditionally padded last line with
> spaces, but print_ucs4_menu() would move to next screen position if
> line was wrapped. This caused bottom border to be partially overwritten
> with spaces. The patch moves line padding to term.c. It also
> makes behaviour consistent with print_ucs4_terminal which did padding
> itself.
>
> Signed-off-by: Andrey Borzenkov <arvidjaar@gmail.com>
>
> ---
> grub-core/normal/menu_entry.c | 10 ----------
> grub-core/normal/term.c | 29 +++++++++++++++++++++++------
> 2 files changed, 23 insertions(+), 16 deletions(-)
>
> diff --git a/grub-core/normal/menu_entry.c b/grub-core/normal/menu_entry.c
> index 7cd67f3..cc977b5 100644
> --- a/grub-core/normal/menu_entry.c
> +++ b/grub-core/normal/menu_entry.c
> @@ -256,7 +256,6 @@ update_screen (struct screen *screen, struct per_term_screen *term_screen,
>
> if (i == region_start || linep == screen->lines + screen->line)
> {
> - int sp;
> grub_term_gotoxy (term_screen->term, GRUB_TERM_LEFT_BORDER_X
> + GRUB_TERM_MARGIN + 1, (y < 0 ? 0 : y)
> + GRUB_TERM_FIRST_ENTRY_Y);
> @@ -271,14 +270,9 @@ update_screen (struct screen *screen, struct per_term_screen *term_screen,
> term_screen->num_entries
> - ((y > 0) ? y : 0), '\\',
> *pos);
> - sp = grub_term_entry_width (term_screen->term)
> - - (*pos)[linep->len].x;
> - if (sp > 0)
> - grub_print_spaces (term_screen->term, sp);
> }
> else if (i > region_start && mode == ALL_LINES)
> {
> - int sp;
> grub_term_gotoxy (term_screen->term, GRUB_TERM_LEFT_BORDER_X
> + GRUB_TERM_MARGIN + 1, (y < 0 ? 0 : y)
> + GRUB_TERM_FIRST_ENTRY_Y);
> @@ -293,10 +287,6 @@ update_screen (struct screen *screen, struct per_term_screen *term_screen,
> term_screen->num_entries
> - ((y > 0) ? y : 0), '\\',
> *pos);
> - sp = grub_term_entry_width (term_screen->term)
> - - (*pos)[linep->len].x;
> - if (sp > 0)
> - grub_print_spaces (term_screen->term, sp);
> }
> y += get_logical_num_lines (linep, term_screen);
> if (y >= term_screen->num_entries)
> diff --git a/grub-core/normal/term.c b/grub-core/normal/term.c
> index dc03268..0290968 100644
> --- a/grub-core/normal/term.c
> +++ b/grub-core/normal/term.c
> @@ -736,6 +736,8 @@ print_ucs4_terminal (const grub_uint32_t * str,
> continue;
> putcode_real (*ptr2, term, fixed_tab);
> }
> + if (contchar)
> + fill_margin (term, margin_right);
> }
> return dry_run ? lines : 0;
> }
> @@ -767,13 +769,22 @@ put_glyphs_terminal (const struct grub_unicode_glyph *visual,
> grub_ssize_t visual_len,
> int margin_left, int margin_right,
> struct grub_term_output *term,
> - struct term_state *state, int fixed_tab)
> + struct term_state *state, int fixed_tab, grub_uint32_t contchar)
> {
> const struct grub_unicode_glyph *visual_ptr;
> + int wasn = 0;
> +
> for (visual_ptr = visual; visual_ptr < visual + visual_len; visual_ptr++)
> {
> if (visual_ptr->base == '\n')
> - grub_print_spaces (term, margin_right);
> + {
> + wasn = 1;
> + if (contchar)
> + fill_margin (term, margin_right);
> + }
> + else
> + wasn = 0;
> +
> putglyph (visual_ptr, term, fixed_tab);
> if (visual_ptr->base == '\n')
> {
> @@ -786,10 +797,16 @@ put_glyphs_terminal (const struct grub_unicode_glyph *visual,
> return 1;
> }
>
> - grub_print_spaces (term, margin_left);
> + if (!contchar)
> + grub_print_spaces (term, margin_left);
> + else
> + grub_term_gotoxy (term, margin_left,
> + grub_term_getxy (term) & 0xff);
> }
> grub_free (visual_ptr->combining);
> }
> + if (!wasn && contchar)
> + fill_margin (term, margin_right);
> return 0;
> }
>
> @@ -826,7 +843,7 @@ print_backlog (struct grub_term_output *term,
> ret = put_glyphs_terminal (state->backlog_glyphs,
> state->backlog_len,
> margin_left, margin_right, term, state,
> - state->backlog_fixed_tab);
> + state->backlog_fixed_tab, 0);
> if (!ret)
> {
> grub_free (state->free);
> @@ -908,7 +925,7 @@ print_ucs4_real (const grub_uint32_t * str,
> {
> for (vptr = visual_show;
> max_lines && vptr < visual + visual_len; vptr++)
> - if (visual_show->base == '\n')
> + if (vptr->base == '\n')
> max_lines--;
>
> visual_len_show = vptr - visual_show;
> @@ -930,7 +947,7 @@ print_ucs4_real (const grub_uint32_t * str,
> {
> ret = put_glyphs_terminal (visual_show, visual_len_show, margin_left,
> contchar ? margin_right : 1,
> - term, state, fixed_tab);
> + term, state, fixed_tab, contchar);
>
> if (!ret)
> grub_free (visual);
>
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 294 bytes --]
next prev parent reply other threads:[~2013-04-03 19:57 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-02-17 15:15 [PATCH] fix entry editor screen screen layout corruption in trunk Andrey Borzenkov
2013-04-03 13:22 ` Vladimir 'φ-coder/phcoder' Serbinenko [this message]
2013-04-07 12:26 ` Andrey Borzenkov
2013-04-07 15:49 ` Vladimir 'φ-coder/phcoder' Serbinenko
[not found] ` <20130407225029.79b6795e@opensuse.site>
2013-04-08 2:42 ` Andrey Borzenkov
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=515C2D17.2040800@gmail.com \
--to=phcoder@gmail.com \
--cc=grub-devel@gnu.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).